diff --git a/dns.go b/dns.go index 0086866f..8deaf0a1 100644 --- a/dns.go +++ b/dns.go @@ -124,7 +124,7 @@ type Exchange struct { // There are many types of messages, // but they all share the same header. type RR_Header struct { - Name string "cdomain-name" + Name string `dns:"cdomain-name"` Rrtype uint16 Class uint16 Ttl uint32 diff --git a/dnssec.go b/dnssec.go index 6c3612c0..360eeb49 100644 --- a/dnssec.go +++ b/dnssec.go @@ -81,7 +81,7 @@ type rrsigWireFmt struct { Expiration uint32 Inception uint32 KeyTag uint16 - SignerName string "domain-name" + SignerName string `dns:"domain-name"` /* No Signature */ } @@ -90,7 +90,7 @@ type dnskeyWireFmt struct { Flags uint16 Protocol uint8 Algorithm uint8 - PublicKey string "base64" + PublicKey string `dns:"base64"` /* Nothing is left out */ } diff --git a/edns.go b/edns.go index 0ab762b8..4191057f 100644 --- a/edns.go +++ b/edns.go @@ -17,7 +17,7 @@ const ( // An ENDS0 option rdata element. type Option struct { Code uint16 - Data string "hex" + Data string `dns:"hex"` } /* @@ -34,7 +34,7 @@ type Option struct { type RR_OPT struct { Hdr RR_Header - Option []Option "opt" // tag is used in Pack and Unpack + Option []Option `dns:"opt"` // tag is used in Pack and Unpack } func (rr *RR_OPT) Header() *RR_Header { @@ -126,6 +126,7 @@ func (rr *RR_OPT) Nsid() string { return "NSID: " + rr.Option[i].Data } } + // TODO: error or nil string? return "Not found" } diff --git a/msg.go b/msg.go index 2da1b391..219db803 100644 --- a/msg.go +++ b/msg.go @@ -371,9 +371,9 @@ func packStructValue(val reflect.Value, msg []byte, off int, compression map[str default: return lenmsg, false case reflect.Slice: - switch val.Type().Field(i).Tag { + switch val.Type().Field(i).Tag.Get("dns") { default: - println("dns: unknown tag packing slice", val.Type().Field(i).Tag) + println("dns: unknown tag packing slice", val.Type().Field(i).Tag.Get("dns"), '"', val.Type().Field(i).Tag , '"') return lenmsg, false case "domain-name": for j := 0; j < val.Field(i).Len(); j++ { @@ -550,7 +550,7 @@ func packStructValue(val reflect.Value, msg []byte, off int, compression map[str // There are multiple string encodings. // The tag distinguishes ordinary strings from domain names. s := fv.String() - switch val.Type().Field(i).Tag { + switch val.Type().Field(i).Tag.Get("dns") { default: return lenmsg, false case "base64": @@ -562,14 +562,12 @@ func packStructValue(val reflect.Value, msg []byte, off int, compression map[str copy(msg[off:off+len(b64)], b64) off += len(b64) case "domain-name": - fallthrough // No compression - case "cdomain-name": - if val.Type().Field(i).Tag == "cdomain-name" { - off, ok = PackDomainName(s, msg, off, compression, true && compress) - } else { - off, ok = PackDomainName(s, msg, off, compression, false && compress) + if off, ok = PackDomainName(s, msg, off, compression, false && compress); !ok { + println("dns: overflow packing domain-name", off) + return lenmsg, false } - if !ok { + case "cdomain-name": + if off, ok = PackDomainName(s, msg, off, compression, true && compress); !ok { println("dns: overflow packing domain-name", off) return lenmsg, false } @@ -653,7 +651,7 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok boo println("dns: unknown case unpacking struct") return lenmsg, false case reflect.Slice: - switch val.Type().Field(i).Tag { + switch val.Type().Field(i).Tag.Get("dns") { default: println("dns: unknown tag unpacking slice", val.Type().Field(i).Tag) return lenmsg, false @@ -820,7 +818,7 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok boo off += 6 case reflect.String: var s string - switch val.Type().Field(i).Tag { + switch val.Type().Field(i).Tag.Get("dns") { default: println("dns: unknown tag unpacking string") return lenmsg, false @@ -832,7 +830,7 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok boo println("dns: overflow when unpacking hex string") return lenmsg, false } - s = hex.EncodeToString(msg[off : endrr]) + s = hex.EncodeToString(msg[off:endrr]) off = endrr case "base64": // Rest of the RR is base64 encoded value @@ -842,7 +840,7 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok boo println("dns: failure unpacking base64") return lenmsg, false } - s = unpackBase64(msg[off : endrr]) + s = unpackBase64(msg[off:endrr]) off = endrr case "cdomain-name": fallthrough diff --git a/nsecx.go b/nsecx.go index f486d7e7..684fb86b 100644 --- a/nsecx.go +++ b/nsecx.go @@ -14,7 +14,7 @@ const ( ) type saltWireFmt struct { - Salt string "size-hex" + Salt string `dns:"size-hex"` } // HashName hashes a string (label) according to RFC5155. It returns the hashed string. diff --git a/tsig.go b/tsig.go index db09b2ec..8bac6d21 100644 --- a/tsig.go +++ b/tsig.go @@ -72,15 +72,15 @@ const ( // RFC 2845. type RR_TSIG struct { Hdr RR_Header - Algorithm string "domain-name" + Algorithm string `dns:"domain-name"` TimeSigned uint64 Fudge uint16 MACSize uint16 - MAC string "size-hex" + MAC string `dns:"size-hex"` OrigId uint16 Error uint16 OtherLen uint16 - OtherData string "size-hex" + OtherData string `dns:"size-hex"` } func (rr *RR_TSIG) Header() *RR_Header { @@ -112,24 +112,24 @@ func (rr *RR_TSIG) Len() int { // RFC 2845, section 3.4.2. TSIG Variables. type tsigWireFmt struct { // From RR_Header - Name string "domain-name" + Name string `dns:"domain-name"` Class uint16 Ttl uint32 // Rdata of the TSIG - Algorithm string "domain-name" + Algorithm string `dns:"domain-name"` TimeSigned uint64 Fudge uint16 // MACSize, MAC and OrigId excluded Error uint16 OtherLen uint16 - OtherData string "size-hex" + OtherData string `dns:"size-hex"` } // If we have the MAC use this type to convert it to wiredata. // Section 3.4.3. Request MAC type macWireFmt struct { MACSize uint16 - MAC string "size-hex" + MAC string `dns:"size-hex"` } // 3.3. Time values used in TSIG calculations diff --git a/types.go b/types.go index ced0c9f1..edea7f75 100644 --- a/types.go +++ b/types.go @@ -129,7 +129,7 @@ const ( // DNS queries. type Question struct { - Name string "cdomain-name" // "cdomain-name" specifies encoding (and may be compressed) + Name string `dns:"cdomain-name"` // "cdomain-name" specifies encoding (and may be compressed) Qtype uint16 Qclass uint16 } @@ -179,7 +179,7 @@ func (rr *RR_ANY) Len() int { type RR_CNAME struct { Hdr RR_Header - Target string "cdomain-name" + Target string `dns:"cdomain-name"` } func (rr *RR_CNAME) Header() *RR_Header { @@ -215,7 +215,7 @@ func (rr *RR_HINFO) Len() int { type RR_MB struct { Hdr RR_Header - Mb string "cdomain-name" + Mb string `dns:"cdomain-name"` } func (rr *RR_MB) Header() *RR_Header { @@ -233,7 +233,7 @@ func (rr *RR_MB) Len() int { type RR_MG struct { Hdr RR_Header - Mg string "cdomain-name" + Mg string `dns:"cdomain-name"` } func (rr *RR_MG) Header() *RR_Header { @@ -251,8 +251,8 @@ func (rr *RR_MG) Len() int { type RR_MINFO struct { Hdr RR_Header - Rmail string "cdomain-name" - Email string "cdomain-name" + Rmail string `dns:"cdomain-name"` + Email string `dns:"cdomain-name"` } func (rr *RR_MINFO) Header() *RR_Header { @@ -271,7 +271,7 @@ func (rr *RR_MINFO) Len() int { type RR_MR struct { Hdr RR_Header - Mr string "cdomain-name" + Mr string `dns:"cdomain-name"` } func (rr *RR_MR) Header() *RR_Header { @@ -290,7 +290,7 @@ func (rr *RR_MR) Len() int { type RR_MX struct { Hdr RR_Header Pref uint16 - Mx string "cdomain-name" + Mx string `dns:"cdomain-name"` } func (rr *RR_MX) Header() *RR_Header { @@ -308,7 +308,7 @@ func (rr *RR_MX) Len() int { type RR_NS struct { Hdr RR_Header - Ns string "cdomain-name" + Ns string `dns:"cdomain-name"` } func (rr *RR_NS) Header() *RR_Header { @@ -326,7 +326,7 @@ func (rr *RR_NS) Len() int { type RR_PTR struct { Hdr RR_Header - Ptr string "cdomain-name" + Ptr string `dns:"cdomain-name"` } func (rr *RR_PTR) Header() *RR_Header { @@ -344,8 +344,8 @@ func (rr *RR_PTR) Len() int { type RR_SOA struct { Hdr RR_Header - Ns string "cdomain-name" - Mbox string "cdomain-name" + Ns string `dns:"cdomain-name"` + Mbox string `dns:"cdomain-name"` Serial uint32 Refresh uint32 Retry uint32 @@ -374,7 +374,7 @@ func (rr *RR_SOA) Len() int { type RR_TXT struct { Hdr RR_Header - Txt []string "txt" + Txt []string `dns:"txt"` } func (rr *RR_TXT) Header() *RR_Header { @@ -403,7 +403,7 @@ func (rr *RR_TXT) Len() int { type RR_SPF struct { Hdr RR_Header - Txt []string "txt" + Txt []string `dns:"txt"` } func (rr *RR_SPF) Header() *RR_Header { @@ -435,7 +435,7 @@ type RR_SRV struct { Priority uint16 Weight uint16 Port uint16 - Target string "domain-name" + Target string `dns:"domain-name"` } func (rr *RR_SRV) Header() *RR_Header { @@ -461,7 +461,7 @@ type RR_NAPTR struct { Flags string Service string Regexp string - Replacement string "domain-name" + Replacement string `dns:"domain-name"` } func (rr *RR_NAPTR) Header() *RR_Header { @@ -489,7 +489,7 @@ type RR_CERT struct { Type uint16 KeyTag uint16 Algorithm uint8 - Certificate string "base64" + Certificate string `dns:"base64"` } func (rr *RR_CERT) Header() *RR_Header { @@ -511,7 +511,7 @@ func (rr *RR_CERT) Len() int { // See RFC 2672. type RR_DNAME struct { Hdr RR_Header - Target string "domain-name" + Target string `dns:"domain-name"` } func (rr *RR_DNAME) Header() *RR_Header { @@ -529,7 +529,7 @@ func (rr *RR_DNAME) Len() int { type RR_A struct { Hdr RR_Header - A net.IP "a" + A net.IP `dns:"a"` } func (rr *RR_A) Header() *RR_Header { @@ -546,7 +546,7 @@ func (rr *RR_A) Len() int { type RR_AAAA struct { Hdr RR_Header - AAAA net.IP "aaaa" + AAAA net.IP `dns:"aaaa"` } func (rr *RR_AAAA) Header() *RR_Header { @@ -593,8 +593,8 @@ type RR_RRSIG struct { Expiration uint32 Inception uint32 KeyTag uint16 - SignerName string "domain-name" - Signature string "base64" + SignerName string `dns:"domain-name"` + Signature string `dns:"base64"` } func (rr *RR_RRSIG) Header() *RR_Header { @@ -620,8 +620,8 @@ func (rr *RR_RRSIG) Len() int { type RR_NSEC struct { Hdr RR_Header - NextDomain string "domain-name" - TypeBitMap []uint16 "nsec" + NextDomain string `dns:"domain-name"` + TypeBitMap []uint16 `dns:"nsec"` } func (rr *RR_NSEC) Header() *RR_Header { @@ -651,7 +651,7 @@ type RR_DS struct { KeyTag uint16 Algorithm uint8 DigestType uint8 - Digest string "hex" + Digest string `dns:"hex"` } func (rr *RR_DS) Header() *RR_Header { @@ -674,7 +674,7 @@ type RR_DLV struct { KeyTag uint16 Algorithm uint8 DigestType uint8 - Digest string "hex" + Digest string `dns:"hex"` } func (rr *RR_DLV) Header() *RR_Header { @@ -695,7 +695,7 @@ func (rr *RR_DLV) Len() int { type RR_KX struct { Hdr RR_Header Preference uint16 - Exchanger string "domain-name" + Exchanger string `dns:"domain-name"` } func (rr *RR_KX) Header() *RR_Header { @@ -716,7 +716,7 @@ type RR_TA struct { KeyTag uint16 Algorithm uint8 DigestType uint8 - Digest string "hex" + Digest string `dns:"hex"` } func (rr *RR_TA) Header() *RR_Header { @@ -736,8 +736,8 @@ func (rr *RR_TA) Len() int { type RR_TALINK struct { Hdr RR_Header - PreviousName string "domain" - NextName string "domain" + PreviousName string `dns:"domain"` + NextName string `dns:"domain"` } func (rr *RR_TALINK) Header() *RR_Header { @@ -757,7 +757,7 @@ type RR_SSHFP struct { Hdr RR_Header Algorithm uint8 Type uint8 - FingerPrint string "hex" + FingerPrint string `dns:"hex"` } func (rr *RR_SSHFP) Header() *RR_Header { @@ -779,8 +779,8 @@ type RR_IPSECKEY struct { Precedence uint8 GatewayType uint8 Algorithm uint8 - Gateway string "ipseckey" - PublicKey string "base64" + Gateway string `dns:"ipseckey"` + PublicKey string `dns:"base64"` } func (rr *RR_IPSECKEY) Header() *RR_Header { @@ -805,7 +805,7 @@ type RR_DNSKEY struct { Flags uint16 Protocol uint8 Algorithm uint8 - PublicKey string "base64" + PublicKey string `dns:"base64"` } func (rr *RR_DNSKEY) Header() *RR_Header { @@ -830,10 +830,10 @@ type RR_NSEC3 struct { Flags uint8 Iterations uint16 SaltLength uint8 - Salt string "size-hex" + Salt string `dns:"size-hex"` HashLength uint8 - NextDomain string "size-base32" - TypeBitMap []uint16 "nsec" + NextDomain string `dns:"size-base32"` + TypeBitMap []uint16 `dns:"nsec"` } func (rr *RR_NSEC3) Header() *RR_Header { @@ -868,7 +868,7 @@ type RR_NSEC3PARAM struct { Flags uint8 Iterations uint16 SaltLength uint8 - Salt string "hex" // hexsize?? + Salt string `dns:"hex"` // hexsize?? } func (rr *RR_NSEC3PARAM) Header() *RR_Header { @@ -890,7 +890,7 @@ func (rr *RR_NSEC3PARAM) Len() int { type RR_TKEY struct { Hdr RR_Header - Algorithm string "domain-name" + Algorithm string `dns:"domain-name"` Inception uint32 Expiration uint32 Mode uint16 @@ -918,7 +918,7 @@ func (rr *RR_TKEY) Len() int { // Unknown RR representation type RR_RFC3597 struct { Hdr RR_Header - Rdata string "hex" + Rdata string `dns:"hex"` } func (rr *RR_RFC3597) Header() *RR_Header { @@ -939,7 +939,7 @@ type RR_URI struct { Hdr RR_Header Priority uint16 Weight uint16 - Target string "txt" + Target string `dns:"txt"` } func (rr *RR_URI) Header() *RR_Header { @@ -958,7 +958,7 @@ func (rr *RR_URI) Len() int { type RR_DHCID struct { Hdr RR_Header - Digest string "base64" + Digest string `dns:"base64"` } func (rr *RR_DHCID) Header() *RR_Header { @@ -979,7 +979,7 @@ type RR_TLSA struct { Usage uint8 Selector uint8 MatchingType uint8 - Certificate string "hex" + Certificate string `dns:"hex"` } func (rr *RR_TLSA) Header() *RR_Header { @@ -1003,9 +1003,9 @@ type RR_HIP struct { HitLength uint8 PublicKeyAlgorithm uint8 PublicKeyLength uint16 - Hit string "hex" - PublicKey string "base64" - RendezvousServers []string "domain-name" + Hit string `dns:"hex"` + PublicKey string `dns:"base64"` + RendezvousServers []string `dns:"domain-name"` } func (rr *RR_HIP) Header() *RR_Header {