HIP unpack support -- not tested

This commit is contained in:
Miek Gieben 2012-02-19 15:33:12 +01:00
parent f45d4d933d
commit c82a1af1e3
2 changed files with 43 additions and 31 deletions

72
msg.go
View File

@ -109,7 +109,7 @@ var Rr_str = map[uint16]string{
TypeOPT: "OPT", TypeOPT: "OPT",
TypeDS: "DS", TypeDS: "DS",
TypeDHCID: "DHCID", TypeDHCID: "DHCID",
TypeHIP: "HIP", TypeHIP: "HIP",
TypeIPSECKEY: "IPSECKEY", TypeIPSECKEY: "IPSECKEY",
TypeSSHFP: "SSHFP", TypeSSHFP: "SSHFP",
TypeRRSIG: "RRSIG", TypeRRSIG: "RRSIG",
@ -370,21 +370,21 @@ func packStructValue(val reflect.Value, msg []byte, off int, compression map[str
default: default:
println("dns: unknown tag packing slice", val.Type().Field(i).Tag) println("dns: unknown tag packing slice", val.Type().Field(i).Tag)
return lenmsg, false return lenmsg, false
case "txt": case "txt":
for j := 0; j < val.Field(i).Len(); j++ { for j := 0; j < val.Field(i).Len(); j++ {
element := val.Field(i).Index(j).String() element := val.Field(i).Index(j).String()
// Counted string: 1 byte length. // Counted string: 1 byte length.
if len(element) > 255 || off+1+len(element) > lenmsg { if len(element) > 255 || off+1+len(element) > lenmsg {
println("dns: overflow packing TXT string") println("dns: overflow packing TXT string")
return len(msg), false return len(msg), false
} }
msg[off] = byte(len(element)) msg[off] = byte(len(element))
off++ off++
for i := 0; i < len(element); i++ { for i := 0; i < len(element); i++ {
msg[off+i] = element[i] msg[off+i] = element[i]
} }
off += len(element) off += len(element)
} }
case "opt": // edns case "opt": // edns
// Length of the entire option section // Length of the entire option section
for j := 0; j < val.Field(i).Len(); j++ { for j := 0; j < val.Field(i).Len(); j++ {
@ -642,22 +642,34 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok boo
default: default:
println("dns: unknown tag unpacking slice", val.Type().Field(i).Tag) println("dns: unknown tag unpacking slice", val.Type().Field(i).Tag)
return lenmsg, false return lenmsg, false
// Need to add domain-name for HIP case "domain-name":
case "txt": // HIP record slice of name (or none)
txt := make([]string,0) servers := make([]string, 0)
var s string
for off < lenmsg {
s, off, ok = UnpackDomainName(msg, off)
if !ok {
println("dns: failure unpacking domain-name")
return lenmsg, false
}
servers = append(servers, s)
}
fv.Set(reflect.ValueOf(servers))
case "txt":
txt := make([]string, 0)
rdlength := int(val.FieldByName("Hdr").FieldByName("Rdlength").Uint()) rdlength := int(val.FieldByName("Hdr").FieldByName("Rdlength").Uint())
Txts: Txts:
l := int(msg[off]) l := int(msg[off])
if off + l + 1 > lenmsg { if off+l+1 > lenmsg {
println("dns: failure unpacking txt strings") println("dns: failure unpacking txt strings")
return lenmsg, false return lenmsg, false
} }
txt = append(txt, string(msg[off+1:off+l+1])) txt = append(txt, string(msg[off+1:off+l+1]))
off += l+1 off += l + 1
if off < rdlength { if off < rdlength {
// More // More
goto Txts goto Txts
} }
fv.Set(reflect.ValueOf(txt)) fv.Set(reflect.ValueOf(txt))
case "opt": // edns0 case "opt": // edns0
if off+2 > lenmsg { if off+2 > lenmsg {

View File

@ -859,7 +859,7 @@ func (rr *RR_NSEC3) String() string {
func (rr *RR_NSEC3) Len() int { func (rr *RR_NSEC3) Len() int {
return rr.Hdr.Len() + 6 + len(rr.Salt)/2 + 1 + len(rr.NextDomain) + 1 + len(rr.TypeBitMap) return rr.Hdr.Len() + 6 + len(rr.Salt)/2 + 1 + len(rr.NextDomain) + 1 + len(rr.TypeBitMap)
// TODO: typebitmap // TODO: typebitmap length
} }
type RR_NSEC3PARAM struct { type RR_NSEC3PARAM struct {