diff options
author | Pablo Mazzini <pmazzini@gmail.com> | 2018-10-16 11:33:18 +0100 |
---|---|---|
committer | insomniac <insomniacslk@users.noreply.github.com> | 2018-10-16 11:33:18 +0100 |
commit | 5a743fadfa9e98fdca5deaef45e1114b273981ab (patch) | |
tree | 5083983290a73515c990e974322ccecbbfe441ca /dhcpv6/option_iaprefix.go | |
parent | 12c15033719dec9aa6415b3c0e25c1fcd97cba42 (diff) |
OptIAPrefix: sub-options (#177)
Diffstat (limited to 'dhcpv6/option_iaprefix.go')
-rw-r--r-- | dhcpv6/option_iaprefix.go | 80 |
1 files changed, 40 insertions, 40 deletions
diff --git a/dhcpv6/option_iaprefix.go b/dhcpv6/option_iaprefix.go index 1f68789..8a39531 100644 --- a/dhcpv6/option_iaprefix.go +++ b/dhcpv6/option_iaprefix.go @@ -10,11 +10,11 @@ import ( ) type OptIAPrefix struct { - preferredLifetime uint32 - validLifetime uint32 + PreferredLifetime uint32 + ValidLifetime uint32 prefixLength byte - ipv6Prefix [16]byte - options []byte + ipv6Prefix net.IP + Options []Option } func (op *OptIAPrefix) Code() OptionCode { @@ -25,30 +25,16 @@ func (op *OptIAPrefix) ToBytes() []byte { buf := make([]byte, 12) binary.BigEndian.PutUint16(buf[0:2], uint16(OptionIAPrefix)) binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - binary.BigEndian.PutUint32(buf[4:8], op.preferredLifetime) - binary.BigEndian.PutUint32(buf[8:12], op.validLifetime) + binary.BigEndian.PutUint32(buf[4:8], op.PreferredLifetime) + binary.BigEndian.PutUint32(buf[8:12], op.ValidLifetime) buf = append(buf, op.prefixLength) - buf = append(buf, op.ipv6Prefix[:]...) - buf = append(buf, op.options...) + buf = append(buf, op.ipv6Prefix...) + for _, opt := range op.Options { + buf = append(buf, opt.ToBytes()...) + } return buf } -func (op *OptIAPrefix) PreferredLifetime() uint32 { - return op.preferredLifetime -} - -func (op *OptIAPrefix) SetPreferredLifetime(pl uint32) { - op.preferredLifetime = pl -} - -func (op *OptIAPrefix) ValidLifetime() uint32 { - return op.validLifetime -} - -func (op *OptIAPrefix) SetValidLifetime(vl uint32) { - op.validLifetime = vl -} - func (op *OptIAPrefix) PrefixLength() byte { return op.prefixLength } @@ -57,42 +43,56 @@ func (op *OptIAPrefix) SetPrefixLength(pl byte) { op.prefixLength = pl } -func (op *OptIAPrefix) IPv6Prefix() []byte { - return op.ipv6Prefix[:] +// IPv6Prefix returns the ipv6Prefix +func (op *OptIAPrefix) IPv6Prefix() net.IP { + return op.ipv6Prefix } -func (op *OptIAPrefix) SetIPv6Prefix(p [16]byte) { +// SetIPv6Prefix sets the ipv6Prefix +func (op *OptIAPrefix) SetIPv6Prefix(p net.IP) { op.ipv6Prefix = p } -func (op *OptIAPrefix) Options() []byte { - return op.options +// Length returns the option length +func (op *OptIAPrefix) Length() int { + opLen := 25 + for _, opt := range op.Options { + opLen += 4 + opt.Length() + } + return opLen } -func (op *OptIAPrefix) SetOptions(options []byte) { - op.options = options +func (op *OptIAPrefix) String() string { + return fmt.Sprintf("OptIAPrefix{preferredlifetime=%v, validlifetime=%v, prefixlength=%v, ipv6prefix=%v, options=%v}", + op.PreferredLifetime, op.ValidLifetime, op.PrefixLength(), op.IPv6Prefix(), op.Options) } -func (op *OptIAPrefix) Length() int { - return 25 + len(op.options) +// GetOneOption will get an option of the give type from the Options field, if +// it is present. It will return `nil` otherwise +func (op *OptIAPrefix) GetOneOption(code OptionCode) Option { + return getOption(op.Options, code) } -func (op *OptIAPrefix) String() string { - return fmt.Sprintf("OptIAPrefix{preferredlifetime=%v, validlifetime=%v, prefixlength=%v, ipv6prefix=%v, options=%v}", - op.preferredLifetime, op.validLifetime, op.prefixLength, net.IP(op.ipv6Prefix[:]), op.options) +// DelOption will remove all the options that match a Option code. +func (op *OptIAPrefix) DelOption(code OptionCode) { + op.Options = delOption(op.Options, code) } // build an OptIAPrefix structure from a sequence of bytes. // The input data does not include option code and length bytes. func ParseOptIAPrefix(data []byte) (*OptIAPrefix, error) { + var err error opt := OptIAPrefix{} if len(data) < 25 { return nil, fmt.Errorf("Invalid IA for Prefix Delegation data length. Expected at least 25 bytes, got %v", len(data)) } - opt.preferredLifetime = binary.BigEndian.Uint32(data[:4]) - opt.validLifetime = binary.BigEndian.Uint32(data[4:8]) + opt.PreferredLifetime = binary.BigEndian.Uint32(data[:4]) + opt.ValidLifetime = binary.BigEndian.Uint32(data[4:8]) opt.prefixLength = data[8] - copy(opt.ipv6Prefix[:], data[9:25]) - copy(opt.options, data[25:]) + opt.ipv6Prefix = net.IP(data[9:25]) + opt.Options, err = OptionsFromBytes(data[25:]) + if err != nil { + return nil, err + } return &opt, nil } |