diff options
author | Christopher Koch <c@chrisko.ch> | 2019-01-20 04:47:08 +0000 |
---|---|---|
committer | insomniac <insomniacslk@users.noreply.github.com> | 2019-01-26 23:34:26 +0000 |
commit | 3478513076477d0f19eaeaf441f29949a9f6bc92 (patch) | |
tree | 4d621abff002cef480901a2ef015620472293db3 /dhcpv6/option_requestedoption.go | |
parent | e62883f5b5683ae2259ad01b7ffbe20671deb6b2 (diff) |
dhcpv6: easier option parsing
- move option parsing to uio buffer library.
- move option code and length reading into FromBytes rather than
implementing it in each OptionParser.
Diffstat (limited to 'dhcpv6/option_requestedoption.go')
-rw-r--r-- | dhcpv6/option_requestedoption.go | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/dhcpv6/option_requestedoption.go b/dhcpv6/option_requestedoption.go index 0324642..7f345f4 100644 --- a/dhcpv6/option_requestedoption.go +++ b/dhcpv6/option_requestedoption.go @@ -1,14 +1,16 @@ package dhcpv6 -// This module defines the OptRequestedOption structure. -// https://www.ietf.org/rfc/rfc3315.txt - import ( - "encoding/binary" "fmt" "strings" + + "github.com/u-root/u-root/pkg/uio" ) +// OptRequestedOption implements the requested options option. +// +// This module defines the OptRequestedOption structure. +// https://www.ietf.org/rfc/rfc3315.txt type OptRequestedOption struct { requestedOptions []OptionCode } @@ -18,15 +20,13 @@ func (op *OptRequestedOption) Code() OptionCode { } func (op *OptRequestedOption) ToBytes() []byte { - buf := make([]byte, 4) - roBytes := make([]byte, 2) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionORO)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionORO)) + buf.Write16(uint16(op.Length())) for _, ro := range op.requestedOptions { - binary.BigEndian.PutUint16(roBytes, uint16(ro)) - buf = append(buf, roBytes...) + buf.Write16(uint16(ro)) } - return buf + return buf.Data() } func (op *OptRequestedOption) RequestedOptions() []OptionCode { @@ -61,14 +61,10 @@ func (op *OptRequestedOption) String() string { // build an OptRequestedOption structure from a sequence of bytes. // The input data does not include option code and length bytes. func ParseOptRequestedOption(data []byte) (*OptRequestedOption, error) { - if len(data)%2 != 0 { - return nil, fmt.Errorf("Invalid OptRequestedOption data: length is not a multiple of 2") - } - opt := OptRequestedOption{} - var rOpts []OptionCode - for i := 0; i < len(data); i += 2 { - rOpts = append(rOpts, OptionCode(binary.BigEndian.Uint16(data[i:i+2]))) + var opt OptRequestedOption + buf := uio.NewBigEndianBuffer(data) + for buf.Has(2) { + opt.requestedOptions = append(opt.requestedOptions, OptionCode(buf.Read16())) } - opt.requestedOptions = rOpts - return &opt, nil + return &opt, buf.FinError() } |