Support the WKS record

This commit is contained in:
Miek Gieben 2012-06-02 17:33:49 +02:00
parent fb0623fbb2
commit 89ec077d8f
3 changed files with 96 additions and 8 deletions

37
msg.go
View File

@ -94,9 +94,13 @@ var Rr_str = map[uint16]string{
TypeHINFO: "HINFO",
TypeMB: "MB",
TypeMG: "MG",
TypeRP: "RP",
TypeMD: "MD",
TypeMF: "MF",
TypeMINFO: "MINFO",
TypeMR: "MR",
TypeMX: "MX",
TypeWKS: "WKS",
TypeNS: "NS",
TypePTR: "PTR",
TypeSOA: "SOA",
@ -752,11 +756,38 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok boo
rdlength := int(val.FieldByName("Hdr").FieldByName("Rdlength").Uint())
endrr := rdstart + rdlength
serv := make([]uint16, 0)
j := 0
for off < endrr {
b := msg[off]
// Check the bits one by one, and set the type
if b&0x80 == 0x80 {
serv = append(serv, uint16(j*8+0))
}
if b&0x40 == 0x40 {
serv = append(serv, uint16(j*8+1))
}
if b&0x20 == 0x20 {
serv = append(serv, uint16(j*8+2))
}
if b&0x10 == 0x10 {
serv = append(serv, uint16(j*8+3))
}
if b&0x8 == 0x8 {
serv = append(serv, uint16(j*8+4))
}
if b&0x4 == 0x4 {
serv = append(serv, uint16(j*8+5))
}
if b&0x2 == 0x2 {
serv = append(serv, uint16(j*8+6))
}
if b&0x1 == 0x1 {
serv = append(serv, uint16(j*8+7))
}
j++
off++
}
fv.Set(reflect.ValueOf(serv))
case "nsec": // NSEC/NSEC3
// Rest of the record is the type bitmap
rdlength := int(val.FieldByName("Hdr").FieldByName("Rdlength").Uint())

View File

@ -1154,7 +1154,7 @@ type RR_WKS struct {
Hdr RR_Header
Address net.IP `dns:"a"`
Protocol uint8
Bitmap []uint16 `dns:"wks"`
BitMap []uint16 `dns:"wks"`
}
func (rr *RR_WKS) Header() *RR_Header {
@ -1162,10 +1162,10 @@ func (rr *RR_WKS) Header() *RR_Header {
}
func (rr *RR_WKS) String() string {
s := rr.Hdr.String() + " " + rr.Address.String()
for i := 0; i < len(rr.Bitmap); i++ {
// lookup the port
s += " " + strconv.Itoa(int(rr.Bitmap[i]))
s := rr.Hdr.String() + rr.Address.String()
for i := 0; i < len(rr.BitMap); i++ {
// should lookup the port
s += " " + strconv.Itoa(int(rr.BitMap[i]))
}
return s
}

View File

@ -89,6 +89,8 @@ func setRR(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return setNSEC3(h, c, o, f)
case TypeNSEC3PARAM:
return setNSEC3PARAM(h, c, f)
case TypeWKS:
return setWKS(h, c, f)
case TypeDS:
return setDS(h, c, f)
case TypeDLV:
@ -1060,6 +1062,61 @@ func setNSEC3PARAM(h RR_Header, c chan lex, f string) (RR, *ParseError) {
return rr, nil
}
func setWKS(h RR_Header, c chan lex, f string) (RR, *ParseError) {
rr := new(RR_WKS)
rr.Hdr = h
l := <-c
rr.Address = net.ParseIP(l.token)
if rr.Address == nil {
return nil, &ParseError{f, "bad WKS Adress", l}
}
<-c // _BLANK
l = <-c
proto := "tcp"
if i, e := strconv.Atoi(l.token); e != nil {
return nil, &ParseError{f, "bad WKS Protocol", l}
} else {
rr.Protocol = uint8(i)
switch rr.Protocol {
case 17:
proto = "udp"
case 6:
proto = "tcp"
default:
return nil, &ParseError{f, "bad WKS Protocol", l}
}
}
<-c
l = <-c
rr.BitMap = make([]uint16, 0)
var (
k int
err error
)
for l.value != _NEWLINE && l.value != _EOF {
switch l.value {
case _BLANK:
// Ok
case _STRING:
if k, err = net.LookupPort(proto, l.token); err != nil {
if i, e := strconv.Atoi(l.token); e != nil { // If a number use that
rr.BitMap = append(rr.BitMap, uint16(i))
} else {
return nil, &ParseError{f, "bad WKS BitMap", l}
}
}
rr.BitMap = append(rr.BitMap, uint16(k))
default:
return nil, &ParseError{f, "bad WKS BitMap", l}
}
l = <-c
}
return rr, nil
}
func setSSHFP(h RR_Header, c chan lex, f string) (RR, *ParseError) {
rr := new(RR_SSHFP)
rr.Hdr = h