summaryrefslogtreecommitdiffhomepage
path: root/dhcpv6/option_clientlinklayeraddress.go
diff options
context:
space:
mode:
Diffstat (limited to 'dhcpv6/option_clientlinklayeraddress.go')
-rw-r--r--dhcpv6/option_clientlinklayeraddress.go47
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()
+}