Support the WKS record
This commit is contained in:
parent
fb0623fbb2
commit
89ec077d8f
37
msg.go
37
msg.go
|
@ -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())
|
||||
|
|
10
types.go
10
types.go
|
@ -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
|
||||
}
|
||||
|
|
57
zscan_rr.go
57
zscan_rr.go
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue