diff --git a/msg.go b/msg.go index afeb3665..7a489878 100644 --- a/msg.go +++ b/msg.go @@ -129,6 +129,8 @@ var TypeToString = map[uint16]string{ TypeL32: "L32", TypeL64: "L64", TypeLP: "LP", + TypeEUI48: "EUI48", + TypeEUI64: "EUI64", TypeTKEY: "TKEY", // Meta RR TypeTSIG: "TSIG", // Meta RR TypeAXFR: "AXFR", // Meta RR diff --git a/parse_test.go b/parse_test.go index 3008cddb..a40f5cfc 100644 --- a/parse_test.go +++ b/parse_test.go @@ -738,3 +738,21 @@ foo. IN TXT "THIS IS TEXT MAN"; this is comment 8 } } } + +func TestEUIxx(t *testing.T) { + tests := map[string]string{ + "host.example. IN EUI48 00-00-5e-90-01-2a": "host.example.\t3600\tIN\tEUI48\t00-00-5e-90-01-2a", + "host.example. IN EUI64 00-00-5e-ef-00-00-00-2a": "host.example.\t3600\tIN\tEUI64\t00-00-5e-ef-00-00-00-2a", + } + for i, o := range tests { + r, e := NewRR(i) + if e != nil { + t.Logf("Failed to parse %s: %s\n", i, e.Error()) + t.Fail() + } + if r.String() != o { + t.Logf("Want %s, got %s\n", o, r.String()) + t.Fail() + } + } +} diff --git a/types.go b/types.go index bbde5bf8..eeb33aff 100644 --- a/types.go +++ b/types.go @@ -1384,8 +1384,7 @@ func (rr *EUI48) Header() *RR_Header { return &rr.Hdr } func (rr *EUI48) copy() RR { return &EUI48{*rr.Hdr.copyHeader(), rr.Address} } func (rr *EUI48) String() string { - s := rr.Hdr.String() + euiToString(rr.Address, 48) - return s + return rr.Hdr.String() + euiToString(rr.Address, 48) } func (rr *EUI48) len() int { @@ -1401,8 +1400,7 @@ func (rr *EUI64) Header() *RR_Header { return &rr.Hdr } func (rr *EUI64) copy() RR { return &EUI64{*rr.Hdr.copyHeader(), rr.Address} } func (rr *EUI64) String() string { - s := rr.Hdr.String() + euiToString(rr.Address, 64) - return s + return rr.Hdr.String() + euiToString(rr.Address, 64) } func (rr *EUI64) len() int { @@ -1465,13 +1463,13 @@ func cmToString(mantissa, exponent uint8) string { func euiToString(eui uint64, bits int) (hex string) { switch bits { case 64: - hex = strconv.FormatUint(eui, 16) - hex = hex[0:1] + "-" + hex[2:3] + "-" + hex[4:5] + "-" + hex[6:7] + - "-" + hex[8:9] + "-" + hex[10:11] + "-" + hex[12:13] + "-" + hex[14:15] + hex = fmt.Sprintf("%16.16x", eui) + hex = hex[0:2] + "-" + hex[2:4] + "-" + hex[4:6] + "-" + hex[6:8] + + "-" + hex[8:10] + "-" + hex[10:12] + "-" + hex[12:14] + "-" + hex[14:16] case 48: - hex = strconv.FormatUint(eui, 16) // shift here? - hex = hex[0:1] + "-" + hex[2:3] + "-" + hex[4:5] + "-" + hex[6:7] + - "-" + hex[8:9] + "-" + hex[10:11] + hex = fmt.Sprintf("%12.12x", eui) + hex = hex[0:2] + "-" + hex[2:4] + "-" + hex[4:6] + "-" + hex[6:8] + + "-" + hex[8:10] + "-" + hex[10:12] } return } diff --git a/zscan_rr.go b/zscan_rr.go index 3d984174..a1c46335 100644 --- a/zscan_rr.go +++ b/zscan_rr.go @@ -1287,7 +1287,7 @@ func setEUI48(h RR_Header, c chan lex, f string) (RR, *ParseError) { } addr := make([]byte, 12) dash := 0 - for i := 0; i < 12; i += 2 { + for i := 0; i < 10; i += 2 { addr[i] = l.token[i+dash] addr[i+1] = l.token[i+1+dash] dash++ @@ -1295,6 +1295,8 @@ func setEUI48(h RR_Header, c chan lex, f string) (RR, *ParseError) { return nil, &ParseError{f, "bad EUI48 Address", l} } } + addr[10] = l.token[15] + addr[11] = l.token[16] if i, e := strconv.ParseUint(string(addr), 16, 48); e != nil { return nil, &ParseError{f, "bad EUI48 Address", l} @@ -1314,7 +1316,7 @@ func setEUI64(h RR_Header, c chan lex, f string) (RR, *ParseError) { } addr := make([]byte, 16) dash := 0 - for i := 0; i < 16; i += 2 { + for i := 0; i < 14; i += 2 { addr[i] = l.token[i+dash] addr[i+1] = l.token[i+1+dash] dash++ @@ -1322,6 +1324,8 @@ func setEUI64(h RR_Header, c chan lex, f string) (RR, *ParseError) { return nil, &ParseError{f, "bad EUI64 Address", l} } } + addr[14] = l.token[21] + addr[15] = l.token[22] if i, e := strconv.ParseUint(string(addr), 16, 64); e != nil { return nil, &ParseError{f, "bad EUI68 Address", l}