summaryrefslogtreecommitdiffhomepage
path: root/dhcpv6/option_iaprefix.go
diff options
context:
space:
mode:
authorPablo Mazzini <pmazzini@gmail.com>2018-10-16 11:33:18 +0100
committerinsomniac <insomniacslk@users.noreply.github.com>2018-10-16 11:33:18 +0100
commit5a743fadfa9e98fdca5deaef45e1114b273981ab (patch)
tree5083983290a73515c990e974322ccecbbfe441ca /dhcpv6/option_iaprefix.go
parent12c15033719dec9aa6415b3c0e25c1fcd97cba42 (diff)
OptIAPrefix: sub-options (#177)
Diffstat (limited to 'dhcpv6/option_iaprefix.go')
-rw-r--r--dhcpv6/option_iaprefix.go80
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
}