diff options
Diffstat (limited to 'dhcpv6')
-rw-r--r-- | dhcpv6/option_iaprefix.go | 8 | ||||
-rw-r--r-- | dhcpv6/option_iaprefix_test.go | 52 |
2 files changed, 56 insertions, 4 deletions
diff --git a/dhcpv6/option_iaprefix.go b/dhcpv6/option_iaprefix.go index b4adacb..57810b1 100644 --- a/dhcpv6/option_iaprefix.go +++ b/dhcpv6/option_iaprefix.go @@ -22,7 +22,7 @@ func (op *OptIAPrefix) Code() OptionCode { } func (op *OptIAPrefix) ToBytes() []byte { - buf := make([]byte, 25) + buf := make([]byte, 12) binary.BigEndian.PutUint16(buf[0:2], uint16(OPTION_IAPREFIX)) binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) binary.BigEndian.PutUint32(buf[4:8], op.preferredLifetime) @@ -91,8 +91,8 @@ func ParseOptIAPrefix(data []byte) (*OptIAPrefix, error) { } opt.preferredLifetime = binary.BigEndian.Uint32(data[:4]) opt.validLifetime = binary.BigEndian.Uint32(data[4:8]) - opt.prefixLength = data[9] - copy(opt.ipv6Prefix[:], data[9:17]) - copy(opt.options, data[17:]) + opt.prefixLength = data[8] + copy(opt.ipv6Prefix[:], data[9:25]) + copy(opt.options, data[25:]) return &opt, nil } diff --git a/dhcpv6/option_iaprefix_test.go b/dhcpv6/option_iaprefix_test.go new file mode 100644 index 0000000..caabc75 --- /dev/null +++ b/dhcpv6/option_iaprefix_test.go @@ -0,0 +1,52 @@ +package dhcpv6 + +import ( + "bytes" + "net" + "testing" +) + +func TestOptIAPrefix(t *testing.T) { + buf := []byte{ + 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime + 0xee, 0xff, 0x00, 0x11, // validLifetime + 36, // prefixLength + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // ipv6Prefix + } + opt, err := ParseOptIAPrefix(buf) + if err != nil { + t.Fatal(err) + } + if pl := opt.PreferredLifetime(); pl != 0xaabbccdd { + t.Fatalf("Invalid Preferred Lifetime. Expected 0xaabbccdd, got %v", pl) + } + if vl := opt.ValidLifetime(); vl != 0xeeff0011 { + t.Fatalf("Invalid Valid Lifetime. Expected 0xeeff0011, got %v", vl) + } + if pr := opt.PrefixLength(); pr != 36 { + t.Fatalf("Invalid Prefix Length. Expected 36, got %v", pr) + } + if ip := opt.IPv6Prefix(); !bytes.Equal(ip, net.IPv6loopback) { + t.Fatalf("Invalid Prefix Length. Expected %v, got %v", net.IPv6loopback, ip) + } +} + +func TestOptIAPrefixToBytes(t *testing.T) { + buf := []byte{ + 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime + 0xee, 0xff, 0x00, 0x11, // validLifetime + 36, // prefixLength + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ipv6Prefix + } + expected := []byte{00, 26, 00, byte(len(buf))} + expected = append(expected, buf...) + opt := OptIAPrefix{ + preferredLifetime: 0xaabbccdd, + validLifetime: 0xeeff0011, + prefixLength: 36, + } + toBytes := opt.ToBytes() + if !bytes.Equal(toBytes, expected) { + t.Fatalf("Invalid ToBytes result. Expected %v, got %v", expected, toBytes) + } +} |