diff options
Diffstat (limited to 'dhcpv6/option_clientlinklayeraddress.go')
-rw-r--r-- | dhcpv6/option_clientlinklayeraddress.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/dhcpv6/option_clientlinklayeraddress.go b/dhcpv6/option_clientlinklayeraddress.go new file mode 100644 index 0000000..91d8a23 --- /dev/null +++ b/dhcpv6/option_clientlinklayeraddress.go @@ -0,0 +1,47 @@ +package dhcpv6 + +import ( + "fmt" + "net" + + "github.com/insomniacslk/dhcp/iana" + "github.com/u-root/u-root/pkg/uio" +) + +// OptClientLinkLayerAddress implements OptionClientLinkLayerAddr option. +// https://tools.ietf.org/html/rfc6939 +func OptClientLinkLayerAddress(ht iana.HWType, lla net.HardwareAddr) *optClientLinkLayerAddress { + return &optClientLinkLayerAddress{LinkLayerType: ht, LinkLayerAddress: lla} +} + +type optClientLinkLayerAddress struct { + LinkLayerType iana.HWType + LinkLayerAddress net.HardwareAddr +} + +// Code returns the option code. +func (op *optClientLinkLayerAddress) Code() OptionCode { + return OptionClientLinkLayerAddr +} + +// ToBytes serializes the option and returns it as a sequence of bytes +func (op *optClientLinkLayerAddress) ToBytes() []byte { + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(op.LinkLayerType)) + buf.WriteBytes(op.LinkLayerAddress) + return buf.Data() +} + +func (op *optClientLinkLayerAddress) String() string { + return fmt.Sprintf("ClientLinkLayerAddress: Type=%s LinkLayerAddress=%s", op.LinkLayerType, op.LinkLayerAddress) +} + +// parseOptClientLinkLayerAddress deserializes from bytes +// to build an optClientLinkLayerAddress structure. +func parseOptClientLinkLayerAddress(data []byte) (*optClientLinkLayerAddress, error) { + var opt optClientLinkLayerAddress + buf := uio.NewBigEndianBuffer(data) + opt.LinkLayerType = iana.HWType(buf.Read16()) + opt.LinkLayerAddress = buf.ReadAll() + return &opt, buf.FinError() +} |