diff options
Diffstat (limited to 'dhcpv6/option_prefixdelegation.go')
-rw-r--r-- | dhcpv6/option_prefixdelegation.go | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/dhcpv6/option_prefixdelegation.go b/dhcpv6/option_prefixdelegation.go index ecc7990..6cc22fd 100644 --- a/dhcpv6/option_prefixdelegation.go +++ b/dhcpv6/option_prefixdelegation.go @@ -6,19 +6,22 @@ package dhcpv6 import ( "encoding/binary" "fmt" + "log" ) type OptIAForPrefixDelegation struct { iaId [4]byte t1 uint32 t2 uint32 - options []byte + options []Option } +// Code returns the option code func (op *OptIAForPrefixDelegation) Code() OptionCode { return OptionIAPD } +// ToBytes serializes the option and returns it as a sequence of bytes func (op *OptIAForPrefixDelegation) ToBytes() []byte { buf := make([]byte, 16) binary.BigEndian.PutUint16(buf[0:2], uint16(OptionIAPD)) @@ -26,54 +29,89 @@ func (op *OptIAForPrefixDelegation) ToBytes() []byte { copy(buf[4:8], op.iaId[:]) binary.BigEndian.PutUint32(buf[8:12], op.t1) binary.BigEndian.PutUint32(buf[12:16], op.t2) - buf = append(buf, op.options...) + for _, opt := range op.options { + buf = append(buf, opt.ToBytes()...) + } return buf } +// IAID returns the identity association identifier for this option func (op *OptIAForPrefixDelegation) IAID() []byte { return op.iaId[:] } +// SetIAID sets the identity association identifier for this option func (op *OptIAForPrefixDelegation) SetIAID(iaId [4]byte) { op.iaId = iaId } +// T1 returns the T1 timer for this option func (op *OptIAForPrefixDelegation) T1() uint32 { return op.t1 } +// SetT1 sets the T1 timer for this option func (op *OptIAForPrefixDelegation) SetT1(t1 uint32) { op.t1 = t1 } +// T2 returns the T2 timer for this option func (op *OptIAForPrefixDelegation) T2() uint32 { return op.t2 } +// SetT2 sets the T2 timer for this option func (op *OptIAForPrefixDelegation) SetT2(t2 uint32) { op.t2 = t2 } +// Options serializes the options and returns them as a sequence of bytes func (op *OptIAForPrefixDelegation) Options() []byte { - return op.options + log.Printf("Warning: OptIAForPrefixDelegation.Options() is deprecated and will be changed to a public field") + buf := op.ToBytes() + return buf[16:] } -func (op *OptIAForPrefixDelegation) SetOptions(options []byte) { - op.options = options +// SetOptions sets the options as a sequence of bytes +func (op *OptIAForPrefixDelegation) SetOptions(options []byte) error { + var err error + op.options, err = OptionsFromBytes(options) + if err != nil { + return err + } + return nil } +// Length returns the option length func (op *OptIAForPrefixDelegation) Length() int { - return 12 + len(op.options) + l := 12 + for _, opt := range op.options { + l += 4 + opt.Length() + } + return l } +// String returns a string representation of the OptIAForPrefixDelegation data func (op *OptIAForPrefixDelegation) String() string { return fmt.Sprintf("OptIAForPrefixDelegation{IAID=%v, t1=%v, t2=%v, options=%v}", op.iaId, op.t1, op.t2, 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 *OptIAForPrefixDelegation) GetOneOption(code OptionCode) Option { + return getOption(op.options, code) +} + +// DelOption will remove all the options that match a Option code. +func (op *OptIAForPrefixDelegation) DelOption(code OptionCode) { + op.options = delOption(op.options, code) +} + // build an OptIAForPrefixDelegation structure from a sequence of bytes. // The input data does not include option code and length bytes. func ParseOptIAForPrefixDelegation(data []byte) (*OptIAForPrefixDelegation, error) { + var err error opt := OptIAForPrefixDelegation{} if len(data) < 12 { return nil, fmt.Errorf("Invalid IA for Prefix Delegation data length. Expected at least 12 bytes, got %v", len(data)) @@ -81,6 +119,9 @@ func ParseOptIAForPrefixDelegation(data []byte) (*OptIAForPrefixDelegation, erro copy(opt.iaId[:], data[:4]) opt.t1 = binary.BigEndian.Uint32(data[4:8]) opt.t2 = binary.BigEndian.Uint32(data[8:12]) - opt.options = append(opt.options, data[12:]...) + opt.options, err = OptionsFromBytes(data[12:]) + if err != nil { + return nil, err + } return &opt, nil } |