Fix the OPT RR Version get code and simplify DO get/set
This commit is contained in:
parent
45e66bfe1d
commit
43fe5fb12c
33
edns.go
33
edns.go
|
@ -35,16 +35,16 @@ import (
|
||||||
|
|
||||||
// EDNS0 Option codes.
|
// EDNS0 Option codes.
|
||||||
const (
|
const (
|
||||||
EDNS0LLQ = 0x1 // long lived queries: http://tools.ietf.org/html/draft-sekar-dns-llq-01
|
EDNS0LLQ = 0x1 // long lived queries: http://tools.ietf.org/html/draft-sekar-dns-llq-01
|
||||||
EDNS0UL = 0x2 // update lease draft: http://files.dns-sd.org/draft-sekar-dns-ul.txt
|
EDNS0UL = 0x2 // update lease draft: http://files.dns-sd.org/draft-sekar-dns-ul.txt
|
||||||
EDNS0NSID = 0x3 // nsid (RFC5001)
|
EDNS0NSID = 0x3 // nsid (RFC5001)
|
||||||
EDNS0DAU = 0x5 // DNSSEC Algorithm Understood
|
EDNS0DAU = 0x5 // DNSSEC Algorithm Understood
|
||||||
EDNS0DHU = 0x6 // DS Hash Understood
|
EDNS0DHU = 0x6 // DS Hash Understood
|
||||||
EDNS0N3U = 0x7 // NSEC3 Hash Understood
|
EDNS0N3U = 0x7 // NSEC3 Hash Understood
|
||||||
EDNS0SUBNET = 0x8 // client-subnet (RFC6891)
|
EDNS0SUBNET = 0x8 // client-subnet (RFC6891)
|
||||||
EDNS0EXPIRE = 0x9 // EDNS0 expire
|
EDNS0EXPIRE = 0x9 // EDNS0 expire
|
||||||
EDNS0SUBNETDRAFT = 0x50fa // Don't use! Use EDNS0SUBNET
|
EDNS0SUBNETDRAFT = 0x50fa // Don't use! Use EDNS0SUBNET
|
||||||
_DO = 1 << 7 // dnssec ok
|
_DO = 1 << 15 // dnssec ok
|
||||||
)
|
)
|
||||||
|
|
||||||
type OPT struct {
|
type OPT struct {
|
||||||
|
@ -114,12 +114,12 @@ func (rr *OPT) copy() RR {
|
||||||
|
|
||||||
// Version returns the EDNS version used. Only zero is defined.
|
// Version returns the EDNS version used. Only zero is defined.
|
||||||
func (rr *OPT) Version() uint8 {
|
func (rr *OPT) Version() uint8 {
|
||||||
return uint8(rr.Hdr.Ttl & 0x00FF00FFFF)
|
return uint8((rr.Hdr.Ttl & 0x00FF0000) >> 16)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetVersion sets the version of EDNS. This is usually zero.
|
// SetVersion sets the version of EDNS. This is usually zero.
|
||||||
func (rr *OPT) SetVersion(v uint8) {
|
func (rr *OPT) SetVersion(v uint8) {
|
||||||
rr.Hdr.Ttl = rr.Hdr.Ttl&0xFF00FFFF | uint32(v)
|
rr.Hdr.Ttl = rr.Hdr.Ttl&0xFF00FFFF | (uint32(v) << 16)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UDPSize returns the UDP buffer size.
|
// UDPSize returns the UDP buffer size.
|
||||||
|
@ -134,17 +134,12 @@ func (rr *OPT) SetUDPSize(size uint16) {
|
||||||
|
|
||||||
// Do returns the value of the DO (DNSSEC OK) bit.
|
// Do returns the value of the DO (DNSSEC OK) bit.
|
||||||
func (rr *OPT) Do() bool {
|
func (rr *OPT) Do() bool {
|
||||||
return byte(rr.Hdr.Ttl>>8)&_DO == _DO
|
return rr.Hdr.Ttl&_DO == _DO
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetDo sets the DO (DNSSEC OK) bit.
|
// SetDo sets the DO (DNSSEC OK) bit.
|
||||||
func (rr *OPT) SetDo() {
|
func (rr *OPT) SetDo() {
|
||||||
b1 := byte(rr.Hdr.Ttl >> 24)
|
rr.Hdr.Ttl |= _DO
|
||||||
b2 := byte(rr.Hdr.Ttl >> 16)
|
|
||||||
b3 := byte(rr.Hdr.Ttl >> 8)
|
|
||||||
b4 := byte(rr.Hdr.Ttl)
|
|
||||||
b3 |= _DO // Set it
|
|
||||||
rr.Hdr.Ttl = uint32(b1)<<24 | uint32(b2)<<16 | uint32(b3)<<8 | uint32(b4)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// EDNS0 defines an EDNS0 Option. An OPT RR can have multiple options appended to
|
// EDNS0 defines an EDNS0 Option. An OPT RR can have multiple options appended to
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
package dns
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestOPTTtl(t *testing.T) {
|
||||||
|
e := &OPT{}
|
||||||
|
e.Hdr.Name = "."
|
||||||
|
e.Hdr.Rrtype = TypeOPT
|
||||||
|
|
||||||
|
if e.Do() {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
e.SetDo()
|
||||||
|
if !e.Do() {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
oldTtl := e.Hdr.Ttl
|
||||||
|
|
||||||
|
if e.Version() != 0 {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
e.SetVersion(42)
|
||||||
|
if e.Version() != 42 {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
e.SetVersion(0)
|
||||||
|
if e.Hdr.Ttl != oldTtl {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue