HIP unpack support -- not tested
This commit is contained in:
parent
f45d4d933d
commit
c82a1af1e3
72
msg.go
72
msg.go
|
@ -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 {
|
||||||
|
|
2
types.go
2
types.go
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue