From 5e6e8baddaa29b866abe0b865e0c66c9190ec2f7 Mon Sep 17 00:00:00 2001 From: Andrea Barberio Date: Sat, 19 Jan 2019 11:55:16 +0000 Subject: [PATCH 01/43] dhcpv6: added Duid.Equal --- dhcpv6/duid.go | 24 +++++++++++++++++++++++- dhcpv6/duid_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/dhcpv6/duid.go b/dhcpv6/duid.go index c9e38b2d..2ae8e601 100644 --- a/dhcpv6/duid.go +++ b/dhcpv6/duid.go @@ -1,6 +1,7 @@ package dhcpv6 import ( + "bytes" "encoding/binary" "fmt" "net" @@ -8,6 +9,7 @@ import ( "github.com/insomniacslk/dhcp/iana" ) +// DuidType is the DUID type as defined in rfc3315. type DuidType uint16 // DUID types @@ -18,6 +20,7 @@ const ( DUID_UUID DuidType = 4 ) +// DuidTypeToString maps a DuidType to a name. var DuidTypeToString = map[DuidType]string{ DUID_LL: "DUID-LL", DUID_LLT: "DUID-LLT", @@ -32,10 +35,11 @@ func (d DuidType) String() string { return "Unknown" } +// Duid is a DHCP Unique Identifier. type Duid struct { Type DuidType HwType iana.HWType // for DUID-LLT and DUID-LL. Ignored otherwise. RFC 826 - Time uint32 // for DUID-LLT. Ignored otherwise + Time uint32 // for DUID-LLT. Ignored otherwise LinkLayerAddr net.HardwareAddr EnterpriseNumber uint32 // for DUID-EN. Ignored otherwise EnterpriseIdentifier []byte // for DUID-EN. Ignored otherwise @@ -43,6 +47,7 @@ type Duid struct { Opaque []byte // for unknown DUIDs } +// Length returns the DUID length in bytes. func (d *Duid) Length() int { if d.Type == DUID_LLT { return 8 + len(d.LinkLayerAddr) @@ -57,6 +62,22 @@ func (d *Duid) Length() int { } } +// Equal compares two Duid objects. +func (d Duid) Equal(o Duid) bool { + if d.Type != o.Type || + d.HwType != o.HwType || + d.Time != o.Time || + !bytes.Equal(d.LinkLayerAddr, o.LinkLayerAddr) || + d.EnterpriseNumber != o.EnterpriseNumber || + !bytes.Equal(d.EnterpriseIdentifier, o.EnterpriseIdentifier) || + !bytes.Equal(d.Uuid, o.Uuid) || + !bytes.Equal(d.Opaque, o.Opaque) { + return false + } + return true +} + +// ToBytes serializes a Duid object. func (d *Duid) ToBytes() []byte { if d.Type == DUID_LLT { buf := make([]byte, 8) @@ -98,6 +119,7 @@ func (d *Duid) String() string { return fmt.Sprintf("DUID{type=%v hwtype=%v hwaddr=%v}", d.Type.String(), d.HwType.String(), hwaddr) } +// DuidFromBytes parses a Duid from a byte slice. func DuidFromBytes(data []byte) (*Duid, error) { if len(data) < 2 { return nil, fmt.Errorf("Invalid DUID: shorter than 2 bytes") diff --git a/dhcpv6/duid_test.go b/dhcpv6/duid_test.go index 840ab4a6..5efa0e1a 100644 --- a/dhcpv6/duid_test.go +++ b/dhcpv6/duid_test.go @@ -118,3 +118,31 @@ func TestOpaqueDuid(t *testing.T) { t.Fatalf("ToBytes: unexpected result: got %x, want %x", got, want) } } + +func TestDuidEqual(t *testing.T) { + d := Duid{ + Type: DUID_LL, + HwType: iana.HWTypeEthernet, + LinkLayerAddr: net.HardwareAddr{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, + } + o := Duid{ + Type: DUID_LL, + HwType: iana.HWTypeEthernet, + LinkLayerAddr: net.HardwareAddr{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, + } + require.True(t, d.Equal(o)) +} + +func TestDuidEqualNotEqual(t *testing.T) { + d := Duid{ + Type: DUID_LL, + HwType: iana.HWTypeEthernet, + LinkLayerAddr: net.HardwareAddr{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, + } + o := Duid{ + Type: DUID_LL, + HwType: iana.HWTypeEthernet, + LinkLayerAddr: net.HardwareAddr{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0x00}, + } + require.False(t, d.Equal(o)) +} From fe6f307df5d78a54ddd4a56a275043317148fe5a Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sat, 19 Jan 2019 21:29:26 +0000 Subject: [PATCH 02/43] dhcpv4: build more packets with modifiers Also drop unnecessary return value of Modifier. --- dhcpv4/async/client.go | 6 +- dhcpv4/bsdp/bsdp.go | 72 +++++++++--------------- dhcpv4/bsdp/bsdp_test.go | 1 + dhcpv4/client.go | 5 +- dhcpv4/dhcpv4.go | 115 ++++++++++++++------------------------- dhcpv4/modifiers.go | 73 ++++++++++++++++++++----- dhcpv4/modifiers_test.go | 96 ++++++++++++++++---------------- netboot/netconf_test.go | 112 ++++++++++++++++++++------------------ 8 files changed, 238 insertions(+), 242 deletions(-) diff --git a/dhcpv4/async/client.go b/dhcpv4/async/client.go index 98441805..81b10f7c 100644 --- a/dhcpv4/async/client.go +++ b/dhcpv4/async/client.go @@ -194,11 +194,7 @@ func (c *Client) remoteAddr() (*net.UDPAddr, error) { // Send inserts a message to the queue to be sent asynchronously. // Returns a future which resolves to response and error. -func (c *Client) Send(message *dhcpv4.DHCPv4, modifiers ...dhcpv4.Modifier) *promise.Future { - for _, mod := range modifiers { - message = mod(message) - } - +func (c *Client) Send(message *dhcpv4.DHCPv4) *promise.Future { p := promise.NewPromise() c.packetsLock.Lock() c.packets[message.TransactionID] = p diff --git a/dhcpv4/bsdp/bsdp.go b/dhcpv4/bsdp/bsdp.go index 21cc71a6..3cc87d22 100644 --- a/dhcpv4/bsdp/bsdp.go +++ b/dhcpv4/bsdp/bsdp.go @@ -96,17 +96,17 @@ func NewInformListForInterface(ifname string, replyPort uint16) (*dhcpv4.DHCPv4, // NewInformList creates a new INFORM packet for interface with hardware address // `hwaddr` and IP `localIP`. Packet will be sent out on port `replyPort`. -func NewInformList(hwaddr net.HardwareAddr, localIP net.IP, replyPort uint16) (*dhcpv4.DHCPv4, error) { - d, err := dhcpv4.NewInform(hwaddr, localIP) - if err != nil { - return nil, err - } - +func NewInformList(hwaddr net.HardwareAddr, localIP net.IP, replyPort uint16, modifiers ...dhcpv4.Modifier) (*dhcpv4.DHCPv4, error) { // Validate replyPort first if needsReplyPort(replyPort) && replyPort >= 1024 { return nil, errors.New("replyPort must be a privileged port") } + vendorClassID, err := MakeVendorClassIdentifier() + if err != nil { + return nil, err + } + // These are vendor-specific options used to pass along BSDP information. vendorOpts := []dhcpv4.Option{ &OptMessageType{MessageTypeList}, @@ -115,44 +115,24 @@ func NewInformList(hwaddr net.HardwareAddr, localIP net.IP, replyPort uint16) (* if needsReplyPort(replyPort) { vendorOpts = append(vendorOpts, &OptReplyPort{replyPort}) } - d.UpdateOption(&OptVendorSpecificInformation{vendorOpts}) - d.UpdateOption(&dhcpv4.OptParameterRequestList{ - RequestedOpts: []dhcpv4.OptionCode{ + return dhcpv4.NewInform(hwaddr, localIP, + dhcpv4.PrependModifiers(modifiers, dhcpv4.WithRequestedOptions( dhcpv4.OptionVendorSpecificInformation, dhcpv4.OptionClassIdentifier, - }, - }) - d.UpdateOption(&dhcpv4.OptMaximumDHCPMessageSize{Size: MaxDHCPMessageSize}) - - vendorClassID, err := MakeVendorClassIdentifier() - if err != nil { - return nil, err - } - d.UpdateOption(&dhcpv4.OptClassIdentifier{Identifier: vendorClassID}) - return d, nil + ), + dhcpv4.WithOption(&dhcpv4.OptMaximumDHCPMessageSize{Size: MaxDHCPMessageSize}), + dhcpv4.WithOption(&dhcpv4.OptClassIdentifier{Identifier: vendorClassID}), + dhcpv4.WithOption(&OptVendorSpecificInformation{vendorOpts}), + )...) } // InformSelectForAck constructs an INFORM[SELECT] packet given an ACK to the // previously-sent INFORM[LIST]. func InformSelectForAck(ack dhcpv4.DHCPv4, replyPort uint16, selectedImage BootImage) (*dhcpv4.DHCPv4, error) { - d, err := dhcpv4.New() - if err != nil { - return nil, err - } - if needsReplyPort(replyPort) && replyPort >= 1024 { return nil, errors.New("replyPort must be a privileged port") } - d.OpCode = dhcpv4.OpcodeBootRequest - d.HWType = ack.HWType - d.ClientHWAddr = ack.ClientHWAddr - d.TransactionID = ack.TransactionID - if ack.IsBroadcast() { - d.SetBroadcast() - } else { - d.SetUnicast() - } // Data for OptionSelectedBootImageID vendorOpts := []dhcpv4.Option{ @@ -161,6 +141,11 @@ func InformSelectForAck(ack dhcpv4.DHCPv4, replyPort uint16, selectedImage BootI &OptSelectedBootImageID{selectedImage.ID}, } + // Validate replyPort if requested. + if needsReplyPort(replyPort) { + vendorOpts = append(vendorOpts, &OptReplyPort{replyPort}) + } + // Find server IP address var serverIP net.IP if opt := ack.GetOneOption(dhcpv4.OptionServerIdentifier); opt != nil { @@ -171,28 +156,23 @@ func InformSelectForAck(ack dhcpv4.DHCPv4, replyPort uint16, selectedImage BootI } vendorOpts = append(vendorOpts, &OptServerIdentifier{serverIP}) - // Validate replyPort if requested. - if needsReplyPort(replyPort) { - vendorOpts = append(vendorOpts, &OptReplyPort{replyPort}) - } - vendorClassID, err := MakeVendorClassIdentifier() if err != nil { return nil, err } - d.UpdateOption(&dhcpv4.OptClassIdentifier{Identifier: vendorClassID}) - d.UpdateOption(&dhcpv4.OptParameterRequestList{ - RequestedOpts: []dhcpv4.OptionCode{ + + return dhcpv4.New(dhcpv4.WithReply(&ack), + dhcpv4.WithOption(&dhcpv4.OptClassIdentifier{Identifier: vendorClassID}), + dhcpv4.WithRequestedOptions( dhcpv4.OptionSubnetMask, dhcpv4.OptionRouter, dhcpv4.OptionBootfileName, dhcpv4.OptionVendorSpecificInformation, dhcpv4.OptionClassIdentifier, - }, - }) - d.UpdateOption(&dhcpv4.OptMessageType{MessageType: dhcpv4.MessageTypeInform}) - d.UpdateOption(&OptVendorSpecificInformation{vendorOpts}) - return d, nil + ), + dhcpv4.WithMessageType(dhcpv4.MessageTypeInform), + dhcpv4.WithOption(&OptVendorSpecificInformation{vendorOpts}), + ) } // NewReplyForInformList constructs an ACK for the INFORM[LIST] packet `inform` diff --git a/dhcpv4/bsdp/bsdp_test.go b/dhcpv4/bsdp/bsdp_test.go index 2caa6e50..638a4081 100644 --- a/dhcpv4/bsdp/bsdp_test.go +++ b/dhcpv4/bsdp/bsdp_test.go @@ -104,6 +104,7 @@ func TestNewInformList_ReplyPort(t *testing.T) { func newAck(hwAddr net.HardwareAddr, transactionID [4]byte) *dhcpv4.DHCPv4 { ack, _ := dhcpv4.New() + ack.OpCode = dhcpv4.OpcodeBootReply ack.TransactionID = transactionID ack.HWType = iana.HWTypeEthernet ack.ClientHWAddr = hwAddr diff --git a/dhcpv4/client.go b/dhcpv4/client.go index d2d18db2..ad80b345 100644 --- a/dhcpv4/client.go +++ b/dhcpv4/client.go @@ -220,13 +220,10 @@ func (c *Client) Exchange(ifname string, modifiers ...Modifier) ([]*DHCPv4, erro }() // Discover - discover, err := NewDiscoveryForInterface(ifname) + discover, err := NewDiscoveryForInterface(ifname, modifiers...) if err != nil { return conversation, err } - for _, mod := range modifiers { - discover = mod(discover) - } conversation = append(conversation, discover) // Offer diff --git a/dhcpv4/dhcpv4.go b/dhcpv4/dhcpv4.go index 429d4048..93a65313 100644 --- a/dhcpv4/dhcpv4.go +++ b/dhcpv4/dhcpv4.go @@ -50,7 +50,7 @@ type DHCPv4 struct { // Modifier defines the signature for functions that can modify DHCPv4 // structures. This is used to simplify packet manipulation -type Modifier func(d *DHCPv4) *DHCPv4 +type Modifier func(d *DHCPv4) // IPv4AddrsForInterface obtains the currently-configured, non-loopback IPv4 // addresses for iface. @@ -106,7 +106,7 @@ func GenerateTransactionID() (TransactionID, error) { // won't be a valid DHCPv4 message so you will need to adjust its fields. // See also NewDiscovery, NewOffer, NewRequest, NewAcknowledge, NewInform and // NewRelease . -func New() (*DHCPv4, error) { +func New(modifiers ...Modifier) (*DHCPv4, error) { xid, err := GenerateTransactionID() if err != nil { return nil, err @@ -124,42 +124,37 @@ func New() (*DHCPv4, error) { GatewayIPAddr: net.IPv4zero, Options: make([]Option, 0, 10), } + for _, mod := range modifiers { + mod(&d) + } return &d, nil } // NewDiscoveryForInterface builds a new DHCPv4 Discovery message, with a default // Ethernet HW type and the hardware address obtained from the specified // interface. -func NewDiscoveryForInterface(ifname string) (*DHCPv4, error) { +func NewDiscoveryForInterface(ifname string, modifiers ...Modifier) (*DHCPv4, error) { iface, err := net.InterfaceByName(ifname) if err != nil { return nil, err } - return NewDiscovery(iface.HardwareAddr) + return NewDiscovery(iface.HardwareAddr, modifiers...) } // NewDiscovery builds a new DHCPv4 Discovery message, with a default Ethernet // HW type and specified hardware address. -func NewDiscovery(hwaddr net.HardwareAddr) (*DHCPv4, error) { - d, err := New() - if err != nil { - return nil, err - } - // get hw addr - d.OpCode = OpcodeBootRequest - d.HWType = iana.HWTypeEthernet - d.ClientHWAddr = hwaddr - d.SetBroadcast() - d.UpdateOption(&OptMessageType{MessageType: MessageTypeDiscover}) - d.UpdateOption(&OptParameterRequestList{ - RequestedOpts: []OptionCode{ +func NewDiscovery(hwaddr net.HardwareAddr, modifiers ...Modifier) (*DHCPv4, error) { + return New(PrependModifiers(modifiers, + WithBroadcast(true), + WithHwAddr(hwaddr), + WithRequestedOptions( OptionSubnetMask, OptionRouter, OptionDomainName, OptionDomainNameServer, - }, - }) - return d, nil + ), + WithMessageType(MessageTypeDiscover), + )...) } // NewInformForInterface builds a new DHCPv4 Informational message with default @@ -190,74 +185,46 @@ func NewInformForInterface(ifname string, needsBroadcast bool) (*DHCPv4, error) return pkt, nil } -// NewInform builds a new DHCPv4 Informational message with default Ethernet HW -// type and specified hardware address. It does NOT put a DHCP End option at the -// end. -func NewInform(hwaddr net.HardwareAddr, localIP net.IP) (*DHCPv4, error) { - d, err := New() - if err != nil { - return nil, err - } +// PrependModifiers prepends other to m. +func PrependModifiers(m []Modifier, other ...Modifier) []Modifier { + return append(other, m...) +} - d.OpCode = OpcodeBootRequest - d.HWType = iana.HWTypeEthernet - d.ClientHWAddr = hwaddr - d.ClientIPAddr = localIP - d.UpdateOption(&OptMessageType{MessageType: MessageTypeInform}) - return d, nil +// NewInform builds a new DHCPv4 Informational message with the specified +// hardware address. +func NewInform(hwaddr net.HardwareAddr, localIP net.IP, modifiers ...Modifier) (*DHCPv4, error) { + return New(PrependModifiers( + modifiers, + WithHwAddr(hwaddr), + WithMessageType(MessageTypeInform), + WithClientIP(localIP), + )...) } // NewRequestFromOffer builds a DHCPv4 request from an offer. func NewRequestFromOffer(offer *DHCPv4, modifiers ...Modifier) (*DHCPv4, error) { - d, err := New() - if err != nil { - return nil, err - } - d.OpCode = OpcodeBootRequest - d.HWType = offer.HWType - d.ClientHWAddr = offer.ClientHWAddr - d.TransactionID = offer.TransactionID - if offer.IsBroadcast() { - d.SetBroadcast() - } else { - d.SetUnicast() - } // find server IP address - var serverIP []byte - for _, opt := range offer.Options { - if opt.Code() == OptionServerIdentifier { - serverIP = opt.(*OptServerIdentifier).ServerID - } + var serverIP net.IP + serverID := offer.GetOneOption(OptionServerIdentifier) + if serverID != nil { + serverIP = serverID.(*OptServerIdentifier).ServerID } if serverIP == nil { return nil, errors.New("Missing Server IP Address in DHCP Offer") } - d.ServerIPAddr = serverIP - d.UpdateOption(&OptMessageType{MessageType: MessageTypeRequest}) - d.UpdateOption(&OptRequestedIPAddress{RequestedAddr: offer.YourIPAddr}) - d.UpdateOption(&OptServerIdentifier{ServerID: serverIP}) - for _, mod := range modifiers { - d = mod(d) - } - return d, nil + + return New(PrependModifiers(modifiers, + WithReply(offer), + WithMessageType(MessageTypeRequest), + WithServerIP(serverIP), + WithOption(&OptRequestedIPAddress{RequestedAddr: offer.YourIPAddr}), + WithOption(&OptServerIdentifier{ServerID: serverIP}), + )...) } // NewReplyFromRequest builds a DHCPv4 reply from a request. func NewReplyFromRequest(request *DHCPv4, modifiers ...Modifier) (*DHCPv4, error) { - reply, err := New() - if err != nil { - return nil, err - } - reply.OpCode = OpcodeBootReply - reply.HWType = request.HWType - reply.ClientHWAddr = request.ClientHWAddr - reply.TransactionID = request.TransactionID - reply.Flags = request.Flags - reply.GatewayIPAddr = request.GatewayIPAddr - for _, mod := range modifiers { - reply = mod(reply) - } - return reply, nil + return New(PrependModifiers(modifiers, WithReply(request))...) } // FromBytes encodes the DHCPv4 packet into a sequence of bytes, and returns an diff --git a/dhcpv4/modifiers.go b/dhcpv4/modifiers.go index cd80bc92..07594911 100644 --- a/dhcpv4/modifiers.go +++ b/dhcpv4/modifiers.go @@ -3,42 +3,84 @@ package dhcpv4 import ( "net" + "github.com/insomniacslk/dhcp/iana" "github.com/insomniacslk/dhcp/rfc1035label" ) // WithTransactionID sets the Transaction ID for the DHCPv4 packet func WithTransactionID(xid TransactionID) Modifier { - return func(d *DHCPv4) *DHCPv4 { + return func(d *DHCPv4) { d.TransactionID = xid - return d + } +} + +// WithClientIP sets the Client IP for a DHCPv4 packet. +func WithClientIP(ip net.IP) Modifier { + return func(d *DHCPv4) { + d.ClientIPAddr = ip + } +} + +// WithYourIP sets the Your IP for a DHCPv4 packet. +func WithYourIP(ip net.IP) Modifier { + return func(d *DHCPv4) { + d.YourIPAddr = ip + } +} + +// WithServerIP sets the Server IP for a DHCPv4 packet. +func WithServerIP(ip net.IP) Modifier { + return func(d *DHCPv4) { + d.ServerIPAddr = ip + } +} + +// WithReply fills in opcode, hwtype, xid, clienthwaddr, flags, and gateway ip +// addr from the given packet. +func WithReply(request *DHCPv4) Modifier { + return func(d *DHCPv4) { + if request.OpCode == OpcodeBootRequest { + d.OpCode = OpcodeBootReply + } else { + d.OpCode = OpcodeBootRequest + } + d.HWType = request.HWType + d.TransactionID = request.TransactionID + d.ClientHWAddr = request.ClientHWAddr + d.Flags = request.Flags + d.GatewayIPAddr = request.GatewayIPAddr + } +} + +// WithHWType sets the Hardware Type for a DHCPv4 packet. +func WithHWType(hwt iana.HWType) Modifier { + return func(d *DHCPv4) { + d.HWType = hwt } } // WithBroadcast sets the packet to be broadcast or unicast func WithBroadcast(broadcast bool) Modifier { - return func(d *DHCPv4) *DHCPv4 { + return func(d *DHCPv4) { if broadcast { d.SetBroadcast() } else { d.SetUnicast() } - return d } } // WithHwAddr sets the hardware address for a packet func WithHwAddr(hwaddr net.HardwareAddr) Modifier { - return func(d *DHCPv4) *DHCPv4 { + return func(d *DHCPv4) { d.ClientHWAddr = hwaddr - return d } } // WithOption appends a DHCPv4 option provided by the user func WithOption(opt Option) Modifier { - return func(d *DHCPv4) *DHCPv4 { + return func(d *DHCPv4) { d.UpdateOption(opt) - return d } } @@ -54,13 +96,18 @@ func WithUserClass(uc []byte, rfc bool) Modifier { } // WithNetboot adds bootfile URL and bootfile param options to a DHCPv4 packet. -func WithNetboot(d *DHCPv4) *DHCPv4 { - return WithRequestedOptions(OptionTFTPServerName, OptionBootfileName)(d) +func WithNetboot(d *DHCPv4) { + WithRequestedOptions(OptionTFTPServerName, OptionBootfileName)(d) +} + +// WithMessageType adds the DHCPv4 message type m to a packet. +func WithMessageType(m MessageType) Modifier { + return WithOption(&OptMessageType{m}) } // WithRequestedOptions adds requested options to the packet. func WithRequestedOptions(optionCodes ...OptionCode) Modifier { - return func(d *DHCPv4) *DHCPv4 { + return func(d *DHCPv4) { params := d.GetOneOption(OptionParameterRequestList) if params == nil { d.UpdateOption(&OptParameterRequestList{OptionCodeList(optionCodes)}) @@ -68,18 +115,16 @@ func WithRequestedOptions(optionCodes ...OptionCode) Modifier { opts := params.(*OptParameterRequestList) opts.RequestedOpts.Add(optionCodes...) } - return d } } // WithRelay adds parameters required for DHCPv4 to be relayed by the relay // server with given ip func WithRelay(ip net.IP) Modifier { - return func(d *DHCPv4) *DHCPv4 { + return func(d *DHCPv4) { d.SetUnicast() d.GatewayIPAddr = ip d.HopCount += 1 - return d } } diff --git a/dhcpv4/modifiers_test.go b/dhcpv4/modifiers_test.go index d9bb3c74..2cac2a07 100644 --- a/dhcpv4/modifiers_test.go +++ b/dhcpv4/modifiers_test.go @@ -10,33 +10,34 @@ import ( func TestTransactionIDModifier(t *testing.T) { d, err := New() require.NoError(t, err) - d = WithTransactionID(TransactionID{0xdd, 0xcc, 0xbb, 0xaa})(d) + WithTransactionID(TransactionID{0xdd, 0xcc, 0xbb, 0xaa})(d) require.Equal(t, TransactionID{0xdd, 0xcc, 0xbb, 0xaa}, d.TransactionID) } func TestBroadcastModifier(t *testing.T) { d, err := New() require.NoError(t, err) + // set and test broadcast - d = WithBroadcast(true)(d) + WithBroadcast(true)(d) require.Equal(t, true, d.IsBroadcast()) + // set and test unicast - d = WithBroadcast(false)(d) + WithBroadcast(false)(d) require.Equal(t, true, d.IsUnicast()) } func TestHwAddrModifier(t *testing.T) { - d, err := New() + hwaddr := net.HardwareAddr{0xa, 0xb, 0xc, 0xd, 0xe, 0xf} + d, err := New(WithHwAddr(hwaddr)) require.NoError(t, err) - hwaddr := net.HardwareAddr{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf} - d = WithHwAddr(hwaddr)(d) require.Equal(t, hwaddr, d.ClientHWAddr) } func TestWithOptionModifier(t *testing.T) { - d, err := New() + d, err := New(WithOption(&OptDomainName{DomainName: "slackware.it"})) require.NoError(t, err) - d = WithOption(&OptDomainName{DomainName: "slackware.it"})(d) + opt := d.GetOneOption(OptionDomainName) require.NotNil(t, opt) dnOpt := opt.(*OptDomainName) @@ -44,10 +45,9 @@ func TestWithOptionModifier(t *testing.T) { } func TestUserClassModifier(t *testing.T) { - d, err := New() + d, err := New(WithUserClass([]byte("linuxboot"), false)) require.NoError(t, err) - userClass := WithUserClass([]byte("linuxboot"), false) - d = userClass(d) + expected := []byte{ 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', } @@ -56,9 +56,9 @@ func TestUserClassModifier(t *testing.T) { } func TestUserClassModifierRFC(t *testing.T) { - d, _ := New() - userClass := WithUserClass([]byte("linuxboot"), true) - d = userClass(d) + d, err := New(WithUserClass([]byte("linuxboot"), true)) + require.NoError(t, err) + expected := []byte{ 9, 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', } @@ -67,53 +67,52 @@ func TestUserClassModifierRFC(t *testing.T) { } func TestWithNetboot(t *testing.T) { - d, _ := New() - d = WithNetboot(d) + d, err := New(WithNetboot) + require.NoError(t, err) + require.Equal(t, "Parameter Request List -> TFTP Server Name, Bootfile Name", d.Options[0].String()) } func TestWithNetbootExistingTFTP(t *testing.T) { - d, _ := New() - OptParams := &OptParameterRequestList{ + d, err := New() + require.NoError(t, err) + d.UpdateOption(&OptParameterRequestList{ RequestedOpts: []OptionCode{OptionTFTPServerName}, - } - d.UpdateOption(OptParams) - d = WithNetboot(d) + }) + WithNetboot(d) require.Equal(t, "Parameter Request List -> TFTP Server Name, Bootfile Name", d.Options[0].String()) } func TestWithNetbootExistingBootfileName(t *testing.T) { d, _ := New() - OptParams := &OptParameterRequestList{ + d.UpdateOption(&OptParameterRequestList{ RequestedOpts: []OptionCode{OptionBootfileName}, - } - d.UpdateOption(OptParams) - d = WithNetboot(d) + }) + WithNetboot(d) require.Equal(t, "Parameter Request List -> Bootfile Name, TFTP Server Name", d.Options[0].String()) } func TestWithNetbootExistingBoth(t *testing.T) { d, _ := New() - OptParams := &OptParameterRequestList{ + d.UpdateOption(&OptParameterRequestList{ RequestedOpts: []OptionCode{OptionBootfileName, OptionTFTPServerName}, - } - d.UpdateOption(OptParams) - d = WithNetboot(d) + }) + WithNetboot(d) require.Equal(t, "Parameter Request List -> Bootfile Name, TFTP Server Name", d.Options[0].String()) } func TestWithRequestedOptions(t *testing.T) { // Check if OptionParameterRequestList is created when not present - d, err := New() + d, err := New(WithRequestedOptions(OptionFQDN)) require.NoError(t, err) - d = WithRequestedOptions(OptionFQDN)(d) require.NotNil(t, d) o := d.GetOneOption(OptionParameterRequestList) require.NotNil(t, o) opts := o.(*OptParameterRequestList) require.ElementsMatch(t, opts.RequestedOpts, []OptionCode{OptionFQDN}) + // Check if already set options are preserved - d = WithRequestedOptions(OptionHostName)(d) + WithRequestedOptions(OptionHostName)(d) require.NotNil(t, d) o = d.GetOneOption(OptionParameterRequestList) require.NotNil(t, o) @@ -122,20 +121,19 @@ func TestWithRequestedOptions(t *testing.T) { } func TestWithRelay(t *testing.T) { - d, err := New() + ip := net.IP{10, 0, 0, 1} + d, err := New(WithRelay(ip)) require.NoError(t, err) - ip := net.ParseIP("10.0.0.1") - require.NotNil(t, ip) - d = WithRelay(ip)(d) - require.NotNil(t, d) + require.True(t, d.IsUnicast(), "expected unicast") require.Equal(t, ip, d.GatewayIPAddr) require.Equal(t, uint8(1), d.HopCount) } func TestWithNetmask(t *testing.T) { - d := &DHCPv4{} - d = WithNetmask(net.IPv4Mask(255, 255, 255, 0))(d) + d, err := New(WithNetmask(net.IPv4Mask(255, 255, 255, 0))) + require.NoError(t, err) + require.Equal(t, 1, len(d.Options)) require.Equal(t, OptionSubnetMask, d.Options[0].Code()) osm := d.Options[0].(*OptSubnetMask) @@ -143,8 +141,9 @@ func TestWithNetmask(t *testing.T) { } func TestWithLeaseTime(t *testing.T) { - d := &DHCPv4{} - d = WithLeaseTime(uint32(3600))(d) + d, err := New(WithLeaseTime(uint32(3600))) + require.NoError(t, err) + require.Equal(t, 1, len(d.Options)) require.Equal(t, OptionIPAddressLeaseTime, d.Options[0].Code()) olt := d.Options[0].(*OptIPAddressLeaseTime) @@ -152,8 +151,9 @@ func TestWithLeaseTime(t *testing.T) { } func TestWithDNS(t *testing.T) { - d := &DHCPv4{} - d = WithDNS(net.ParseIP("10.0.0.1"), net.ParseIP("10.0.0.2"))(d) + d, err := New(WithDNS(net.ParseIP("10.0.0.1"), net.ParseIP("10.0.0.2"))) + require.NoError(t, err) + require.Equal(t, 1, len(d.Options)) require.Equal(t, OptionDomainNameServer, d.Options[0].Code()) olt := d.Options[0].(*OptDomainNameServer) @@ -164,8 +164,9 @@ func TestWithDNS(t *testing.T) { } func TestWithDomainSearchList(t *testing.T) { - d := &DHCPv4{} - d = WithDomainSearchList("slackware.it", "dhcp.slackware.it")(d) + d, err := New(WithDomainSearchList("slackware.it", "dhcp.slackware.it")) + require.NoError(t, err) + require.Equal(t, 1, len(d.Options)) osl := d.Options[0].(*OptDomainSearch) require.Equal(t, OptionDNSDomainSearchList, osl.Code()) @@ -176,9 +177,10 @@ func TestWithDomainSearchList(t *testing.T) { } func TestWithRouter(t *testing.T) { - d := &DHCPv4{} rtr := net.ParseIP("10.0.0.254") - d = WithRouter(rtr)(d) + d, err := New(WithRouter(rtr)) + require.NoError(t, err) + require.Equal(t, 1, len(d.Options)) ortr := d.Options[0].(*OptRouter) require.Equal(t, OptionRouter, ortr.Code()) diff --git a/netboot/netconf_test.go b/netboot/netconf_test.go index 91d44829..00b39b87 100644 --- a/netboot/netconf_test.go +++ b/netboot/netconf_test.go @@ -107,106 +107,114 @@ func TestGetNetConfFromPacketv6(t *testing.T) { } func TestGetNetConfFromPacketv4AddrZero(t *testing.T) { - d := dhcpv4.DHCPv4{} - d.YourIPAddr = net.IPv4zero - _, err := GetNetConfFromPacketv4(&d) + d, _ := dhcpv4.New(dhcpv4.WithYourIP(net.IPv4zero)) + _, err := GetNetConfFromPacketv4(d) require.Error(t, err) } func TestGetNetConfFromPacketv4NoMask(t *testing.T) { - d := dhcpv4.DHCPv4{} - d.YourIPAddr = net.ParseIP("10.0.0.1") - _, err := GetNetConfFromPacketv4(&d) + d, _ := dhcpv4.New(dhcpv4.WithYourIP(net.ParseIP("10.0.0.1"))) + _, err := GetNetConfFromPacketv4(d) require.Error(t, err) } func TestGetNetConfFromPacketv4NullMask(t *testing.T) { - d := &dhcpv4.DHCPv4{} - d.YourIPAddr = net.ParseIP("10.0.0.1") - d = dhcpv4.WithNetmask(net.IPv4Mask(0, 0, 0, 0))(d) + d, _ := dhcpv4.New( + dhcpv4.WithNetmask(net.IPv4Mask(0, 0, 0, 0)), + dhcpv4.WithYourIP(net.ParseIP("10.0.0.1")), + ) _, err := GetNetConfFromPacketv4(d) require.Error(t, err) } func TestGetNetConfFromPacketv4NoLeaseTime(t *testing.T) { - d := &dhcpv4.DHCPv4{} - d.YourIPAddr = net.ParseIP("10.0.0.1") - d = dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0))(d) + d, _ := dhcpv4.New( + dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0)), + dhcpv4.WithYourIP(net.ParseIP("10.0.0.1")), + ) _, err := GetNetConfFromPacketv4(d) require.Error(t, err) } func TestGetNetConfFromPacketv4NoDNS(t *testing.T) { - d := &dhcpv4.DHCPv4{} - d.YourIPAddr = net.ParseIP("10.0.0.1") - d = dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0))(d) - d = dhcpv4.WithLeaseTime(uint32(0))(d) + d, _ := dhcpv4.New( + dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0)), + dhcpv4.WithLeaseTime(uint32(0)), + dhcpv4.WithYourIP(net.ParseIP("10.0.0.1")), + ) _, err := GetNetConfFromPacketv4(d) require.Error(t, err) } func TestGetNetConfFromPacketv4EmptyDNSList(t *testing.T) { - d := &dhcpv4.DHCPv4{} - d.YourIPAddr = net.ParseIP("10.0.0.1") - d = dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0))(d) - d = dhcpv4.WithLeaseTime(uint32(0))(d) - d = dhcpv4.WithDNS()(d) + d, _ := dhcpv4.New( + dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0)), + dhcpv4.WithLeaseTime(uint32(0)), + dhcpv4.WithDNS(), + dhcpv4.WithYourIP(net.ParseIP("10.0.0.1")), + ) _, err := GetNetConfFromPacketv4(d) require.Error(t, err) } func TestGetNetConfFromPacketv4NoSearchList(t *testing.T) { - d := &dhcpv4.DHCPv4{} - d.YourIPAddr = net.ParseIP("10.0.0.1") - d = dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0))(d) - d = dhcpv4.WithLeaseTime(uint32(0))(d) - d = dhcpv4.WithDNS(net.ParseIP("10.10.0.1"), net.ParseIP("10.10.0.2"))(d) + d, _ := dhcpv4.New( + dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0)), + dhcpv4.WithLeaseTime(uint32(0)), + dhcpv4.WithDNS(net.ParseIP("10.10.0.1"), net.ParseIP("10.10.0.2")), + dhcpv4.WithYourIP(net.ParseIP("10.0.0.1")), + ) _, err := GetNetConfFromPacketv4(d) require.Error(t, err) } func TestGetNetConfFromPacketv4EmptySearchList(t *testing.T) { - d := &dhcpv4.DHCPv4{} - d.YourIPAddr = net.ParseIP("10.0.0.1") - d = dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0))(d) - d = dhcpv4.WithLeaseTime(uint32(0))(d) - d = dhcpv4.WithDNS(net.ParseIP("10.10.0.1"), net.ParseIP("10.10.0.2"))(d) - d = dhcpv4.WithDomainSearchList()(d) + d, _ := dhcpv4.New( + dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0)), + dhcpv4.WithLeaseTime(uint32(0)), + dhcpv4.WithDNS(net.ParseIP("10.10.0.1"), net.ParseIP("10.10.0.2")), + dhcpv4.WithDomainSearchList(), + dhcpv4.WithYourIP(net.ParseIP("10.0.0.1")), + ) _, err := GetNetConfFromPacketv4(d) require.Error(t, err) } func TestGetNetConfFromPacketv4NoRouter(t *testing.T) { - d := &dhcpv4.DHCPv4{} - d.YourIPAddr = net.ParseIP("10.0.0.1") - d = dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0))(d) - d = dhcpv4.WithLeaseTime(uint32(0))(d) - d = dhcpv4.WithDNS(net.ParseIP("10.10.0.1"), net.ParseIP("10.10.0.2"))(d) - d = dhcpv4.WithDomainSearchList("slackware.it", "dhcp.slackware.it")(d) + d, _ := dhcpv4.New( + dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0)), + dhcpv4.WithLeaseTime(uint32(0)), + dhcpv4.WithDNS(net.ParseIP("10.10.0.1"), net.ParseIP("10.10.0.2")), + dhcpv4.WithDomainSearchList("slackware.it", "dhcp.slackware.it"), + dhcpv4.WithYourIP(net.ParseIP("10.0.0.1")), + ) _, err := GetNetConfFromPacketv4(d) require.Error(t, err) } func TestGetNetConfFromPacketv4EmptyRouter(t *testing.T) { - d := &dhcpv4.DHCPv4{} - d.YourIPAddr = net.ParseIP("10.0.0.1") - d = dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0))(d) - d = dhcpv4.WithLeaseTime(uint32(0))(d) - d = dhcpv4.WithDNS(net.ParseIP("10.10.0.1"), net.ParseIP("10.10.0.2"))(d) - d = dhcpv4.WithDomainSearchList("slackware.it", "dhcp.slackware.it")(d) - d = dhcpv4.WithRouter()(d) + d, _ := dhcpv4.New( + dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0)), + dhcpv4.WithLeaseTime(uint32(0)), + dhcpv4.WithDNS(net.ParseIP("10.10.0.1"), net.ParseIP("10.10.0.2")), + dhcpv4.WithDomainSearchList("slackware.it", "dhcp.slackware.it"), + dhcpv4.WithRouter(), + dhcpv4.WithYourIP(net.ParseIP("10.0.0.1")), + ) _, err := GetNetConfFromPacketv4(d) require.Error(t, err) } func TestGetNetConfFromPacketv4(t *testing.T) { - d := &dhcpv4.DHCPv4{} - d.YourIPAddr = net.ParseIP("10.0.0.1") - d = dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0))(d) - d = dhcpv4.WithLeaseTime(uint32(5200))(d) - d = dhcpv4.WithDNS(net.ParseIP("10.10.0.1"), net.ParseIP("10.10.0.2"))(d) - d = dhcpv4.WithDomainSearchList("slackware.it", "dhcp.slackware.it")(d) - d = dhcpv4.WithRouter(net.ParseIP("10.0.0.254"))(d) + d, _ := dhcpv4.New( + dhcpv4.WithNetmask(net.IPv4Mask(255, 255, 255, 0)), + dhcpv4.WithLeaseTime(uint32(5200)), + dhcpv4.WithDNS(net.ParseIP("10.10.0.1"), net.ParseIP("10.10.0.2")), + dhcpv4.WithDomainSearchList("slackware.it", "dhcp.slackware.it"), + dhcpv4.WithRouter(net.ParseIP("10.0.0.254")), + dhcpv4.WithYourIP(net.ParseIP("10.0.0.1")), + ) + netconf, err := GetNetConfFromPacketv4(d) require.NoError(t, err) // check addresses From feb8958aff848a6d7363fea2e29a2ac071685055 Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Tue, 15 Jan 2019 20:55:06 +0000 Subject: [PATCH 03/43] dhcpv4: consolidate string options into one file. --- dhcpv4/option_bootfile_name.go | 30 ----- dhcpv4/option_bootfile_name_test.go | 37 ------ dhcpv4/option_class_identifier.go | 32 ----- dhcpv4/option_class_identifier_test.go | 25 ---- dhcpv4/option_domain_name.go | 30 ----- dhcpv4/option_domain_name_test.go | 25 ---- dhcpv4/option_host_name.go | 30 ----- dhcpv4/option_host_name_test.go | 25 ---- dhcpv4/option_root_path.go | 32 ----- dhcpv4/option_root_path_test.go | 28 ----- dhcpv4/option_string.go | 163 +++++++++++++++++++++++++ dhcpv4/option_string_test.go | 102 ++++++++++++++++ dhcpv4/option_tftp_server_name.go | 30 ----- dhcpv4/option_tftp_server_name_test.go | 37 ------ 14 files changed, 265 insertions(+), 361 deletions(-) delete mode 100644 dhcpv4/option_bootfile_name.go delete mode 100644 dhcpv4/option_bootfile_name_test.go delete mode 100644 dhcpv4/option_class_identifier.go delete mode 100644 dhcpv4/option_class_identifier_test.go delete mode 100644 dhcpv4/option_domain_name.go delete mode 100644 dhcpv4/option_domain_name_test.go delete mode 100644 dhcpv4/option_host_name.go delete mode 100644 dhcpv4/option_host_name_test.go delete mode 100644 dhcpv4/option_root_path.go delete mode 100644 dhcpv4/option_root_path_test.go create mode 100644 dhcpv4/option_string.go create mode 100644 dhcpv4/option_string_test.go delete mode 100644 dhcpv4/option_tftp_server_name.go delete mode 100644 dhcpv4/option_tftp_server_name_test.go diff --git a/dhcpv4/option_bootfile_name.go b/dhcpv4/option_bootfile_name.go deleted file mode 100644 index da0d8731..00000000 --- a/dhcpv4/option_bootfile_name.go +++ /dev/null @@ -1,30 +0,0 @@ -package dhcpv4 - -import ( - "fmt" -) - -// OptBootfileName implements the bootfile name option described in RFC 2132, -// Section 9.5. -type OptBootfileName struct { - BootfileName string -} - -// Code returns the option code -func (op *OptBootfileName) Code() OptionCode { - return OptionBootfileName -} - -// ToBytes serializes the option and returns it as a sequence of bytes -func (op *OptBootfileName) ToBytes() []byte { - return []byte(op.BootfileName) -} - -func (op *OptBootfileName) String() string { - return fmt.Sprintf("Bootfile Name -> %s", op.BootfileName) -} - -// ParseOptBootfileName returns a new OptBootfile from a byte stream or error if any -func ParseOptBootfileName(data []byte) (*OptBootfileName, error) { - return &OptBootfileName{BootfileName: string(data)}, nil -} diff --git a/dhcpv4/option_bootfile_name_test.go b/dhcpv4/option_bootfile_name_test.go deleted file mode 100644 index 38a200d3..00000000 --- a/dhcpv4/option_bootfile_name_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package dhcpv4 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptBootfileNameCode(t *testing.T) { - opt := OptBootfileName{} - require.Equal(t, OptionBootfileName, opt.Code()) -} - -func TestOptBootfileNameToBytes(t *testing.T) { - opt := OptBootfileName{ - BootfileName: "linuxboot", - } - data := opt.ToBytes() - expected := []byte{ - 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', - } - require.Equal(t, expected, data) -} - -func TestParseOptBootfileName(t *testing.T) { - expected := []byte{ - 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', - } - opt, err := ParseOptBootfileName(expected) - require.NoError(t, err) - require.Equal(t, "linuxboot", opt.BootfileName) -} - -func TestOptBootfileNameString(t *testing.T) { - o := OptBootfileName{BootfileName: "testy test"} - require.Equal(t, "Bootfile Name -> testy test", o.String()) -} diff --git a/dhcpv4/option_class_identifier.go b/dhcpv4/option_class_identifier.go deleted file mode 100644 index 286cb59c..00000000 --- a/dhcpv4/option_class_identifier.go +++ /dev/null @@ -1,32 +0,0 @@ -package dhcpv4 - -import ( - "fmt" -) - -// OptClassIdentifier implements the vendor class identifier option described -// in RFC 2132, Section 9.13. -type OptClassIdentifier struct { - Identifier string -} - -// ParseOptClassIdentifier constructs an OptClassIdentifier struct from a sequence of -// bytes and returns it, or an error. -func ParseOptClassIdentifier(data []byte) (*OptClassIdentifier, error) { - return &OptClassIdentifier{Identifier: string(data)}, nil -} - -// Code returns the option code. -func (o *OptClassIdentifier) Code() OptionCode { - return OptionClassIdentifier -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptClassIdentifier) ToBytes() []byte { - return []byte(o.Identifier) -} - -// String returns a human-readable string for this option. -func (o *OptClassIdentifier) String() string { - return fmt.Sprintf("Class Identifier -> %v", o.Identifier) -} diff --git a/dhcpv4/option_class_identifier_test.go b/dhcpv4/option_class_identifier_test.go deleted file mode 100644 index 780cf1de..00000000 --- a/dhcpv4/option_class_identifier_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package dhcpv4 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptClassIdentifierInterfaceMethods(t *testing.T) { - o := OptClassIdentifier{Identifier: "foo"} - require.Equal(t, OptionClassIdentifier, o.Code(), "Code") - require.Equal(t, []byte{'f', 'o', 'o'}, o.ToBytes(), "ToBytes") -} - -func TestParseOptClassIdentifier(t *testing.T) { - data := []byte{'t', 'e', 's', 't'} - o, err := ParseOptClassIdentifier(data) - require.NoError(t, err) - require.Equal(t, &OptClassIdentifier{Identifier: "test"}, o) -} - -func TestOptClassIdentifierString(t *testing.T) { - o := OptClassIdentifier{Identifier: "testy test"} - require.Equal(t, "Class Identifier -> testy test", o.String()) -} diff --git a/dhcpv4/option_domain_name.go b/dhcpv4/option_domain_name.go deleted file mode 100644 index 932a1a47..00000000 --- a/dhcpv4/option_domain_name.go +++ /dev/null @@ -1,30 +0,0 @@ -package dhcpv4 - -import "fmt" - -// OptDomainName implements the domain name option described in RFC 2132, -// Section 3.17. -type OptDomainName struct { - DomainName string -} - -// ParseOptDomainName returns a new OptDomainName from a byte stream, or error -// if any. -func ParseOptDomainName(data []byte) (*OptDomainName, error) { - return &OptDomainName{DomainName: string(data)}, nil -} - -// Code returns the option code. -func (o *OptDomainName) Code() OptionCode { - return OptionDomainName -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptDomainName) ToBytes() []byte { - return []byte(o.DomainName) -} - -// String returns a human-readable string. -func (o *OptDomainName) String() string { - return fmt.Sprintf("Domain Name -> %v", o.DomainName) -} diff --git a/dhcpv4/option_domain_name_test.go b/dhcpv4/option_domain_name_test.go deleted file mode 100644 index 8c259d55..00000000 --- a/dhcpv4/option_domain_name_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package dhcpv4 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptDomainNameInterfaceMethods(t *testing.T) { - o := OptDomainName{DomainName: "foo"} - require.Equal(t, OptionDomainName, o.Code(), "Code") - require.Equal(t, []byte{'f', 'o', 'o'}, o.ToBytes(), "ToBytes") -} - -func TestParseOptDomainName(t *testing.T) { - data := []byte{'t', 'e', 's', 't'} - o, err := ParseOptDomainName(data) - require.NoError(t, err) - require.Equal(t, &OptDomainName{DomainName: "test"}, o) -} - -func TestOptDomainNameString(t *testing.T) { - o := OptDomainName{DomainName: "testy test"} - require.Equal(t, "Domain Name -> testy test", o.String()) -} diff --git a/dhcpv4/option_host_name.go b/dhcpv4/option_host_name.go deleted file mode 100644 index 242ea22d..00000000 --- a/dhcpv4/option_host_name.go +++ /dev/null @@ -1,30 +0,0 @@ -package dhcpv4 - -import "fmt" - -// OptHostName implements the host name option described by RFC 2132, Section -// 3.14. -type OptHostName struct { - HostName string -} - -// ParseOptHostName returns a new OptHostName from a byte stream, or error if -// any. -func ParseOptHostName(data []byte) (*OptHostName, error) { - return &OptHostName{HostName: string(data)}, nil -} - -// Code returns the option code. -func (o *OptHostName) Code() OptionCode { - return OptionHostName -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptHostName) ToBytes() []byte { - return []byte(o.HostName) -} - -// String returns a human-readable string. -func (o *OptHostName) String() string { - return fmt.Sprintf("Host Name -> %v", o.HostName) -} diff --git a/dhcpv4/option_host_name_test.go b/dhcpv4/option_host_name_test.go deleted file mode 100644 index 3761adae..00000000 --- a/dhcpv4/option_host_name_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package dhcpv4 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptHostNameInterfaceMethods(t *testing.T) { - o := OptHostName{HostName: "foo"} - require.Equal(t, OptionHostName, o.Code(), "Code") - require.Equal(t, []byte{'f', 'o', 'o'}, o.ToBytes(), "ToBytes") -} - -func TestParseOptHostName(t *testing.T) { - data := []byte{'t', 'e', 's', 't'} - o, err := ParseOptHostName(data) - require.NoError(t, err) - require.Equal(t, &OptHostName{HostName: "test"}, o) -} - -func TestOptHostNameString(t *testing.T) { - o := OptHostName{HostName: "testy test"} - require.Equal(t, "Host Name -> testy test", o.String()) -} diff --git a/dhcpv4/option_root_path.go b/dhcpv4/option_root_path.go deleted file mode 100644 index 66a55a78..00000000 --- a/dhcpv4/option_root_path.go +++ /dev/null @@ -1,32 +0,0 @@ -package dhcpv4 - -import ( - "fmt" -) - -// OptRootPath implements the root path option described by RFC 2132, Section -// 3.19. -type OptRootPath struct { - Path string -} - -// ParseOptRootPath constructs an OptRootPath struct from a sequence of bytes -// and returns it, or an error. -func ParseOptRootPath(data []byte) (*OptRootPath, error) { - return &OptRootPath{Path: string(data)}, nil -} - -// Code returns the option code. -func (o *OptRootPath) Code() OptionCode { - return OptionRootPath -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptRootPath) ToBytes() []byte { - return []byte(o.Path) -} - -// String returns a human-readable string for this option. -func (o *OptRootPath) String() string { - return fmt.Sprintf("Root Path -> %v", o.Path) -} diff --git a/dhcpv4/option_root_path_test.go b/dhcpv4/option_root_path_test.go deleted file mode 100644 index e05dd0e6..00000000 --- a/dhcpv4/option_root_path_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package dhcpv4 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptRootPathInterfaceMethods(t *testing.T) { - o := OptRootPath{Path: "/foo/bar/baz"} - require.Equal(t, OptionRootPath, o.Code(), "Code") - wantBytes := []byte{ - '/', 'f', 'o', 'o', '/', 'b', 'a', 'r', '/', 'b', 'a', 'z', - } - require.Equal(t, wantBytes, o.ToBytes(), "ToBytes") -} - -func TestParseOptRootPath(t *testing.T) { - data := []byte{byte(OptionRootPath), 4, '/', 'f', 'o', 'o'} - o, err := ParseOptRootPath(data[2:]) - require.NoError(t, err) - require.Equal(t, &OptRootPath{Path: "/foo"}, o) -} - -func TestOptRootPathString(t *testing.T) { - o := OptRootPath{Path: "/foo/bar/baz"} - require.Equal(t, "Root Path -> /foo/bar/baz", o.String()) -} diff --git a/dhcpv4/option_string.go b/dhcpv4/option_string.go new file mode 100644 index 00000000..76a2db26 --- /dev/null +++ b/dhcpv4/option_string.go @@ -0,0 +1,163 @@ +package dhcpv4 + +import ( + "fmt" +) + +// OptDomainName implements the domain name option described in RFC 2132, +// Section 3.17. +type OptDomainName struct { + DomainName string +} + +// ParseOptDomainName returns a new OptDomainName from a byte stream, or error +// if any. +func ParseOptDomainName(data []byte) (*OptDomainName, error) { + return &OptDomainName{DomainName: string(data)}, nil +} + +// Code returns the option code. +func (o *OptDomainName) Code() OptionCode { + return OptionDomainName +} + +// ToBytes returns a serialized stream of bytes for this option. +func (o *OptDomainName) ToBytes() []byte { + return []byte(o.DomainName) +} + +// String returns a human-readable string. +func (o *OptDomainName) String() string { + return fmt.Sprintf("Domain Name -> %v", o.DomainName) +} + +// OptHostName implements the host name option described by RFC 2132, Section +// 3.14. +type OptHostName struct { + HostName string +} + +// ParseOptHostName returns a new OptHostName from a byte stream, or error if +// any. +func ParseOptHostName(data []byte) (*OptHostName, error) { + return &OptHostName{HostName: string(data)}, nil +} + +// Code returns the option code. +func (o *OptHostName) Code() OptionCode { + return OptionHostName +} + +// ToBytes returns a serialized stream of bytes for this option. +func (o *OptHostName) ToBytes() []byte { + return []byte(o.HostName) +} + +// String returns a human-readable string. +func (o *OptHostName) String() string { + return fmt.Sprintf("Host Name -> %v", o.HostName) +} + +// OptRootPath implements the root path option described by RFC 2132, Section +// 3.19. +type OptRootPath struct { + Path string +} + +// ParseOptRootPath constructs an OptRootPath struct from a sequence of bytes +// and returns it, or an error. +func ParseOptRootPath(data []byte) (*OptRootPath, error) { + return &OptRootPath{Path: string(data)}, nil +} + +// Code returns the option code. +func (o *OptRootPath) Code() OptionCode { + return OptionRootPath +} + +// ToBytes returns a serialized stream of bytes for this option. +func (o *OptRootPath) ToBytes() []byte { + return []byte(o.Path) +} + +// String returns a human-readable string for this option. +func (o *OptRootPath) String() string { + return fmt.Sprintf("Root Path -> %v", o.Path) +} + +// OptBootfileName implements the bootfile name option described in RFC 2132, +// Section 9.5. +type OptBootfileName struct { + BootfileName string +} + +// Code returns the option code +func (op *OptBootfileName) Code() OptionCode { + return OptionBootfileName +} + +// ToBytes serializes the option and returns it as a sequence of bytes +func (op *OptBootfileName) ToBytes() []byte { + return []byte(op.BootfileName) +} + +func (op *OptBootfileName) String() string { + return fmt.Sprintf("Bootfile Name -> %s", op.BootfileName) +} + +// ParseOptBootfileName returns a new OptBootfile from a byte stream or error if any +func ParseOptBootfileName(data []byte) (*OptBootfileName, error) { + return &OptBootfileName{BootfileName: string(data)}, nil +} + +// OptTFTPServerName implements the TFTP server name option described by RFC +// 2132, Section 9.4. +type OptTFTPServerName struct { + TFTPServerName string +} + +// Code returns the option code +func (op *OptTFTPServerName) Code() OptionCode { + return OptionTFTPServerName +} + +// ToBytes serializes the option and returns it as a sequence of bytes +func (op *OptTFTPServerName) ToBytes() []byte { + return []byte(op.TFTPServerName) +} + +func (op *OptTFTPServerName) String() string { + return fmt.Sprintf("TFTP Server Name -> %s", op.TFTPServerName) +} + +// ParseOptTFTPServerName returns a new OptTFTPServerName from a byte stream or error if any +func ParseOptTFTPServerName(data []byte) (*OptTFTPServerName, error) { + return &OptTFTPServerName{TFTPServerName: string(data)}, nil +} + +// OptClassIdentifier implements the vendor class identifier option described +// in RFC 2132, Section 9.13. +type OptClassIdentifier struct { + Identifier string +} + +// ParseOptClassIdentifier constructs an OptClassIdentifier struct from a sequence of +// bytes and returns it, or an error. +func ParseOptClassIdentifier(data []byte) (*OptClassIdentifier, error) { + return &OptClassIdentifier{Identifier: string(data)}, nil +} + +// Code returns the option code. +func (o *OptClassIdentifier) Code() OptionCode { + return OptionClassIdentifier +} + +// ToBytes returns a serialized stream of bytes for this option. +func (o *OptClassIdentifier) ToBytes() []byte { + return []byte(o.Identifier) +} + +// String returns a human-readable string for this option. +func (o *OptClassIdentifier) String() string { + return fmt.Sprintf("Class Identifier -> %v", o.Identifier) +} diff --git a/dhcpv4/option_string_test.go b/dhcpv4/option_string_test.go new file mode 100644 index 00000000..0704f317 --- /dev/null +++ b/dhcpv4/option_string_test.go @@ -0,0 +1,102 @@ +package dhcpv4 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestOptDomainName(t *testing.T) { + o := OptDomainName{DomainName: "foo"} + require.Equal(t, OptionDomainName, o.Code(), "Code") + require.Equal(t, []byte{'f', 'o', 'o'}, o.ToBytes(), "ToBytes") + require.Equal(t, "Domain Name -> foo", o.String()) +} + +func TestParseOptDomainName(t *testing.T) { + data := []byte{'t', 'e', 's', 't'} + o, err := ParseOptDomainName(data) + require.NoError(t, err) + require.Equal(t, &OptDomainName{DomainName: "test"}, o) +} + +func TestOptHostName(t *testing.T) { + o := OptHostName{HostName: "foo"} + require.Equal(t, OptionHostName, o.Code(), "Code") + require.Equal(t, []byte{'f', 'o', 'o'}, o.ToBytes(), "ToBytes") + require.Equal(t, "Host Name -> foo", o.String()) +} + +func TestParseOptHostName(t *testing.T) { + data := []byte{'t', 'e', 's', 't'} + o, err := ParseOptHostName(data) + require.NoError(t, err) + require.Equal(t, &OptHostName{HostName: "test"}, o) +} + +func TestOptRootPath(t *testing.T) { + o := OptRootPath{Path: "/foo/bar/baz"} + require.Equal(t, OptionRootPath, o.Code(), "Code") + wantBytes := []byte{ + '/', 'f', 'o', 'o', '/', 'b', 'a', 'r', '/', 'b', 'a', 'z', + } + require.Equal(t, wantBytes, o.ToBytes(), "ToBytes") + require.Equal(t, "Root Path -> /foo/bar/baz", o.String()) +} + +func TestParseOptRootPath(t *testing.T) { + data := []byte{byte(OptionRootPath), 4, '/', 'f', 'o', 'o'} + o, err := ParseOptRootPath(data[2:]) + require.NoError(t, err) + require.Equal(t, &OptRootPath{Path: "/foo"}, o) +} + +func TestOptBootfileName(t *testing.T) { + opt := OptBootfileName{ + BootfileName: "linuxboot", + } + require.Equal(t, OptionBootfileName, opt.Code()) + require.Equal(t, []byte{'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't'}, opt.ToBytes()) + require.Equal(t, "Bootfile Name -> linuxboot", opt.String()) +} + +func TestParseOptBootfileName(t *testing.T) { + expected := []byte{ + 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', + } + opt, err := ParseOptBootfileName(expected) + require.NoError(t, err) + require.Equal(t, "linuxboot", opt.BootfileName) +} + +func TestOptTFTPServer(t *testing.T) { + opt := OptTFTPServerName{ + TFTPServerName: "linuxboot", + } + require.Equal(t, OptionTFTPServerName, opt.Code()) + require.Equal(t, []byte("linuxboot"), opt.ToBytes()) + require.Equal(t, "TFTP Server Name -> linuxboot", opt.String()) +} + +func TestParseOptTFTPServerName(t *testing.T) { + expected := []byte{ + 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', + } + opt, err := ParseOptTFTPServerName(expected) + require.NoError(t, err) + require.Equal(t, "linuxboot", string(opt.TFTPServerName)) +} + +func TestOptClassIdentifier(t *testing.T) { + o := OptClassIdentifier{Identifier: "foo"} + require.Equal(t, OptionClassIdentifier, o.Code(), "Code") + require.Equal(t, []byte("foo"), o.ToBytes(), "ToBytes") + require.Equal(t, "Class Identifier -> foo", o.String()) +} + +func TestParseOptClassIdentifier(t *testing.T) { + data := []byte("test") + o, err := ParseOptClassIdentifier(data) + require.NoError(t, err) + require.Equal(t, &OptClassIdentifier{Identifier: "test"}, o) +} diff --git a/dhcpv4/option_tftp_server_name.go b/dhcpv4/option_tftp_server_name.go deleted file mode 100644 index 52c638d1..00000000 --- a/dhcpv4/option_tftp_server_name.go +++ /dev/null @@ -1,30 +0,0 @@ -package dhcpv4 - -import ( - "fmt" -) - -// OptTFTPServerName implements the TFTP server name option described by RFC -// 2132, Section 9.4. -type OptTFTPServerName struct { - TFTPServerName string -} - -// Code returns the option code -func (op *OptTFTPServerName) Code() OptionCode { - return OptionTFTPServerName -} - -// ToBytes serializes the option and returns it as a sequence of bytes -func (op *OptTFTPServerName) ToBytes() []byte { - return []byte(op.TFTPServerName) -} - -func (op *OptTFTPServerName) String() string { - return fmt.Sprintf("TFTP Server Name -> %s", op.TFTPServerName) -} - -// ParseOptTFTPServerName returns a new OptTFTPServerName from a byte stream or error if any -func ParseOptTFTPServerName(data []byte) (*OptTFTPServerName, error) { - return &OptTFTPServerName{TFTPServerName: string(data)}, nil -} diff --git a/dhcpv4/option_tftp_server_name_test.go b/dhcpv4/option_tftp_server_name_test.go deleted file mode 100644 index c46b5db9..00000000 --- a/dhcpv4/option_tftp_server_name_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package dhcpv4 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptTFTPServerNameCode(t *testing.T) { - opt := OptTFTPServerName{} - require.Equal(t, OptionTFTPServerName, opt.Code()) -} - -func TestOptTFTPServerNameToBytes(t *testing.T) { - opt := OptTFTPServerName{ - TFTPServerName: "linuxboot", - } - data := opt.ToBytes() - expected := []byte{ - 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', - } - require.Equal(t, expected, data) -} - -func TestParseOptTFTPServerName(t *testing.T) { - expected := []byte{ - 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', - } - opt, err := ParseOptTFTPServerName(expected) - require.NoError(t, err) - require.Equal(t, "linuxboot", string(opt.TFTPServerName)) -} - -func TestOptTFTPServerNameString(t *testing.T) { - o := OptTFTPServerName{TFTPServerName: "testy test"} - require.Equal(t, "TFTP Server Name -> testy test", o.String()) -} From 0b587bcfd1b0e8808e57d77fb4028adbd54bfd25 Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Tue, 15 Jan 2019 21:11:07 +0000 Subject: [PATCH 04/43] dhcpv4: consolidate all IP options into one file. --- dhcpv4/option_broadcast_address.go | 36 --------- dhcpv4/option_broadcast_address_test.go | 36 --------- dhcpv4/option_ip.go | 92 ++++++++++++++++++++++ dhcpv4/option_ip_test.go | 68 ++++++++++++++++ dhcpv4/option_requested_ip_address.go | 36 --------- dhcpv4/option_requested_ip_address_test.go | 36 --------- dhcpv4/option_server_identifier.go | 36 --------- dhcpv4/option_server_identifier_test.go | 36 --------- 8 files changed, 160 insertions(+), 216 deletions(-) delete mode 100644 dhcpv4/option_broadcast_address.go delete mode 100644 dhcpv4/option_broadcast_address_test.go create mode 100644 dhcpv4/option_ip.go create mode 100644 dhcpv4/option_ip_test.go delete mode 100644 dhcpv4/option_requested_ip_address.go delete mode 100644 dhcpv4/option_requested_ip_address_test.go delete mode 100644 dhcpv4/option_server_identifier.go delete mode 100644 dhcpv4/option_server_identifier_test.go diff --git a/dhcpv4/option_broadcast_address.go b/dhcpv4/option_broadcast_address.go deleted file mode 100644 index 0f5fb4b6..00000000 --- a/dhcpv4/option_broadcast_address.go +++ /dev/null @@ -1,36 +0,0 @@ -package dhcpv4 - -import ( - "fmt" - "net" - - "github.com/u-root/u-root/pkg/uio" -) - -// OptBroadcastAddress implements the broadcast address option described in RFC -// 2132, Section 5.3. -type OptBroadcastAddress struct { - BroadcastAddress net.IP -} - -// ParseOptBroadcastAddress returns a new OptBroadcastAddress from a byte -// stream, or error if any. -func ParseOptBroadcastAddress(data []byte) (*OptBroadcastAddress, error) { - buf := uio.NewBigEndianBuffer(data) - return &OptBroadcastAddress{BroadcastAddress: net.IP(buf.CopyN(net.IPv4len))}, buf.FinError() -} - -// Code returns the option code. -func (o *OptBroadcastAddress) Code() OptionCode { - return OptionBroadcastAddress -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptBroadcastAddress) ToBytes() []byte { - return []byte(o.BroadcastAddress.To4()) -} - -// String returns a human-readable string. -func (o *OptBroadcastAddress) String() string { - return fmt.Sprintf("Broadcast Address -> %v", o.BroadcastAddress.String()) -} diff --git a/dhcpv4/option_broadcast_address_test.go b/dhcpv4/option_broadcast_address_test.go deleted file mode 100644 index 5b6b44f9..00000000 --- a/dhcpv4/option_broadcast_address_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package dhcpv4 - -import ( - "net" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptBroadcastAddressInterfaceMethods(t *testing.T) { - ip := net.IP{192, 168, 0, 1} - o := OptBroadcastAddress{BroadcastAddress: ip} - - require.Equal(t, OptionBroadcastAddress, o.Code(), "Code") - - expectedBytes := []byte{192, 168, 0, 1} - require.Equal(t, expectedBytes, o.ToBytes(), "ToBytes") - - require.Equal(t, "Broadcast Address -> 192.168.0.1", o.String(), "String") -} - -func TestParseOptBroadcastAddress(t *testing.T) { - var ( - o *OptBroadcastAddress - err error - ) - o, err = ParseOptBroadcastAddress([]byte{}) - require.Error(t, err, "empty byte stream") - - o, err = ParseOptBroadcastAddress([]byte{192, 168, 0}) - require.Error(t, err, "wrong IP length") - - o, err = ParseOptBroadcastAddress([]byte{192, 168, 0, 1}) - require.NoError(t, err) - require.Equal(t, net.IP{192, 168, 0, 1}, o.BroadcastAddress) -} diff --git a/dhcpv4/option_ip.go b/dhcpv4/option_ip.go new file mode 100644 index 00000000..ee0f5fef --- /dev/null +++ b/dhcpv4/option_ip.go @@ -0,0 +1,92 @@ +package dhcpv4 + +import ( + "fmt" + "net" + + "github.com/u-root/u-root/pkg/uio" +) + +// OptBroadcastAddress implements the broadcast address option described in RFC +// 2132, Section 5.3. +type OptBroadcastAddress struct { + BroadcastAddress net.IP +} + +// ParseOptBroadcastAddress returns a new OptBroadcastAddress from a byte +// stream, or error if any. +func ParseOptBroadcastAddress(data []byte) (*OptBroadcastAddress, error) { + buf := uio.NewBigEndianBuffer(data) + return &OptBroadcastAddress{BroadcastAddress: net.IP(buf.CopyN(net.IPv4len))}, buf.FinError() +} + +// Code returns the option code. +func (o *OptBroadcastAddress) Code() OptionCode { + return OptionBroadcastAddress +} + +// ToBytes returns a serialized stream of bytes for this option. +func (o *OptBroadcastAddress) ToBytes() []byte { + return []byte(o.BroadcastAddress.To4()) +} + +// String returns a human-readable string. +func (o *OptBroadcastAddress) String() string { + return fmt.Sprintf("Broadcast Address -> %v", o.BroadcastAddress.String()) +} + +// OptRequestedIPAddress implements the requested IP address option described +// by RFC 2132, Section 9.1. +type OptRequestedIPAddress struct { + RequestedAddr net.IP +} + +// ParseOptRequestedIPAddress returns a new OptRequestedIPAddress from a byte +// stream, or error if any. +func ParseOptRequestedIPAddress(data []byte) (*OptRequestedIPAddress, error) { + buf := uio.NewBigEndianBuffer(data) + return &OptRequestedIPAddress{RequestedAddr: net.IP(buf.CopyN(net.IPv4len))}, buf.FinError() +} + +// Code returns the option code. +func (o *OptRequestedIPAddress) Code() OptionCode { + return OptionRequestedIPAddress +} + +// ToBytes returns a serialized stream of bytes for this option. +func (o *OptRequestedIPAddress) ToBytes() []byte { + return o.RequestedAddr.To4() +} + +// String returns a human-readable string. +func (o *OptRequestedIPAddress) String() string { + return fmt.Sprintf("Requested IP Address -> %v", o.RequestedAddr.String()) +} + +// OptServerIdentifier implements the server identifier option described by RFC +// 2132, Section 9.7. +type OptServerIdentifier struct { + ServerID net.IP +} + +// ParseOptServerIdentifier returns a new OptServerIdentifier from a byte +// stream, or error if any. +func ParseOptServerIdentifier(data []byte) (*OptServerIdentifier, error) { + buf := uio.NewBigEndianBuffer(data) + return &OptServerIdentifier{ServerID: net.IP(buf.CopyN(net.IPv4len))}, buf.FinError() +} + +// Code returns the option code. +func (o *OptServerIdentifier) Code() OptionCode { + return OptionServerIdentifier +} + +// ToBytes returns a serialized stream of bytes for this option. +func (o *OptServerIdentifier) ToBytes() []byte { + return o.ServerID.To4() +} + +// String returns a human-readable string. +func (o *OptServerIdentifier) String() string { + return fmt.Sprintf("Server Identifier -> %v", o.ServerID.String()) +} diff --git a/dhcpv4/option_ip_test.go b/dhcpv4/option_ip_test.go new file mode 100644 index 00000000..fe314870 --- /dev/null +++ b/dhcpv4/option_ip_test.go @@ -0,0 +1,68 @@ +package dhcpv4 + +import ( + "net" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestOptBroadcastAddress(t *testing.T) { + o := OptBroadcastAddress{BroadcastAddress: net.IP{192, 168, 0, 1}} + + require.Equal(t, OptionBroadcastAddress, o.Code(), "Code") + require.Equal(t, []byte{192, 168, 0, 1}, o.ToBytes(), "ToBytes") + require.Equal(t, "Broadcast Address -> 192.168.0.1", o.String(), "String") +} + +func TestParseOptBroadcastAddress(t *testing.T) { + o, err := ParseOptBroadcastAddress([]byte{}) + require.Error(t, err, "empty byte stream") + + o, err = ParseOptBroadcastAddress([]byte{192, 168, 0}) + require.Error(t, err, "wrong IP length") + + o, err = ParseOptBroadcastAddress([]byte{192, 168, 0, 1}) + require.NoError(t, err) + require.Equal(t, net.IP{192, 168, 0, 1}, o.BroadcastAddress) +} + +func TestOptRequestedIPAddress(t *testing.T) { + o := OptRequestedIPAddress{RequestedAddr: net.IP{192, 168, 0, 1}} + + require.Equal(t, OptionRequestedIPAddress, o.Code(), "Code") + require.Equal(t, []byte{192, 168, 0, 1}, o.ToBytes(), "ToBytes") + require.Equal(t, "Requested IP Address -> 192.168.0.1", o.String(), "String") +} + +func TestParseOptRequestedIPAddress(t *testing.T) { + o, err := ParseOptRequestedIPAddress([]byte{}) + require.Error(t, err, "empty byte stream") + + o, err = ParseOptRequestedIPAddress([]byte{192}) + require.Error(t, err, "wrong IP length") + + o, err = ParseOptRequestedIPAddress([]byte{192, 168, 0, 1}) + require.NoError(t, err) + require.Equal(t, net.IP{192, 168, 0, 1}, o.RequestedAddr) +} + +func TestOptServerIdentifierInterfaceMethods(t *testing.T) { + o := OptServerIdentifier{ServerID: net.IP{192, 168, 0, 1}} + + require.Equal(t, OptionServerIdentifier, o.Code(), "Code") + require.Equal(t, []byte{192, 168, 0, 1}, o.ToBytes(), "ToBytes") + require.Equal(t, "Server Identifier -> 192.168.0.1", o.String(), "String") +} + +func TestParseOptServerIdentifier(t *testing.T) { + o, err := ParseOptServerIdentifier([]byte{}) + require.Error(t, err, "empty byte stream") + + o, err = ParseOptServerIdentifier([]byte{192, 168, 0}) + require.Error(t, err, "wrong IP length") + + o, err = ParseOptServerIdentifier([]byte{192, 168, 0, 1}) + require.NoError(t, err) + require.Equal(t, net.IP{192, 168, 0, 1}, o.ServerID) +} diff --git a/dhcpv4/option_requested_ip_address.go b/dhcpv4/option_requested_ip_address.go deleted file mode 100644 index bd3bc091..00000000 --- a/dhcpv4/option_requested_ip_address.go +++ /dev/null @@ -1,36 +0,0 @@ -package dhcpv4 - -import ( - "fmt" - "net" - - "github.com/u-root/u-root/pkg/uio" -) - -// OptRequestedIPAddress implements the requested IP address option described -// by RFC 2132, Section 9.1. -type OptRequestedIPAddress struct { - RequestedAddr net.IP -} - -// ParseOptRequestedIPAddress returns a new OptServerIdentifier from a byte -// stream, or error if any. -func ParseOptRequestedIPAddress(data []byte) (*OptRequestedIPAddress, error) { - buf := uio.NewBigEndianBuffer(data) - return &OptRequestedIPAddress{RequestedAddr: net.IP(buf.CopyN(net.IPv4len))}, buf.FinError() -} - -// Code returns the option code. -func (o *OptRequestedIPAddress) Code() OptionCode { - return OptionRequestedIPAddress -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptRequestedIPAddress) ToBytes() []byte { - return o.RequestedAddr.To4() -} - -// String returns a human-readable string. -func (o *OptRequestedIPAddress) String() string { - return fmt.Sprintf("Requested IP Address -> %v", o.RequestedAddr.String()) -} diff --git a/dhcpv4/option_requested_ip_address_test.go b/dhcpv4/option_requested_ip_address_test.go deleted file mode 100644 index 7d33b1e1..00000000 --- a/dhcpv4/option_requested_ip_address_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package dhcpv4 - -import ( - "net" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptRequestedIPAddressInterfaceMethods(t *testing.T) { - ip := net.IP{192, 168, 0, 1} - o := OptRequestedIPAddress{RequestedAddr: ip} - - require.Equal(t, OptionRequestedIPAddress, o.Code(), "Code") - - expectedBytes := []byte{192, 168, 0, 1} - require.Equal(t, expectedBytes, o.ToBytes(), "ToBytes") - - require.Equal(t, "Requested IP Address -> 192.168.0.1", o.String(), "String") -} - -func TestParseOptRequestedIPAddress(t *testing.T) { - var ( - o *OptRequestedIPAddress - err error - ) - o, err = ParseOptRequestedIPAddress([]byte{}) - require.Error(t, err, "empty byte stream") - - o, err = ParseOptRequestedIPAddress([]byte{192}) - require.Error(t, err, "wrong IP length") - - o, err = ParseOptRequestedIPAddress([]byte{192, 168, 0, 1}) - require.NoError(t, err) - require.Equal(t, net.IP{192, 168, 0, 1}, o.RequestedAddr) -} diff --git a/dhcpv4/option_server_identifier.go b/dhcpv4/option_server_identifier.go deleted file mode 100644 index 6fc09a96..00000000 --- a/dhcpv4/option_server_identifier.go +++ /dev/null @@ -1,36 +0,0 @@ -package dhcpv4 - -import ( - "fmt" - "net" - - "github.com/u-root/u-root/pkg/uio" -) - -// OptServerIdentifier implements the server identifier option described by RFC -// 2132, Section 9.7. -type OptServerIdentifier struct { - ServerID net.IP -} - -// ParseOptServerIdentifier returns a new OptServerIdentifier from a byte -// stream, or error if any. -func ParseOptServerIdentifier(data []byte) (*OptServerIdentifier, error) { - buf := uio.NewBigEndianBuffer(data) - return &OptServerIdentifier{ServerID: net.IP(buf.CopyN(net.IPv4len))}, buf.FinError() -} - -// Code returns the option code. -func (o *OptServerIdentifier) Code() OptionCode { - return OptionServerIdentifier -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptServerIdentifier) ToBytes() []byte { - return o.ServerID.To4() -} - -// String returns a human-readable string. -func (o *OptServerIdentifier) String() string { - return fmt.Sprintf("Server Identifier -> %v", o.ServerID.String()) -} diff --git a/dhcpv4/option_server_identifier_test.go b/dhcpv4/option_server_identifier_test.go deleted file mode 100644 index e250ad7e..00000000 --- a/dhcpv4/option_server_identifier_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package dhcpv4 - -import ( - "net" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptServerIdentifierInterfaceMethods(t *testing.T) { - ip := net.IP{192, 168, 0, 1} - o := OptServerIdentifier{ServerID: ip} - - require.Equal(t, OptionServerIdentifier, o.Code(), "Code") - - expectedBytes := []byte{192, 168, 0, 1} - require.Equal(t, expectedBytes, o.ToBytes(), "ToBytes") - - require.Equal(t, "Server Identifier -> 192.168.0.1", o.String(), "String") -} - -func TestParseOptServerIdentifier(t *testing.T) { - var ( - o *OptServerIdentifier - err error - ) - o, err = ParseOptServerIdentifier([]byte{}) - require.Error(t, err, "empty byte stream") - - o, err = ParseOptServerIdentifier([]byte{192, 168, 0}) - require.Error(t, err, "wrong IP length") - - o, err = ParseOptServerIdentifier([]byte{192, 168, 0, 1}) - require.NoError(t, err) - require.Equal(t, net.IP{192, 168, 0, 1}, o.ServerID) -} From d2b44fc606e0383a8d81f9dfe1c57f14f22f90fb Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 20:32:44 +0000 Subject: [PATCH 05/43] dhcpv4: add Stringer for XID --- dhcpv4/dhcpv4.go | 12 +++--------- dhcpv4/types.go | 5 +++++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/dhcpv4/dhcpv4.go b/dhcpv4/dhcpv4.go index 93a65313..1aa2603e 100644 --- a/dhcpv4/dhcpv4.go +++ b/dhcpv4/dhcpv4.go @@ -2,7 +2,6 @@ package dhcpv4 import ( "crypto/rand" - "encoding/binary" "errors" "fmt" "net" @@ -347,15 +346,10 @@ func (d *DHCPv4) MessageType() MessageType { return opt.(*OptMessageType).MessageType } -// HumanXID returns a human-readably integer transaction ID. -func (d *DHCPv4) HumanXID() uint32 { - return binary.LittleEndian.Uint32(d.TransactionID[:]) -} - // String implements fmt.Stringer. func (d *DHCPv4) String() string { - return fmt.Sprintf("DHCPv4(opcode=%s xid=%v hwtype=%s hwaddr=%s)", - d.OpCode.String(), d.HumanXID(), d.HWType, d.ClientHWAddr) + return fmt.Sprintf("DHCPv4(opcode=%s xid=%s hwtype=%s hwaddr=%s)", + d.OpCode, d.TransactionID, d.HWType, d.ClientHWAddr) } // Summary prints detailed information about the packet. @@ -378,7 +372,7 @@ func (d *DHCPv4) Summary() string { d.OpCode, d.HWType, d.HopCount, - d.HumanXID(), + d.TransactionID, d.NumSeconds, d.FlagsToString(), d.Flags, diff --git a/dhcpv4/types.go b/dhcpv4/types.go index 46ec3c6b..6214dbd8 100644 --- a/dhcpv4/types.go +++ b/dhcpv4/types.go @@ -13,6 +13,11 @@ import ( // The TransactionID is used to match DHCP replies to their original request. type TransactionID [4]byte +// String prints a hex transaction ID. +func (xid TransactionID) String() string { + return fmt.Sprintf("0x%x", xid[:]) +} + // MessageType represents the possible DHCP message types - DISCOVER, OFFER, etc type MessageType byte From 2be5cae32d33f01ddecf6f167a9c0e5290e6d58f Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 21:50:04 +0000 Subject: [PATCH 06/43] dhcpv4: fix TransactionID in Summary --- dhcpv4/dhcpv4.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/dhcpv4/dhcpv4.go b/dhcpv4/dhcpv4.go index 1aa2603e..bbb2f379 100644 --- a/dhcpv4/dhcpv4.go +++ b/dhcpv4/dhcpv4.go @@ -356,19 +356,19 @@ func (d *DHCPv4) String() string { func (d *DHCPv4) Summary() string { ret := fmt.Sprintf( "DHCPv4\n"+ - " opcode=%v\n"+ - " hwtype=%v\n"+ + " opcode=%s\n"+ + " hwtype=%s\n"+ " hopcount=%v\n"+ - " transactionid=0x%08x\n"+ + " transactionid=%s\n"+ " numseconds=%v\n"+ " flags=%v (0x%02x)\n"+ - " clientipaddr=%v\n"+ - " youripaddr=%v\n"+ - " serveripaddr=%v\n"+ - " gatewayipaddr=%v\n"+ - " clienthwaddr=%v\n"+ - " serverhostname=%v\n"+ - " bootfilename=%v\n", + " clientipaddr=%s\n"+ + " youripaddr=%s\n"+ + " serveripaddr=%s\n"+ + " gatewayipaddr=%s\n"+ + " clienthwaddr=%s\n"+ + " serverhostname=%s\n"+ + " bootfilename=%s\n", d.OpCode, d.HWType, d.HopCount, From c90ab10024ada840e24bb028a3405961e8e4c26a Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sat, 29 Dec 2018 14:48:10 -0800 Subject: [PATCH 07/43] dhcpv4: nicer API for option parsing. From: r := d.GetOneOption(OptionRouter).(*OptRouter).Routers d.UpdateOption(&OptRouter{Routers: []net.IP{net.IP{192, 168, 0, 1}}}) To: r := GetRouter(d.Options) d.UpdateOption(OptRouter(net.IP{192, 168, 0, 1}, ...)) --- dhcpv4/bsdp/boot_image.go | 51 ++- dhcpv4/bsdp/bsdp.go | 158 ++++---- dhcpv4/bsdp/bsdp_option_boot_image_list.go | 66 ++-- .../bsdp/bsdp_option_boot_image_list_test.go | 19 +- .../bsdp/bsdp_option_default_boot_image_id.go | 42 -- .../bsdp_option_default_boot_image_id_test.go | 46 --- dhcpv4/bsdp/bsdp_option_generic.go | 36 -- dhcpv4/bsdp/bsdp_option_generic_test.go | 57 --- dhcpv4/bsdp/bsdp_option_machine_name.go | 34 -- dhcpv4/bsdp/bsdp_option_machine_name_test.go | 26 -- dhcpv4/bsdp/bsdp_option_message_type.go | 50 ++- dhcpv4/bsdp/bsdp_option_message_type_test.go | 19 +- dhcpv4/bsdp/bsdp_option_misc.go | 99 +++++ dhcpv4/bsdp/bsdp_option_misc_test.go | 95 +++++ dhcpv4/bsdp/bsdp_option_reply_port.go | 42 -- dhcpv4/bsdp/bsdp_option_reply_port_test.go | 36 -- .../bsdp_option_selected_boot_image_id.go | 42 -- ...bsdp_option_selected_boot_image_id_test.go | 46 --- dhcpv4/bsdp/bsdp_option_server_identifier.go | 36 -- .../bsdp_option_server_identifier_test.go | 33 -- dhcpv4/bsdp/bsdp_option_server_priority.go | 37 -- .../bsdp/bsdp_option_server_priority_test.go | 30 -- dhcpv4/bsdp/bsdp_option_version.go | 41 -- dhcpv4/bsdp/bsdp_option_version_test.go | 29 -- dhcpv4/bsdp/bsdp_test.go | 152 ++++---- dhcpv4/bsdp/client.go | 32 +- .../option_vendor_specific_information.go | 136 ++++--- ...option_vendor_specific_information_test.go | 218 +++-------- dhcpv4/bsdp/types.go | 6 +- dhcpv4/dhcpv4.go | 115 +++--- dhcpv4/dhcpv4_test.go | 57 ++- dhcpv4/modifiers.go | 41 +- dhcpv4/modifiers_test.go | 97 ++--- dhcpv4/option_archtype.go | 56 +-- dhcpv4/option_archtype_test.go | 53 +-- dhcpv4/option_domain_search.go | 44 +-- dhcpv4/option_domain_search_test.go | 32 +- dhcpv4/option_generic.go | 25 +- dhcpv4/option_generic_test.go | 40 +- dhcpv4/option_ip.go | 115 +++--- dhcpv4/option_ip_address_lease_time.go | 54 ++- dhcpv4/option_ip_address_lease_time_test.go | 41 +- dhcpv4/option_ip_test.go | 74 ++-- dhcpv4/option_ips.go | 152 ++++---- dhcpv4/option_ips_test.go | 145 +++---- dhcpv4/option_maximum_dhcp_message_size.go | 58 ++- .../option_maximum_dhcp_message_size_test.go | 30 +- dhcpv4/option_message_type.go | 44 +-- dhcpv4/option_message_type_test.go | 36 +- dhcpv4/option_parameter_request_list.go | 62 +-- dhcpv4/option_parameter_request_list_test.go | 20 +- dhcpv4/option_relay_agent_information.go | 61 +-- dhcpv4/option_relay_agent_information_test.go | 65 ++-- dhcpv4/option_string.go | 208 ++++------ dhcpv4/option_string_test.go | 111 +++--- dhcpv4/option_subnet_mask.go | 57 ++- dhcpv4/option_subnet_mask_test.go | 37 +- dhcpv4/option_userclass.go | 77 ++-- dhcpv4/option_userclass_test.go | 48 +-- dhcpv4/option_vivc.go | 62 +-- dhcpv4/option_vivc_test.go | 37 +- dhcpv4/options.go | 366 +++++++++++------- dhcpv4/options_test.go | 333 ++++++++-------- dhcpv4/server_test.go | 16 +- dhcpv4/types.go | 39 +- dhcpv4/ztpv4/ztp.go | 10 +- dhcpv4/ztpv4/ztp_test.go | 9 +- iana/archtype.go | 44 +++ netboot/netconf.go | 33 +- netboot/netconf_test.go | 6 +- rfc1035label/label.go | 30 +- 71 files changed, 2114 insertions(+), 2640 deletions(-) delete mode 100644 dhcpv4/bsdp/bsdp_option_default_boot_image_id.go delete mode 100644 dhcpv4/bsdp/bsdp_option_default_boot_image_id_test.go delete mode 100644 dhcpv4/bsdp/bsdp_option_generic.go delete mode 100644 dhcpv4/bsdp/bsdp_option_generic_test.go delete mode 100644 dhcpv4/bsdp/bsdp_option_machine_name.go delete mode 100644 dhcpv4/bsdp/bsdp_option_machine_name_test.go create mode 100644 dhcpv4/bsdp/bsdp_option_misc.go create mode 100644 dhcpv4/bsdp/bsdp_option_misc_test.go delete mode 100644 dhcpv4/bsdp/bsdp_option_reply_port.go delete mode 100644 dhcpv4/bsdp/bsdp_option_reply_port_test.go delete mode 100644 dhcpv4/bsdp/bsdp_option_selected_boot_image_id.go delete mode 100644 dhcpv4/bsdp/bsdp_option_selected_boot_image_id_test.go delete mode 100644 dhcpv4/bsdp/bsdp_option_server_identifier.go delete mode 100644 dhcpv4/bsdp/bsdp_option_server_identifier_test.go delete mode 100644 dhcpv4/bsdp/bsdp_option_server_priority.go delete mode 100644 dhcpv4/bsdp/bsdp_option_server_priority_test.go delete mode 100644 dhcpv4/bsdp/bsdp_option_version.go delete mode 100644 dhcpv4/bsdp/bsdp_option_version_test.go diff --git a/dhcpv4/bsdp/boot_image.go b/dhcpv4/bsdp/boot_image.go index 954dcb65..58b5167b 100644 --- a/dhcpv4/bsdp/boot_image.go +++ b/dhcpv4/bsdp/boot_image.go @@ -3,6 +3,7 @@ package bsdp import ( "fmt" + "github.com/insomniacslk/dhcp/dhcpv4" "github.com/u-root/u-root/pkg/uio" ) @@ -18,9 +19,9 @@ const ( // 4 - 127 are reserved for future use. ) -// BootImageTypeToString maps the different BootImageTypes to human-readable +// bootImageTypeToString maps the different BootImageTypes to human-readable // representations. -var BootImageTypeToString = map[BootImageType]string{ +var bootImageTypeToString = map[BootImageType]string{ BootImageTypeMacOS9: "macOS 9", BootImageTypeMacOSX: "macOS", BootImageTypeMacOSXServer: "macOS Server", @@ -35,6 +36,16 @@ type BootImageID struct { Index uint16 } +// ToBytes implements dhcpv4.OptionValue. +func (b BootImageID) ToBytes() []byte { + return uio.ToBigEndian(b) +} + +// FromBytes reads data into b. +func (b *BootImageID) FromBytes(data []byte) error { + return uio.FromBigEndian(b, data) +} + // Marshal writes the binary representation to buf. func (b BootImageID) Marshal(buf *uio.Lexer) { var byte0 byte @@ -55,7 +66,7 @@ func (b BootImageID) String() string { } else { s += " uninstallable" } - t, ok := BootImageTypeToString[b.ImageType] + t, ok := bootImageTypeToString[b.ImageType] if !ok { t = "unknown" } @@ -99,3 +110,37 @@ func (b *BootImage) Unmarshal(buf *uio.Lexer) error { b.Name = string(buf.Consume(int(nameLength))) return buf.Error() } + +func getBootImageID(code dhcpv4.OptionCode, o dhcpv4.Options) *BootImageID { + v := o.Get(code) + if v == nil { + return nil + } + var b BootImageID + if err := uio.FromBigEndian(&b, v); err != nil { + return nil + } + return &b +} + +// OptDefaultBootImageID returns a new default boot image ID option as per +// BSDP. +func OptDefaultBootImageID(b BootImageID) dhcpv4.Option { + return dhcpv4.Option{Code: OptionDefaultBootImageID, Value: b} +} + +// GetDefaultBootImageID returns the default boot image ID contained in o. +func GetDefaultBootImageID(o dhcpv4.Options) *BootImageID { + return getBootImageID(OptionDefaultBootImageID, o) +} + +// OptSelectedBootImageID returns a new selected boot image ID option as per +// BSDP. +func OptSelectedBootImageID(b BootImageID) dhcpv4.Option { + return dhcpv4.Option{Code: OptionSelectedBootImageID, Value: b} +} + +// GetSelectedBootImageID returns the selected boot image ID contained in o. +func GetSelectedBootImageID(o dhcpv4.Options) *BootImageID { + return getBootImageID(OptionSelectedBootImageID, o) +} diff --git a/dhcpv4/bsdp/bsdp.go b/dhcpv4/bsdp/bsdp.go index 3cc87d22..9bcc15d6 100644 --- a/dhcpv4/bsdp/bsdp.go +++ b/dhcpv4/bsdp/bsdp.go @@ -30,20 +30,12 @@ type ReplyConfig struct { // ParseBootImageListFromAck parses the list of boot images presented in the // ACK[LIST] packet and returns them as a list of BootImages. -func ParseBootImageListFromAck(ack dhcpv4.DHCPv4) ([]BootImage, error) { - opt := ack.GetOneOption(dhcpv4.OptionVendorSpecificInformation) - if opt == nil { +func ParseBootImageListFromAck(ack *dhcpv4.DHCPv4) ([]BootImage, error) { + vendorOpts := GetVendorOptions(ack.Options) + if vendorOpts == nil { return nil, errors.New("ParseBootImageListFromAck: could not find vendor-specific option") } - vendorOpt, err := ParseOptVendorSpecificInformation(opt.ToBytes()) - if err != nil { - return nil, err - } - bootImageOpts := vendorOpt.GetOneOption(OptionBootImageList) - if bootImageOpts == nil { - return nil, fmt.Errorf("boot image option not found") - } - return bootImageOpts.(*OptBootImageList).Images, nil + return GetBootImageList(vendorOpts.Options), nil } func needsReplyPort(replyPort uint16) bool { @@ -53,28 +45,41 @@ func needsReplyPort(replyPort uint16) bool { // MessageTypeFromPacket extracts the BSDP message type (LIST, SELECT) from the // vendor-specific options and returns it. If the message type option cannot be // found, returns false. -func MessageTypeFromPacket(packet *dhcpv4.DHCPv4) *MessageType { - var ( - vendorOpts *OptVendorSpecificInformation - err error - ) - opt := packet.GetOneOption(dhcpv4.OptionVendorSpecificInformation) - if opt == nil { - return nil - } - if vendorOpts, err = ParseOptVendorSpecificInformation(opt.ToBytes()); err == nil { - if o := vendorOpts.GetOneOption(OptionMessageType); o != nil { - if optMessageType, ok := o.(*OptMessageType); ok { - return &optMessageType.Type - } - } - } - return nil +func MessageTypeFromPacket(packet *dhcpv4.DHCPv4) MessageType { + vendorOpts := GetVendorOptions(packet.Options) + if vendorOpts == nil { + return MessageTypeNone + } + return GetMessageType(vendorOpts.Options) +} + +// Packet is a BSDP packet wrapper around a DHCPv4 packet in order to print the +// correct vendor-specific BSDP information in String(). +type Packet struct { + dhcpv4.DHCPv4 +} + +// PacketFor returns a wrapped BSDP Packet given a DHCPv4 packet. +func PacketFor(d *dhcpv4.DHCPv4) *Packet { + return &Packet{*d} +} + +func (p Packet) v4() *dhcpv4.DHCPv4 { + return &p.DHCPv4 +} + +func (p Packet) String() string { + return p.DHCPv4.String() +} + +// Summary prints the BSDP packet with the correct vendor-specific options. +func (p Packet) Summary() string { + return p.DHCPv4.SummaryWithVendor(&VendorOptions{}) } // NewInformListForInterface creates a new INFORM packet for interface ifname // with configuration options specified by config. -func NewInformListForInterface(ifname string, replyPort uint16) (*dhcpv4.DHCPv4, error) { +func NewInformListForInterface(ifname string, replyPort uint16) (*Packet, error) { iface, err := net.InterfaceByName(ifname) if err != nil { return nil, err @@ -96,7 +101,7 @@ func NewInformListForInterface(ifname string, replyPort uint16) (*dhcpv4.DHCPv4, // NewInformList creates a new INFORM packet for interface with hardware address // `hwaddr` and IP `localIP`. Packet will be sent out on port `replyPort`. -func NewInformList(hwaddr net.HardwareAddr, localIP net.IP, replyPort uint16, modifiers ...dhcpv4.Modifier) (*dhcpv4.DHCPv4, error) { +func NewInformList(hwaddr net.HardwareAddr, localIP net.IP, replyPort uint16, modifiers ...dhcpv4.Modifier) (*Packet, error) { // Validate replyPort first if needsReplyPort(replyPort) && replyPort >= 1024 { return nil, errors.New("replyPort must be a privileged port") @@ -109,60 +114,61 @@ func NewInformList(hwaddr net.HardwareAddr, localIP net.IP, replyPort uint16, mo // These are vendor-specific options used to pass along BSDP information. vendorOpts := []dhcpv4.Option{ - &OptMessageType{MessageTypeList}, - Version1_1, + OptMessageType(MessageTypeList), + OptVersion(Version1_1), } if needsReplyPort(replyPort) { - vendorOpts = append(vendorOpts, &OptReplyPort{replyPort}) + vendorOpts = append(vendorOpts, OptReplyPort(replyPort)) } - return dhcpv4.NewInform(hwaddr, localIP, + d, err := dhcpv4.NewInform(hwaddr, localIP, dhcpv4.PrependModifiers(modifiers, dhcpv4.WithRequestedOptions( dhcpv4.OptionVendorSpecificInformation, dhcpv4.OptionClassIdentifier, ), - dhcpv4.WithOption(&dhcpv4.OptMaximumDHCPMessageSize{Size: MaxDHCPMessageSize}), - dhcpv4.WithOption(&dhcpv4.OptClassIdentifier{Identifier: vendorClassID}), - dhcpv4.WithOption(&OptVendorSpecificInformation{vendorOpts}), + dhcpv4.WithOption(dhcpv4.OptMaxMessageSize(MaxDHCPMessageSize)), + dhcpv4.WithOption(dhcpv4.OptClassIdentifier(vendorClassID)), + dhcpv4.WithOption(OptVendorOptions(vendorOpts...)), )...) + if err != nil { + return nil, err + } + return PacketFor(d), nil } // InformSelectForAck constructs an INFORM[SELECT] packet given an ACK to the // previously-sent INFORM[LIST]. -func InformSelectForAck(ack dhcpv4.DHCPv4, replyPort uint16, selectedImage BootImage) (*dhcpv4.DHCPv4, error) { +func InformSelectForAck(ack *Packet, replyPort uint16, selectedImage BootImage) (*Packet, error) { if needsReplyPort(replyPort) && replyPort >= 1024 { return nil, errors.New("replyPort must be a privileged port") } // Data for OptionSelectedBootImageID vendorOpts := []dhcpv4.Option{ - &OptMessageType{MessageTypeSelect}, - Version1_1, - &OptSelectedBootImageID{selectedImage.ID}, + OptMessageType(MessageTypeSelect), + OptVersion(Version1_1), + OptSelectedBootImageID(selectedImage.ID), } // Validate replyPort if requested. if needsReplyPort(replyPort) { - vendorOpts = append(vendorOpts, &OptReplyPort{replyPort}) + vendorOpts = append(vendorOpts, OptReplyPort(replyPort)) } // Find server IP address - var serverIP net.IP - if opt := ack.GetOneOption(dhcpv4.OptionServerIdentifier); opt != nil { - serverIP = opt.(*dhcpv4.OptServerIdentifier).ServerID - } + serverIP := dhcpv4.GetServerIdentifier(ack.Options) if serverIP.To4() == nil { return nil, fmt.Errorf("could not parse server identifier from ACK") } - vendorOpts = append(vendorOpts, &OptServerIdentifier{serverIP}) + vendorOpts = append(vendorOpts, OptServerIdentifier(serverIP)) vendorClassID, err := MakeVendorClassIdentifier() if err != nil { return nil, err } - return dhcpv4.New(dhcpv4.WithReply(&ack), - dhcpv4.WithOption(&dhcpv4.OptClassIdentifier{Identifier: vendorClassID}), + d, err := dhcpv4.New(dhcpv4.WithReply(ack.v4()), + dhcpv4.WithOption(dhcpv4.OptClassIdentifier(vendorClassID)), dhcpv4.WithRequestedOptions( dhcpv4.OptionSubnetMask, dhcpv4.OptionRouter, @@ -171,20 +177,24 @@ func InformSelectForAck(ack dhcpv4.DHCPv4, replyPort uint16, selectedImage BootI dhcpv4.OptionClassIdentifier, ), dhcpv4.WithMessageType(dhcpv4.MessageTypeInform), - dhcpv4.WithOption(&OptVendorSpecificInformation{vendorOpts}), + dhcpv4.WithOption(OptVendorOptions(vendorOpts...)), ) + if err != nil { + return nil, err + } + return PacketFor(d), nil } // NewReplyForInformList constructs an ACK for the INFORM[LIST] packet `inform` // with additional options in `config`. -func NewReplyForInformList(inform *dhcpv4.DHCPv4, config ReplyConfig) (*dhcpv4.DHCPv4, error) { +func NewReplyForInformList(inform *Packet, config ReplyConfig) (*Packet, error) { if config.DefaultImage == nil { return nil, errors.New("NewReplyForInformList: no default boot image ID set") } if config.Images == nil || len(config.Images) == 0 { return nil, errors.New("NewReplyForInformList: no boot images provided") } - reply, err := dhcpv4.NewReplyFromRequest(inform) + reply, err := dhcpv4.NewReplyFromRequest(&inform.DHCPv4) if err != nil { return nil, err } @@ -193,34 +203,34 @@ func NewReplyForInformList(inform *dhcpv4.DHCPv4, config ReplyConfig) (*dhcpv4.D reply.ServerIPAddr = config.ServerIP reply.ServerHostName = config.ServerHostname - reply.UpdateOption(&dhcpv4.OptMessageType{MessageType: dhcpv4.MessageTypeAck}) - reply.UpdateOption(&dhcpv4.OptServerIdentifier{ServerID: config.ServerIP}) - reply.UpdateOption(&dhcpv4.OptClassIdentifier{Identifier: AppleVendorID}) + reply.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeAck)) + reply.UpdateOption(dhcpv4.OptServerIdentifier(config.ServerIP)) + reply.UpdateOption(dhcpv4.OptClassIdentifier(AppleVendorID)) // BSDP opts. vendorOpts := []dhcpv4.Option{ - &OptMessageType{Type: MessageTypeList}, - &OptServerPriority{Priority: config.ServerPriority}, - &OptDefaultBootImageID{ID: config.DefaultImage.ID}, - &OptBootImageList{Images: config.Images}, + OptMessageType(MessageTypeList), + OptServerPriority(config.ServerPriority), + OptDefaultBootImageID(config.DefaultImage.ID), + OptBootImageList(config.Images...), } if config.SelectedImage != nil { - vendorOpts = append(vendorOpts, &OptSelectedBootImageID{ID: config.SelectedImage.ID}) + vendorOpts = append(vendorOpts, OptSelectedBootImageID(config.SelectedImage.ID)) } - reply.UpdateOption(&OptVendorSpecificInformation{Options: vendorOpts}) - return reply, nil + reply.UpdateOption(OptVendorOptions(vendorOpts...)) + return PacketFor(reply), nil } // NewReplyForInformSelect constructs an ACK for the INFORM[Select] packet // `inform` with additional options in `config`. -func NewReplyForInformSelect(inform *dhcpv4.DHCPv4, config ReplyConfig) (*dhcpv4.DHCPv4, error) { +func NewReplyForInformSelect(inform *Packet, config ReplyConfig) (*Packet, error) { if config.SelectedImage == nil { return nil, errors.New("NewReplyForInformSelect: no selected boot image ID set") } if config.Images == nil || len(config.Images) == 0 { return nil, errors.New("NewReplyForInformSelect: no boot images provided") } - reply, err := dhcpv4.NewReplyFromRequest(inform) + reply, err := dhcpv4.NewReplyFromRequest(&inform.DHCPv4) if err != nil { return nil, err } @@ -231,16 +241,14 @@ func NewReplyForInformSelect(inform *dhcpv4.DHCPv4, config ReplyConfig) (*dhcpv4 reply.ServerHostName = config.ServerHostname reply.BootFileName = config.BootFileName - reply.UpdateOption(&dhcpv4.OptMessageType{MessageType: dhcpv4.MessageTypeAck}) - reply.UpdateOption(&dhcpv4.OptServerIdentifier{ServerID: config.ServerIP}) - reply.UpdateOption(&dhcpv4.OptClassIdentifier{Identifier: AppleVendorID}) + reply.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeAck)) + reply.UpdateOption(dhcpv4.OptServerIdentifier(config.ServerIP)) + reply.UpdateOption(dhcpv4.OptClassIdentifier(AppleVendorID)) // BSDP opts. - reply.UpdateOption(&OptVendorSpecificInformation{ - Options: []dhcpv4.Option{ - &OptMessageType{Type: MessageTypeSelect}, - &OptSelectedBootImageID{ID: config.SelectedImage.ID}, - }, - }) - return reply, nil + reply.UpdateOption(OptVendorOptions( + OptMessageType(MessageTypeSelect), + OptSelectedBootImageID(config.SelectedImage.ID), + )) + return PacketFor(reply), nil } diff --git a/dhcpv4/bsdp/bsdp_option_boot_image_list.go b/dhcpv4/bsdp/bsdp_option_boot_image_list.go index 3282fa33..ebbbd2de 100644 --- a/dhcpv4/bsdp/bsdp_option_boot_image_list.go +++ b/dhcpv4/bsdp/bsdp_option_boot_image_list.go @@ -1,52 +1,66 @@ package bsdp import ( + "strings" + "github.com/insomniacslk/dhcp/dhcpv4" "github.com/u-root/u-root/pkg/uio" ) -// OptBootImageList contains the list of boot images presented by a netboot -// server. -type OptBootImageList struct { - Images []BootImage -} +// BootImageList contains a list of boot images presented by a netboot server. +// +// Implements the BSDP option listing the boot images. +type BootImageList []BootImage -// ParseOptBootImageList constructs an OptBootImageList struct from a sequence -// of bytes and returns it, or an error. -func ParseOptBootImageList(data []byte) (*OptBootImageList, error) { +// FromBytes deserializes data into bil. +func (bil *BootImageList) FromBytes(data []byte) error { buf := uio.NewBigEndianBuffer(data) - var bootImages []BootImage for buf.Has(5) { var image BootImage - if err := (&image).Unmarshal(buf); err != nil { - return nil, err + if err := image.Unmarshal(buf); err != nil { + return err } - bootImages = append(bootImages, image) + *bil = append(*bil, image) } - - return &OptBootImageList{bootImages}, nil -} - -// Code returns the option code. -func (o *OptBootImageList) Code() dhcpv4.OptionCode { - return OptionBootImageList + return nil } // ToBytes returns a serialized stream of bytes for this option. -func (o *OptBootImageList) ToBytes() []byte { +func (bil BootImageList) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - for _, image := range o.Images { + for _, image := range bil { image.Marshal(buf) } return buf.Data() } // String returns a human-readable string for this option. -func (o *OptBootImageList) String() string { - s := "BSDP Boot Image List ->" - for _, image := range o.Images { - s += "\n " + image.String() +func (bil BootImageList) String() string { + s := make([]string, 0, len(bil)) + for _, image := range bil { + s = append(s, image.String()) + } + return strings.Join(s, ", ") +} + +// OptBootImageList returns a new BSDP boot image list. +func OptBootImageList(b ...BootImage) dhcpv4.Option { + return dhcpv4.Option{ + Code: OptionBootImageList, + Value: BootImageList(b), + } +} + +// GetBootImageList returns the BSDP boot image list. +func GetBootImageList(o dhcpv4.Options) BootImageList { + v := o.Get(OptionBootImageList) + if v == nil { + return nil + } + var bil BootImageList + if err := bil.FromBytes(v); err != nil { + return nil } - return s + return bil } diff --git a/dhcpv4/bsdp/bsdp_option_boot_image_list_test.go b/dhcpv4/bsdp/bsdp_option_boot_image_list_test.go index 5d1b77c0..6282156e 100644 --- a/dhcpv4/bsdp/bsdp_option_boot_image_list_test.go +++ b/dhcpv4/bsdp/bsdp_option_boot_image_list_test.go @@ -25,8 +25,8 @@ func TestOptBootImageListInterfaceMethods(t *testing.T) { Name: "bsdp-2", }, } - o := OptBootImageList{bs} - require.Equal(t, OptionBootImageList, o.Code(), "Code") + o := OptBootImageList(bs...) + require.Equal(t, OptionBootImageList, o.Code, "Code") expectedBytes := []byte{ // boot image 1 0x1, 0x0, 0x03, 0xe9, // ID @@ -37,7 +37,7 @@ func TestOptBootImageListInterfaceMethods(t *testing.T) { 6, // name length 'b', 's', 'd', 'p', '-', '2', } - require.Equal(t, expectedBytes, o.ToBytes(), "ToBytes") + require.Equal(t, expectedBytes, o.Value.ToBytes(), "ToBytes") } func TestParseOptBootImageList(t *testing.T) { @@ -51,9 +51,10 @@ func TestParseOptBootImageList(t *testing.T) { 6, // name length 'b', 's', 'd', 'p', '-', '2', } - o, err := ParseOptBootImageList(data) + var o BootImageList + err := o.FromBytes(data) require.NoError(t, err) - expectedBootImages := []BootImage{ + expectedBootImages := BootImageList{ BootImage{ ID: BootImageID{ IsInstall: false, @@ -71,7 +72,7 @@ func TestParseOptBootImageList(t *testing.T) { Name: "bsdp-2", }, } - require.Equal(t, &OptBootImageList{expectedBootImages}, o) + require.Equal(t, expectedBootImages, o) // Error parsing boot image (malformed) data = []byte{ @@ -84,7 +85,7 @@ func TestParseOptBootImageList(t *testing.T) { 6, // name length 'b', 's', 'd', 'p', '-', '2', } - _, err = ParseOptBootImageList(data) + err = o.FromBytes(data) require.Error(t, err, "should get error from bad boot image") } @@ -107,7 +108,7 @@ func TestOptBootImageListString(t *testing.T) { Name: "bsdp-2", }, } - o := OptBootImageList{bs} - expectedString := "BSDP Boot Image List ->\n bsdp-1 [1001] uninstallable macOS image\n bsdp-2 [9009] installable macOS 9 image" + o := OptBootImageList(bs...) + expectedString := "BSDP Boot Image List: bsdp-1 [1001] uninstallable macOS image, bsdp-2 [9009] installable macOS 9 image" require.Equal(t, expectedString, o.String()) } diff --git a/dhcpv4/bsdp/bsdp_option_default_boot_image_id.go b/dhcpv4/bsdp/bsdp_option_default_boot_image_id.go deleted file mode 100644 index 40ab0beb..00000000 --- a/dhcpv4/bsdp/bsdp_option_default_boot_image_id.go +++ /dev/null @@ -1,42 +0,0 @@ -package bsdp - -import ( - "fmt" - - "github.com/insomniacslk/dhcp/dhcpv4" - "github.com/u-root/u-root/pkg/uio" -) - -// OptDefaultBootImageID contains the selected boot image ID. -// -// Implements the BSDP option default boot image ID, which tells the client -// which image is the default boot image if one is not selected. -type OptDefaultBootImageID struct { - ID BootImageID -} - -// ParseOptDefaultBootImageID constructs an OptDefaultBootImageID struct from a sequence of -// bytes and returns it, or an error. -func ParseOptDefaultBootImageID(data []byte) (*OptDefaultBootImageID, error) { - var o OptDefaultBootImageID - buf := uio.NewBigEndianBuffer(data) - if err := o.ID.Unmarshal(buf); err != nil { - return nil, err - } - return &o, buf.FinError() -} - -// Code returns the option code. -func (o *OptDefaultBootImageID) Code() dhcpv4.OptionCode { - return OptionDefaultBootImageID -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptDefaultBootImageID) ToBytes() []byte { - return uio.ToBigEndian(o.ID) -} - -// String returns a human-readable string for this option. -func (o *OptDefaultBootImageID) String() string { - return fmt.Sprintf("BSDP Default Boot Image ID -> %s", o.ID.String()) -} diff --git a/dhcpv4/bsdp/bsdp_option_default_boot_image_id_test.go b/dhcpv4/bsdp/bsdp_option_default_boot_image_id_test.go deleted file mode 100644 index a5abdafd..00000000 --- a/dhcpv4/bsdp/bsdp_option_default_boot_image_id_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package bsdp - -import ( - "testing" - - "github.com/stretchr/testify/require" - "github.com/u-root/u-root/pkg/uio" -) - -func TestOptDefaultBootImageIDInterfaceMethods(t *testing.T) { - b := BootImageID{IsInstall: true, ImageType: BootImageTypeMacOSX, Index: 1001} - o := OptDefaultBootImageID{b} - require.Equal(t, OptionDefaultBootImageID, o.Code(), "Code") - require.Equal(t, uio.ToBigEndian(b), o.ToBytes(), "ToBytes") -} - -func TestParseOptDefaultBootImageID(t *testing.T) { - b := BootImageID{IsInstall: true, ImageType: BootImageTypeMacOSX, Index: 1001} - o, err := ParseOptDefaultBootImageID(uio.ToBigEndian(b)) - require.NoError(t, err) - require.Equal(t, &OptDefaultBootImageID{b}, o) - - // Short byte stream - data := []byte{} - _, err = ParseOptDefaultBootImageID(data) - require.Error(t, err, "should get error from short byte stream") - - // Bad length - data = []byte{1, 0, 0, 0, 0} - _, err = ParseOptDefaultBootImageID(data) - require.Error(t, err, "should get error from bad length") -} - -func TestOptDefaultBootImageIDString(t *testing.T) { - b := BootImageID{IsInstall: true, ImageType: BootImageTypeMacOSX, Index: 1001} - o := OptDefaultBootImageID{b} - require.Equal(t, "BSDP Default Boot Image ID -> [1001] installable macOS image", o.String()) - - b = BootImageID{IsInstall: false, ImageType: BootImageTypeMacOS9, Index: 1001} - o = OptDefaultBootImageID{b} - require.Equal(t, "BSDP Default Boot Image ID -> [1001] uninstallable macOS 9 image", o.String()) - - b = BootImageID{IsInstall: false, ImageType: BootImageType(99), Index: 1001} - o = OptDefaultBootImageID{b} - require.Equal(t, "BSDP Default Boot Image ID -> [1001] uninstallable unknown image", o.String()) -} diff --git a/dhcpv4/bsdp/bsdp_option_generic.go b/dhcpv4/bsdp/bsdp_option_generic.go deleted file mode 100644 index e9e163f3..00000000 --- a/dhcpv4/bsdp/bsdp_option_generic.go +++ /dev/null @@ -1,36 +0,0 @@ -package bsdp - -import ( - "fmt" - - "github.com/insomniacslk/dhcp/dhcpv4" -) - -// OptGeneric is an option that only contains the option code and associated -// data. Every option that does not have a specific implementation will fall -// back to this option. -type OptGeneric struct { - OptionCode dhcpv4.OptionCode - Data []byte -} - -// ParseOptGeneric parses a bytestream and creates a new OptGeneric from it, -// or an error. -func ParseOptGeneric(code dhcpv4.OptionCode, data []byte) (*OptGeneric, error) { - return &OptGeneric{OptionCode: code, Data: data}, nil -} - -// Code returns the generic option code. -func (o OptGeneric) Code() dhcpv4.OptionCode { - return o.OptionCode -} - -// ToBytes returns a serialized generic option as a slice of bytes. -func (o OptGeneric) ToBytes() []byte { - return o.Data -} - -// String returns a human-readable representation of a generic option. -func (o OptGeneric) String() string { - return fmt.Sprintf("%s -> %v", o.OptionCode, o.Data) -} diff --git a/dhcpv4/bsdp/bsdp_option_generic_test.go b/dhcpv4/bsdp/bsdp_option_generic_test.go deleted file mode 100644 index a813f952..00000000 --- a/dhcpv4/bsdp/bsdp_option_generic_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package bsdp - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestParseOptGeneric(t *testing.T) { - // Good parse - o, err := ParseOptGeneric(OptionMessageType, []byte{1}) - require.NoError(t, err) - require.Equal(t, OptionMessageType, o.Code()) - require.Equal(t, MessageTypeList, MessageType(o.Data[0])) -} - -func TestOptGenericCode(t *testing.T) { - o := OptGeneric{ - OptionCode: OptionMessageType, - Data: []byte{byte(MessageTypeList)}, - } - require.Equal(t, OptionMessageType, o.Code()) -} - -func TestOptGenericData(t *testing.T) { - o := OptGeneric{ - OptionCode: OptionServerIdentifier, - Data: []byte{192, 168, 0, 1}, - } - require.Equal(t, []byte{192, 168, 0, 1}, o.Data) -} - -func TestOptGenericToBytes(t *testing.T) { - o := OptGeneric{ - OptionCode: OptionServerIdentifier, - Data: []byte{192, 168, 0, 1}, - } - serialized := o.ToBytes() - expected := []byte{192, 168, 0, 1} - require.Equal(t, expected, serialized) -} - -func TestOptGenericString(t *testing.T) { - o := OptGeneric{ - OptionCode: OptionServerIdentifier, - Data: []byte{192, 168, 0, 1}, - } - require.Equal(t, "BSDP Server Identifier -> [192 168 0 1]", o.String()) -} - -func TestOptGenericStringUnknown(t *testing.T) { - o := OptGeneric{ - OptionCode: optionCode(102), // Returned option code. - Data: []byte{5}, - } - require.Equal(t, "unknown -> [5]", o.String()) -} diff --git a/dhcpv4/bsdp/bsdp_option_machine_name.go b/dhcpv4/bsdp/bsdp_option_machine_name.go deleted file mode 100644 index ced88b0e..00000000 --- a/dhcpv4/bsdp/bsdp_option_machine_name.go +++ /dev/null @@ -1,34 +0,0 @@ -package bsdp - -import ( - "github.com/insomniacslk/dhcp/dhcpv4" -) - -// OptMachineName represents a BSDP message type. -// -// Implements the BSDP option machine name, which gives the Netboot server's -// machine name. -type OptMachineName struct { - Name string -} - -// ParseOptMachineName constructs an OptMachineName struct from a sequence of -// bytes and returns it, or an error. -func ParseOptMachineName(data []byte) (*OptMachineName, error) { - return &OptMachineName{Name: string(data)}, nil -} - -// Code returns the option code. -func (o *OptMachineName) Code() dhcpv4.OptionCode { - return OptionMachineName -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptMachineName) ToBytes() []byte { - return []byte(o.Name) -} - -// String returns a human-readable string for this option. -func (o *OptMachineName) String() string { - return "BSDP Machine Name -> " + o.Name -} diff --git a/dhcpv4/bsdp/bsdp_option_machine_name_test.go b/dhcpv4/bsdp/bsdp_option_machine_name_test.go deleted file mode 100644 index abc0d547..00000000 --- a/dhcpv4/bsdp/bsdp_option_machine_name_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package bsdp - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptMachineNameInterfaceMethods(t *testing.T) { - o := OptMachineName{"somebox"} - require.Equal(t, OptionMachineName, o.Code(), "Code") - expectedBytes := []byte{'s', 'o', 'm', 'e', 'b', 'o', 'x'} - require.Equal(t, expectedBytes, o.ToBytes(), "ToBytes") -} - -func TestParseOptMachineName(t *testing.T) { - data := []byte{'s', 'o', 'm', 'e', 'b', 'o', 'x'} - o, err := ParseOptMachineName(data) - require.NoError(t, err) - require.Equal(t, &OptMachineName{"somebox"}, o) -} - -func TestOptMachineNameString(t *testing.T) { - o := OptMachineName{"somebox"} - require.Equal(t, "BSDP Machine Name -> somebox", o.String()) -} diff --git a/dhcpv4/bsdp/bsdp_option_message_type.go b/dhcpv4/bsdp/bsdp_option_message_type.go index 5f96f123..cb0c5cf6 100644 --- a/dhcpv4/bsdp/bsdp_option_message_type.go +++ b/dhcpv4/bsdp/bsdp_option_message_type.go @@ -15,16 +15,23 @@ type MessageType byte // BSDP Message types - e.g. LIST, SELECT, FAILED const ( + MessageTypeNone MessageType = 0 MessageTypeList MessageType = 1 MessageTypeSelect MessageType = 2 MessageTypeFailed MessageType = 3 ) +// ToBytes returns a serialized stream of bytes for this option. +func (m MessageType) ToBytes() []byte { + return []byte{byte(m)} +} + +// String returns a human-friendly representation of MessageType. func (m MessageType) String() string { if s, ok := messageTypeToString[m]; ok { return s } - return "Unknown" + return fmt.Sprintf("unknown (%d)", m) } // messageTypeToString maps each BSDP message type to a human-readable string. @@ -34,29 +41,30 @@ var messageTypeToString = map[MessageType]string{ MessageTypeFailed: "FAILED", } -// OptMessageType represents a BSDP message type. -type OptMessageType struct { - Type MessageType -} - -// ParseOptMessageType constructs an OptMessageType struct from a sequence of -// bytes and returns it, or an error. -func ParseOptMessageType(data []byte) (*OptMessageType, error) { +// FromBytes reads data into m. +func (m *MessageType) FromBytes(data []byte) error { buf := uio.NewBigEndianBuffer(data) - return &OptMessageType{Type: MessageType(buf.Read8())}, buf.FinError() + *m = MessageType(buf.Read8()) + return buf.FinError() } -// Code returns the option code. -func (o *OptMessageType) Code() dhcpv4.OptionCode { - return OptionMessageType -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptMessageType) ToBytes() []byte { - return []byte{byte(o.Type)} +// OptMessageType returns a new BSDP Message Type option. +func OptMessageType(mt MessageType) dhcpv4.Option { + return dhcpv4.Option{ + Code: OptionMessageType, + Value: mt, + } } -// String returns a human-readable string for this option. -func (o *OptMessageType) String() string { - return fmt.Sprintf("BSDP Message Type -> %s", o.Type.String()) +// GetMessageType returns the BSDP Message Type in o. +func GetMessageType(o dhcpv4.Options) MessageType { + v := o.Get(OptionMessageType) + if v == nil { + return MessageTypeNone + } + var m MessageType + if err := m.FromBytes(v); err != nil { + return MessageTypeNone + } + return m } diff --git a/dhcpv4/bsdp/bsdp_option_message_type_test.go b/dhcpv4/bsdp/bsdp_option_message_type_test.go index a6695ccc..6666137d 100644 --- a/dhcpv4/bsdp/bsdp_option_message_type_test.go +++ b/dhcpv4/bsdp/bsdp_option_message_type_test.go @@ -7,24 +7,25 @@ import ( ) func TestOptMessageTypeInterfaceMethods(t *testing.T) { - o := OptMessageType{MessageTypeList} - require.Equal(t, OptionMessageType, o.Code(), "Code") - require.Equal(t, []byte{1}, o.ToBytes(), "ToBytes") + o := OptMessageType(MessageTypeList) + require.Equal(t, OptionMessageType, o.Code, "Code") + require.Equal(t, []byte{1}, o.Value.ToBytes(), "ToBytes") } func TestParseOptMessageType(t *testing.T) { + var o MessageType data := []byte{1} // DISCOVER - o, err := ParseOptMessageType(data) + err := o.FromBytes(data) require.NoError(t, err) - require.Equal(t, &OptMessageType{MessageTypeList}, o) + require.Equal(t, MessageTypeList, o) } func TestOptMessageTypeString(t *testing.T) { // known - o := OptMessageType{MessageTypeList} - require.Equal(t, "BSDP Message Type -> LIST", o.String()) + o := OptMessageType(MessageTypeList) + require.Equal(t, "BSDP Message Type: LIST", o.String()) // unknown - o = OptMessageType{99} - require.Equal(t, "BSDP Message Type -> Unknown", o.String()) + o = OptMessageType(99) + require.Equal(t, "BSDP Message Type: unknown (99)", o.String()) } diff --git a/dhcpv4/bsdp/bsdp_option_misc.go b/dhcpv4/bsdp/bsdp_option_misc.go new file mode 100644 index 00000000..2d3a7bfb --- /dev/null +++ b/dhcpv4/bsdp/bsdp_option_misc.go @@ -0,0 +1,99 @@ +package bsdp + +import ( + "fmt" + "net" + + "github.com/insomniacslk/dhcp/dhcpv4" + "github.com/u-root/u-root/pkg/uio" +) + +// OptReplyPort returns a new BSDP reply port option. +// +// Implements the BSDP option reply port. This is used when BSDP responses +// should be sent to a reply port other than the DHCP default. The macOS GUI +// "Startup Disk Select" sends this option since it's operating in an +// unprivileged context. +func OptReplyPort(port uint16) dhcpv4.Option { + return dhcpv4.Option{Code: OptionReplyPort, Value: dhcpv4.Uint16(port)} +} + +// GetReplyPort returns the BSDP reply port in o, if present. +func GetReplyPort(o dhcpv4.Options) (uint16, error) { + return dhcpv4.GetUint16(OptionReplyPort, o) +} + +// OptServerPriority returns a new BSDP server priority option. +func OptServerPriority(prio uint16) dhcpv4.Option { + return dhcpv4.Option{Code: OptionServerPriority, Value: dhcpv4.Uint16(prio)} +} + +// GetServerPriority returns the BSDP server priority in o if present. +func GetServerPriority(o dhcpv4.Options) (uint16, error) { + return dhcpv4.GetUint16(OptionServerPriority, o) +} + +// OptMachineName returns a BSDP Machine Name option. +func OptMachineName(name string) dhcpv4.Option { + return dhcpv4.Option{Code: OptionMachineName, Value: dhcpv4.String(name)} +} + +// GetMachineName finds and parses the BSDP Machine Name option from o. +func GetMachineName(o dhcpv4.Options) string { + return dhcpv4.GetString(OptionMachineName, o) +} + +// Version is the BSDP protocol version. Can be one of 1.0 or 1.1. +type Version [2]byte + +// Specific versions. +var ( + Version1_0 = Version{1, 0} + Version1_1 = Version{1, 1} +) + +// ToBytes returns a serialized stream of bytes for this option. +func (o Version) ToBytes() []byte { + return o[:] +} + +// String returns a human-readable string for this option. +func (o Version) String() string { + return fmt.Sprintf("%d.%d", o[0], o[1]) +} + +// FromBytes constructs a Version struct from a sequence of +// bytes and returns it, or an error. +func (o *Version) FromBytes(data []byte) error { + buf := uio.NewBigEndianBuffer(data) + buf.ReadBytes(o[:]) + return buf.FinError() +} + +// OptVersion returns a new BSDP version option. +func OptVersion(version Version) dhcpv4.Option { + return dhcpv4.Option{Code: OptionVersion, Value: version} +} + +// GetVersion returns the BSDP version in o if present. +func GetVersion(o dhcpv4.Options) (Version, error) { + v := o.Get(OptionVersion) + if v == nil { + return Version{0, 0}, fmt.Errorf("version not found") + } + var ver Version + if err := ver.FromBytes(v); err != nil { + return Version{0, 0}, err + } + return ver, nil +} + +// GetServerIdentifier returns the BSDP Server Identifier value in o. +func GetServerIdentifier(o dhcpv4.Options) net.IP { + return dhcpv4.GetIP(OptionServerIdentifier, o) +} + +// OptServerIdentifier returns a new BSDP Server Identifier option. +func OptServerIdentifier(ip net.IP) dhcpv4.Option { + return dhcpv4.Option{Code: OptionServerIdentifier, Value: dhcpv4.IP(ip)} +} diff --git a/dhcpv4/bsdp/bsdp_option_misc_test.go b/dhcpv4/bsdp/bsdp_option_misc_test.go new file mode 100644 index 00000000..dfa81b58 --- /dev/null +++ b/dhcpv4/bsdp/bsdp_option_misc_test.go @@ -0,0 +1,95 @@ +package bsdp + +import ( + "net" + "testing" + + "github.com/insomniacslk/dhcp/dhcpv4" + "github.com/stretchr/testify/require" +) + +func TestOptReplyPort(t *testing.T) { + o := OptReplyPort(1234) + require.Equal(t, OptionReplyPort, o.Code, "Code") + require.Equal(t, []byte{4, 210}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "BSDP Reply Port: 1234", o.String()) +} + +func TestGetReplyPort(t *testing.T) { + o := VendorOptions{dhcpv4.OptionsFromList(OptReplyPort(1234))} + port, err := GetReplyPort(o.Options) + require.NoError(t, err) + require.Equal(t, uint16(1234), port) + + port, err = GetReplyPort(dhcpv4.Options{}) + require.Error(t, err, "no reply port present") +} + +func TestOptServerPriority(t *testing.T) { + o := OptServerPriority(1234) + require.Equal(t, OptionServerPriority, o.Code, "Code") + require.Equal(t, []byte{4, 210}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "BSDP Server Priority: 1234", o.String()) +} + +func TestGetServerPriority(t *testing.T) { + o := VendorOptions{dhcpv4.OptionsFromList(OptServerPriority(1234))} + prio, err := GetServerPriority(o.Options) + require.NoError(t, err) + require.Equal(t, uint16(1234), prio) + + prio, err = GetServerPriority(dhcpv4.Options{}) + require.Error(t, err, "no server prio present") +} + +func TestOptMachineName(t *testing.T) { + o := OptMachineName("foo") + require.Equal(t, OptionMachineName, o.Code, "Code") + require.Equal(t, []byte("foo"), o.Value.ToBytes(), "ToBytes") + require.Equal(t, "BSDP Machine Name: foo", o.String()) +} + +func TestGetMachineName(t *testing.T) { + o := VendorOptions{dhcpv4.OptionsFromList(OptMachineName("foo"))} + require.Equal(t, "foo", GetMachineName(o.Options)) + require.Equal(t, "", GetMachineName(dhcpv4.Options{})) +} + +func TestOptVersion(t *testing.T) { + o := OptVersion(Version1_1) + require.Equal(t, OptionVersion, o.Code, "Code") + require.Equal(t, []byte{1, 1}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "BSDP Version: 1.1", o.String()) +} + +func TestGetVersion(t *testing.T) { + o := VendorOptions{dhcpv4.OptionsFromList(OptVersion(Version1_1))} + ver, err := GetVersion(o.Options) + require.NoError(t, err) + require.Equal(t, ver, Version1_1) + + ver, err = GetVersion(dhcpv4.Options{}) + require.Error(t, err, "no version present") + + ver, err = GetVersion(dhcpv4.Options{OptionVersion.Code(): []byte{}}) + require.Error(t, err, "empty version field") + + ver, err = GetVersion(dhcpv4.Options{OptionVersion.Code(): []byte{1}}) + require.Error(t, err, "version option too short") + + ver, err = GetVersion(dhcpv4.Options{OptionVersion.Code(): []byte{1, 2, 3}}) + require.Error(t, err, "version option too long") +} + +func TestOptServerIdentifier(t *testing.T) { + o := OptServerIdentifier(net.IP{1, 1, 1, 1}) + require.Equal(t, OptionServerIdentifier, o.Code, "Code") + require.Equal(t, []byte{1, 1, 1, 1}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "BSDP Server Identifier: 1.1.1.1", o.String()) +} + +func TestGetServerIdentifier(t *testing.T) { + o := VendorOptions{dhcpv4.OptionsFromList(OptServerIdentifier(net.IP{1, 1, 1, 1}))} + require.Equal(t, net.IP{1, 1, 1, 1}, GetServerIdentifier(o.Options)) + require.Equal(t, net.IP(nil), GetServerIdentifier(dhcpv4.Options{})) +} diff --git a/dhcpv4/bsdp/bsdp_option_reply_port.go b/dhcpv4/bsdp/bsdp_option_reply_port.go deleted file mode 100644 index 5eea5ee8..00000000 --- a/dhcpv4/bsdp/bsdp_option_reply_port.go +++ /dev/null @@ -1,42 +0,0 @@ -package bsdp - -import ( - "fmt" - - "github.com/insomniacslk/dhcp/dhcpv4" - "github.com/u-root/u-root/pkg/uio" -) - -// OptReplyPort represents a BSDP protocol version. -// -// Implements the BSDP option reply port. This is used when BSDP responses -// should be sent to a reply port other than the DHCP default. The macOS GUI -// "Startup Disk Select" sends this option since it's operating in an -// unprivileged context. -type OptReplyPort struct { - Port uint16 -} - -// ParseOptReplyPort constructs an OptReplyPort struct from a sequence of -// bytes and returns it, or an error. -func ParseOptReplyPort(data []byte) (*OptReplyPort, error) { - buf := uio.NewBigEndianBuffer(data) - return &OptReplyPort{buf.Read16()}, buf.FinError() -} - -// Code returns the option code. -func (o *OptReplyPort) Code() dhcpv4.OptionCode { - return OptionReplyPort -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptReplyPort) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - buf.Write16(o.Port) - return buf.Data() -} - -// String returns a human-readable string for this option. -func (o *OptReplyPort) String() string { - return fmt.Sprintf("BSDP Reply Port -> %v", o.Port) -} diff --git a/dhcpv4/bsdp/bsdp_option_reply_port_test.go b/dhcpv4/bsdp/bsdp_option_reply_port_test.go deleted file mode 100644 index de94ffb3..00000000 --- a/dhcpv4/bsdp/bsdp_option_reply_port_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package bsdp - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptReplyPortInterfaceMethods(t *testing.T) { - o := OptReplyPort{1234} - require.Equal(t, OptionReplyPort, o.Code(), "Code") - require.Equal(t, []byte{4, 210}, o.ToBytes(), "ToBytes") -} - -func TestParseOptReplyPort(t *testing.T) { - data := []byte{0, 1} - o, err := ParseOptReplyPort(data) - require.NoError(t, err) - require.Equal(t, &OptReplyPort{1}, o) - - // Short byte stream - data = []byte{} - _, err = ParseOptReplyPort(data) - require.Error(t, err, "should get error from short byte stream") - - // Bad length - data = []byte{1} - _, err = ParseOptReplyPort(data) - require.Error(t, err, "should get error from bad length") -} - -func TestOptReplyPortString(t *testing.T) { - // known - o := OptReplyPort{1234} - require.Equal(t, "BSDP Reply Port -> 1234", o.String()) -} diff --git a/dhcpv4/bsdp/bsdp_option_selected_boot_image_id.go b/dhcpv4/bsdp/bsdp_option_selected_boot_image_id.go deleted file mode 100644 index 67f99a8b..00000000 --- a/dhcpv4/bsdp/bsdp_option_selected_boot_image_id.go +++ /dev/null @@ -1,42 +0,0 @@ -package bsdp - -import ( - "fmt" - - "github.com/insomniacslk/dhcp/dhcpv4" - "github.com/u-root/u-root/pkg/uio" -) - -// OptSelectedBootImageID contains the selected boot image ID. -// -// Implements the BSDP option selected boot image ID, which tells the server -// which boot image has been selected by the client. -type OptSelectedBootImageID struct { - ID BootImageID -} - -// ParseOptSelectedBootImageID constructs an OptSelectedBootImageID struct from a sequence of -// bytes and returns it, or an error. -func ParseOptSelectedBootImageID(data []byte) (*OptSelectedBootImageID, error) { - var o OptSelectedBootImageID - buf := uio.NewBigEndianBuffer(data) - if err := o.ID.Unmarshal(buf); err != nil { - return nil, err - } - return &o, buf.FinError() -} - -// Code returns the option code. -func (o *OptSelectedBootImageID) Code() dhcpv4.OptionCode { - return OptionSelectedBootImageID -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptSelectedBootImageID) ToBytes() []byte { - return uio.ToBigEndian(o.ID) -} - -// String returns a human-readable string for this option. -func (o *OptSelectedBootImageID) String() string { - return fmt.Sprintf("BSDP Selected Boot Image ID -> %s", o.ID.String()) -} diff --git a/dhcpv4/bsdp/bsdp_option_selected_boot_image_id_test.go b/dhcpv4/bsdp/bsdp_option_selected_boot_image_id_test.go deleted file mode 100644 index e187fc7d..00000000 --- a/dhcpv4/bsdp/bsdp_option_selected_boot_image_id_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package bsdp - -import ( - "testing" - - "github.com/stretchr/testify/require" - "github.com/u-root/u-root/pkg/uio" -) - -func TestOptSelectedBootImageIDInterfaceMethods(t *testing.T) { - b := BootImageID{IsInstall: true, ImageType: BootImageTypeMacOSX, Index: 1001} - o := OptSelectedBootImageID{b} - require.Equal(t, OptionSelectedBootImageID, o.Code(), "Code") - require.Equal(t, uio.ToBigEndian(b), o.ToBytes(), "ToBytes") -} - -func TestParseOptSelectedBootImageID(t *testing.T) { - b := BootImageID{IsInstall: true, ImageType: BootImageTypeMacOSX, Index: 1001} - o, err := ParseOptSelectedBootImageID(uio.ToBigEndian(b)) - require.NoError(t, err) - require.Equal(t, &OptSelectedBootImageID{b}, o) - - // Short byte stream - data := []byte{} - _, err = ParseOptSelectedBootImageID(data) - require.Error(t, err, "should get error from short byte stream") - - // Bad length - data = []byte{1, 0, 0, 0, 0} - _, err = ParseOptSelectedBootImageID(data) - require.Error(t, err, "should get error from bad length") -} - -func TestOptSelectedBootImageIDString(t *testing.T) { - b := BootImageID{IsInstall: true, ImageType: BootImageTypeMacOSX, Index: 1001} - o := OptSelectedBootImageID{b} - require.Equal(t, "BSDP Selected Boot Image ID -> [1001] installable macOS image", o.String()) - - b = BootImageID{IsInstall: false, ImageType: BootImageTypeMacOS9, Index: 1001} - o = OptSelectedBootImageID{b} - require.Equal(t, "BSDP Selected Boot Image ID -> [1001] uninstallable macOS 9 image", o.String()) - - b = BootImageID{IsInstall: false, ImageType: BootImageType(99), Index: 1001} - o = OptSelectedBootImageID{b} - require.Equal(t, "BSDP Selected Boot Image ID -> [1001] uninstallable unknown image", o.String()) -} diff --git a/dhcpv4/bsdp/bsdp_option_server_identifier.go b/dhcpv4/bsdp/bsdp_option_server_identifier.go deleted file mode 100644 index d1f5b6cb..00000000 --- a/dhcpv4/bsdp/bsdp_option_server_identifier.go +++ /dev/null @@ -1,36 +0,0 @@ -package bsdp - -import ( - "fmt" - "net" - - "github.com/insomniacslk/dhcp/dhcpv4" - "github.com/u-root/u-root/pkg/uio" -) - -// OptServerIdentifier implements the BSDP server identifier option. -type OptServerIdentifier struct { - ServerID net.IP -} - -// ParseOptServerIdentifier returns a new OptServerIdentifier from a byte -// stream, or error if any. -func ParseOptServerIdentifier(data []byte) (*OptServerIdentifier, error) { - buf := uio.NewBigEndianBuffer(data) - return &OptServerIdentifier{ServerID: net.IP(buf.CopyN(net.IPv4len))}, buf.FinError() -} - -// Code returns the option code. -func (o *OptServerIdentifier) Code() dhcpv4.OptionCode { - return OptionServerIdentifier -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptServerIdentifier) ToBytes() []byte { - return o.ServerID.To4() -} - -// String returns a human-readable string. -func (o *OptServerIdentifier) String() string { - return fmt.Sprintf("BSDP Server Identifier -> %v", o.ServerID.String()) -} diff --git a/dhcpv4/bsdp/bsdp_option_server_identifier_test.go b/dhcpv4/bsdp/bsdp_option_server_identifier_test.go deleted file mode 100644 index 5a776448..00000000 --- a/dhcpv4/bsdp/bsdp_option_server_identifier_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package bsdp - -import ( - "net" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptServerIdentifierInterfaceMethods(t *testing.T) { - ip := net.IP{192, 168, 0, 1} - o := OptServerIdentifier{ServerID: ip} - require.Equal(t, OptionServerIdentifier, o.Code(), "Code") - expectedBytes := []byte{192, 168, 0, 1} - require.Equal(t, expectedBytes, o.ToBytes(), "ToBytes") - require.Equal(t, "BSDP Server Identifier -> 192.168.0.1", o.String(), "String") -} - -func TestParseOptServerIdentifier(t *testing.T) { - var ( - o *OptServerIdentifier - err error - ) - o, err = ParseOptServerIdentifier([]byte{}) - require.Error(t, err, "empty byte stream") - - o, err = ParseOptServerIdentifier([]byte{3, 4, 192}) - require.Error(t, err, "wrong IP length") - - o, err = ParseOptServerIdentifier([]byte{192, 168, 0, 1}) - require.NoError(t, err) - require.Equal(t, net.IP{192, 168, 0, 1}, o.ServerID) -} diff --git a/dhcpv4/bsdp/bsdp_option_server_priority.go b/dhcpv4/bsdp/bsdp_option_server_priority.go deleted file mode 100644 index f6fcf577..00000000 --- a/dhcpv4/bsdp/bsdp_option_server_priority.go +++ /dev/null @@ -1,37 +0,0 @@ -package bsdp - -import ( - "fmt" - - "github.com/insomniacslk/dhcp/dhcpv4" - "github.com/u-root/u-root/pkg/uio" -) - -// OptServerPriority represents an option encapsulating the server priority. -type OptServerPriority struct { - Priority uint16 -} - -// ParseOptServerPriority returns a new OptServerPriority from a byte stream, or -// error if any. -func ParseOptServerPriority(data []byte) (*OptServerPriority, error) { - buf := uio.NewBigEndianBuffer(data) - return &OptServerPriority{Priority: buf.Read16()}, buf.FinError() -} - -// Code returns the option code. -func (o *OptServerPriority) Code() dhcpv4.OptionCode { - return OptionServerPriority -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptServerPriority) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - buf.Write16(o.Priority) - return buf.Data() -} - -// String returns a human-readable string. -func (o *OptServerPriority) String() string { - return fmt.Sprintf("BSDP Server Priority -> %v", o.Priority) -} diff --git a/dhcpv4/bsdp/bsdp_option_server_priority_test.go b/dhcpv4/bsdp/bsdp_option_server_priority_test.go deleted file mode 100644 index c4c96dee..00000000 --- a/dhcpv4/bsdp/bsdp_option_server_priority_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package bsdp - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptServerPriorityInterfaceMethods(t *testing.T) { - o := OptServerPriority{Priority: 100} - require.Equal(t, OptionServerPriority, o.Code(), "Code") - require.Equal(t, []byte{0, 100}, o.ToBytes(), "ToBytes") - require.Equal(t, "BSDP Server Priority -> 100", o.String(), "String") -} - -func TestParseOptServerPriority(t *testing.T) { - var ( - o *OptServerPriority - err error - ) - o, err = ParseOptServerPriority([]byte{}) - require.Error(t, err, "empty byte stream") - - o, err = ParseOptServerPriority([]byte{1}) - require.Error(t, err, "short byte stream") - - o, err = ParseOptServerPriority([]byte{0, 100}) - require.NoError(t, err) - require.Equal(t, uint16(100), o.Priority) -} diff --git a/dhcpv4/bsdp/bsdp_option_version.go b/dhcpv4/bsdp/bsdp_option_version.go deleted file mode 100644 index d6b78c81..00000000 --- a/dhcpv4/bsdp/bsdp_option_version.go +++ /dev/null @@ -1,41 +0,0 @@ -package bsdp - -import ( - "fmt" - - "github.com/insomniacslk/dhcp/dhcpv4" - "github.com/u-root/u-root/pkg/uio" -) - -// Version is the BSDP protocol version. Can be one of 1.0 or 1.1. -type Version [2]byte - -// Specific versions. -var ( - Version1_0 = Version{1, 0} - Version1_1 = Version{1, 1} -) - -// ParseOptVersion constructs an OptVersion struct from a sequence of -// bytes and returns it, or an error. -func ParseOptVersion(data []byte) (Version, error) { - buf := uio.NewBigEndianBuffer(data) - var v Version - buf.ReadBytes(v[:]) - return v, buf.FinError() -} - -// Code returns the option code. -func (o Version) Code() dhcpv4.OptionCode { - return OptionVersion -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o Version) ToBytes() []byte { - return o[:] -} - -// String returns a human-readable string for this option. -func (o Version) String() string { - return fmt.Sprintf("BSDP Version -> %d.%d", o[0], o[1]) -} diff --git a/dhcpv4/bsdp/bsdp_option_version_test.go b/dhcpv4/bsdp/bsdp_option_version_test.go deleted file mode 100644 index 69d4c864..00000000 --- a/dhcpv4/bsdp/bsdp_option_version_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package bsdp - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestOptVersionInterfaceMethods(t *testing.T) { - o := Version1_1 - require.Equal(t, OptionVersion, o.Code(), "Code") - require.Equal(t, []byte{1, 1}, o.ToBytes(), "ToBytes") -} - -func TestParseOptVersion(t *testing.T) { - data := []byte{1, 1} - o, err := ParseOptVersion(data) - require.NoError(t, err) - require.Equal(t, Version1_1, o) - - // Short byte stream - data = []byte{2} - _, err = ParseOptVersion(data) - require.Error(t, err, "should get error from short byte stream") -} - -func TestOptVersionString(t *testing.T) { - require.Equal(t, "BSDP Version -> 1.1", Version1_1.String()) -} diff --git a/dhcpv4/bsdp/bsdp_test.go b/dhcpv4/bsdp/bsdp_test.go index 638a4081..e0378c2c 100644 --- a/dhcpv4/bsdp/bsdp_test.go +++ b/dhcpv4/bsdp/bsdp_test.go @@ -12,9 +12,9 @@ import ( func RequireHasOption(t *testing.T, opts dhcpv4.Options, opt dhcpv4.Option) { require.NotNil(t, opts, "must pass list of options") require.NotNil(t, opt, "must pass option") - require.True(t, opts.Has(opt.Code())) - actual := opts.GetOne(opt.Code()) - require.Equal(t, opt, actual) + require.True(t, opts.Has(opt.Code)) + actual := opts.Get(opt.Code) + require.Equal(t, opt.Value.ToBytes(), actual) } func TestParseBootImageListFromAck(t *testing.T) { @@ -37,11 +37,11 @@ func TestParseBootImageListFromAck(t *testing.T) { }, } ack, _ := dhcpv4.New() - ack.UpdateOption(&OptVendorSpecificInformation{ - []dhcpv4.Option{&OptBootImageList{expectedBootImages}}, - }) + ack.UpdateOption(OptVendorOptions( + OptBootImageList(expectedBootImages...), + )) - images, err := ParseBootImageListFromAck(*ack) + images, err := ParseBootImageListFromAck(ack) require.NoError(t, err) require.NotEmpty(t, images, "should get BootImages") require.Equal(t, expectedBootImages, images, "should get same BootImages") @@ -49,7 +49,7 @@ func TestParseBootImageListFromAck(t *testing.T) { func TestParseBootImageListFromAckNoVendorOption(t *testing.T) { ack, _ := dhcpv4.New() - images, err := ParseBootImageListFromAck(*ack) + images, err := ParseBootImageListFromAck(ack) require.Error(t, err) require.Empty(t, images, "no BootImages") } @@ -70,14 +70,13 @@ func TestNewInformList_NoReplyPort(t *testing.T) { require.True(t, m.Options.Has(dhcpv4.OptionParameterRequestList)) require.True(t, m.Options.Has(dhcpv4.OptionMaximumDHCPMessageSize)) - opt := m.GetOneOption(dhcpv4.OptionVendorSpecificInformation) - require.NotNil(t, opt, "vendor opts not present") - vendorInfo := opt.(*OptVendorSpecificInformation) - require.True(t, vendorInfo.Options.Has(OptionMessageType)) - require.True(t, vendorInfo.Options.Has(OptionVersion)) + vendorOpts := GetVendorOptions(m.Options) + require.NotNil(t, vendorOpts, "vendor opts not present") + require.True(t, vendorOpts.Has(OptionMessageType)) + require.True(t, vendorOpts.Has(OptionVersion)) - opt = vendorInfo.GetOneOption(OptionMessageType) - require.Equal(t, MessageTypeList, opt.(*OptMessageType).Type) + mt := GetMessageType(vendorOpts.Options) + require.Equal(t, MessageTypeList, mt) } func TestNewInformList_ReplyPort(t *testing.T) { @@ -94,12 +93,12 @@ func TestNewInformList_ReplyPort(t *testing.T) { m, err := NewInformList(hwAddr, localIP, replyPort) require.NoError(t, err) - opt := m.GetOneOption(dhcpv4.OptionVendorSpecificInformation) - vendorInfo := opt.(*OptVendorSpecificInformation) - require.True(t, vendorInfo.Options.Has(OptionReplyPort)) + vendorOpts := GetVendorOptions(m.Options) + require.True(t, vendorOpts.Options.Has(OptionReplyPort)) - opt = vendorInfo.GetOneOption(OptionReplyPort) - require.Equal(t, replyPort, opt.(*OptReplyPort).Port) + port, err := GetReplyPort(vendorOpts.Options) + require.NoError(t, err) + require.Equal(t, replyPort, port) } func newAck(hwAddr net.HardwareAddr, transactionID [4]byte) *dhcpv4.DHCPv4 { @@ -108,7 +107,7 @@ func newAck(hwAddr net.HardwareAddr, transactionID [4]byte) *dhcpv4.DHCPv4 { ack.TransactionID = transactionID ack.HWType = iana.HWTypeEthernet ack.ClientHWAddr = hwAddr - ack.UpdateOption(&dhcpv4.OptMessageType{MessageType: dhcpv4.MessageTypeAck}) + ack.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeAck)) return ack } @@ -126,9 +125,9 @@ func TestInformSelectForAck_Broadcast(t *testing.T) { } ack := newAck(hwAddr, tid) ack.SetBroadcast() - ack.UpdateOption(&dhcpv4.OptServerIdentifier{ServerID: serverID}) + ack.UpdateOption(dhcpv4.OptServerIdentifier(serverID)) - m, err := InformSelectForAck(*ack, 0, bootImage) + m, err := InformSelectForAck(PacketFor(ack), 0, bootImage) require.NoError(t, err) require.Equal(t, dhcpv4.OpcodeBootRequest, m.OpCode) require.Equal(t, ack.HWType, m.HWType) @@ -140,17 +139,16 @@ func TestInformSelectForAck_Broadcast(t *testing.T) { require.True(t, m.Options.Has(dhcpv4.OptionClassIdentifier)) require.True(t, m.Options.Has(dhcpv4.OptionParameterRequestList)) require.True(t, m.Options.Has(dhcpv4.OptionDHCPMessageType)) - opt := m.GetOneOption(dhcpv4.OptionDHCPMessageType) - require.Equal(t, dhcpv4.MessageTypeInform, opt.(*dhcpv4.OptMessageType).MessageType) + mt := dhcpv4.GetMessageType(m.Options) + require.Equal(t, dhcpv4.MessageTypeInform, mt) // Validate vendor opts. require.True(t, m.Options.Has(dhcpv4.OptionVendorSpecificInformation)) - opt = m.GetOneOption(dhcpv4.OptionVendorSpecificInformation) - vendorInfo := opt.(*OptVendorSpecificInformation) - RequireHasOption(t, vendorInfo.Options, &OptMessageType{Type: MessageTypeSelect}) - require.True(t, vendorInfo.Options.Has(OptionVersion)) - RequireHasOption(t, vendorInfo.Options, &OptSelectedBootImageID{ID: bootImage.ID}) - RequireHasOption(t, vendorInfo.Options, &OptServerIdentifier{ServerID: serverID}) + vendorOpts := GetVendorOptions(m.Options).Options + RequireHasOption(t, vendorOpts, OptMessageType(MessageTypeSelect)) + require.True(t, vendorOpts.Has(OptionVersion)) + RequireHasOption(t, vendorOpts, OptSelectedBootImageID(bootImage.ID)) + RequireHasOption(t, vendorOpts, OptServerIdentifier(serverID)) } func TestInformSelectForAck_NoServerID(t *testing.T) { @@ -166,7 +164,7 @@ func TestInformSelectForAck_NoServerID(t *testing.T) { } ack := newAck(hwAddr, tid) - _, err := InformSelectForAck(*ack, 0, bootImage) + _, err := InformSelectForAck(PacketFor(ack), 0, bootImage) require.Error(t, err, "expect error for no server identifier option") } @@ -184,9 +182,9 @@ func TestInformSelectForAck_BadReplyPort(t *testing.T) { } ack := newAck(hwAddr, tid) ack.SetBroadcast() - ack.UpdateOption(&dhcpv4.OptServerIdentifier{ServerID: serverID}) + ack.UpdateOption(dhcpv4.OptServerIdentifier(serverID)) - _, err := InformSelectForAck(*ack, 11223, bootImage) + _, err := InformSelectForAck(PacketFor(ack), 11223, bootImage) require.Error(t, err, "expect error for > 1024 replyPort") } @@ -204,16 +202,15 @@ func TestInformSelectForAck_ReplyPort(t *testing.T) { } ack := newAck(hwAddr, tid) ack.SetBroadcast() - ack.UpdateOption(&dhcpv4.OptServerIdentifier{ServerID: serverID}) + ack.UpdateOption(dhcpv4.OptServerIdentifier(serverID)) replyPort := uint16(999) - m, err := InformSelectForAck(*ack, replyPort, bootImage) + m, err := InformSelectForAck(PacketFor(ack), replyPort, bootImage) require.NoError(t, err) require.True(t, m.Options.Has(dhcpv4.OptionVendorSpecificInformation)) - opt := m.GetOneOption(dhcpv4.OptionVendorSpecificInformation) - vendorInfo := opt.(*OptVendorSpecificInformation) - RequireHasOption(t, vendorInfo.Options, &OptReplyPort{Port: replyPort}) + vendorOpts := GetVendorOptions(m.Options).Options + RequireHasOption(t, vendorOpts, OptReplyPort(replyPort)) } func TestNewReplyForInformList_NoDefaultImage(t *testing.T) { @@ -274,24 +271,24 @@ func TestNewReplyForInformList(t *testing.T) { require.Equal(t, "bsdp.foo.com", ack.ServerHostName) // Validate options. - RequireHasOption(t, ack.Options, &dhcpv4.OptMessageType{MessageType: dhcpv4.MessageTypeAck}) - RequireHasOption(t, ack.Options, &dhcpv4.OptServerIdentifier{ServerID: net.IP{9, 9, 9, 9}}) - RequireHasOption(t, ack.Options, &dhcpv4.OptClassIdentifier{Identifier: AppleVendorID}) + RequireHasOption(t, ack.Options, dhcpv4.OptMessageType(dhcpv4.MessageTypeAck)) + RequireHasOption(t, ack.Options, dhcpv4.OptServerIdentifier(net.IP{9, 9, 9, 9})) + RequireHasOption(t, ack.Options, dhcpv4.OptClassIdentifier(AppleVendorID)) require.NotNil(t, ack.GetOneOption(dhcpv4.OptionVendorSpecificInformation)) // Vendor-specific options. - vendorOpts := ack.GetOneOption(dhcpv4.OptionVendorSpecificInformation).(*OptVendorSpecificInformation) - RequireHasOption(t, vendorOpts.Options, &OptMessageType{Type: MessageTypeList}) - RequireHasOption(t, vendorOpts.Options, &OptDefaultBootImageID{ID: images[0].ID}) - RequireHasOption(t, vendorOpts.Options, &OptServerPriority{Priority: 0x7070}) - RequireHasOption(t, vendorOpts.Options, &OptBootImageList{Images: images}) + vendorOpts := GetVendorOptions(ack.Options).Options + RequireHasOption(t, vendorOpts, OptMessageType(MessageTypeList)) + RequireHasOption(t, vendorOpts, OptDefaultBootImageID(images[0].ID)) + RequireHasOption(t, vendorOpts, OptServerPriority(0x7070)) + RequireHasOption(t, vendorOpts, OptBootImageList(images...)) // Add in selected boot image, ensure it's in the generated ACK. config.SelectedImage = &images[0] ack, err = NewReplyForInformList(inform, config) require.NoError(t, err) - vendorOpts = ack.GetOneOption(dhcpv4.OptionVendorSpecificInformation).(*OptVendorSpecificInformation) - RequireHasOption(t, vendorOpts.Options, &OptSelectedBootImageID{ID: images[0].ID}) + vendorOpts = GetVendorOptions(ack.Options).Options + RequireHasOption(t, vendorOpts, OptSelectedBootImageID(images[0].ID)) } func TestNewReplyForInformSelect_NoSelectedImage(t *testing.T) { @@ -352,30 +349,22 @@ func TestNewReplyForInformSelect(t *testing.T) { require.Equal(t, "bsdp.foo.com", ack.ServerHostName) // Validate options. - RequireHasOption(t, ack.Options, &dhcpv4.OptMessageType{MessageType: dhcpv4.MessageTypeAck}) - RequireHasOption(t, ack.Options, &dhcpv4.OptServerIdentifier{ServerID: net.IP{9, 9, 9, 9}}) - RequireHasOption(t, ack.Options, &dhcpv4.OptServerIdentifier{ServerID: net.IP{9, 9, 9, 9}}) - RequireHasOption(t, ack.Options, &dhcpv4.OptClassIdentifier{Identifier: AppleVendorID}) + RequireHasOption(t, ack.Options, dhcpv4.OptMessageType(dhcpv4.MessageTypeAck)) + RequireHasOption(t, ack.Options, dhcpv4.OptServerIdentifier(net.IP{9, 9, 9, 9})) + RequireHasOption(t, ack.Options, dhcpv4.OptServerIdentifier(net.IP{9, 9, 9, 9})) + RequireHasOption(t, ack.Options, dhcpv4.OptClassIdentifier(AppleVendorID)) require.NotNil(t, ack.GetOneOption(dhcpv4.OptionVendorSpecificInformation)) - vendorOpts := ack.GetOneOption(dhcpv4.OptionVendorSpecificInformation).(*OptVendorSpecificInformation) - RequireHasOption(t, vendorOpts.Options, &OptMessageType{Type: MessageTypeSelect}) - RequireHasOption(t, vendorOpts.Options, &OptSelectedBootImageID{ID: images[0].ID}) + vendorOpts := GetVendorOptions(ack.Options) + RequireHasOption(t, vendorOpts.Options, OptMessageType(MessageTypeSelect)) + RequireHasOption(t, vendorOpts.Options, OptSelectedBootImageID(images[0].ID)) } func TestMessageTypeForPacket(t *testing.T) { - var ( - pkt *dhcpv4.DHCPv4 - gotMessageType *MessageType - ) - - list := new(MessageType) - *list = MessageTypeList - testcases := []struct { tcName string opts []dhcpv4.Option - wantMessageType *MessageType + wantMessageType MessageType }{ { tcName: "No options", @@ -384,45 +373,38 @@ func TestMessageTypeForPacket(t *testing.T) { { tcName: "Some options, no vendor opts", opts: []dhcpv4.Option{ - &dhcpv4.OptHostName{HostName: "foobar1234"}, + dhcpv4.OptHostName("foobar1234"), }, }, { tcName: "Vendor opts, no message type", opts: []dhcpv4.Option{ - &dhcpv4.OptHostName{HostName: "foobar1234"}, - &OptVendorSpecificInformation{ - Options: []dhcpv4.Option{ - Version1_1, - }, - }, + dhcpv4.OptHostName("foobar1234"), + OptVendorOptions( + OptVersion(Version1_1), + ), }, }, { tcName: "Vendor opts, with message type", opts: []dhcpv4.Option{ - &dhcpv4.OptHostName{HostName: "foobar1234"}, - &OptVendorSpecificInformation{ - Options: []dhcpv4.Option{ - Version1_1, - &OptMessageType{Type: MessageTypeList}, - }, - }, + dhcpv4.OptHostName("foobar1234"), + OptVendorOptions( + OptVersion(Version1_1), + OptMessageType(MessageTypeList), + ), }, - wantMessageType: list, + wantMessageType: MessageTypeList, }, } for _, tt := range testcases { t.Run(tt.tcName, func(t *testing.T) { - pkt, _ = dhcpv4.New() + pkt, _ := dhcpv4.New() for _, opt := range tt.opts { pkt.UpdateOption(opt) } - gotMessageType = MessageTypeFromPacket(pkt) + gotMessageType := MessageTypeFromPacket(pkt) require.Equal(t, tt.wantMessageType, gotMessageType) - if tt.wantMessageType != nil { - require.Equal(t, *tt.wantMessageType, *gotMessageType) - } }) } } diff --git a/dhcpv4/bsdp/client.go b/dhcpv4/bsdp/client.go index dd4a0a03..e8ca2ca8 100644 --- a/dhcpv4/bsdp/client.go +++ b/dhcpv4/bsdp/client.go @@ -18,24 +18,10 @@ func NewClient() *Client { return &Client{Client: dhcpv4.Client{}} } -func castVendorOpt(ack *dhcpv4.DHCPv4) { - opts := ack.Options - for i := 0; i < len(opts); i++ { - if opts[i].Code() == dhcpv4.OptionVendorSpecificInformation { - vendorOpt, err := ParseOptVendorSpecificInformation(opts[i].ToBytes()) - // Oh well, we tried - if err != nil { - return - } - opts[i] = vendorOpt - } - } -} - // Exchange runs a full BSDP exchange (Inform[list], Ack, Inform[select], // Ack). Returns a list of DHCPv4 structures representing the exchange. -func (c *Client) Exchange(ifname string) ([]*dhcpv4.DHCPv4, error) { - conversation := make([]*dhcpv4.DHCPv4, 0) +func (c *Client) Exchange(ifname string) ([]*Packet, error) { + conversation := make([]*Packet, 0) // Get our file descriptor for the broadcast socket. sendFd, err := dhcpv4.MakeBroadcastSocket(ifname) @@ -55,17 +41,16 @@ func (c *Client) Exchange(ifname string) ([]*dhcpv4.DHCPv4, error) { conversation = append(conversation, informList) // ACK[LIST] - ackForList, err := c.Client.SendReceive(sendFd, recvFd, informList, dhcpv4.MessageTypeAck) + ackForList, err := c.Client.SendReceive(sendFd, recvFd, informList.v4(), dhcpv4.MessageTypeAck) if err != nil { return conversation, err } // Rewrite vendor-specific option for pretty printing. - castVendorOpt(ackForList) - conversation = append(conversation, ackForList) + conversation = append(conversation, PacketFor(ackForList)) // Parse boot images sent back by server - bootImages, err := ParseBootImageListFromAck(*ackForList) + bootImages, err := ParseBootImageListFromAck(ackForList) if err != nil { return conversation, err } @@ -74,17 +59,16 @@ func (c *Client) Exchange(ifname string) ([]*dhcpv4.DHCPv4, error) { } // INFORM[SELECT] - informSelect, err := InformSelectForAck(*ackForList, dhcpv4.ClientPort, bootImages[0]) + informSelect, err := InformSelectForAck(PacketFor(ackForList), dhcpv4.ClientPort, bootImages[0]) if err != nil { return conversation, err } conversation = append(conversation, informSelect) // ACK[SELECT] - ackForSelect, err := c.Client.SendReceive(sendFd, recvFd, informSelect, dhcpv4.MessageTypeAck) - castVendorOpt(ackForSelect) + ackForSelect, err := c.Client.SendReceive(sendFd, recvFd, informSelect.v4(), dhcpv4.MessageTypeAck) if err != nil { return conversation, err } - return append(conversation, ackForSelect), nil + return append(conversation, PacketFor(ackForSelect)), nil } diff --git a/dhcpv4/bsdp/option_vendor_specific_information.go b/dhcpv4/bsdp/option_vendor_specific_information.go index a87135f9..4e107e17 100644 --- a/dhcpv4/bsdp/option_vendor_specific_information.go +++ b/dhcpv4/bsdp/option_vendor_specific_information.go @@ -1,93 +1,87 @@ package bsdp import ( - "strings" + "fmt" "github.com/insomniacslk/dhcp/dhcpv4" - "github.com/u-root/u-root/pkg/uio" ) -// OptVendorSpecificInformation encapsulates the BSDP-specific options used for -// the protocol. -type OptVendorSpecificInformation struct { - Options dhcpv4.Options +// VendorOptions is like dhcpv4.Options, but stringifies using BSDP-specific +// option codes. +type VendorOptions struct { + dhcpv4.Options } -// parseOption is similar to dhcpv4.ParseOption, except that it switches based -// on the BSDP specific options. -func parseOption(code dhcpv4.OptionCode, data []byte) (dhcpv4.Option, error) { - var ( - opt dhcpv4.Option - err error - ) - switch code { - case OptionBootImageList: - opt, err = ParseOptBootImageList(data) - case OptionDefaultBootImageID: - opt, err = ParseOptDefaultBootImageID(data) - case OptionMachineName: - opt, err = ParseOptMachineName(data) - case OptionMessageType: - opt, err = ParseOptMessageType(data) - case OptionReplyPort: - opt, err = ParseOptReplyPort(data) - case OptionSelectedBootImageID: - opt, err = ParseOptSelectedBootImageID(data) - case OptionServerIdentifier: - opt, err = ParseOptServerIdentifier(data) - case OptionServerPriority: - opt, err = ParseOptServerPriority(data) - case OptionVersion: - opt, err = ParseOptVersion(data) - default: - opt, err = ParseOptGeneric(code, data) - } - if err != nil { - return nil, err - } - return opt, nil +// String prints the contained options using BSDP-specific option code parsing. +func (v VendorOptions) String() string { + return v.Options.ToString(bsdpHumanizer) } -// codeGetter is a dhcpv4.OptionCodeGetter for BSDP optionCodes. -func codeGetter(c uint8) dhcpv4.OptionCode { - return optionCode(c) +// FromBytes parses vendor options from +func (v *VendorOptions) FromBytes(data []byte) error { + v.Options = make(dhcpv4.Options) + return v.Options.FromBytes(data) } -// ParseOptVendorSpecificInformation constructs an OptVendorSpecificInformation struct from a sequence of -// bytes and returns it, or an error. -func ParseOptVendorSpecificInformation(data []byte) (*OptVendorSpecificInformation, error) { - options, err := dhcpv4.OptionsFromBytesWithParser(data, codeGetter, parseOption, false /* don't check for OptionEnd tag */) - if err != nil { - return nil, err +// OptVendorOptions returns the BSDP Vendor Specific Info in o. +func OptVendorOptions(o ...dhcpv4.Option) dhcpv4.Option { + return dhcpv4.Option{ + Code: dhcpv4.OptionVendorSpecificInformation, + Value: VendorOptions{dhcpv4.OptionsFromList(o...)}, } - return &OptVendorSpecificInformation{options}, nil } -// Code returns the option code. -func (o *OptVendorSpecificInformation) Code() dhcpv4.OptionCode { - return dhcpv4.OptionVendorSpecificInformation +// GetVendorOptions returns a new BSDP Vendor Specific Info option. +func GetVendorOptions(o dhcpv4.Options) *VendorOptions { + v := o.Get(dhcpv4.OptionVendorSpecificInformation) + if v == nil { + return nil + } + var vo VendorOptions + if err := vo.FromBytes(v); err != nil { + return nil + } + return &vo } -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptVendorSpecificInformation) ToBytes() []byte { - return uio.ToBigEndian(o.Options) +var bsdpHumanizer = dhcpv4.OptionHumanizer{ + ValueHumanizer: parseOption, + CodeHumanizer: func(c uint8) dhcpv4.OptionCode { + return optionCode(c) + }, } -// String returns a human-readable string for this option. -func (o *OptVendorSpecificInformation) String() string { - s := "Vendor Specific Information ->" - for _, opt := range o.Options { - optString := opt.String() - // If this option has sub-structures, offset them accordingly. - if strings.Contains(optString, "\n") { - optString = strings.Replace(optString, "\n ", "\n ", -1) - } - s += "\n " + optString - } - return s -} +// parseOption is similar to dhcpv4.parseOption, except that it interprets +// option codes based on the BSDP-specific options. +func parseOption(code dhcpv4.OptionCode, data []byte) fmt.Stringer { + var d dhcpv4.OptionDecoder + switch code { + case OptionMachineName: + var s dhcpv4.String + d = &s + + case OptionServerIdentifier: + d = &dhcpv4.IP{} + + case OptionServerPriority, OptionReplyPort: + var u dhcpv4.Uint16 + d = &u + + case OptionBootImageList: + d = &BootImageList{} -// GetOneOption returns the first suboption that matches the OptionCode code. -func (o *OptVendorSpecificInformation) GetOneOption(code dhcpv4.OptionCode) dhcpv4.Option { - return o.Options.GetOne(code) + case OptionDefaultBootImageID, OptionSelectedBootImageID: + d = &BootImageID{} + + case OptionMessageType: + var m MessageType + d = &m + + case OptionVersion: + d = &Version{} + } + if d != nil && d.FromBytes(data) == nil { + return d + } + return dhcpv4.OptionGeneric{data} } diff --git a/dhcpv4/bsdp/option_vendor_specific_information_test.go b/dhcpv4/bsdp/option_vendor_specific_information_test.go index ede8a0bf..a6727f56 100644 --- a/dhcpv4/bsdp/option_vendor_specific_information_test.go +++ b/dhcpv4/bsdp/option_vendor_specific_information_test.go @@ -1,6 +1,7 @@ package bsdp import ( + "net" "testing" "github.com/insomniacslk/dhcp/dhcpv4" @@ -8,182 +9,71 @@ import ( ) func TestOptVendorSpecificInformationInterfaceMethods(t *testing.T) { - messageTypeOpt := &OptMessageType{MessageTypeList} - versionOpt := Version1_1 - o := &OptVendorSpecificInformation{[]dhcpv4.Option{messageTypeOpt, versionOpt}} - require.Equal(t, dhcpv4.OptionVendorSpecificInformation, o.Code(), "Code") - - expectedBytes := []byte{ - 1, 1, 1, // List option - 2, 2, 1, 1, // Version option - } - o = &OptVendorSpecificInformation{ - []dhcpv4.Option{ - &OptMessageType{MessageTypeList}, - Version1_1, - }, - } - require.Equal(t, expectedBytes, o.ToBytes(), "ToBytes") -} - -func TestParseOptVendorSpecificInformation(t *testing.T) { - var ( - o *OptVendorSpecificInformation - err error + o := OptVendorOptions( + OptVersion(Version1_1), + OptMessageType(MessageTypeList), ) - o, err = ParseOptVendorSpecificInformation([]byte{1, 2}) - require.Error(t, err, "short byte stream") - - // Good byte stream - data := []byte{ - 1, 1, 1, // List option - 2, 2, 1, 1, // Version option - } - o, err = ParseOptVendorSpecificInformation(data) - require.NoError(t, err) - expected := &OptVendorSpecificInformation{ - []dhcpv4.Option{ - &OptMessageType{MessageTypeList}, - Version1_1, - }, - } - require.Equal(t, 2, len(o.Options), "number of parsed suboptions") - typ := o.GetOneOption(OptionMessageType) - version := o.GetOneOption(OptionVersion) - require.Equal(t, expected.Options[0].Code(), typ.Code()) - require.Equal(t, expected.Options[1].Code(), version.Code()) - - // Short byte stream (length and data mismatch) - data = []byte{ - 1, 1, 1, // List option - 2, 2, 1, // Version option - } - o, err = ParseOptVendorSpecificInformation(data) - require.Error(t, err) - - // Bad option - data = []byte{ - 1, 1, 1, // List option - 2, 2, 1, // Version option - 5, 3, 1, 1, 1, // Reply port option - } - o, err = ParseOptVendorSpecificInformation(data) - require.Error(t, err) + require.Equal(t, dhcpv4.OptionVendorSpecificInformation, o.Code, "Code") - // Boot images + default. - data = []byte{ + expectedBytes := []byte{ 1, 1, 1, // List option 2, 2, 1, 1, // Version option - 5, 2, 1, 1, // Reply port option - - // Boot image list - 9, 22, - 0x1, 0x0, 0x03, 0xe9, // ID - 6, // name length - 'b', 's', 'd', 'p', '-', '1', - 0x80, 0x0, 0x23, 0x31, // ID - 6, // name length - 'b', 's', 'd', 'p', '-', '2', - - // Default Boot Image ID - 7, 4, 0x1, 0x0, 0x03, 0xe9, } - o, err = ParseOptVendorSpecificInformation(data) - require.NoError(t, err) - require.Equal(t, 5, len(o.Options)) - for _, opt := range []dhcpv4.OptionCode{ - OptionMessageType, - OptionVersion, - OptionReplyPort, - OptionBootImageList, - OptionDefaultBootImageID, - } { - require.True(t, o.Options.Has(opt)) - } - optBootImage := o.GetOneOption(OptionBootImageList).(*OptBootImageList) - expectedBootImages := []BootImage{ - BootImage{ - ID: BootImageID{ - IsInstall: false, - ImageType: BootImageTypeMacOSX, - Index: 1001, - }, - Name: "bsdp-1", - }, - BootImage{ - ID: BootImageID{ - IsInstall: true, - ImageType: BootImageTypeMacOS9, - Index: 9009, - }, - Name: "bsdp-2", - }, - } - require.Equal(t, expectedBootImages, optBootImage.Images) + require.Equal(t, expectedBytes, o.Value.ToBytes(), "ToBytes") } func TestOptVendorSpecificInformationString(t *testing.T) { - o := &OptVendorSpecificInformation{ - []dhcpv4.Option{ - &OptMessageType{MessageTypeList}, - Version1_1, - }, - } - expectedString := "Vendor Specific Information ->\n BSDP Message Type -> LIST\n BSDP Version -> 1.1" + o := OptVendorOptions( + OptMessageType(MessageTypeList), + OptVersion(Version1_1), + ) + expectedString := "Vendor Specific Information:\n BSDP Message Type: LIST\n BSDP Version: 1.1\n" require.Equal(t, expectedString, o.String()) // Test more complicated string - sub options of sub options. - o = &OptVendorSpecificInformation{ - []dhcpv4.Option{ - &OptMessageType{MessageTypeList}, - &OptBootImageList{ - []BootImage{ - BootImage{ - ID: BootImageID{ - IsInstall: false, - ImageType: BootImageTypeMacOSX, - Index: 1001, - }, - Name: "bsdp-1", - }, - BootImage{ - ID: BootImageID{ - IsInstall: true, - ImageType: BootImageTypeMacOS9, - Index: 9009, - }, - Name: "bsdp-2", - }, + o = OptVendorOptions( + OptMessageType(MessageTypeList), + OptBootImageList( + BootImage{ + ID: BootImageID{ + IsInstall: false, + ImageType: BootImageTypeMacOSX, + Index: 1001, }, + Name: "bsdp-1", }, - }, - } - expectedString = "Vendor Specific Information ->\n" + - " BSDP Message Type -> LIST\n" + - " BSDP Boot Image List ->\n" + - " bsdp-1 [1001] uninstallable macOS image\n" + - " bsdp-2 [9009] installable macOS 9 image" + BootImage{ + ID: BootImageID{ + IsInstall: true, + ImageType: BootImageTypeMacOS9, + Index: 9009, + }, + Name: "bsdp-2", + }, + ), + OptMachineName("foo"), + OptServerIdentifier(net.IP{1, 1, 1, 1}), + OptServerPriority(1234), + OptReplyPort(1235), + OptDefaultBootImageID(BootImageID{ + IsInstall: true, + ImageType: BootImageTypeMacOS9, + Index: 9009, + }), + OptSelectedBootImageID(BootImageID{ + IsInstall: true, + ImageType: BootImageTypeMacOS9, + Index: 9009, + }), + ) + expectedString = "Vendor Specific Information:\n" + + " BSDP Message Type: LIST\n" + + " BSDP Server Identifier: 1.1.1.1\n" + + " BSDP Server Priority: 1234\n" + + " BSDP Reply Port: 1235\n" + + " BSDP Default Boot Image ID: [9009] installable macOS 9 image\n" + + " BSDP Selected Boot Image ID: [9009] installable macOS 9 image\n" + + " BSDP Boot Image List: bsdp-1 [1001] uninstallable macOS image, bsdp-2 [9009] installable macOS 9 image\n" + + " BSDP Machine Name: foo\n" require.Equal(t, expectedString, o.String()) } - -func TestOptVendorSpecificInformationGetOneOption(t *testing.T) { - // No option - o := &OptVendorSpecificInformation{ - []dhcpv4.Option{ - &OptMessageType{MessageTypeList}, - Version1_1, - }, - } - foundOpt := o.GetOneOption(OptionBootImageList) - require.Nil(t, foundOpt, "should not get options") - - // One option - o = &OptVendorSpecificInformation{ - []dhcpv4.Option{ - &OptMessageType{MessageTypeList}, - Version1_1, - }, - } - foundOpt = o.GetOneOption(OptionMessageType) - require.Equal(t, MessageTypeList, foundOpt.(*OptMessageType).Type) -} diff --git a/dhcpv4/bsdp/types.go b/dhcpv4/bsdp/types.go index 4ce840f7..49310815 100644 --- a/dhcpv4/bsdp/types.go +++ b/dhcpv4/bsdp/types.go @@ -1,5 +1,9 @@ package bsdp +import ( + "fmt" +) + // DefaultMacOSVendorClassIdentifier is a default vendor class identifier used // on non-darwin hosts where the vendor class identifier cannot be determined. // It should mostly be used for debugging if testing BSDP on a non-darwin @@ -19,7 +23,7 @@ func (o optionCode) String() string { if s, ok := optionCodeToString[o]; ok { return s } - return "unknown" + return fmt.Sprintf("unknown (%d)", o) } // Options (occur as sub-options of DHCP option 43). diff --git a/dhcpv4/dhcpv4.go b/dhcpv4/dhcpv4.go index bbb2f379..d94c58ab 100644 --- a/dhcpv4/dhcpv4.go +++ b/dhcpv4/dhcpv4.go @@ -1,3 +1,18 @@ +// Package dhcpv4 provides encoding and decoding of DHCPv4 packets and options. +// +// Example Usage: +// +// p, err := dhcpv4.New( +// dhcpv4.WithClientIP(net.IP{192, 168, 0, 1}), +// dhcpv4.WithMessageType(dhcpv4.MessageTypeInform), +// ) +// p.UpdateOption(dhcpv4.OptServerIdentifier(net.IP{192, 110, 110, 110})) +// +// // Retrieve the DHCP Message Type option. +// m := dhcpv4.GetMessageType(p.Options) +// +// bytesOnTheWire := p.ToBytes() +// longSummary := p.Summary() package dhcpv4 import ( @@ -121,7 +136,7 @@ func New(modifiers ...Modifier) (*DHCPv4, error) { YourIPAddr: net.IPv4zero, ServerIPAddr: net.IPv4zero, GatewayIPAddr: net.IPv4zero, - Options: make([]Option, 0, 10), + Options: make(Options), } for _, mod := range modifiers { mod(&d) @@ -203,11 +218,7 @@ func NewInform(hwaddr net.HardwareAddr, localIP net.IP, modifiers ...Modifier) ( // NewRequestFromOffer builds a DHCPv4 request from an offer. func NewRequestFromOffer(offer *DHCPv4, modifiers ...Modifier) (*DHCPv4, error) { // find server IP address - var serverIP net.IP - serverID := offer.GetOneOption(OptionServerIdentifier) - if serverID != nil { - serverIP = serverID.(*OptServerIdentifier).ServerID - } + serverIP := GetServerIdentifier(offer.Options) if serverIP == nil { return nil, errors.New("Missing Server IP Address in DHCP Offer") } @@ -216,8 +227,8 @@ func NewRequestFromOffer(offer *DHCPv4, modifiers ...Modifier) (*DHCPv4, error) WithReply(offer), WithMessageType(MessageTypeRequest), WithServerIP(serverIP), - WithOption(&OptRequestedIPAddress{RequestedAddr: offer.YourIPAddr}), - WithOption(&OptServerIdentifier{ServerID: serverIP}), + WithOption(OptRequestedIPAddress(offer.YourIPAddr)), + WithOption(OptServerIdentifier(serverIP)), )...) } @@ -281,11 +292,10 @@ func FromBytes(q []byte) (*DHCPv4, error) { return nil, fmt.Errorf("malformed DHCP packet: got magic cookie %v, want %v", cookie[:], magicCookie[:]) } - opts, err := OptionsFromBytes(buf.Data()) - if err != nil { + p.Options = make(Options) + if err := p.Options.fromBytesCheckEnd(buf.Data(), true); err != nil { return nil, err } - p.Options = opts return &p, nil } @@ -325,25 +335,25 @@ func (d *DHCPv4) SetUnicast() { // GetOneOption returns the option that matches the given option code. // -// If no matching option is found, nil is returned. -func (d *DHCPv4) GetOneOption(code OptionCode) Option { - return d.Options.GetOne(code) +// According to RFC 3396, options that are specified more than once are +// concatenated, and hence this should always just return one option. +func (d *DHCPv4) GetOneOption(code OptionCode) []byte { + return d.Options.Get(code) } // UpdateOption replaces an existing option with the same option code with the // given one, adding it if not already present. -func (d *DHCPv4) UpdateOption(option Option) { - d.Options.Update(option) +func (d *DHCPv4) UpdateOption(opt Option) { + if d.Options == nil { + d.Options = make(Options) + } + d.Options.Update(opt) } // MessageType returns the message type, trying to extract it from the // OptMessageType option. It returns nil if the message type cannot be extracted func (d *DHCPv4) MessageType() MessageType { - opt := d.GetOneOption(OptionDHCPMessageType) - if opt == nil { - return MessageTypeNone - } - return opt.(*OptMessageType).MessageType + return GetMessageType(d.Options) } // String implements fmt.Stringer. @@ -352,23 +362,24 @@ func (d *DHCPv4) String() string { d.OpCode, d.TransactionID, d.HWType, d.ClientHWAddr) } -// Summary prints detailed information about the packet. -func (d *DHCPv4) Summary() string { +// SummaryWithVendor prints a summary of the packet, interpreting the +// vendor-specific info option using the given parser (can be nil). +func (d *DHCPv4) SummaryWithVendor(vendorDecoder OptionDecoder) string { ret := fmt.Sprintf( - "DHCPv4\n"+ - " opcode=%s\n"+ - " hwtype=%s\n"+ - " hopcount=%v\n"+ - " transactionid=%s\n"+ - " numseconds=%v\n"+ - " flags=%v (0x%02x)\n"+ - " clientipaddr=%s\n"+ - " youripaddr=%s\n"+ - " serveripaddr=%s\n"+ - " gatewayipaddr=%s\n"+ - " clienthwaddr=%s\n"+ - " serverhostname=%s\n"+ - " bootfilename=%s\n", + "DHCPv4 Message\n"+ + " opcode: %s\n"+ + " hwtype: %s\n"+ + " hopcount: %v\n"+ + " transaction ID: %s\n"+ + " num seconds: %v\n"+ + " flags: %v (0x%02x)\n"+ + " client IP: %s\n"+ + " your IP: %s\n"+ + " server IP: %s\n"+ + " gateway IP: %s\n"+ + " client MAC: %s\n"+ + " server hostname: %s\n"+ + " bootfile name: %s\n", d.OpCode, d.HWType, d.HopCount, @@ -384,29 +395,20 @@ func (d *DHCPv4) Summary() string { d.ServerHostName, d.BootFileName, ) - ret += " options=\n" - for _, opt := range d.Options { - optString := opt.String() - // If this option has sub structures, offset them accordingly. - if strings.Contains(optString, "\n") { - optString = strings.Replace(optString, "\n ", "\n ", -1) - } - ret += fmt.Sprintf(" %v\n", optString) - if opt.Code() == OptionEnd { - break - } - } + ret += " options:\n" + ret += d.Options.Summary(vendorDecoder) return ret } +// Summary prints detailed information about the packet. +func (d *DHCPv4) Summary() string { + return d.SummaryWithVendor(nil) +} + // IsOptionRequested returns true if that option is within the requested // options of the DHCPv4 message. func (d *DHCPv4) IsOptionRequested(requested OptionCode) bool { - optprl := d.GetOneOption(OptionParameterRequestList) - if optprl == nil { - return false - } - for _, o := range optprl.(*OptParameterRequestList).RequestedOpts { + for _, o := range GetParameterRequestList(d.Options) { if o == requested { return true } @@ -459,7 +461,12 @@ func (d *DHCPv4) ToBytes() []byte { // The magic cookie. buf.WriteBytes(magicCookie[:]) + + // Write all options. d.Options.Marshal(buf) + + // Finish the packet. buf.Write8(uint8(OptionEnd)) + return buf.Data() } diff --git a/dhcpv4/dhcpv4_test.go b/dhcpv4/dhcpv4_test.go index fb0ef702..a3e2a8a2 100644 --- a/dhcpv4/dhcpv4_test.go +++ b/dhcpv4/dhcpv4_test.go @@ -179,43 +179,43 @@ func TestGetOption(t *testing.T) { t.Fatal(err) } - hostnameOpt := &OptionGeneric{OptionCode: OptionHostName, Data: []byte("darkstar")} - bootFileOpt := &OptBootfileName{"boot.img"} + hostnameOpt := OptGeneric(OptionHostName, []byte("darkstar")) + bootFileOpt := OptBootFileName("boot.img") d.UpdateOption(hostnameOpt) d.UpdateOption(bootFileOpt) - require.Equal(t, d.GetOneOption(OptionHostName), hostnameOpt) - require.Equal(t, d.GetOneOption(OptionBootfileName), bootFileOpt) - require.Equal(t, d.GetOneOption(OptionRouter), nil) + require.Equal(t, d.GetOneOption(OptionHostName), []byte("darkstar")) + require.Equal(t, d.GetOneOption(OptionBootfileName), []byte("boot.img")) + require.Equal(t, d.GetOneOption(OptionRouter), []byte(nil)) } func TestUpdateOption(t *testing.T) { d, err := New() require.NoError(t, err) - hostnameOpt := &OptionGeneric{OptionCode: OptionHostName, Data: []byte("darkstar")} - bootFileOpt1 := &OptBootfileName{"boot.img"} - bootFileOpt2 := &OptBootfileName{"boot2.img"} + hostnameOpt := OptGeneric(OptionHostName, []byte("darkstar")) + bootFileOpt1 := OptBootFileName("boot.img") + bootFileOpt2 := OptBootFileName("boot2.img") d.UpdateOption(hostnameOpt) d.UpdateOption(bootFileOpt1) d.UpdateOption(bootFileOpt2) options := d.Options require.Equal(t, len(options), 2) - require.Equal(t, d.Options.GetOne(OptionBootfileName), bootFileOpt2) - require.Equal(t, d.Options.GetOne(OptionHostName), hostnameOpt) + require.Equal(t, d.GetOneOption(OptionHostName), []byte("darkstar")) + require.Equal(t, d.GetOneOption(OptionBootfileName), []byte("boot2.img")) } func TestDHCPv4NewRequestFromOffer(t *testing.T) { offer, err := New() require.NoError(t, err) offer.SetBroadcast() - offer.UpdateOption(&OptMessageType{MessageType: MessageTypeOffer}) + offer.UpdateOption(OptMessageType(MessageTypeOffer)) req, err := NewRequestFromOffer(offer) require.Error(t, err) // Now add the option so it doesn't error out. - offer.UpdateOption(&OptServerIdentifier{ServerID: net.IPv4(192, 168, 0, 1)}) + offer.UpdateOption(OptServerIdentifier(net.IPv4(192, 168, 0, 1))) // Broadcast request req, err = NewRequestFromOffer(offer) @@ -235,13 +235,12 @@ func TestDHCPv4NewRequestFromOffer(t *testing.T) { func TestDHCPv4NewRequestFromOfferWithModifier(t *testing.T) { offer, err := New() require.NoError(t, err) - offer.UpdateOption(&OptMessageType{MessageType: MessageTypeOffer}) - offer.UpdateOption(&OptServerIdentifier{ServerID: net.IPv4(192, 168, 0, 1)}) + offer.UpdateOption(OptMessageType(MessageTypeOffer)) + offer.UpdateOption(OptServerIdentifier(net.IPv4(192, 168, 0, 1))) userClass := WithUserClass([]byte("linuxboot"), false) req, err := NewRequestFromOffer(offer, userClass) require.NoError(t, err) require.Equal(t, MessageTypeRequest, req.MessageType()) - require.Equal(t, "User Class Information -> linuxboot", req.Options[3].String()) } func TestNewReplyFromRequest(t *testing.T) { @@ -263,7 +262,6 @@ func TestNewReplyFromRequestWithModifier(t *testing.T) { require.NoError(t, err) require.Equal(t, discover.TransactionID, reply.TransactionID) require.Equal(t, discover.GatewayIPAddr, reply.GatewayIPAddr) - require.Equal(t, "User Class Information -> linuxboot", reply.Options[0].String()) } func TestDHCPv4MessageTypeNil(t *testing.T) { @@ -304,10 +302,33 @@ func TestIsOptionRequested(t *testing.T) { require.NoError(t, err) require.False(t, pkt.IsOptionRequested(OptionDomainNameServer)) - optprl := OptParameterRequestList{RequestedOpts: []OptionCode{OptionDomainNameServer}} - pkt.UpdateOption(&optprl) + optprl := OptParameterRequestList(OptionDomainNameServer) + pkt.UpdateOption(optprl) require.True(t, pkt.IsOptionRequested(OptionDomainNameServer)) } // TODO // test Summary() and String() +func TestSummary(t *testing.T) { + packet, err := New(WithMessageType(MessageTypeInform)) + packet.TransactionID = [4]byte{1, 1, 1, 1} + require.NoError(t, err) + + want := "DHCPv4 Message\n" + + " opcode: BootRequest\n" + + " hwtype: Ethernet\n" + + " hopcount: 0\n" + + " transaction ID: 0x01010101\n" + + " num seconds: 0\n" + + " flags: Unicast (0x00)\n" + + " client IP: 0.0.0.0\n" + + " your IP: 0.0.0.0\n" + + " server IP: 0.0.0.0\n" + + " gateway IP: 0.0.0.0\n" + + " client MAC: \n" + + " server hostname: \n" + + " bootfile name: \n" + + " options:\n" + + " DHCP Message Type: INFORM\n" + require.Equal(t, want, packet.Summary()) +} diff --git a/dhcpv4/modifiers.go b/dhcpv4/modifiers.go index 07594911..431fdfd1 100644 --- a/dhcpv4/modifiers.go +++ b/dhcpv4/modifiers.go @@ -2,6 +2,7 @@ package dhcpv4 import ( "net" + "time" "github.com/insomniacslk/dhcp/iana" "github.com/insomniacslk/dhcp/rfc1035label" @@ -89,10 +90,13 @@ func WithOption(opt Option) Modifier { // rfc compliant or not. More details in issue #113 func WithUserClass(uc []byte, rfc bool) Modifier { // TODO let the user specify multiple user classes - return WithOption(&OptUserClass{ - UserClasses: [][]byte{uc}, - Rfc3004: rfc, - }) + return func(d *DHCPv4) { + if rfc { + d.UpdateOption(OptRFC3004UserClass([][]byte{uc})) + } else { + d.UpdateOption(OptUserClass(uc)) + } + } } // WithNetboot adds bootfile URL and bootfile param options to a DHCPv4 packet. @@ -102,7 +106,7 @@ func WithNetboot(d *DHCPv4) { // WithMessageType adds the DHCPv4 message type m to a packet. func WithMessageType(m MessageType) Modifier { - return WithOption(&OptMessageType{m}) + return WithOption(OptMessageType(m)) } // WithRequestedOptions adds requested options to the packet. @@ -110,10 +114,11 @@ func WithRequestedOptions(optionCodes ...OptionCode) Modifier { return func(d *DHCPv4) { params := d.GetOneOption(OptionParameterRequestList) if params == nil { - d.UpdateOption(&OptParameterRequestList{OptionCodeList(optionCodes)}) + d.UpdateOption(OptParameterRequestList(optionCodes...)) } else { - opts := params.(*OptParameterRequestList) - opts.RequestedOpts.Add(optionCodes...) + cl := OptionCodeList(GetParameterRequestList(d.Options)) + cl.Add(optionCodes...) + d.UpdateOption(OptParameterRequestList(cl...)) } } } @@ -124,33 +129,23 @@ func WithRelay(ip net.IP) Modifier { return func(d *DHCPv4) { d.SetUnicast() d.GatewayIPAddr = ip - d.HopCount += 1 + d.HopCount++ } } // WithNetmask adds or updates an OptSubnetMask func WithNetmask(mask net.IPMask) Modifier { - return WithOption(&OptSubnetMask{SubnetMask: mask}) + return WithOption(OptSubnetMask(mask)) } // WithLeaseTime adds or updates an OptIPAddressLeaseTime func WithLeaseTime(leaseTime uint32) Modifier { - return WithOption(&OptIPAddressLeaseTime{LeaseTime: leaseTime}) -} - -// WithDNS adds or updates an OptionDomainNameServer -func WithDNS(dnses ...net.IP) Modifier { - return WithOption(&OptDomainNameServer{NameServers: dnses}) + return WithOption(OptIPAddressLeaseTime(time.Duration(leaseTime) * time.Second)) } // WithDomainSearchList adds or updates an OptionDomainSearch func WithDomainSearchList(searchList ...string) Modifier { - return WithOption(&OptDomainSearch{DomainSearch: &rfc1035label.Labels{ + return WithOption(OptDomainSearch(&rfc1035label.Labels{ Labels: searchList, - }}) -} - -// WithRouter adds or updates an OptionRouter -func WithRouter(routers ...net.IP) Modifier { - return WithOption(&OptRouter{Routers: routers}) + })) } diff --git a/dhcpv4/modifiers_test.go b/dhcpv4/modifiers_test.go index 2cac2a07..6233a7de 100644 --- a/dhcpv4/modifiers_test.go +++ b/dhcpv4/modifiers_test.go @@ -3,6 +3,7 @@ package dhcpv4 import ( "net" "testing" + "time" "github.com/stretchr/testify/require" ) @@ -35,13 +36,12 @@ func TestHwAddrModifier(t *testing.T) { } func TestWithOptionModifier(t *testing.T) { - d, err := New(WithOption(&OptDomainName{DomainName: "slackware.it"})) + d, err := New(WithOption(OptDomainName("slackware.it"))) require.NoError(t, err) - opt := d.GetOneOption(OptionDomainName) - require.NotNil(t, opt) - dnOpt := opt.(*OptDomainName) - require.Equal(t, "slackware.it", dnOpt.DomainName) + dnOpt := GetDomainName(d.Options) + require.NotNil(t, dnOpt) + require.Equal(t, "slackware.it", dnOpt) } func TestUserClassModifier(t *testing.T) { @@ -51,8 +51,7 @@ func TestUserClassModifier(t *testing.T) { expected := []byte{ 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', } - require.Equal(t, "User Class Information -> linuxboot", d.Options[0].String()) - require.Equal(t, expected, d.Options[0].ToBytes()) + require.Equal(t, expected, d.GetOneOption(OptionUserClassInformation)) } func TestUserClassModifierRFC(t *testing.T) { @@ -62,43 +61,35 @@ func TestUserClassModifierRFC(t *testing.T) { expected := []byte{ 9, 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', } - require.Equal(t, "User Class Information -> linuxboot", d.Options[0].String()) - require.Equal(t, expected, d.Options[0].ToBytes()) + require.Equal(t, expected, d.GetOneOption(OptionUserClassInformation)) } func TestWithNetboot(t *testing.T) { d, err := New(WithNetboot) require.NoError(t, err) - require.Equal(t, "Parameter Request List -> TFTP Server Name, Bootfile Name", d.Options[0].String()) + require.Equal(t, "TFTP Server Name, Bootfile Name", GetParameterRequestList(d.Options).String()) } func TestWithNetbootExistingTFTP(t *testing.T) { - d, err := New() - require.NoError(t, err) - d.UpdateOption(&OptParameterRequestList{ - RequestedOpts: []OptionCode{OptionTFTPServerName}, - }) + d, _ := New() + d.UpdateOption(OptParameterRequestList(OptionTFTPServerName)) WithNetboot(d) - require.Equal(t, "Parameter Request List -> TFTP Server Name, Bootfile Name", d.Options[0].String()) + require.Equal(t, "TFTP Server Name, Bootfile Name", GetParameterRequestList(d.Options).String()) } func TestWithNetbootExistingBootfileName(t *testing.T) { d, _ := New() - d.UpdateOption(&OptParameterRequestList{ - RequestedOpts: []OptionCode{OptionBootfileName}, - }) + d.UpdateOption(OptParameterRequestList(OptionBootfileName)) WithNetboot(d) - require.Equal(t, "Parameter Request List -> Bootfile Name, TFTP Server Name", d.Options[0].String()) + require.Equal(t, "TFTP Server Name, Bootfile Name", GetParameterRequestList(d.Options).String()) } func TestWithNetbootExistingBoth(t *testing.T) { d, _ := New() - d.UpdateOption(&OptParameterRequestList{ - RequestedOpts: []OptionCode{OptionBootfileName, OptionTFTPServerName}, - }) + d.UpdateOption(OptParameterRequestList(OptionBootfileName, OptionTFTPServerName)) WithNetboot(d) - require.Equal(t, "Parameter Request List -> Bootfile Name, TFTP Server Name", d.Options[0].String()) + require.Equal(t, "TFTP Server Name, Bootfile Name", GetParameterRequestList(d.Options).String()) } func TestWithRequestedOptions(t *testing.T) { @@ -106,18 +97,16 @@ func TestWithRequestedOptions(t *testing.T) { d, err := New(WithRequestedOptions(OptionFQDN)) require.NoError(t, err) require.NotNil(t, d) - o := d.GetOneOption(OptionParameterRequestList) - require.NotNil(t, o) - opts := o.(*OptParameterRequestList) - require.ElementsMatch(t, opts.RequestedOpts, []OptionCode{OptionFQDN}) + opts := GetParameterRequestList(d.Options) + require.NotNil(t, opts) + require.ElementsMatch(t, opts, []OptionCode{OptionFQDN}) // Check if already set options are preserved WithRequestedOptions(OptionHostName)(d) require.NotNil(t, d) - o = d.GetOneOption(OptionParameterRequestList) - require.NotNil(t, o) - opts = o.(*OptParameterRequestList) - require.ElementsMatch(t, opts.RequestedOpts, []OptionCode{OptionFQDN, OptionHostName}) + opts = GetParameterRequestList(d.Options) + require.NotNil(t, opts) + require.ElementsMatch(t, opts, []OptionCode{OptionFQDN, OptionHostName}) } func TestWithRelay(t *testing.T) { @@ -134,56 +123,44 @@ func TestWithNetmask(t *testing.T) { d, err := New(WithNetmask(net.IPv4Mask(255, 255, 255, 0))) require.NoError(t, err) - require.Equal(t, 1, len(d.Options)) - require.Equal(t, OptionSubnetMask, d.Options[0].Code()) - osm := d.Options[0].(*OptSubnetMask) - require.Equal(t, net.IPv4Mask(255, 255, 255, 0), osm.SubnetMask) + osm := GetSubnetMask(d.Options) + require.Equal(t, net.IPv4Mask(255, 255, 255, 0), osm) } func TestWithLeaseTime(t *testing.T) { d, err := New(WithLeaseTime(uint32(3600))) require.NoError(t, err) - require.Equal(t, 1, len(d.Options)) - require.Equal(t, OptionIPAddressLeaseTime, d.Options[0].Code()) - olt := d.Options[0].(*OptIPAddressLeaseTime) - require.Equal(t, uint32(3600), olt.LeaseTime) + require.True(t, d.Options.Has(OptionIPAddressLeaseTime)) + olt := GetIPAddressLeaseTime(d.Options, 10*time.Second) + require.Equal(t, 3600*time.Second, olt) } func TestWithDNS(t *testing.T) { d, err := New(WithDNS(net.ParseIP("10.0.0.1"), net.ParseIP("10.0.0.2"))) require.NoError(t, err) - require.Equal(t, 1, len(d.Options)) - require.Equal(t, OptionDomainNameServer, d.Options[0].Code()) - olt := d.Options[0].(*OptDomainNameServer) - require.Equal(t, 2, len(olt.NameServers)) - require.Equal(t, net.ParseIP("10.0.0.1"), olt.NameServers[0]) - require.Equal(t, net.ParseIP("10.0.0.2"), olt.NameServers[1]) - require.NotEqual(t, net.ParseIP("10.0.0.1"), olt.NameServers[1]) + dns := GetDNS(d.Options) + require.Equal(t, net.ParseIP("10.0.0.1").To4(), dns[0]) + require.Equal(t, net.ParseIP("10.0.0.2").To4(), dns[1]) } func TestWithDomainSearchList(t *testing.T) { d, err := New(WithDomainSearchList("slackware.it", "dhcp.slackware.it")) require.NoError(t, err) - require.Equal(t, 1, len(d.Options)) - osl := d.Options[0].(*OptDomainSearch) - require.Equal(t, OptionDNSDomainSearchList, osl.Code()) - require.NotNil(t, osl.DomainSearch) - require.Equal(t, 2, len(osl.DomainSearch.Labels)) - require.Equal(t, "slackware.it", osl.DomainSearch.Labels[0]) - require.Equal(t, "dhcp.slackware.it", osl.DomainSearch.Labels[1]) + osl := GetDomainSearch(d.Options) + require.NotNil(t, osl) + require.Equal(t, 2, len(osl.Labels)) + require.Equal(t, "slackware.it", osl.Labels[0]) + require.Equal(t, "dhcp.slackware.it", osl.Labels[1]) } func TestWithRouter(t *testing.T) { - rtr := net.ParseIP("10.0.0.254") + rtr := net.ParseIP("10.0.0.254").To4() d, err := New(WithRouter(rtr)) require.NoError(t, err) - require.Equal(t, 1, len(d.Options)) - ortr := d.Options[0].(*OptRouter) - require.Equal(t, OptionRouter, ortr.Code()) - require.Equal(t, 1, len(ortr.Routers)) - require.Equal(t, rtr, ortr.Routers[0]) + ortr := GetRouter(d.Options) + require.Equal(t, rtr, ortr[0]) } diff --git a/dhcpv4/option_archtype.go b/dhcpv4/option_archtype.go index 59dadb39..00a44172 100644 --- a/dhcpv4/option_archtype.go +++ b/dhcpv4/option_archtype.go @@ -1,55 +1,23 @@ package dhcpv4 import ( - "fmt" - "github.com/insomniacslk/dhcp/iana" - "github.com/u-root/u-root/pkg/uio" ) -// OptClientArchType represents an option encapsulating the Client System -// Architecture Type option definition. See RFC 4578. -type OptClientArchType struct { - ArchTypes []iana.Arch -} - -// Code returns the option code. -func (o *OptClientArchType) Code() OptionCode { - return OptionClientSystemArchitectureType -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptClientArchType) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - for _, at := range o.ArchTypes { - buf.Write16(uint16(at)) - } - return buf.Data() +// OptClientArch returns a new Client System Architecture Type option. +func OptClientArch(archs ...iana.Arch) Option { + return Option{Code: OptionClientSystemArchitectureType, Value: iana.Archs(archs)} } -// String returns a human-readable string. -func (o *OptClientArchType) String() string { - var archTypes string - for idx, at := range o.ArchTypes { - archTypes += at.String() - if idx < len(o.ArchTypes)-1 { - archTypes += ", " - } +// GetClientArch returns the Client System Architecture Type option. +func GetClientArch(o Options) []iana.Arch { + v := o.Get(OptionClientSystemArchitectureType) + if v == nil { + return nil } - return fmt.Sprintf("Client System Architecture Type -> %v", archTypes) -} - -// ParseOptClientArchType returns a new OptClientArchType from a byte stream, -// or error if any. -func ParseOptClientArchType(data []byte) (*OptClientArchType, error) { - buf := uio.NewBigEndianBuffer(data) - if buf.Len() == 0 { - return nil, fmt.Errorf("must have at least one archtype if option is present") - } - - archTypes := make([]iana.Arch, 0, buf.Len()/2) - for buf.Has(2) { - archTypes = append(archTypes, iana.Arch(buf.Read16())) + var archs iana.Archs + if err := archs.FromBytes(v); err != nil { + return nil } - return &OptClientArchType{ArchTypes: archTypes}, buf.FinError() + return archs } diff --git a/dhcpv4/option_archtype_test.go b/dhcpv4/option_archtype_test.go index 60f88644..fcf526b9 100644 --- a/dhcpv4/option_archtype_test.go +++ b/dhcpv4/option_archtype_test.go @@ -8,53 +8,42 @@ import ( ) func TestParseOptClientArchType(t *testing.T) { - data := []byte{ + o := Options{OptionClientSystemArchitectureType.Code(): []byte{ 0, 6, // EFI_IA32 - } - opt, err := ParseOptClientArchType(data) - require.NoError(t, err) - require.Equal(t, opt.ArchTypes[0], iana.EFI_IA32) + }} + archs := GetClientArch(o) + require.NotNil(t, archs) + require.Equal(t, archs[0], iana.EFI_IA32) } func TestParseOptClientArchTypeMultiple(t *testing.T) { - data := []byte{ + o := Options{OptionClientSystemArchitectureType.Code(): []byte{ 0, 6, // EFI_IA32 0, 2, // EFI_ITANIUM - } - opt, err := ParseOptClientArchType(data) - require.NoError(t, err) - require.Equal(t, opt.ArchTypes[0], iana.EFI_IA32) - require.Equal(t, opt.ArchTypes[1], iana.EFI_ITANIUM) + }} + archs := GetClientArch(o) + require.NotNil(t, archs) + require.Equal(t, archs[0], iana.EFI_IA32) + require.Equal(t, archs[1], iana.EFI_ITANIUM) } func TestParseOptClientArchTypeInvalid(t *testing.T) { - data := []byte{42} - _, err := ParseOptClientArchType(data) - require.Error(t, err) + o := Options{OptionClientSystemArchitectureType.Code(): []byte{42}} + archs := GetClientArch(o) + require.Nil(t, archs) } -func TestOptClientArchTypeParseAndToBytes(t *testing.T) { - data := []byte{ - 0, 8, // EFI_XSCALE - } - opt, err := ParseOptClientArchType(data) - require.NoError(t, err) - require.Equal(t, opt.ToBytes(), data) +func TestGetClientArchEmpty(t *testing.T) { + require.Nil(t, GetClientArch(Options{})) } func TestOptClientArchTypeParseAndToBytesMultiple(t *testing.T) { data := []byte{ - 0, 8, // EFI_XSCALE 0, 6, // EFI_IA32 + 0, 8, // EFI_XSCALE } - opt, err := ParseOptClientArchType(data) - require.NoError(t, err) - require.Equal(t, opt.ToBytes(), data) -} - -func TestOptClientArchType(t *testing.T) { - opt := OptClientArchType{ - ArchTypes: []iana.Arch{iana.EFI_ITANIUM}, - } - require.Equal(t, opt.Code(), OptionClientSystemArchitectureType) + opt := OptClientArch(iana.EFI_IA32, iana.EFI_XSCALE) + require.Equal(t, opt.Value.ToBytes(), data) + require.Equal(t, opt.Code, OptionClientSystemArchitectureType) + require.Equal(t, opt.String(), "Client System Architecture Type: EFI IA32, EFI Xscale") } diff --git a/dhcpv4/option_domain_search.go b/dhcpv4/option_domain_search.go index e352e349..6d2f7b21 100644 --- a/dhcpv4/option_domain_search.go +++ b/dhcpv4/option_domain_search.go @@ -1,41 +1,27 @@ package dhcpv4 import ( - "fmt" - "github.com/insomniacslk/dhcp/rfc1035label" ) -// OptDomainSearch implements the domain search list option described by RFC -// 3397, Section 2. +// OptDomainSearch returns a new domain search option. // -// FIXME: rename OptDomainSearch to OptDomainSearchList, and DomainSearch to -// SearchList, for consistency with the equivalent v6 option -type OptDomainSearch struct { - DomainSearch *rfc1035label.Labels -} - -// Code returns the option code. -func (op *OptDomainSearch) Code() OptionCode { - return OptionDNSDomainSearchList -} - -// ToBytes returns a serialized stream of bytes for this option. -func (op *OptDomainSearch) ToBytes() []byte { - return op.DomainSearch.ToBytes() +// The domain search option is described by RFC 3397, Section 2. +func OptDomainSearch(labels *rfc1035label.Labels) Option { + return Option{Code: OptionDNSDomainSearchList, Value: labels} } -// String returns a human-readable string. -func (op *OptDomainSearch) String() string { - return fmt.Sprintf("DNS Domain Search List -> %v", op.DomainSearch.Labels) -} - -// ParseOptDomainSearch returns a new OptDomainSearch from a byte stream, or -// error if any. -func ParseOptDomainSearch(data []byte) (*OptDomainSearch, error) { - labels, err := rfc1035label.FromBytes(data) +// GetDomainSearch returns the domain search list in o, if present. +// +// The domain search option is described by RFC 3397, Section 2. +func GetDomainSearch(o Options) *rfc1035label.Labels { + v := o.Get(OptionDNSDomainSearchList) + if v == nil { + return nil + } + labels, err := rfc1035label.FromBytes(v) if err != nil { - return nil, err + return nil } - return &OptDomainSearch{DomainSearch: labels}, nil + return labels } diff --git a/dhcpv4/option_domain_search_test.go b/dhcpv4/option_domain_search_test.go index 6425d577..9a508f2b 100644 --- a/dhcpv4/option_domain_search_test.go +++ b/dhcpv4/option_domain_search_test.go @@ -7,17 +7,20 @@ import ( "github.com/stretchr/testify/require" ) -func TestParseOptDomainSearch(t *testing.T) { +func TestGetDomainSearch(t *testing.T) { data := []byte{ 7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'c', 'o', 'm', 0, 6, 's', 'u', 'b', 'n', 'e', 't', 7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'o', 'r', 'g', 0, } - opt, err := ParseOptDomainSearch(data) - require.NoError(t, err) - require.Equal(t, 2, len(opt.DomainSearch.Labels)) - require.Equal(t, data, opt.DomainSearch.ToBytes()) - require.Equal(t, opt.DomainSearch.Labels[0], "example.com") - require.Equal(t, opt.DomainSearch.Labels[1], "subnet.example.org") + o := Options{ + OptionDNSDomainSearchList.Code(): data, + } + labels := GetDomainSearch(o) + require.NotNil(t, labels) + require.Equal(t, 2, len(labels.Labels)) + require.Equal(t, data, labels.ToBytes()) + require.Equal(t, labels.Labels[0], "example.com") + require.Equal(t, labels.Labels[1], "subnet.example.org") } func TestOptDomainSearchToBytes(t *testing.T) { @@ -25,13 +28,12 @@ func TestOptDomainSearchToBytes(t *testing.T) { 7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'c', 'o', 'm', 0, 6, 's', 'u', 'b', 'n', 'e', 't', 7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'o', 'r', 'g', 0, } - opt := OptDomainSearch{ - DomainSearch: &rfc1035label.Labels{ - Labels: []string{ - "example.com", - "subnet.example.org", - }, + opt := OptDomainSearch(&rfc1035label.Labels{ + Labels: []string{ + "example.com", + "subnet.example.org", }, - } - require.Equal(t, opt.ToBytes(), expected) + }, + ) + require.Equal(t, opt.Value.ToBytes(), expected) } diff --git a/dhcpv4/option_generic.go b/dhcpv4/option_generic.go index 264340c3..a54cdeb7 100644 --- a/dhcpv4/option_generic.go +++ b/dhcpv4/option_generic.go @@ -1,7 +1,6 @@ package dhcpv4 import ( - "errors" "fmt" ) @@ -9,22 +8,7 @@ import ( // data. Every option that does not have a specific implementation will fall // back to this option. type OptionGeneric struct { - OptionCode OptionCode - Data []byte -} - -// ParseOptionGeneric parses a bytestream and creates a new OptionGeneric from -// it, or an error. -func ParseOptionGeneric(code OptionCode, data []byte) (Option, error) { - if len(data) == 0 { - return nil, errors.New("invalid zero-length bytestream") - } - return &OptionGeneric{OptionCode: code, Data: data}, nil -} - -// Code returns the generic option code. -func (o OptionGeneric) Code() OptionCode { - return o.OptionCode + Data []byte } // ToBytes returns a serialized generic option as a slice of bytes. @@ -34,5 +18,10 @@ func (o OptionGeneric) ToBytes() []byte { // String returns a human-readable representation of a generic option. func (o OptionGeneric) String() string { - return fmt.Sprintf("%v -> %v", o.OptionCode.String(), o.Data) + return fmt.Sprintf("%v", o.Data) +} + +// OptGeneric returns a generic option. +func OptGeneric(code OptionCode, value []byte) Option { + return Option{Code: code, Value: OptionGeneric{value}} } diff --git a/dhcpv4/option_generic_test.go b/dhcpv4/option_generic_test.go index ee35d653..4c4f2e82 100644 --- a/dhcpv4/option_generic_test.go +++ b/dhcpv4/option_generic_test.go @@ -6,42 +6,14 @@ import ( "github.com/stretchr/testify/require" ) -func TestParseOptionGeneric(t *testing.T) { - // Empty bytestream produces error - _, err := ParseOptionGeneric(OptionHostName, []byte{}) - require.Error(t, err, "error from empty bytestream") -} - func TestOptionGenericCode(t *testing.T) { - o := OptionGeneric{ - OptionCode: OptionDHCPMessageType, - Data: []byte{byte(MessageTypeDiscover)}, - } - require.Equal(t, OptionDHCPMessageType, o.Code()) -} - -func TestOptionGenericToBytes(t *testing.T) { - o := OptionGeneric{ - OptionCode: OptionDHCPMessageType, - Data: []byte{byte(MessageTypeDiscover)}, - } - serialized := o.ToBytes() - expected := []byte{1} - require.Equal(t, expected, serialized) -} - -func TestOptionGenericString(t *testing.T) { - o := OptionGeneric{ - OptionCode: OptionDHCPMessageType, - Data: []byte{byte(MessageTypeDiscover)}, - } - require.Equal(t, "DHCP Message Type -> [1]", o.String()) + o := OptGeneric(OptionDHCPMessageType, []byte{byte(MessageTypeDiscover)}) + require.Equal(t, OptionDHCPMessageType, o.Code) + require.Equal(t, []byte{1}, o.Value.ToBytes()) + require.Equal(t, "DHCP Message Type: [1]", o.String()) } func TestOptionGenericStringUnknown(t *testing.T) { - o := OptionGeneric{ - OptionCode: optionCode(102), // Returned option code. - Data: []byte{byte(MessageTypeDiscover)}, - } - require.Equal(t, "unknown (102) -> [1]", o.String()) + o := OptGeneric(optionCode(102), []byte{byte(MessageTypeDiscover)}) + require.Equal(t, "unknown (102): [1]", o.String()) } diff --git a/dhcpv4/option_ip.go b/dhcpv4/option_ip.go index ee0f5fef..6a4206cf 100644 --- a/dhcpv4/option_ip.go +++ b/dhcpv4/option_ip.go @@ -1,92 +1,83 @@ package dhcpv4 import ( - "fmt" "net" "github.com/u-root/u-root/pkg/uio" ) -// OptBroadcastAddress implements the broadcast address option described in RFC -// 2132, Section 5.3. -type OptBroadcastAddress struct { - BroadcastAddress net.IP -} +// IP implements DHCPv4 IP option marshaling and unmarshaling as described by +// RFC 2132, Sections 5.3, 9.1, 9.7, and others. +type IP net.IP -// ParseOptBroadcastAddress returns a new OptBroadcastAddress from a byte -// stream, or error if any. -func ParseOptBroadcastAddress(data []byte) (*OptBroadcastAddress, error) { +// FromBytes parses an IP from data in binary form. +func (i *IP) FromBytes(data []byte) error { buf := uio.NewBigEndianBuffer(data) - return &OptBroadcastAddress{BroadcastAddress: net.IP(buf.CopyN(net.IPv4len))}, buf.FinError() -} - -// Code returns the option code. -func (o *OptBroadcastAddress) Code() OptionCode { - return OptionBroadcastAddress + *i = IP(buf.CopyN(net.IPv4len)) + return buf.FinError() } // ToBytes returns a serialized stream of bytes for this option. -func (o *OptBroadcastAddress) ToBytes() []byte { - return []byte(o.BroadcastAddress.To4()) +func (i IP) ToBytes() []byte { + return []byte(net.IP(i).To4()) } -// String returns a human-readable string. -func (o *OptBroadcastAddress) String() string { - return fmt.Sprintf("Broadcast Address -> %v", o.BroadcastAddress.String()) +// String returns a human-readable IP. +func (i IP) String() string { + return net.IP(i).String() } -// OptRequestedIPAddress implements the requested IP address option described -// by RFC 2132, Section 9.1. -type OptRequestedIPAddress struct { - RequestedAddr net.IP +// GetIP returns code out of o parsed as an IP. +func GetIP(code OptionCode, o Options) net.IP { + v := o.Get(code) + if v == nil { + return nil + } + var ip IP + if err := ip.FromBytes(v); err != nil { + return nil + } + return net.IP(ip) } -// ParseOptRequestedIPAddress returns a new OptRequestedIPAddress from a byte -// stream, or error if any. -func ParseOptRequestedIPAddress(data []byte) (*OptRequestedIPAddress, error) { - buf := uio.NewBigEndianBuffer(data) - return &OptRequestedIPAddress{RequestedAddr: net.IP(buf.CopyN(net.IPv4len))}, buf.FinError() +// GetBroadcastAddress returns the DHCPv4 Broadcast Address value in o. +// +// The broadcast address option is described in RFC 2132, Section 5.3. +func GetBroadcastAddress(o Options) net.IP { + return GetIP(OptionBroadcastAddress, o) } -// Code returns the option code. -func (o *OptRequestedIPAddress) Code() OptionCode { - return OptionRequestedIPAddress -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptRequestedIPAddress) ToBytes() []byte { - return o.RequestedAddr.To4() +// OptBroadcastAddress returns a new DHCPv4 Broadcast Address option. +// +// The broadcast address option is described in RFC 2132, Section 5.3. +func OptBroadcastAddress(ip net.IP) Option { + return Option{Code: OptionBroadcastAddress, Value: IP(ip)} } -// String returns a human-readable string. -func (o *OptRequestedIPAddress) String() string { - return fmt.Sprintf("Requested IP Address -> %v", o.RequestedAddr.String()) +// GetRequestedIPAddress returns the DHCPv4 Requested IP Address value in o. +// +// The requested IP address option is described by RFC 2132, Section 9.1. +func GetRequestedIPAddress(o Options) net.IP { + return GetIP(OptionRequestedIPAddress, o) } -// OptServerIdentifier implements the server identifier option described by RFC -// 2132, Section 9.7. -type OptServerIdentifier struct { - ServerID net.IP +// OptRequestedIPAddress returns a new DHCPv4 Requested IP Address option. +// +// The requested IP address option is described by RFC 2132, Section 9.1. +func OptRequestedIPAddress(ip net.IP) Option { + return Option{Code: OptionRequestedIPAddress, Value: IP(ip)} } -// ParseOptServerIdentifier returns a new OptServerIdentifier from a byte -// stream, or error if any. -func ParseOptServerIdentifier(data []byte) (*OptServerIdentifier, error) { - buf := uio.NewBigEndianBuffer(data) - return &OptServerIdentifier{ServerID: net.IP(buf.CopyN(net.IPv4len))}, buf.FinError() -} - -// Code returns the option code. -func (o *OptServerIdentifier) Code() OptionCode { - return OptionServerIdentifier -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptServerIdentifier) ToBytes() []byte { - return o.ServerID.To4() +// GetServerIdentifier returns the DHCPv4 Server Identifier value in o. +// +// The server identifier option is described by RFC 2132, Section 9.7. +func GetServerIdentifier(o Options) net.IP { + return GetIP(OptionServerIdentifier, o) } -// String returns a human-readable string. -func (o *OptServerIdentifier) String() string { - return fmt.Sprintf("Server Identifier -> %v", o.ServerID.String()) +// OptServerIdentifier returns a new DHCPv4 Server Identifier option. +// +// The server identifier option is described by RFC 2132, Section 9.7. +func OptServerIdentifier(ip net.IP) Option { + return Option{Code: OptionServerIdentifier, Value: IP(ip)} } diff --git a/dhcpv4/option_ip_address_lease_time.go b/dhcpv4/option_ip_address_lease_time.go index 4362419c..6e092332 100644 --- a/dhcpv4/option_ip_address_lease_time.go +++ b/dhcpv4/option_ip_address_lease_time.go @@ -2,37 +2,53 @@ package dhcpv4 import ( "fmt" + "time" "github.com/u-root/u-root/pkg/uio" ) -// OptIPAddressLeaseTime implements the IP address lease time option described -// by RFC 2132, Section 9.2. -type OptIPAddressLeaseTime struct { - LeaseTime uint32 -} +// Duration implements the IP address lease time option described by RFC 2132, +// Section 9.2. +type Duration time.Duration -// ParseOptIPAddressLeaseTime constructs an OptIPAddressLeaseTime struct from a -// sequence of bytes and returns it, or an error. -func ParseOptIPAddressLeaseTime(data []byte) (*OptIPAddressLeaseTime, error) { +// FromBytes parses a duration from a byte stream according to RFC 2132, Section 9.2. +func (d *Duration) FromBytes(data []byte) error { buf := uio.NewBigEndianBuffer(data) - leaseTime := buf.Read32() - return &OptIPAddressLeaseTime{LeaseTime: leaseTime}, buf.FinError() -} - -// Code returns the option code. -func (o *OptIPAddressLeaseTime) Code() OptionCode { - return OptionIPAddressLeaseTime + *d = Duration(time.Duration(buf.Read32()) * time.Second) + return buf.FinError() } // ToBytes returns a serialized stream of bytes for this option. -func (o *OptIPAddressLeaseTime) ToBytes() []byte { +func (d Duration) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write32(o.LeaseTime) + buf.Write32(uint32(time.Duration(d) / time.Second)) return buf.Data() } // String returns a human-readable string for this option. -func (o *OptIPAddressLeaseTime) String() string { - return fmt.Sprintf("IP Addresses Lease Time -> %v", o.LeaseTime) +func (d Duration) String() string { + return fmt.Sprintf("%s", time.Duration(d)) +} + +// OptIPAddressLeaseTime returns a new IP address lease time option. +// +// The IP address lease time option is described by RFC 2132, Section 9.2. +func OptIPAddressLeaseTime(d time.Duration) Option { + return Option{Code: OptionIPAddressLeaseTime, Value: Duration(d)} +} + +// GetIPAddressLeaseTime returns the IP address lease time in o, or the given +// default duration if not present. +// +// The IP address lease time option is described by RFC 2132, Section 9.2. +func GetIPAddressLeaseTime(o Options, def time.Duration) time.Duration { + v := o.Get(OptionIPAddressLeaseTime) + if v == nil { + return def + } + var d Duration + if err := d.FromBytes(v); err != nil { + return def + } + return time.Duration(d) } diff --git a/dhcpv4/option_ip_address_lease_time_test.go b/dhcpv4/option_ip_address_lease_time_test.go index 384db1ce..70c40473 100644 --- a/dhcpv4/option_ip_address_lease_time_test.go +++ b/dhcpv4/option_ip_address_lease_time_test.go @@ -2,34 +2,33 @@ package dhcpv4 import ( "testing" + "time" "github.com/stretchr/testify/require" ) -func TestOptIPAddressLeaseTimeInterfaceMethods(t *testing.T) { - o := OptIPAddressLeaseTime{LeaseTime: 43200} - require.Equal(t, OptionIPAddressLeaseTime, o.Code(), "Code") - require.Equal(t, []byte{0, 0, 168, 192}, o.ToBytes(), "ToBytes") +func TestOptIPAddressLeaseTime(t *testing.T) { + o := OptIPAddressLeaseTime(43200 * time.Second) + require.Equal(t, OptionIPAddressLeaseTime, o.Code, "Code") + require.Equal(t, []byte{0, 0, 168, 192}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "IP Addresses Lease Time: 12h0m0s", o.String(), "String") } -func TestParseOptIPAddressLeaseTime(t *testing.T) { - data := []byte{0, 0, 168, 192} - o, err := ParseOptIPAddressLeaseTime(data) - require.NoError(t, err) - require.Equal(t, &OptIPAddressLeaseTime{LeaseTime: 43200}, o) +func TestGetIPAddressLeaseTime(t *testing.T) { + o := Options{OptionIPAddressLeaseTime.Code(): []byte{0, 0, 168, 192}} + leaseTime := GetIPAddressLeaseTime(o, 0) + require.Equal(t, 43200*time.Second, leaseTime) - // Short byte stream - data = []byte{168, 192} - _, err = ParseOptIPAddressLeaseTime(data) - require.Error(t, err, "should get error from short byte stream") + // Too short. + o = Options{OptionIPAddressLeaseTime.Code(): []byte{168, 192}} + leaseTime = GetIPAddressLeaseTime(o, 0) + require.Equal(t, time.Duration(0), leaseTime) - // Bad length - data = []byte{1, 1, 1, 1, 1} - _, err = ParseOptIPAddressLeaseTime(data) - require.Error(t, err, "should get error from bad length") -} + // Too long. + o = Options{OptionIPAddressLeaseTime.Code(): []byte{1, 1, 1, 1, 1}} + leaseTime = GetIPAddressLeaseTime(o, 0) + require.Equal(t, time.Duration(0), leaseTime) -func TestOptIPAddressLeaseTimeString(t *testing.T) { - o := OptIPAddressLeaseTime{LeaseTime: 43200} - require.Equal(t, "IP Addresses Lease Time -> 43200", o.String()) + // Empty. + require.Equal(t, time.Duration(10), GetIPAddressLeaseTime(Options{}, 10)) } diff --git a/dhcpv4/option_ip_test.go b/dhcpv4/option_ip_test.go index fe314870..e7722243 100644 --- a/dhcpv4/option_ip_test.go +++ b/dhcpv4/option_ip_test.go @@ -8,61 +8,59 @@ import ( ) func TestOptBroadcastAddress(t *testing.T) { - o := OptBroadcastAddress{BroadcastAddress: net.IP{192, 168, 0, 1}} + ip := net.IP{192, 168, 0, 1} + o := OptBroadcastAddress(ip) - require.Equal(t, OptionBroadcastAddress, o.Code(), "Code") - require.Equal(t, []byte{192, 168, 0, 1}, o.ToBytes(), "ToBytes") - require.Equal(t, "Broadcast Address -> 192.168.0.1", o.String(), "String") + require.Equal(t, OptionBroadcastAddress, o.Code, "Code") + require.Equal(t, []byte(ip), o.Value.ToBytes(), "ToBytes") + require.Equal(t, "Broadcast Address: 192.168.0.1", o.String(), "String") } -func TestParseOptBroadcastAddress(t *testing.T) { - o, err := ParseOptBroadcastAddress([]byte{}) - require.Error(t, err, "empty byte stream") - - o, err = ParseOptBroadcastAddress([]byte{192, 168, 0}) - require.Error(t, err, "wrong IP length") +func TestGetIPs(t *testing.T) { + o := Options{102: []byte{}} + i := GetIPs(optionCode(102), o) + require.Nil(t, i) - o, err = ParseOptBroadcastAddress([]byte{192, 168, 0, 1}) - require.NoError(t, err) - require.Equal(t, net.IP{192, 168, 0, 1}, o.BroadcastAddress) -} + o = Options{102: []byte{192, 168, 0}} + i = GetIPs(optionCode(102), o) + require.Nil(t, i) -func TestOptRequestedIPAddress(t *testing.T) { - o := OptRequestedIPAddress{RequestedAddr: net.IP{192, 168, 0, 1}} + o = Options{102: []byte{192, 168, 0, 1}} + i = GetIPs(optionCode(102), o) + require.Equal(t, i, []net.IP{{192, 168, 0, 1}}) - require.Equal(t, OptionRequestedIPAddress, o.Code(), "Code") - require.Equal(t, []byte{192, 168, 0, 1}, o.ToBytes(), "ToBytes") - require.Equal(t, "Requested IP Address -> 192.168.0.1", o.String(), "String") + o = Options{102: []byte{192, 168, 0, 1, 192, 168, 0, 2}} + i = GetIPs(optionCode(102), o) + require.Equal(t, i, []net.IP{{192, 168, 0, 1}, {192, 168, 0, 2}}) } -func TestParseOptRequestedIPAddress(t *testing.T) { - o, err := ParseOptRequestedIPAddress([]byte{}) +func TestParseIP(t *testing.T) { + var ip IP + err := ip.FromBytes([]byte{}) require.Error(t, err, "empty byte stream") - o, err = ParseOptRequestedIPAddress([]byte{192}) + err = ip.FromBytes([]byte{192, 168, 0}) require.Error(t, err, "wrong IP length") - o, err = ParseOptRequestedIPAddress([]byte{192, 168, 0, 1}) + err = ip.FromBytes([]byte{192, 168, 0, 1}) require.NoError(t, err) - require.Equal(t, net.IP{192, 168, 0, 1}, o.RequestedAddr) + require.Equal(t, net.IP{192, 168, 0, 1}, net.IP(ip)) } -func TestOptServerIdentifierInterfaceMethods(t *testing.T) { - o := OptServerIdentifier{ServerID: net.IP{192, 168, 0, 1}} +func TestOptRequestedIPAddress(t *testing.T) { + ip := net.IP{192, 168, 0, 1} + o := OptRequestedIPAddress(ip) - require.Equal(t, OptionServerIdentifier, o.Code(), "Code") - require.Equal(t, []byte{192, 168, 0, 1}, o.ToBytes(), "ToBytes") - require.Equal(t, "Server Identifier -> 192.168.0.1", o.String(), "String") + require.Equal(t, OptionRequestedIPAddress, o.Code, "Code") + require.Equal(t, []byte(ip), o.Value.ToBytes(), "ToBytes") + require.Equal(t, "Requested IP Address: 192.168.0.1", o.String(), "String") } -func TestParseOptServerIdentifier(t *testing.T) { - o, err := ParseOptServerIdentifier([]byte{}) - require.Error(t, err, "empty byte stream") +func TestOptServerIdentifier(t *testing.T) { + ip := net.IP{192, 168, 0, 1} + o := OptServerIdentifier(ip) - o, err = ParseOptServerIdentifier([]byte{192, 168, 0}) - require.Error(t, err, "wrong IP length") - - o, err = ParseOptServerIdentifier([]byte{192, 168, 0, 1}) - require.NoError(t, err) - require.Equal(t, net.IP{192, 168, 0, 1}, o.ServerID) + require.Equal(t, OptionServerIdentifier, o.Code, "Code") + require.Equal(t, []byte(ip), o.Value.ToBytes(), "ToBytes") + require.Equal(t, "Server Identifier: 192.168.0.1", o.String(), "String") } diff --git a/dhcpv4/option_ips.go b/dhcpv4/option_ips.go index 8792ed04..693d62da 100644 --- a/dhcpv4/option_ips.go +++ b/dhcpv4/option_ips.go @@ -8,36 +8,40 @@ import ( "github.com/u-root/u-root/pkg/uio" ) -// ParseIPs parses an IPv4 address from a DHCP packet as used and specified by +// IPs are IPv4 addresses from a DHCP packet as used and specified by options +// in RFC 2132, Sections 3.5 through 3.13, 8.2, 8.3, 8.5, 8.6, 8.9, and 8.10. +// +// IPs implements the OptionValue type. +type IPs []net.IP + +// FromBytes parses an IPv4 address from a DHCP packet as used and specified by // options in RFC 2132, Sections 3.5 through 3.13, 8.2, 8.3, 8.5, 8.6, 8.9, and // 8.10. -func ParseIPs(data []byte) ([]net.IP, error) { +func (i *IPs) FromBytes(data []byte) error { buf := uio.NewBigEndianBuffer(data) - if buf.Len() == 0 { - return nil, fmt.Errorf("IP DHCP options must always list at least one IP") + return fmt.Errorf("IP DHCP options must always list at least one IP") } - ips := make([]net.IP, 0, buf.Len()/net.IPv4len) + *i = make(IPs, 0, buf.Len()/net.IPv4len) for buf.Has(net.IPv4len) { - ips = append(ips, net.IP(buf.CopyN(net.IPv4len))) + *i = append(*i, net.IP(buf.CopyN(net.IPv4len))) } - return ips, buf.FinError() + return buf.FinError() } -// IPsToBytes marshals an IPv4 address to a DHCP packet as specified by RFC -// 2132, Section 3.5 et al. -func IPsToBytes(i []net.IP) []byte { +// ToBytes marshals IPv4 addresses to a DHCP packet as specified by RFC 2132, +// Section 3.5 et al. +func (i IPs) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - for _, ip := range i { buf.WriteBytes(ip.To4()) } return buf.Data() } -// IPsToString returns a human-readable representation of a list of IPs. -func IPsToString(i []net.IP) string { +// String returns a human-readable representation of a list of IPs. +func (i IPs) String() string { s := make([]string, 0, len(i)) for _, ip := range i { s = append(s, ip.String()) @@ -45,92 +49,76 @@ func IPsToString(i []net.IP) string { return strings.Join(s, ", ") } -// OptRouter implements the router option described by RFC 2132, Section 3.5. -type OptRouter struct { - Routers []net.IP -} - -// ParseOptRouter returns a new OptRouter from a byte stream, or error if any. -func ParseOptRouter(data []byte) (*OptRouter, error) { - ips, err := ParseIPs(data) - if err != nil { - return nil, err +// GetIPs parses a list of IPs from code in o. +func GetIPs(code OptionCode, o Options) []net.IP { + v := o.Get(code) + if v == nil { + return nil } - return &OptRouter{Routers: ips}, nil -} - -// Code returns the option code. -func (o *OptRouter) Code() OptionCode { - return OptionRouter -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptRouter) ToBytes() []byte { - return IPsToBytes(o.Routers) -} - -// String returns a human-readable string. -func (o *OptRouter) String() string { - return fmt.Sprintf("Routers -> %s", IPsToString(o.Routers)) -} - -// OptNTPServers implements the NTP servers option described by RFC 2132, -// Section 8.3. -type OptNTPServers struct { - NTPServers []net.IP -} - -// ParseOptNTPServers returns a new OptNTPServers from a byte stream, or error if any. -func ParseOptNTPServers(data []byte) (*OptNTPServers, error) { - ips, err := ParseIPs(data) - if err != nil { - return nil, err + var ips IPs + if err := ips.FromBytes(v); err != nil { + return nil } - return &OptNTPServers{NTPServers: ips}, nil + return []net.IP(ips) } -// Code returns the option code. -func (o *OptNTPServers) Code() OptionCode { - return OptionNTPServers +// GetRouter parses the DHCPv4 Router option if present. +// +// The Router option is described by RFC 2132, Section 3.5. +func GetRouter(o Options) []net.IP { + return GetIPs(OptionRouter, o) } -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptNTPServers) ToBytes() []byte { - return IPsToBytes(o.NTPServers) +// OptRouter returns a new DHCPv4 Router option. +// +// The Router option is described by RFC 2132, Section 3.5. +func OptRouter(routers ...net.IP) Option { + return Option{ + Code: OptionRouter, + Value: IPs(routers), + } } -// String returns a human-readable string. -func (o *OptNTPServers) String() string { - return fmt.Sprintf("NTP Servers -> %v", IPsToString(o.NTPServers)) +// WithRouter updates a packet with the DHCPv4 Router option. +func WithRouter(routers ...net.IP) Modifier { + return WithOption(OptRouter(routers...)) } -// OptDomainNameServer implements the DNS server option described by RFC 2132, -// Section 3.8. -type OptDomainNameServer struct { - NameServers []net.IP +// GetNTPServers parses the DHCPv4 NTP Servers option if present. +// +// The NTP servers option is described by RFC 2132, Section 8.3. +func GetNTPServers(o Options) []net.IP { + return GetIPs(OptionNTPServers, o) } -// ParseOptDomainNameServer returns a new OptDomainNameServer from a byte -// stream, or error if any. -func ParseOptDomainNameServer(data []byte) (*OptDomainNameServer, error) { - ips, err := ParseIPs(data) - if err != nil { - return nil, err +// OptNTPServers returns a new DHCPv4 NTP Server option. +// +// The NTP servers option is described by RFC 2132, Section 8.3. +func OptNTPServers(ntpServers ...net.IP) Option { + return Option{ + Code: OptionNTPServers, + Value: IPs(ntpServers), } - return &OptDomainNameServer{NameServers: ips}, nil } -// Code returns the option code. -func (o *OptDomainNameServer) Code() OptionCode { - return OptionDomainNameServer +// GetDNS parses the DHCPv4 Domain Name Server option if present. +// +// The DNS server option is described by RFC 2132, Section 3.8. +func GetDNS(o Options) []net.IP { + return GetIPs(OptionDomainNameServer, o) } -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptDomainNameServer) ToBytes() []byte { - return IPsToBytes(o.NameServers) +// OptDNS returns a new DHCPv4 Domain Name Server option. +// +// The DNS server option is described by RFC 2132, Section 3.8. +func OptDNS(servers ...net.IP) Option { + return Option{ + Code: OptionDomainNameServer, + Value: IPs(servers), + } } -// String returns a human-readable string. -func (o *OptDomainNameServer) String() string { - return fmt.Sprintf("Domain Name Servers -> %s", IPsToString(o.NameServers)) +// WithDNS modifies a packet with the DHCPv4 Domain Name Server option. +func WithDNS(servers ...net.IP) Modifier { + return WithOption(OptDNS(servers...)) } diff --git a/dhcpv4/option_ips_test.go b/dhcpv4/option_ips_test.go index 5efd5375..1e1b772b 100644 --- a/dhcpv4/option_ips_test.go +++ b/dhcpv4/option_ips_test.go @@ -7,132 +7,77 @@ import ( "github.com/stretchr/testify/require" ) -func TestOptRoutersInterfaceMethods(t *testing.T) { - routers := []net.IP{ - net.IPv4(192, 168, 0, 10), - net.IPv4(192, 168, 0, 20), - } - o := OptRouter{Routers: routers} - require.Equal(t, OptionRouter, o.Code(), "Code") - require.Equal(t, routers, o.Routers, "Routers") -} - -func TestParseOptRouter(t *testing.T) { - data := []byte{ - byte(OptionRouter), - 8, // Length - 192, 168, 0, 10, // Router #1 - 192, 168, 0, 20, // Router #2 - } - o, err := ParseOptRouter(data[2:]) - require.NoError(t, err) - routers := []net.IP{ - net.IP{192, 168, 0, 10}, - net.IP{192, 168, 0, 20}, - } - require.Equal(t, &OptRouter{Routers: routers}, o) - - // Short byte stream - data = []byte{byte(OptionRouter)} - _, err = ParseOptRouter(data) - require.Error(t, err, "should get error from short byte stream") -} - -func TestParseOptRouterNoRouters(t *testing.T) { - // RFC2132 requires that at least one Router IP is specified - data := []byte{ - byte(OptionRouter), - 0, // Length - } - _, err := ParseOptRouter(data) - require.Error(t, err) -} - -func TestOptRouterString(t *testing.T) { - o := OptRouter{Routers: []net.IP{net.IP{192, 168, 0, 1}, net.IP{192, 168, 0, 10}}} - require.Equal(t, "Routers -> 192.168.0.1, 192.168.0.10", o.String()) -} - -func TestOptDomainNameServerInterfaceMethods(t *testing.T) { - servers := []net.IP{ - net.IPv4(192, 168, 0, 10), - net.IPv4(192, 168, 0, 20), - } - o := OptDomainNameServer{NameServers: servers} - require.Equal(t, OptionDomainNameServer, o.Code(), "Code") - require.Equal(t, servers, o.NameServers, "NameServers") -} - -func TestParseOptDomainNameServer(t *testing.T) { +func TestParseIPs(t *testing.T) { + var i IPs data := []byte{ - byte(OptionDomainNameServer), - 8, // Length 192, 168, 0, 10, // DNS #1 192, 168, 0, 20, // DNS #2 } - o, err := ParseOptDomainNameServer(data[2:]) + err := i.FromBytes(data) require.NoError(t, err) servers := []net.IP{ net.IP{192, 168, 0, 10}, net.IP{192, 168, 0, 20}, } - require.Equal(t, &OptDomainNameServer{NameServers: servers}, o) + require.Equal(t, servers, []net.IP(i)) // Bad length data = []byte{1, 1, 1} - _, err = ParseOptDomainNameServer(data) + err = i.FromBytes(data) require.Error(t, err, "should get error from bad length") -} -func TestParseOptDomainNameServerNoServers(t *testing.T) { - // RFC2132 requires that at least one DNS server IP is specified - _, err := ParseOptDomainNameServer([]byte{}) + // RFC2132 requires that at least one IP is specified for each IP field. + err = i.FromBytes([]byte{}) require.Error(t, err) } -func TestOptDomainNameServerString(t *testing.T) { - o := OptDomainNameServer{NameServers: []net.IP{net.IPv4(192, 168, 0, 1), net.IPv4(192, 168, 0, 10)}} - require.Equal(t, "Domain Name Servers -> 192.168.0.1, 192.168.0.10", o.String()) +func TestOptDomainNameServer(t *testing.T) { + o := OptDNS(net.IPv4(192, 168, 0, 1), net.IPv4(192, 168, 0, 10)) + require.Equal(t, OptionDomainNameServer, o.Code) + require.Equal(t, []byte{192, 168, 0, 1, 192, 168, 0, 10}, o.Value.ToBytes()) + require.Equal(t, "Domain Name Server: 192.168.0.1, 192.168.0.10", o.String()) } -func TestOptNTPServersInterfaceMethods(t *testing.T) { - ntpServers := []net.IP{ - net.IPv4(192, 168, 0, 10), - net.IPv4(192, 168, 0, 20), +func TestGetDomainNameServer(t *testing.T) { + ips := []net.IP{ + net.IP{192, 168, 0, 1}, + net.IP{192, 168, 0, 10}, } - o := OptNTPServers{NTPServers: ntpServers} - require.Equal(t, OptionNTPServers, o.Code(), "Code") - require.Equal(t, ntpServers, o.NTPServers, "NTPServers") + o := OptionsFromList(OptDNS(ips...)) + require.Equal(t, ips, GetDNS(o)) + require.Nil(t, GetDNS(Options{})) } -func TestParseOptNTPServers(t *testing.T) { - data := []byte{ - byte(OptionNTPServers), - 8, // Length - 192, 168, 0, 10, // NTP server #1 - 192, 168, 0, 20, // NTP server #2 - } - o, err := ParseOptNTPServers(data[2:]) - require.NoError(t, err) - ntpServers := []net.IP{ +func TestOptNTPServers(t *testing.T) { + o := OptNTPServers(net.IPv4(192, 168, 0, 1), net.IPv4(192, 168, 0, 10)) + require.Equal(t, OptionNTPServers, o.Code) + require.Equal(t, []byte{192, 168, 0, 1, 192, 168, 0, 10}, o.Value.ToBytes()) + require.Equal(t, "NTP Servers: 192.168.0.1, 192.168.0.10", o.String()) +} + +func TestGetNTPServers(t *testing.T) { + ips := []net.IP{ + net.IP{192, 168, 0, 1}, net.IP{192, 168, 0, 10}, - net.IP{192, 168, 0, 20}, } - require.Equal(t, &OptNTPServers{NTPServers: ntpServers}, o) - - // Bad length - data = []byte{1, 1, 1} - _, err = ParseOptNTPServers(data) - require.Error(t, err, "should get error from bad length") + o := OptionsFromList(OptNTPServers(ips...)) + require.Equal(t, ips, GetNTPServers(o)) + require.Nil(t, GetNTPServers(Options{})) } -func TestParseOptNTPserversNoNTPServers(t *testing.T) { - // RFC2132 requires that at least one NTP server IP is specified - _, err := ParseOptNTPServers([]byte{}) - require.Error(t, err) +func TestOptRouter(t *testing.T) { + o := OptRouter(net.IPv4(192, 168, 0, 1), net.IPv4(192, 168, 0, 10)) + require.Equal(t, OptionRouter, o.Code) + require.Equal(t, []byte{192, 168, 0, 1, 192, 168, 0, 10}, o.Value.ToBytes()) + require.Equal(t, "Router: 192.168.0.1, 192.168.0.10", o.String()) } -func TestOptNTPServersString(t *testing.T) { - o := OptNTPServers{NTPServers: []net.IP{net.IPv4(192, 168, 0, 1), net.IPv4(192, 168, 0, 10)}} - require.Equal(t, "NTP Servers -> 192.168.0.1, 192.168.0.10", o.String()) +func TestGetRouter(t *testing.T) { + ips := []net.IP{ + net.IP{192, 168, 0, 1}, + net.IP{192, 168, 0, 10}, + } + o := OptionsFromList(OptRouter(ips...)) + require.Equal(t, ips, GetRouter(o)) + require.Nil(t, GetRouter(Options{})) } diff --git a/dhcpv4/option_maximum_dhcp_message_size.go b/dhcpv4/option_maximum_dhcp_message_size.go index 904f3d21..900eea57 100644 --- a/dhcpv4/option_maximum_dhcp_message_size.go +++ b/dhcpv4/option_maximum_dhcp_message_size.go @@ -6,32 +6,52 @@ import ( "github.com/u-root/u-root/pkg/uio" ) -// OptMaximumDHCPMessageSize implements the maximum DHCP message size option -// described by RFC 2132, Section 9.10. -type OptMaximumDHCPMessageSize struct { - Size uint16 +// Uint16 implements encoding and decoding functions for a uint16 as used in +// RFC 2132, Section 9.10. +type Uint16 uint16 + +// ToBytes returns a serialized stream of bytes for this option. +func (o Uint16) ToBytes() []byte { + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(o)) + return buf.Data() } -// ParseOptMaximumDHCPMessageSize constructs an OptMaximumDHCPMessageSize -// struct from a sequence of bytes and returns it, or an error. -func ParseOptMaximumDHCPMessageSize(data []byte) (*OptMaximumDHCPMessageSize, error) { +// String returns a human-readable string for this option. +func (o Uint16) String() string { + return fmt.Sprintf("%d", uint16(o)) +} + +// FromBytes decodes data into o as per RFC 2132, Section 9.10. +func (o *Uint16) FromBytes(data []byte) error { buf := uio.NewBigEndianBuffer(data) - return &OptMaximumDHCPMessageSize{Size: buf.Read16()}, buf.FinError() + *o = Uint16(buf.Read16()) + return buf.FinError() } -// Code returns the option code. -func (o *OptMaximumDHCPMessageSize) Code() OptionCode { - return OptionMaximumDHCPMessageSize +// GetUint16 parses a uint16 from code in o. +func GetUint16(code OptionCode, o Options) (uint16, error) { + v := o.Get(code) + if v == nil { + return 0, fmt.Errorf("option not present") + } + var u Uint16 + if err := u.FromBytes(v); err != nil { + return 0, err + } + return uint16(u), nil } -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptMaximumDHCPMessageSize) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - buf.Write16(o.Size) - return buf.Data() +// OptMaxMessageSize returns a new DHCP Maximum Message Size option. +// +// The Maximum DHCP Message Size option is described by RFC 2132, Section 9.10. +func OptMaxMessageSize(size uint16) Option { + return Option{Code: OptionMaximumDHCPMessageSize, Value: Uint16(size)} } -// String returns a human-readable string for this option. -func (o *OptMaximumDHCPMessageSize) String() string { - return fmt.Sprintf("Maximum DHCP Message Size -> %v", o.Size) +// GetMaxMessageSize returns the DHCP Maximum Message Size in o if present. +// +// The Maximum DHCP Message Size option is described by RFC 2132, Section 9.10. +func GetMaxMessageSize(o Options) (uint16, error) { + return GetUint16(OptionMaximumDHCPMessageSize, o) } diff --git a/dhcpv4/option_maximum_dhcp_message_size_test.go b/dhcpv4/option_maximum_dhcp_message_size_test.go index 0b36b0e6..147f2808 100644 --- a/dhcpv4/option_maximum_dhcp_message_size_test.go +++ b/dhcpv4/option_maximum_dhcp_message_size_test.go @@ -6,30 +6,26 @@ import ( "github.com/stretchr/testify/require" ) -func TestOptMaximumDHCPMessageSizeInterfaceMethods(t *testing.T) { - o := OptMaximumDHCPMessageSize{Size: 1500} - require.Equal(t, OptionMaximumDHCPMessageSize, o.Code(), "Code") - require.Equal(t, []byte{5, 220}, o.ToBytes(), "ToBytes") +func TestOptMaximumDHCPMessageSize(t *testing.T) { + o := OptMaxMessageSize(1500) + require.Equal(t, OptionMaximumDHCPMessageSize, o.Code, "Code") + require.Equal(t, []byte{5, 220}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "Maximum DHCP Message Size: 1500", o.String()) } -func TestParseOptMaximumDHCPMessageSize(t *testing.T) { - data := []byte{5, 220} - o, err := ParseOptMaximumDHCPMessageSize(data) +func TestGetMaximumDHCPMessageSize(t *testing.T) { + options := Options{OptionMaximumDHCPMessageSize.Code(): []byte{5, 220}} + o, err := GetMaxMessageSize(options) require.NoError(t, err) - require.Equal(t, &OptMaximumDHCPMessageSize{Size: 1500}, o) + require.Equal(t, uint16(1500), o) // Short byte stream - data = []byte{2} - _, err = ParseOptMaximumDHCPMessageSize(data) + options = Options{OptionMaximumDHCPMessageSize.Code(): []byte{2}} + _, err = GetMaxMessageSize(options) require.Error(t, err, "should get error from short byte stream") // Bad length - data = []byte{1, 1, 1} - _, err = ParseOptMaximumDHCPMessageSize(data) + options = Options{OptionMaximumDHCPMessageSize.Code(): []byte{1, 1, 1}} + _, err = GetMaxMessageSize(options) require.Error(t, err, "should get error from bad length") } - -func TestOptMaximumDHCPMessageSizeString(t *testing.T) { - o := OptMaximumDHCPMessageSize{Size: 1500} - require.Equal(t, "Maximum DHCP Message Size -> 1500", o.String()) -} diff --git a/dhcpv4/option_message_type.go b/dhcpv4/option_message_type.go index 2857e415..141e3b79 100644 --- a/dhcpv4/option_message_type.go +++ b/dhcpv4/option_message_type.go @@ -1,35 +1,19 @@ package dhcpv4 -import ( - "fmt" - - "github.com/u-root/u-root/pkg/uio" -) - -// OptMessageType implements the DHCP message type option described by RFC -// 2132, Section 9.6. -type OptMessageType struct { - MessageType MessageType -} - -// ParseOptMessageType constructs an OptMessageType struct from a sequence of -// bytes and returns it, or an error. -func ParseOptMessageType(data []byte) (*OptMessageType, error) { - buf := uio.NewBigEndianBuffer(data) - return &OptMessageType{MessageType: MessageType(buf.Read8())}, buf.FinError() -} - -// Code returns the option code. -func (o *OptMessageType) Code() OptionCode { - return OptionDHCPMessageType -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptMessageType) ToBytes() []byte { - return []byte{byte(o.MessageType)} +// OptMessageType returns a new DHCPv4 Message Type option. +func OptMessageType(m MessageType) Option { + return Option{Code: OptionDHCPMessageType, Value: m} } -// String returns a human-readable string for this option. -func (o *OptMessageType) String() string { - return fmt.Sprintf("DHCP Message Type -> %s", o.MessageType.String()) +// GetMessageType returns the DHCPv4 Message Type option in o. +func GetMessageType(o Options) MessageType { + v := o.Get(OptionDHCPMessageType) + if v == nil { + return MessageTypeNone + } + var m MessageType + if err := m.FromBytes(v); err != nil { + return MessageTypeNone + } + return m } diff --git a/dhcpv4/option_message_type_test.go b/dhcpv4/option_message_type_test.go index c3b49043..a97889e7 100644 --- a/dhcpv4/option_message_type_test.go +++ b/dhcpv4/option_message_type_test.go @@ -6,36 +6,32 @@ import ( "github.com/stretchr/testify/require" ) -func TestOptMessageTypeInterfaceMethods(t *testing.T) { - o := OptMessageType{MessageType: MessageTypeDiscover} - require.Equal(t, OptionDHCPMessageType, o.Code(), "Code") - require.Equal(t, []byte{1}, o.ToBytes(), "ToBytes") -} +func TestOptMessageType(t *testing.T) { + o := OptMessageType(MessageTypeDiscover) + require.Equal(t, OptionDHCPMessageType, o.Code, "Code") + require.Equal(t, []byte{1}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "DHCP Message Type: DISCOVER", o.String()) -func TestOptMessageTypeNew(t *testing.T) { - o := OptMessageType{MessageType: MessageTypeDiscover} - require.Equal(t, OptionDHCPMessageType, o.Code()) - require.Equal(t, MessageTypeDiscover, o.MessageType) + // unknown + o = OptMessageType(99) + require.Equal(t, "DHCP Message Type: unknown (99)", o.String()) } func TestParseOptMessageType(t *testing.T) { + var m MessageType data := []byte{1} // DISCOVER - o, err := ParseOptMessageType(data) + err := m.FromBytes(data) require.NoError(t, err) - require.Equal(t, &OptMessageType{MessageType: MessageTypeDiscover}, o) + require.Equal(t, MessageTypeDiscover, m) // Bad length data = []byte{1, 2} - _, err = ParseOptMessageType(data) + err = m.FromBytes(data) require.Error(t, err, "should get error from bad length") } -func TestOptMessageTypeString(t *testing.T) { - // known - o := OptMessageType{MessageType: MessageTypeDiscover} - require.Equal(t, "DHCP Message Type -> DISCOVER", o.String()) - - // unknown - o = OptMessageType{MessageType: 99} - require.Equal(t, "DHCP Message Type -> unknown (99)", o.String()) +func TestGetMessageType(t *testing.T) { + o := OptionsFromList(OptMessageType(MessageTypeDiscover)) + require.Equal(t, MessageTypeDiscover, GetMessageType(o)) + require.Equal(t, MessageTypeNone, GetMessageType(Options{})) } diff --git a/dhcpv4/option_parameter_request_list.go b/dhcpv4/option_parameter_request_list.go index 750c957d..81d5efbe 100644 --- a/dhcpv4/option_parameter_request_list.go +++ b/dhcpv4/option_parameter_request_list.go @@ -1,7 +1,7 @@ package dhcpv4 import ( - "fmt" + "sort" "strings" "github.com/u-root/u-root/pkg/uio" @@ -29,47 +29,59 @@ func (ol *OptionCodeList) Add(cs ...OptionCode) { } } +func (ol OptionCodeList) sort() { + sort.Slice(ol, func(i, j int) bool { return ol[i].Code() < ol[j].Code() }) +} + // String returns a human-readable string for the option names. func (ol OptionCodeList) String() string { var names []string + ol.sort() for _, code := range ol { names = append(names, code.String()) } return strings.Join(names, ", ") } -// OptParameterRequestList implements the parameter request list option -// described by RFC 2132, Section 9.8. -type OptParameterRequestList struct { - RequestedOpts OptionCodeList +// ToBytes returns a serialized stream of bytes for this option as defined by +// RFC 2132, Section 9.8. +func (ol OptionCodeList) ToBytes() []byte { + buf := uio.NewBigEndianBuffer(nil) + for _, req := range ol { + buf.Write8(req.Code()) + } + return buf.Data() } -// ParseOptParameterRequestList returns a new OptParameterRequestList from a -// byte stream, or error if any. -func ParseOptParameterRequestList(data []byte) (*OptParameterRequestList, error) { +// FromBytes parses a byte stream for this option as described by RFC 2132, +// Section 9.8. +func (ol *OptionCodeList) FromBytes(data []byte) error { buf := uio.NewBigEndianBuffer(data) - requestedOpts := make(OptionCodeList, 0, buf.Len()) + *ol = make(OptionCodeList, 0, buf.Len()) for buf.Has(1) { - requestedOpts = append(requestedOpts, optionCode(buf.Read8())) + *ol = append(*ol, optionCode(buf.Read8())) } - return &OptParameterRequestList{RequestedOpts: requestedOpts}, buf.Error() + return buf.FinError() } -// Code returns the option code. -func (o *OptParameterRequestList) Code() OptionCode { - return OptionParameterRequestList -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptParameterRequestList) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - for _, req := range o.RequestedOpts { - buf.Write8(req.Code()) +// GetParameterRequestList returns the DHCPv4 Parameter Request List in o. +// +// The parameter request list option is described by RFC 2132, Section 9.8. +func GetParameterRequestList(o Options) OptionCodeList { + v := o.Get(OptionParameterRequestList) + if v == nil { + return nil } - return buf.Data() + var codes OptionCodeList + if err := codes.FromBytes(v); err != nil { + return nil + } + return codes } -// String returns a human-readable string for this option. -func (o *OptParameterRequestList) String() string { - return fmt.Sprintf("Parameter Request List -> %s", o.RequestedOpts) +// OptParameterRequestList returns a new DHCPv4 Parameter Request List. +// +// The parameter request list option is described by RFC 2132, Section 9.8. +func OptParameterRequestList(codes ...OptionCode) Option { + return Option{Code: OptionParameterRequestList, Value: OptionCodeList(codes)} } diff --git a/dhcpv4/option_parameter_request_list_test.go b/dhcpv4/option_parameter_request_list_test.go index a09aaad8..7c358e22 100644 --- a/dhcpv4/option_parameter_request_list_test.go +++ b/dhcpv4/option_parameter_request_list_test.go @@ -7,24 +7,22 @@ import ( ) func TestOptParameterRequestListInterfaceMethods(t *testing.T) { - requestedOpts := []OptionCode{OptionBootfileName, OptionNameServer} - o := &OptParameterRequestList{RequestedOpts: requestedOpts} - require.Equal(t, OptionParameterRequestList, o.Code(), "Code") + opts := []OptionCode{OptionBootfileName, OptionNameServer} + o := OptParameterRequestList(opts...) + + require.Equal(t, OptionParameterRequestList, o.Code, "Code") expectedBytes := []byte{67, 5} - require.Equal(t, expectedBytes, o.ToBytes(), "ToBytes") + require.Equal(t, expectedBytes, o.Value.ToBytes(), "ToBytes") - expectedString := "Parameter Request List -> Bootfile Name, Name Server" + expectedString := "Parameter Request List: Name Server, Bootfile Name" require.Equal(t, expectedString, o.String(), "String") } func TestParseOptParameterRequestList(t *testing.T) { - var ( - o *OptParameterRequestList - err error - ) - o, err = ParseOptParameterRequestList([]byte{67, 5}) + var o OptionCodeList + err := o.FromBytes([]byte{67, 5}) require.NoError(t, err) expectedOpts := OptionCodeList{OptionBootfileName, OptionNameServer} - require.Equal(t, expectedOpts, o.RequestedOpts) + require.Equal(t, expectedOpts, o) } diff --git a/dhcpv4/option_relay_agent_information.go b/dhcpv4/option_relay_agent_information.go index 42625ca7..fb86c70d 100644 --- a/dhcpv4/option_relay_agent_information.go +++ b/dhcpv4/option_relay_agent_information.go @@ -2,37 +2,52 @@ package dhcpv4 import ( "fmt" - - "github.com/u-root/u-root/pkg/uio" ) -// OptRelayAgentInformation implements the relay agent info option described by -// RFC 3046. -type OptRelayAgentInformation struct { - Options Options +// RelayOptions is like Options, but stringifies using the Relay Agent Specific +// option space. +type RelayOptions struct { + Options } -// ParseOptRelayAgentInformation returns a new OptRelayAgentInformation from a -// byte stream, or error if any. -func ParseOptRelayAgentInformation(data []byte) (*OptRelayAgentInformation, error) { - options, err := OptionsFromBytesWithParser(data, codeGetter, ParseOptionGeneric, false /* don't check for OptionEnd tag */) - if err != nil { - return nil, err - } - return &OptRelayAgentInformation{Options: options}, nil +var relayHumanizer = OptionHumanizer{ + ValueHumanizer: func(code OptionCode, data []byte) fmt.Stringer { + return OptionGeneric{data} + }, + CodeHumanizer: func(c uint8) OptionCode { + return GenericOptionCode(c) + }, +} + +// String prints the contained options using Relay Agent-specific option code parsing. +func (r RelayOptions) String() string { + return r.Options.ToString(relayHumanizer) } -// Code returns the option code. -func (o *OptRelayAgentInformation) Code() OptionCode { - return OptionRelayAgentInformation +// FromBytes parses relay agent options from data. +func (r *RelayOptions) FromBytes(data []byte) error { + r.Options = make(Options) + return r.Options.FromBytes(data) } -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptRelayAgentInformation) ToBytes() []byte { - return uio.ToBigEndian(o.Options) +// OptRelayAgentInfo returns a new DHCP Relay Agent Info option. +// +// The relay agent info option is described by RFC 3046. +func OptRelayAgentInfo(o ...Option) Option { + return Option{Code: OptionRelayAgentInformation, Value: RelayOptions{OptionsFromList(o...)}} } -// String returns a human-readable string for this option. -func (o *OptRelayAgentInformation) String() string { - return fmt.Sprintf("Relay Agent Information -> %v", o.Options) +// GetRelayAgentInfo returns options embedded by the relay agent. +// +// The relay agent info option is described by RFC 3046. +func GetRelayAgentInfo(o Options) *RelayOptions { + v := o.Get(OptionRelayAgentInformation) + if v == nil { + return nil + } + var relayOptions RelayOptions + if err := relayOptions.FromBytes(v); err != nil { + return nil + } + return &relayOptions } diff --git a/dhcpv4/option_relay_agent_information_test.go b/dhcpv4/option_relay_agent_information_test.go index bb5fae0a..6a7b2753 100644 --- a/dhcpv4/option_relay_agent_information_test.go +++ b/dhcpv4/option_relay_agent_information_test.go @@ -6,47 +6,46 @@ import ( "github.com/stretchr/testify/require" ) -func TestParseOptRelayAgentInformation(t *testing.T) { - data := []byte{ - 1, 5, 'l', 'i', 'n', 'u', 'x', - 2, 4, 'b', 'o', 'o', 't', +func TestGetRelayAgentInformation(t *testing.T) { + o := Options{ + OptionRelayAgentInformation.Code(): []byte{ + 1, 5, 'l', 'i', 'n', 'u', 'x', + 2, 4, 'b', 'o', 'o', 't', + }, } - // short sub-option bytes - opt, err := ParseOptRelayAgentInformation([]byte{1, 0, 1}) - require.Error(t, err) + opt := GetRelayAgentInfo(o) + require.NotNil(t, opt) + require.Equal(t, len(opt.Options), 2) - // short sub-option length - opt, err = ParseOptRelayAgentInformation([]byte{1, 1}) - require.Error(t, err) + circuit := opt.Get(GenericOptionCode(1)) + remote := opt.Get(GenericOptionCode(2)) + require.Equal(t, circuit, []byte("linux")) + require.Equal(t, remote, []byte("boot")) - opt, err = ParseOptRelayAgentInformation(data) - require.NoError(t, err) - require.Equal(t, len(opt.Options), 2) - circuit := opt.Options.GetOne(optionCode(1)).(*OptionGeneric) - require.NoError(t, err) - remote := opt.Options.GetOne(optionCode(2)).(*OptionGeneric) - require.NoError(t, err) - require.Equal(t, circuit.Data, []byte("linux")) - require.Equal(t, remote.Data, []byte("boot")) -} + // Empty. + require.Nil(t, GetRelayAgentInfo(Options{})) -func TestParseOptRelayAgentInformationToBytes(t *testing.T) { - opt := OptRelayAgentInformation{ - Options: Options{ - &OptionGeneric{OptionCode: optionCode(1), Data: []byte("linux")}, - &OptionGeneric{OptionCode: optionCode(2), Data: []byte("boot")}, + // Invalid contents. + o = Options{ + OptionRelayAgentInformation.Code(): []byte{ + 1, 7, 'l', 'i', 'n', 'u', 'x', }, } - data := opt.ToBytes() - expected := []byte{ + require.Nil(t, GetRelayAgentInfo(o)) +} + +func TestOptRelayAgentInfo(t *testing.T) { + opt := OptRelayAgentInfo( + OptGeneric(GenericOptionCode(1), []byte("linux")), + OptGeneric(GenericOptionCode(2), []byte("boot")), + ) + wantBytes := []byte{ 1, 5, 'l', 'i', 'n', 'u', 'x', 2, 4, 'b', 'o', 'o', 't', } - require.Equal(t, expected, data) -} - -func TestOptRelayAgentInformationToBytesString(t *testing.T) { - o := OptRelayAgentInformation{} - require.Equal(t, "Relay Agent Information -> []", o.String()) + wantString := "Relay Agent Information:\n unknown (1): [108 105 110 117 120]\n unknown (2): [98 111 111 116]\n" + require.Equal(t, wantBytes, opt.Value.ToBytes()) + require.Equal(t, OptionRelayAgentInformation, opt.Code) + require.Equal(t, wantString, opt.String()) } diff --git a/dhcpv4/option_string.go b/dhcpv4/option_string.go index 76a2db26..9e16d6c6 100644 --- a/dhcpv4/option_string.go +++ b/dhcpv4/option_string.go @@ -1,163 +1,117 @@ package dhcpv4 -import ( - "fmt" -) - -// OptDomainName implements the domain name option described in RFC 2132, -// Section 3.17. -type OptDomainName struct { - DomainName string -} - -// ParseOptDomainName returns a new OptDomainName from a byte stream, or error -// if any. -func ParseOptDomainName(data []byte) (*OptDomainName, error) { - return &OptDomainName{DomainName: string(data)}, nil -} - -// Code returns the option code. -func (o *OptDomainName) Code() OptionCode { - return OptionDomainName -} - -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptDomainName) ToBytes() []byte { - return []byte(o.DomainName) -} - -// String returns a human-readable string. -func (o *OptDomainName) String() string { - return fmt.Sprintf("Domain Name -> %v", o.DomainName) -} - -// OptHostName implements the host name option described by RFC 2132, Section -// 3.14. -type OptHostName struct { - HostName string -} - -// ParseOptHostName returns a new OptHostName from a byte stream, or error if -// any. -func ParseOptHostName(data []byte) (*OptHostName, error) { - return &OptHostName{HostName: string(data)}, nil -} - -// Code returns the option code. -func (o *OptHostName) Code() OptionCode { - return OptionHostName -} +// String represents an option encapsulating a string in IPv4 DHCP. +// +// This representation is shared by multiple options specified by RFC 2132, +// Sections 3.14, 3.16, 3.17, 3.19, and 3.20. +type String string // ToBytes returns a serialized stream of bytes for this option. -func (o *OptHostName) ToBytes() []byte { - return []byte(o.HostName) +func (o String) ToBytes() []byte { + return []byte(o) } // String returns a human-readable string. -func (o *OptHostName) String() string { - return fmt.Sprintf("Host Name -> %v", o.HostName) -} - -// OptRootPath implements the root path option described by RFC 2132, Section -// 3.19. -type OptRootPath struct { - Path string -} - -// ParseOptRootPath constructs an OptRootPath struct from a sequence of bytes -// and returns it, or an error. -func ParseOptRootPath(data []byte) (*OptRootPath, error) { - return &OptRootPath{Path: string(data)}, nil -} - -// Code returns the option code. -func (o *OptRootPath) Code() OptionCode { - return OptionRootPath +func (o String) String() string { + return string(o) } -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptRootPath) ToBytes() []byte { - return []byte(o.Path) -} - -// String returns a human-readable string for this option. -func (o *OptRootPath) String() string { - return fmt.Sprintf("Root Path -> %v", o.Path) -} - -// OptBootfileName implements the bootfile name option described in RFC 2132, -// Section 9.5. -type OptBootfileName struct { - BootfileName string -} - -// Code returns the option code -func (op *OptBootfileName) Code() OptionCode { - return OptionBootfileName +// FromBytes parses a serialized stream of bytes into o. +func (o *String) FromBytes(data []byte) error { + *o = String(string(data)) + return nil } -// ToBytes serializes the option and returns it as a sequence of bytes -func (op *OptBootfileName) ToBytes() []byte { - return []byte(op.BootfileName) +// GetString parses an RFC 2132 string from o[code]. +func GetString(code OptionCode, o Options) string { + v := o.Get(code) + if v == nil { + return "" + } + return string(v) } -func (op *OptBootfileName) String() string { - return fmt.Sprintf("Bootfile Name -> %s", op.BootfileName) +// OptDomainName returns a new DHCPv4 Domain Name option. +// +// The Domain Name option is described by RFC 2132, Section 3.17. +func OptDomainName(name string) Option { + return Option{Code: OptionDomainName, Value: String(name)} } -// ParseOptBootfileName returns a new OptBootfile from a byte stream or error if any -func ParseOptBootfileName(data []byte) (*OptBootfileName, error) { - return &OptBootfileName{BootfileName: string(data)}, nil +// GetDomainName parses the DHCPv4 Domain Name option from o if present. +// +// The Domain Name option is described by RFC 2132, Section 3.17. +func GetDomainName(o Options) string { + return GetString(OptionDomainName, o) } -// OptTFTPServerName implements the TFTP server name option described by RFC -// 2132, Section 9.4. -type OptTFTPServerName struct { - TFTPServerName string +// OptHostName returns a new DHCPv4 Host Name option. +// +// The Host Name option is described by RFC 2132, Section 3.14. +func OptHostName(name string) Option { + return Option{Code: OptionHostName, Value: String(name)} } -// Code returns the option code -func (op *OptTFTPServerName) Code() OptionCode { - return OptionTFTPServerName +// GetHostName parses the DHCPv4 Host Name option from o if present. +// +// The Host Name option is described by RFC 2132, Section 3.14. +func GetHostName(o Options) string { + return GetString(OptionHostName, o) } -// ToBytes serializes the option and returns it as a sequence of bytes -func (op *OptTFTPServerName) ToBytes() []byte { - return []byte(op.TFTPServerName) +// OptRootPath returns a new DHCPv4 Root Path option. +// +// The Root Path option is described by RFC 2132, Section 3.19. +func OptRootPath(name string) Option { + return Option{Code: OptionRootPath, Value: String(name)} } -func (op *OptTFTPServerName) String() string { - return fmt.Sprintf("TFTP Server Name -> %s", op.TFTPServerName) +// GetRootPath parses the DHCPv4 Root Path option from o if present. +// +// The Root Path option is described by RFC 2132, Section 3.19. +func GetRootPath(o Options) string { + return GetString(OptionRootPath, o) } -// ParseOptTFTPServerName returns a new OptTFTPServerName from a byte stream or error if any -func ParseOptTFTPServerName(data []byte) (*OptTFTPServerName, error) { - return &OptTFTPServerName{TFTPServerName: string(data)}, nil +// OptBootFileName returns a new DHCPv4 Boot File Name option. +// +// The Bootfile Name option is described by RFC 2132, Section 9.5. +func OptBootFileName(name string) Option { + return Option{Code: OptionBootfileName, Value: String(name)} } -// OptClassIdentifier implements the vendor class identifier option described -// in RFC 2132, Section 9.13. -type OptClassIdentifier struct { - Identifier string +// GetBootFileName parses the DHCPv4 Bootfile Name option from o if present. +// +// The Bootfile Name option is described by RFC 2132, Section 9.5. +func GetBootFileName(o Options) string { + return GetString(OptionBootfileName, o) } -// ParseOptClassIdentifier constructs an OptClassIdentifier struct from a sequence of -// bytes and returns it, or an error. -func ParseOptClassIdentifier(data []byte) (*OptClassIdentifier, error) { - return &OptClassIdentifier{Identifier: string(data)}, nil +// OptTFTPServerName returns a new DHCPv4 TFTP Server Name option. +// +// The TFTP Server Name option is described by RFC 2132, Section 9.4. +func OptTFTPServerName(name string) Option { + return Option{Code: OptionTFTPServerName, Value: String(name)} } -// Code returns the option code. -func (o *OptClassIdentifier) Code() OptionCode { - return OptionClassIdentifier +// GetTFTPServerName parses the DHCPv4 TFTP Server Name option from o if +// present. +// +// The TFTP Server Name option is described by RFC 2132, Section 9.4. +func GetTFTPServerName(o Options) string { + return GetString(OptionTFTPServerName, o) } -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptClassIdentifier) ToBytes() []byte { - return []byte(o.Identifier) +// OptClassIdentifier returns a new DHCPv4 Class Identifier option. +// +// The Vendor Class Identifier option is described by RFC 2132, Section 9.13. +func OptClassIdentifier(name string) Option { + return Option{Code: OptionClassIdentifier, Value: String(name)} } -// String returns a human-readable string for this option. -func (o *OptClassIdentifier) String() string { - return fmt.Sprintf("Class Identifier -> %v", o.Identifier) +// GetClassIdentifier parses the DHCPv4 Class Identifier option from o if present. +// +// The Vendor Class Identifier option is described by RFC 2132, Section 9.13. +func GetClassIdentifier(o Options) string { + return GetString(OptionClassIdentifier, o) } diff --git a/dhcpv4/option_string_test.go b/dhcpv4/option_string_test.go index 0704f317..bda6009f 100644 --- a/dhcpv4/option_string_test.go +++ b/dhcpv4/option_string_test.go @@ -7,96 +7,83 @@ import ( ) func TestOptDomainName(t *testing.T) { - o := OptDomainName{DomainName: "foo"} - require.Equal(t, OptionDomainName, o.Code(), "Code") - require.Equal(t, []byte{'f', 'o', 'o'}, o.ToBytes(), "ToBytes") - require.Equal(t, "Domain Name -> foo", o.String()) + o := OptDomainName("foo") + require.Equal(t, OptionDomainName, o.Code, "Code") + require.Equal(t, []byte{'f', 'o', 'o'}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "Domain Name: foo", o.String()) } func TestParseOptDomainName(t *testing.T) { - data := []byte{'t', 'e', 's', 't'} - o, err := ParseOptDomainName(data) - require.NoError(t, err) - require.Equal(t, &OptDomainName{DomainName: "test"}, o) + o := Options{ + OptionDomainName.Code(): []byte{'t', 'e', 's', 't'}, + } + require.Equal(t, "test", GetDomainName(o)) + require.Equal(t, "", GetDomainName(Options{})) } func TestOptHostName(t *testing.T) { - o := OptHostName{HostName: "foo"} - require.Equal(t, OptionHostName, o.Code(), "Code") - require.Equal(t, []byte{'f', 'o', 'o'}, o.ToBytes(), "ToBytes") - require.Equal(t, "Host Name -> foo", o.String()) + o := OptHostName("foo") + require.Equal(t, OptionHostName, o.Code, "Code") + require.Equal(t, []byte{'f', 'o', 'o'}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "Host Name: foo", o.String()) } func TestParseOptHostName(t *testing.T) { - data := []byte{'t', 'e', 's', 't'} - o, err := ParseOptHostName(data) - require.NoError(t, err) - require.Equal(t, &OptHostName{HostName: "test"}, o) + o := Options{ + OptionHostName.Code(): []byte{'t', 'e', 's', 't'}, + } + require.Equal(t, "test", GetHostName(o)) + require.Equal(t, "", GetHostName(Options{})) } func TestOptRootPath(t *testing.T) { - o := OptRootPath{Path: "/foo/bar/baz"} - require.Equal(t, OptionRootPath, o.Code(), "Code") - wantBytes := []byte{ - '/', 'f', 'o', 'o', '/', 'b', 'a', 'r', '/', 'b', 'a', 'z', - } - require.Equal(t, wantBytes, o.ToBytes(), "ToBytes") - require.Equal(t, "Root Path -> /foo/bar/baz", o.String()) + o := OptRootPath("foo") + require.Equal(t, OptionRootPath, o.Code, "Code") + require.Equal(t, []byte{'f', 'o', 'o'}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "Root Path: foo", o.String()) } func TestParseOptRootPath(t *testing.T) { - data := []byte{byte(OptionRootPath), 4, '/', 'f', 'o', 'o'} - o, err := ParseOptRootPath(data[2:]) - require.NoError(t, err) - require.Equal(t, &OptRootPath{Path: "/foo"}, o) + o := OptionsFromList(OptRootPath("test")) + require.Equal(t, "test", GetRootPath(o)) + require.Equal(t, "", GetRootPath(Options{})) } -func TestOptBootfileName(t *testing.T) { - opt := OptBootfileName{ - BootfileName: "linuxboot", - } - require.Equal(t, OptionBootfileName, opt.Code()) - require.Equal(t, []byte{'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't'}, opt.ToBytes()) - require.Equal(t, "Bootfile Name -> linuxboot", opt.String()) +func TestOptBootFileName(t *testing.T) { + o := OptBootFileName("foo") + require.Equal(t, OptionBootfileName, o.Code, "Code") + require.Equal(t, []byte{'f', 'o', 'o'}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "Bootfile Name: foo", o.String()) } -func TestParseOptBootfileName(t *testing.T) { - expected := []byte{ - 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', - } - opt, err := ParseOptBootfileName(expected) - require.NoError(t, err) - require.Equal(t, "linuxboot", opt.BootfileName) +func TestParseOptBootFileName(t *testing.T) { + o := OptionsFromList(OptBootFileName("test")) + require.Equal(t, "test", GetBootFileName(o)) + require.Equal(t, "", GetBootFileName(Options{})) } -func TestOptTFTPServer(t *testing.T) { - opt := OptTFTPServerName{ - TFTPServerName: "linuxboot", - } - require.Equal(t, OptionTFTPServerName, opt.Code()) - require.Equal(t, []byte("linuxboot"), opt.ToBytes()) - require.Equal(t, "TFTP Server Name -> linuxboot", opt.String()) +func TestOptTFTPServerName(t *testing.T) { + o := OptTFTPServerName("foo") + require.Equal(t, OptionTFTPServerName, o.Code, "Code") + require.Equal(t, []byte{'f', 'o', 'o'}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "TFTP Server Name: foo", o.String()) } func TestParseOptTFTPServerName(t *testing.T) { - expected := []byte{ - 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', - } - opt, err := ParseOptTFTPServerName(expected) - require.NoError(t, err) - require.Equal(t, "linuxboot", string(opt.TFTPServerName)) + o := OptionsFromList(OptTFTPServerName("test")) + require.Equal(t, "test", GetTFTPServerName(o)) + require.Equal(t, "", GetTFTPServerName(Options{})) } func TestOptClassIdentifier(t *testing.T) { - o := OptClassIdentifier{Identifier: "foo"} - require.Equal(t, OptionClassIdentifier, o.Code(), "Code") - require.Equal(t, []byte("foo"), o.ToBytes(), "ToBytes") - require.Equal(t, "Class Identifier -> foo", o.String()) + o := OptClassIdentifier("foo") + require.Equal(t, OptionClassIdentifier, o.Code, "Code") + require.Equal(t, []byte{'f', 'o', 'o'}, o.Value.ToBytes(), "ToBytes") + require.Equal(t, "Class Identifier: foo", o.String()) } func TestParseOptClassIdentifier(t *testing.T) { - data := []byte("test") - o, err := ParseOptClassIdentifier(data) - require.NoError(t, err) - require.Equal(t, &OptClassIdentifier{Identifier: "test"}, o) + o := OptionsFromList(OptClassIdentifier("test")) + require.Equal(t, "test", GetClassIdentifier(o)) + require.Equal(t, "", GetClassIdentifier(Options{})) } diff --git a/dhcpv4/option_subnet_mask.go b/dhcpv4/option_subnet_mask.go index 19401d82..82b344b6 100644 --- a/dhcpv4/option_subnet_mask.go +++ b/dhcpv4/option_subnet_mask.go @@ -1,36 +1,55 @@ package dhcpv4 import ( - "fmt" "net" "github.com/u-root/u-root/pkg/uio" ) -// OptSubnetMask implements the subnet mask option described by RFC 2132, -// Section 3.3. -type OptSubnetMask struct { - SubnetMask net.IPMask +// IPMask represents an option encapsulating the subnet mask. +// +// This option implements the subnet mask option in RFC 2132, Section 3.3. +type IPMask net.IPMask + +// ToBytes returns a serialized stream of bytes for this option. +func (im IPMask) ToBytes() []byte { + if len(im) > net.IPv4len { + return im[:net.IPv4len] + } + return im } -// ParseOptSubnetMask returns a new OptSubnetMask from a byte -// stream, or error if any. -func ParseOptSubnetMask(data []byte) (*OptSubnetMask, error) { - buf := uio.NewBigEndianBuffer(data) - return &OptSubnetMask{SubnetMask: net.IPMask(buf.CopyN(net.IPv4len))}, buf.FinError() +// String returns a human-readable string. +func (im IPMask) String() string { + return net.IPMask(im).String() } -// Code returns the option code. -func (o *OptSubnetMask) Code() OptionCode { - return OptionSubnetMask +// FromBytes parses im from data per RFC 2132. +func (im *IPMask) FromBytes(data []byte) error { + buf := uio.NewBigEndianBuffer(data) + *im = IPMask(buf.CopyN(net.IPv4len)) + return buf.FinError() } -// ToBytes returns a serialized stream of bytes for this option. -func (o *OptSubnetMask) ToBytes() []byte { - return o.SubnetMask[:net.IPv4len] +// GetSubnetMask returns a subnet mask option contained in o, if there is one. +// +// The subnet mask option is described by RFC 2132, Section 3.3. +func GetSubnetMask(o Options) net.IPMask { + v := o.Get(OptionSubnetMask) + if v == nil { + return nil + } + var im IPMask + if err := im.FromBytes(v); err != nil { + return nil + } + return net.IPMask(im) } -// String returns a human-readable string. -func (o *OptSubnetMask) String() string { - return fmt.Sprintf("Subnet Mask -> %v", o.SubnetMask.String()) +// OptSubnetMask returns a new DHCPv4 SubnetMask option per RFC 2132, Section 3.3. +func OptSubnetMask(mask net.IPMask) Option { + return Option{ + Code: OptionSubnetMask, + Value: IPMask(mask), + } } diff --git a/dhcpv4/option_subnet_mask_test.go b/dhcpv4/option_subnet_mask_test.go index f04a4813..bc82cf1e 100644 --- a/dhcpv4/option_subnet_mask_test.go +++ b/dhcpv4/option_subnet_mask_test.go @@ -7,30 +7,23 @@ import ( "github.com/stretchr/testify/require" ) -func TestOptSubnetMaskInterfaceMethods(t *testing.T) { - mask := net.IPMask{255, 255, 255, 0} - o := OptSubnetMask{SubnetMask: mask} - - require.Equal(t, OptionSubnetMask, o.Code(), "Code") - - expectedBytes := []byte{255, 255, 255, 0} - require.Equal(t, expectedBytes, o.ToBytes(), "ToBytes") - - require.Equal(t, "Subnet Mask -> ffffff00", o.String(), "String") +func TestOptSubnetMask(t *testing.T) { + o := OptSubnetMask(net.IPMask{255, 255, 255, 0}) + require.Equal(t, o.Code, OptionSubnetMask, "Code") + require.Equal(t, "Subnet Mask: ffffff00", o.String(), "String") + require.Equal(t, []byte{255, 255, 255, 0}, o.Value.ToBytes(), "ToBytes") } -func TestParseOptSubnetMask(t *testing.T) { - var ( - o *OptSubnetMask - err error - ) - o, err = ParseOptSubnetMask([]byte{}) - require.Error(t, err, "empty byte stream") +func TestGetSubnetMask(t *testing.T) { + o := OptionsFromList(OptSubnetMask(net.IPMask{})) + mask := GetSubnetMask(o) + require.Nil(t, mask, "empty byte stream") - o, err = ParseOptSubnetMask([]byte{255}) - require.Error(t, err, "short byte stream") + o = OptionsFromList(OptSubnetMask(net.IPMask{255})) + mask = GetSubnetMask(o) + require.Nil(t, mask, "short byte stream") - o, err = ParseOptSubnetMask([]byte{255, 255, 255, 0}) - require.NoError(t, err) - require.Equal(t, net.IPMask{255, 255, 255, 0}, o.SubnetMask) + o = OptionsFromList(OptSubnetMask(net.IPMask{255, 255, 255, 0})) + mask = GetSubnetMask(o) + require.Equal(t, net.IPMask{255, 255, 255, 0}, mask) } diff --git a/dhcpv4/option_userclass.go b/dhcpv4/option_userclass.go index 110cb377..f273a846 100644 --- a/dhcpv4/option_userclass.go +++ b/dhcpv4/option_userclass.go @@ -8,21 +8,53 @@ import ( "github.com/u-root/u-root/pkg/uio" ) -// OptUserClass implements the user class option described by RFC 3004. -type OptUserClass struct { +// UserClass implements the user class option described by RFC 3004. +type UserClass struct { UserClasses [][]byte - Rfc3004 bool + RFC3004 bool } -// Code returns the option code -func (op *OptUserClass) Code() OptionCode { - return OptionUserClassInformation +// GetUserClass returns the user class in o if present. +// +// The user class information option is defined by RFC 3004. +func GetUserClass(o Options) *UserClass { + v := o.Get(OptionUserClassInformation) + if v == nil { + return nil + } + var uc UserClass + if err := uc.FromBytes(v); err != nil { + return nil + } + return &uc +} + +// OptUserClass returns a new user class option. +func OptUserClass(v []byte) Option { + return Option{ + Code: OptionUserClassInformation, + Value: &UserClass{ + UserClasses: [][]byte{v}, + RFC3004: false, + }, + } +} + +// OptRFC3004UserClass returns a new user class option according to RFC 3004. +func OptRFC3004UserClass(v [][]byte) Option { + return Option{ + Code: OptionUserClassInformation, + Value: &UserClass{ + UserClasses: v, + RFC3004: true, + }, + } } // ToBytes serializes the option and returns it as a sequence of bytes -func (op *OptUserClass) ToBytes() []byte { +func (op *UserClass) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - if !op.Rfc3004 { + if !op.RFC3004 { buf.WriteBytes(op.UserClasses[0]) } else { for _, uc := range op.UserClasses { @@ -33,22 +65,21 @@ func (op *OptUserClass) ToBytes() []byte { return buf.Data() } -func (op *OptUserClass) String() string { +// String returns a human-readable user class. +func (op *UserClass) String() string { ucStrings := make([]string, 0, len(op.UserClasses)) - if !op.Rfc3004 { + if !op.RFC3004 { ucStrings = append(ucStrings, string(op.UserClasses[0])) } else { for _, uc := range op.UserClasses { ucStrings = append(ucStrings, string(uc)) } } - return fmt.Sprintf("User Class Information -> %v", strings.Join(ucStrings, ", ")) + return strings.Join(ucStrings, ", ") } -// ParseOptUserClass returns a new OptUserClass from a byte stream or -// error if any -func ParseOptUserClass(data []byte) (*OptUserClass, error) { - opt := OptUserClass{} +// FromBytes parses data into op. +func (op *UserClass) FromBytes(data []byte) error { buf := uio.NewBigEndianBuffer(data) // Check if option is Microsoft style instead of RFC compliant, issue #113 @@ -64,19 +95,19 @@ func ParseOptUserClass(data []byte) (*OptUserClass, error) { counting += int(data[counting]) + 1 } if counting != buf.Len() { - opt.UserClasses = append(opt.UserClasses, data) - return &opt, nil + op.UserClasses = append(op.UserClasses, data) + return nil } - opt.Rfc3004 = true + op.RFC3004 = true for buf.Has(1) { ucLen := buf.Read8() if ucLen == 0 { - return nil, fmt.Errorf("DHCP user class must have length greater than 0") + return fmt.Errorf("DHCP user class must have length greater than 0") } - opt.UserClasses = append(opt.UserClasses, buf.CopyN(int(ucLen))) + op.UserClasses = append(op.UserClasses, buf.CopyN(int(ucLen))) } - if len(opt.UserClasses) == 0 { - return nil, errors.New("ParseOptUserClass: at least one user class is required") + if len(op.UserClasses) == 0 { + return errors.New("ParseOptUserClass: at least one user class is required") } - return &opt, buf.FinError() + return buf.FinError() } diff --git a/dhcpv4/option_userclass_test.go b/dhcpv4/option_userclass_test.go index e321a64c..149fb923 100644 --- a/dhcpv4/option_userclass_test.go +++ b/dhcpv4/option_userclass_test.go @@ -7,11 +7,8 @@ import ( ) func TestOptUserClassToBytes(t *testing.T) { - opt := OptUserClass{ - UserClasses: [][]byte{[]byte("linuxboot")}, - Rfc3004: true, - } - data := opt.ToBytes() + opt := OptRFC3004UserClass([][]byte{[]byte("linuxboot")}) + data := opt.Value.ToBytes() expected := []byte{ 9, 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', } @@ -19,10 +16,8 @@ func TestOptUserClassToBytes(t *testing.T) { } func TestOptUserClassMicrosoftToBytes(t *testing.T) { - opt := OptUserClass{ - UserClasses: [][]byte{[]byte("linuxboot")}, - } - data := opt.ToBytes() + opt := OptUserClass([]byte("linuxboot")) + data := opt.Value.ToBytes() expected := []byte{ 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', } @@ -30,11 +25,12 @@ func TestOptUserClassMicrosoftToBytes(t *testing.T) { } func TestParseOptUserClassMultiple(t *testing.T) { + var opt UserClass expected := []byte{ 9, 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', 4, 't', 'e', 's', 't', } - opt, err := ParseOptUserClass(expected) + err := opt.FromBytes(expected) require.NoError(t, err) require.Equal(t, len(opt.UserClasses), 2) require.Equal(t, []byte("linuxboot"), opt.UserClasses[0]) @@ -42,50 +38,53 @@ func TestParseOptUserClassMultiple(t *testing.T) { } func TestParseOptUserClassNone(t *testing.T) { + var opt UserClass expected := []byte{} - _, err := ParseOptUserClass(expected) + err := opt.FromBytes(expected) require.Error(t, err) } func TestParseOptUserClassMicrosoft(t *testing.T) { + var opt UserClass expected := []byte{ 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', } - opt, err := ParseOptUserClass(expected) + err := opt.FromBytes(expected) require.NoError(t, err) require.Equal(t, 1, len(opt.UserClasses)) require.Equal(t, []byte("linuxboot"), opt.UserClasses[0]) } func TestParseOptUserClassMicrosoftShort(t *testing.T) { + var opt UserClass expected := []byte{ 'l', } - opt, err := ParseOptUserClass(expected) + err := opt.FromBytes(expected) require.NoError(t, err) require.Equal(t, 1, len(opt.UserClasses)) require.Equal(t, []byte("l"), opt.UserClasses[0]) } func TestParseOptUserClass(t *testing.T) { + var opt UserClass expected := []byte{ 9, 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', } - opt, err := ParseOptUserClass(expected) + err := opt.FromBytes(expected) require.NoError(t, err) require.Equal(t, 1, len(opt.UserClasses)) require.Equal(t, []byte("linuxboot"), opt.UserClasses[0]) } func TestOptUserClassToBytesMultiple(t *testing.T) { - opt := OptUserClass{ - UserClasses: [][]byte{ + opt := OptRFC3004UserClass( + [][]byte{ []byte("linuxboot"), []byte("test"), }, - Rfc3004: true, - } - data := opt.ToBytes() + ) + data := opt.Value.ToBytes() expected := []byte{ 9, 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', 4, 't', 'e', 's', 't', @@ -94,14 +93,7 @@ func TestOptUserClassToBytesMultiple(t *testing.T) { } func TestParseOptUserClassZeroLength(t *testing.T) { - expected := []byte{ - 0, 0, - } - _, err := ParseOptUserClass(expected) + var opt UserClass + err := opt.FromBytes([]byte{0, 0}) require.Error(t, err) } - -func TestOptUserClassCode(t *testing.T) { - opt := OptUserClass{} - require.Equal(t, OptionUserClassInformation, opt.Code()) -} diff --git a/dhcpv4/option_vivc.go b/dhcpv4/option_vivc.go index b6efab9f..509ba808 100644 --- a/dhcpv4/option_vivc.go +++ b/dhcpv4/option_vivc.go @@ -10,39 +10,53 @@ import ( // VIVCIdentifier implements the vendor-identifying vendor class option // described by RFC 3925. type VIVCIdentifier struct { + // EntID is the enterprise ID. EntID uint32 Data []byte } -// OptVIVC represents the DHCP message type option. -type OptVIVC struct { - Identifiers []VIVCIdentifier +// OptVIVC returns a new vendor-identifying vendor class option. +// +// The option is described by RFC 3925. +func OptVIVC(identifiers ...VIVCIdentifier) Option { + return Option{ + Code: OptionVendorIdentifyingVendorClass, + Value: VIVCIdentifiers(identifiers), + } } -// ParseOptVIVC contructs an OptVIVC tsruct from a sequence of bytes and returns -// it, or an error. -func ParseOptVIVC(data []byte) (*OptVIVC, error) { - buf := uio.NewBigEndianBuffer(data) +// GetVIVC returns the vendor-identifying vendor class option in o if present. +func GetVIVC(o Options) VIVCIdentifiers { + v := o.Get(OptionVendorIdentifyingVendorClass) + if v == nil { + return nil + } + var ids VIVCIdentifiers + if err := ids.FromBytes(v); err != nil { + return nil + } + return ids +} + +// VIVCIdentifiers implements encoding and decoding methods for a DHCP option +// described in RFC 3925. +type VIVCIdentifiers []VIVCIdentifier - var ids []VIVCIdentifier +// FromBytes parses data into ids per RFC 3925. +func (ids *VIVCIdentifiers) FromBytes(data []byte) error { + buf := uio.NewBigEndianBuffer(data) for buf.Has(5) { entID := buf.Read32() idLen := int(buf.Read8()) - ids = append(ids, VIVCIdentifier{EntID: entID, Data: buf.CopyN(idLen)}) + *ids = append(*ids, VIVCIdentifier{EntID: entID, Data: buf.CopyN(idLen)}) } - - return &OptVIVC{Identifiers: ids}, buf.FinError() -} - -// Code returns the option code. -func (o *OptVIVC) Code() OptionCode { - return OptionVendorIdentifyingVendorClass + return buf.FinError() } // ToBytes returns a serialized stream of bytes for this option. -func (o *OptVIVC) ToBytes() []byte { +func (ids VIVCIdentifiers) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - for _, id := range o.Identifiers { + for _, id := range ids { buf.Write32(id.EntID) buf.Write8(uint8(len(id.Data))) buf.WriteBytes(id.Data) @@ -51,13 +65,13 @@ func (o *OptVIVC) ToBytes() []byte { } // String returns a human-readable string for this option. -func (o *OptVIVC) String() string { +func (ids VIVCIdentifiers) String() string { + if len(ids) == 0 { + return "" + } buf := bytes.Buffer{} - fmt.Fprintf(&buf, "Vendor-Identifying Vendor Class ->") - - for _, id := range o.Identifiers { + for _, id := range ids { fmt.Fprintf(&buf, " %d:'%s',", id.EntID, id.Data) } - - return buf.String()[:buf.Len()-1] + return buf.String()[1 : buf.Len()-1] } diff --git a/dhcpv4/option_vivc_test.go b/dhcpv4/option_vivc_test.go index 9b3b704e..b1ec398e 100644 --- a/dhcpv4/option_vivc_test.go +++ b/dhcpv4/option_vivc_test.go @@ -7,11 +7,9 @@ import ( ) var ( - sampleVIVCOpt = OptVIVC{ - Identifiers: []VIVCIdentifier{ - {EntID: 9, Data: []byte("CiscoIdentifier")}, - {EntID: 18, Data: []byte("WellfleetIdentifier")}, - }, + sampleVIVCOpt = VIVCIdentifiers{ + VIVCIdentifier{EntID: 9, Data: []byte("CiscoIdentifier")}, + VIVCIdentifier{EntID: 18, Data: []byte("WellfleetIdentifier")}, } sampleVIVCOptRaw = []byte{ 0x0, 0x0, 0x0, 0x9, // enterprise id 9 @@ -24,30 +22,31 @@ var ( ) func TestOptVIVCInterfaceMethods(t *testing.T) { - require.Equal(t, OptionVendorIdentifyingVendorClass, sampleVIVCOpt.Code(), "Code") - require.Equal(t, sampleVIVCOptRaw, sampleVIVCOpt.ToBytes(), "ToBytes") + opt := OptVIVC(sampleVIVCOpt...) + require.Equal(t, OptionVendorIdentifyingVendorClass, opt.Code, "Code") + require.Equal(t, sampleVIVCOptRaw, opt.Value.ToBytes(), "ToBytes") + require.Equal(t, "Vendor-Identifying Vendor Class: 9:'CiscoIdentifier', 18:'WellfleetIdentifier'", + opt.String()) } func TestParseOptVICO(t *testing.T) { - o, err := ParseOptVIVC(sampleVIVCOptRaw) - require.NoError(t, err) - require.Equal(t, &sampleVIVCOpt, o) + options := Options{OptionVendorIdentifyingVendorClass.Code(): sampleVIVCOptRaw} + o := GetVIVC(options) + require.Equal(t, sampleVIVCOpt, o) // Identifier len too long data := make([]byte, len(sampleVIVCOptRaw)) copy(data, sampleVIVCOptRaw) data[4] = 40 - _, err = ParseOptVIVC(data) - require.Error(t, err, "should get error from bad length") + options = Options{OptionVendorIdentifyingVendorClass.Code(): data} + o = GetVIVC(options) + require.Nil(t, o, "should get error from bad length") // Longer than length data[4] = 5 - o, err = ParseOptVIVC(data[:10]) - require.NoError(t, err) - require.Equal(t, o.Identifiers[0].Data, []byte("Cisco")) -} + options = Options{OptionVendorIdentifyingVendorClass.Code(): data[:10]} + o = GetVIVC(options) + require.Equal(t, o[0].Data, []byte("Cisco")) -func TestOptVIVCString(t *testing.T) { - require.Equal(t, "Vendor-Identifying Vendor Class -> 9:'CiscoIdentifier', 18:'WellfleetIdentifier'", - sampleVIVCOpt.String()) + require.Equal(t, VIVCIdentifiers(nil), GetVIVC(Options{})) } diff --git a/dhcpv4/options.go b/dhcpv4/options.go index 3d774d18..4c70743a 100644 --- a/dhcpv4/options.go +++ b/dhcpv4/options.go @@ -5,7 +5,11 @@ import ( "fmt" "io" "math" + "sort" + "strings" + "github.com/insomniacslk/dhcp/iana" + "github.com/insomniacslk/dhcp/rfc1035label" "github.com/u-root/u-root/pkg/uio" ) @@ -24,149 +28,95 @@ var ( ErrInvalidOptions = errors.New("invalid options data") ) -// Option is an interface that all DHCP v4 options adhere to. -type Option interface { - Code() OptionCode +// OptionValue is an interface that all DHCP v4 options adhere to. +type OptionValue interface { ToBytes() []byte String() string } -// ParseOption parses a sequence of bytes as a single DHCPv4 option, returning -// the specific option structure or error, if any. -func ParseOption(code OptionCode, data []byte) (Option, error) { - var ( - opt Option - err error - ) - switch code { - case OptionSubnetMask: - opt, err = ParseOptSubnetMask(data) - case OptionRouter: - opt, err = ParseOptRouter(data) - case OptionDomainNameServer: - opt, err = ParseOptDomainNameServer(data) - case OptionHostName: - opt, err = ParseOptHostName(data) - case OptionDomainName: - opt, err = ParseOptDomainName(data) - case OptionRootPath: - opt, err = ParseOptRootPath(data) - case OptionBroadcastAddress: - opt, err = ParseOptBroadcastAddress(data) - case OptionNTPServers: - opt, err = ParseOptNTPServers(data) - case OptionRequestedIPAddress: - opt, err = ParseOptRequestedIPAddress(data) - case OptionIPAddressLeaseTime: - opt, err = ParseOptIPAddressLeaseTime(data) - case OptionDHCPMessageType: - opt, err = ParseOptMessageType(data) - case OptionServerIdentifier: - opt, err = ParseOptServerIdentifier(data) - case OptionParameterRequestList: - opt, err = ParseOptParameterRequestList(data) - case OptionMaximumDHCPMessageSize: - opt, err = ParseOptMaximumDHCPMessageSize(data) - case OptionClassIdentifier: - opt, err = ParseOptClassIdentifier(data) - case OptionTFTPServerName: - opt, err = ParseOptTFTPServerName(data) - case OptionBootfileName: - opt, err = ParseOptBootfileName(data) - case OptionUserClassInformation: - opt, err = ParseOptUserClass(data) - case OptionRelayAgentInformation: - opt, err = ParseOptRelayAgentInformation(data) - case OptionClientSystemArchitectureType: - opt, err = ParseOptClientArchType(data) - case OptionDNSDomainSearchList: - opt, err = ParseOptDomainSearch(data) - case OptionVendorIdentifyingVendorClass: - opt, err = ParseOptVIVC(data) - default: - opt, err = ParseOptionGeneric(code, data) - } - if err != nil { - return nil, err +// Option is a DHCPv4 option and consists of a 1-byte option code and a value +// stream of bytes. +// +// The value is to be interpreted based on the option code. +type Option struct { + Code OptionCode + Value OptionValue +} + +// String returns a human-readable version of this option. +func (o Option) String() string { + v := o.Value.String() + if strings.Contains(v, "\n") { + return fmt.Sprintf("%s:\n%s", o.Code, v) } - return opt, nil + return fmt.Sprintf("%s: %s", o.Code, v) } // Options is a collection of options. -type Options []Option +type Options map[uint8][]byte -// GetOne will attempt to get an option that match a Option code. If there -// are multiple options with the same OptionCode it will only return the first -// one found. If no matching option is found nil will be returned. -func (o Options) GetOne(code OptionCode) Option { +// OptionsFromList adds all given options to an options map. +func OptionsFromList(o ...Option) Options { + opts := make(Options) for _, opt := range o { - if opt.Code() == code { - return opt - } + opts.Update(opt) } - return nil + return opts } -// Has checks whether o has the given `opcode` Option. -func (o Options) Has(code OptionCode) bool { - return o.GetOne(code) != nil +// Get will attempt to get all options that match a DHCPv4 option +// from its OptionCode. If the option was not found it will return an +// empty list. +// +// According to RFC 3396, options that are specified more than once are +// concatenated, and hence this should always just return one option. This +// currently returns a list to be API compatible. +func (o Options) Get(code OptionCode) []byte { + return o[code.Code()] } -// Update replaces an existing option with the same option code with the given -// one, adding it if not already present. -// -// Per RFC 2131, Section 4.1, "options may appear only once." -// -// An End option is ignored. -func (o *Options) Update(option Option) { - if option.Code() == OptionEnd { - return - } +// Has checks whether o has the given opcode. +func (o Options) Has(opcode OptionCode) bool { + _, ok := o[opcode.Code()] + return ok +} - for idx, opt := range *o { - if opt.Code() == option.Code() { - (*o)[idx] = option - // Don't look further. - return - } - } - // If not found, add it. - *o = append(*o, option) +// Update updates the existing options with the passed option, adding it +// at the end if not present already +func (o Options) Update(option Option) { + o[option.Code.Code()] = option.Value.ToBytes() +} + +// ToBytes makes Options usable as an OptionValue as well. +// +// Used in the case of vendor-specific and relay agent options. +func (o Options) ToBytes() []byte { + return uio.ToBigEndian(o) } -// OptionsFromBytes parses a sequence of bytes until the end and builds a list -// of options from it. +// FromBytes parses a sequence of bytes until the end and builds a list of +// options from it. // // The sequence should not contain the DHCP magic cookie. // // Returns an error if any invalid option or length is found. -func OptionsFromBytes(data []byte) (Options, error) { - return OptionsFromBytesWithParser(data, codeGetter, ParseOption, true) +func (o Options) FromBytes(data []byte) error { + return o.fromBytesCheckEnd(data, false) } -// OptionParser is a function signature for option parsing. -type OptionParser func(code OptionCode, data []byte) (Option, error) - -// OptionCodeGetter parses a code into an OptionCode. -type OptionCodeGetter func(code uint8) OptionCode - -// codeGetter is an OptionCodeGetter for DHCP optionCodes. -func codeGetter(c uint8) OptionCode { - return optionCode(c) -} +const ( + optPad = 0 + optEnd = 255 +) -// OptionsFromBytesWithParser parses Options from byte sequences using the +// FromBytesCheckEnd parses Options from byte sequences using the // parsing function that is passed in as a paremeter -func OptionsFromBytesWithParser(data []byte, coder OptionCodeGetter, parser OptionParser, checkEndOption bool) (Options, error) { +func (o Options) fromBytesCheckEnd(data []byte, checkEndOption bool) error { if len(data) == 0 { - return nil, nil + return nil } buf := uio.NewBigEndianBuffer(data) - options := make(map[OptionCode][]byte, 10) - var order []OptionCode - // Due to RFC 2131, 3396 allowing an option to be specified multiple - // times, we have to collect all option data first, and then parse it. var end bool for buf.Len() >= 1 { // 1 byte: option code @@ -174,9 +124,9 @@ func OptionsFromBytesWithParser(data []byte, coder OptionCodeGetter, parser Opti // n bytes: data code := buf.Read8() - if code == OptionPad.Code() { + if code == optPad { continue - } else if code == OptionEnd.Code() { + } else if code == optEnd { end = true break } @@ -185,16 +135,10 @@ func OptionsFromBytesWithParser(data []byte, coder OptionCodeGetter, parser Opti // N bytes: option data data := buf.Consume(length) if data == nil { - return nil, fmt.Errorf("error collecting options: %v", buf.Error()) + return fmt.Errorf("error collecting options: %v", buf.Error()) } data = data[:length:length] - // Get the OptionCode for this guy. - c := coder(code) - if _, ok := options[c]; !ok { - order = append(order, c) - } - // RFC 2131, Section 4.1 "Options may appear only once, [...]. // The client concatenates the values of multiple instances of // the same option into a single parameter list for @@ -202,56 +146,54 @@ func OptionsFromBytesWithParser(data []byte, coder OptionCodeGetter, parser Opti // // See also RFC 3396 for concatenation order and options longer // than 255 bytes. - options[c] = append(options[c], data...) + o[code] = append(o[code], data...) } // If we never read the End option, the sender of this packet screwed // up. if !end && checkEndOption { - return nil, io.ErrUnexpectedEOF + return io.ErrUnexpectedEOF } // Any bytes left must be padding. for buf.Len() >= 1 { - if buf.Read8() != OptionPad.Code() { - return nil, ErrInvalidOptions + if buf.Read8() != optPad { + return ErrInvalidOptions } } + return nil +} - opts := make(Options, 0, len(options)) - for _, code := range order { - parsedOpt, err := parser(code, options[code]) - if err != nil { - return nil, fmt.Errorf("error parsing option code %s: %v", code, err) - } - opts = append(opts, parsedOpt) +// sortedKeys returns an ordered slice of option keys from the Options map, for +// use in serializing options to binary. +func (o Options) sortedKeys() []int { + // Send all values for a given key + var codes []int + for k := range o { + codes = append(codes, int(k)) } - return opts, nil + + sort.Sort(sort.IntSlice(codes)) + return codes } // Marshal writes options binary representations to b. func (o Options) Marshal(b *uio.Lexer) { - for _, opt := range o { - code := opt.Code().Code() - + for _, c := range o.sortedKeys() { + code := uint8(c) // Even if the End option is in there, don't marshal it until // the end. - if code == OptionEnd.Code() { - continue - } else if code == OptionPad.Code() { - // Some DHCPv4 options have fixed length and do not put - // length on the wire. - b.Write8(code) + if code == optEnd { continue } - data := opt.ToBytes() + data := o[code] // RFC 3396: If more than 256 bytes of data are given, the // option is simply listed multiple times. for len(data) > 0 { // 1 byte: option code - b.Write8(code) + b.Write8(uint8(code)) n := len(data) if n > math.MaxUint8 { @@ -267,3 +209,137 @@ func (o Options) Marshal(b *uio.Lexer) { } } } + +// String prints options using DHCP-specified option codes. +func (o Options) String() string { + return o.ToString(dhcpHumanizer) +} + +// Summary prints options in human-readable values. +// +// Summary uses vendorParser to interpret the OptionVendorSpecificInformation option. +func (o Options) Summary(vendorDecoder OptionDecoder) string { + return o.ToString(OptionHumanizer{ + ValueHumanizer: parserFor(vendorDecoder), + CodeHumanizer: func(c uint8) OptionCode { + return optionCode(c) + }, + }) +} + +// OptionParser gives a human-legible interpretation of data for the given option code. +type OptionParser func(code OptionCode, data []byte) fmt.Stringer + +// OptionHumanizer is used to interpret a set of Options for their option code +// name and values. +// +// There should be separate OptionHumanizers for each Option "space": DHCP, +// BSDP, Relay Agent Info, and others. +type OptionHumanizer struct { + ValueHumanizer OptionParser + CodeHumanizer func(code uint8) OptionCode +} + +// Stringify returns a human-readable interpretation of the option code and its +// associated data. +func (oh OptionHumanizer) Stringify(code uint8, data []byte) string { + c := oh.CodeHumanizer(code) + val := oh.ValueHumanizer(c, data) + return fmt.Sprintf("%s: %s", c, val) +} + +// dhcpHumanizer humanizes the set of DHCP option codes. +var dhcpHumanizer = OptionHumanizer{ + ValueHumanizer: parseOption, + CodeHumanizer: func(c uint8) OptionCode { + return optionCode(c) + }, +} + +// ToString uses parse to parse options into human-readable values. +func (o Options) ToString(humanizer OptionHumanizer) string { + var ret string + for _, c := range o.sortedKeys() { + code := uint8(c) + v := o[code] + optString := humanizer.Stringify(code, v) + // If this option has sub structures, offset them accordingly. + if strings.Contains(optString, "\n") { + optString = strings.Replace(optString, "\n ", "\n ", -1) + } + ret += fmt.Sprintf(" %v\n", optString) + } + return ret +} + +func parseOption(code OptionCode, data []byte) fmt.Stringer { + return parserFor(nil)(code, data) +} + +func parserFor(vendorParser OptionDecoder) OptionParser { + return func(code OptionCode, data []byte) fmt.Stringer { + return getOption(code, data, vendorParser) + } +} + +// OptionDecoder can decode a byte stream into a human-readable option. +type OptionDecoder interface { + fmt.Stringer + FromBytes([]byte) error +} + +func getOption(code OptionCode, data []byte, vendorDecoder OptionDecoder) fmt.Stringer { + var d OptionDecoder + switch code { + case OptionRouter, OptionDomainNameServer, OptionNTPServers, OptionServerIdentifier: + d = &IPs{} + + case OptionBroadcastAddress, OptionRequestedIPAddress: + d = &IP{} + + case OptionClientSystemArchitectureType: + d = &iana.Archs{} + + case OptionSubnetMask: + d = &IPMask{} + + case OptionDHCPMessageType: + var mt MessageType + d = &mt + + case OptionParameterRequestList: + d = &OptionCodeList{} + + case OptionHostName, OptionDomainName, OptionRootPath, + OptionClassIdentifier, OptionTFTPServerName, OptionBootfileName: + var s String + d = &s + + case OptionRelayAgentInformation: + d = &RelayOptions{} + + case OptionDNSDomainSearchList: + d = &rfc1035label.Labels{} + + case OptionIPAddressLeaseTime: + var dur Duration + d = &dur + + case OptionMaximumDHCPMessageSize: + var u Uint16 + d = &u + + case OptionUserClassInformation: + d = &UserClass{} + + case OptionVendorIdentifyingVendorClass: + d = &VIVCIdentifiers{} + + case OptionVendorSpecificInformation: + d = vendorDecoder + } + if d != nil && d.FromBytes(data) == nil { + return d + } + return OptionGeneric{data} +} diff --git a/dhcpv4/options_test.go b/dhcpv4/options_test.go index 0c1c1fa7..6c5393c8 100644 --- a/dhcpv4/options_test.go +++ b/dhcpv4/options_test.go @@ -11,154 +11,148 @@ import ( ) func TestParseOption(t *testing.T) { - // Generic - option := []byte{192, 168, 1, 254} // Name server option - opt, err := ParseOption(OptionNameServer, option) - require.NoError(t, err) - generic := opt.(*OptionGeneric) - require.Equal(t, OptionNameServer, generic.Code()) - require.Equal(t, []byte{192, 168, 1, 254}, generic.Data) - require.Equal(t, "Name Server -> [192 168 1 254]", generic.String()) - - // Option subnet mask - option = []byte{255, 255, 255, 0} - opt, err = ParseOption(OptionSubnetMask, option) - require.NoError(t, err) - require.Equal(t, OptionSubnetMask, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option router - option = []byte{192, 168, 1, 1} - opt, err = ParseOption(OptionRouter, option) - require.NoError(t, err) - require.Equal(t, OptionRouter, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option domain name server - option = []byte{192, 168, 1, 1} - opt, err = ParseOption(OptionDomainNameServer, option) - require.NoError(t, err) - require.Equal(t, OptionDomainNameServer, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option host name - option = []byte{'t', 'e', 's', 't'} - opt, err = ParseOption(OptionHostName, option) - require.NoError(t, err) - require.Equal(t, OptionHostName, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option domain name - option = []byte{'t', 'e', 's', 't'} - opt, err = ParseOption(OptionDomainName, option) - require.NoError(t, err) - require.Equal(t, OptionDomainName, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option root path - option = []byte{'/', 'f', 'o', 'o'} - opt, err = ParseOption(OptionRootPath, option) - require.NoError(t, err) - require.Equal(t, OptionRootPath, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option broadcast address - option = []byte{255, 255, 255, 255} - opt, err = ParseOption(OptionBroadcastAddress, option) - require.NoError(t, err) - require.Equal(t, OptionBroadcastAddress, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option NTP servers - option = []byte{10, 10, 10, 10} - opt, err = ParseOption(OptionNTPServers, option) - require.NoError(t, err) - require.Equal(t, OptionNTPServers, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Requested IP address - option = []byte{1, 2, 3, 4} - opt, err = ParseOption(OptionRequestedIPAddress, option) - require.NoError(t, err) - require.Equal(t, OptionRequestedIPAddress, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Requested IP address lease time - option = []byte{0, 0, 0, 0} - opt, err = ParseOption(OptionIPAddressLeaseTime, option) - require.NoError(t, err) - require.Equal(t, OptionIPAddressLeaseTime, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Message type - option = []byte{1} - opt, err = ParseOption(OptionDHCPMessageType, option) - require.NoError(t, err) - require.Equal(t, OptionDHCPMessageType, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option server ID - option = []byte{1, 2, 3, 4} - opt, err = ParseOption(OptionServerIdentifier, option) - require.NoError(t, err) - require.Equal(t, OptionServerIdentifier, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Parameter request list - option = []byte{5, 53, 61} - opt, err = ParseOption(OptionParameterRequestList, option) - require.NoError(t, err) - require.Equal(t, OptionParameterRequestList, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option max message size - option = []byte{1, 2} - opt, err = ParseOption(OptionMaximumDHCPMessageSize, option) - require.NoError(t, err) - require.Equal(t, OptionMaximumDHCPMessageSize, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option class identifier - option = []byte{'t', 'e', 's', 't'} - opt, err = ParseOption(OptionClassIdentifier, option) - require.NoError(t, err) - require.Equal(t, OptionClassIdentifier, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option TFTP server name - option = []byte{'t', 'e', 's', 't'} - opt, err = ParseOption(OptionTFTPServerName, option) - require.NoError(t, err) - require.Equal(t, OptionTFTPServerName, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") - - // Option Bootfile name - option = []byte{'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't'} - opt, err = ParseOption(OptionBootfileName, option) - require.NoError(t, err) - require.Equal(t, OptionBootfileName, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") + for _, tt := range []struct { + code OptionCode + value []byte + want string + }{ + { + code: OptionNameServer, + value: []byte{192, 168, 1, 254}, + want: "[192 168 1 254]", + }, + { + code: OptionSubnetMask, + value: []byte{255, 255, 255, 0}, + want: "ffffff00", + }, + { + code: OptionRouter, + value: []byte{192, 168, 1, 1, 192, 168, 2, 1}, + want: "192.168.1.1, 192.168.2.1", + }, + { + code: OptionDomainNameServer, + value: []byte{192, 168, 1, 1, 192, 168, 2, 1}, + want: "192.168.1.1, 192.168.2.1", + }, + { + code: OptionNTPServers, + value: []byte{192, 168, 1, 1, 192, 168, 2, 1}, + want: "192.168.1.1, 192.168.2.1", + }, + { + code: OptionServerIdentifier, + value: []byte{192, 168, 1, 1, 192, 168, 2, 1}, + want: "192.168.1.1, 192.168.2.1", + }, + { + code: OptionHostName, + value: []byte("test"), + want: "test", + }, + { + code: OptionDomainName, + value: []byte("test"), + want: "test", + }, + { + code: OptionRootPath, + value: []byte("test"), + want: "test", + }, + { + code: OptionClassIdentifier, + value: []byte("test"), + want: "test", + }, + { + code: OptionTFTPServerName, + value: []byte("test"), + want: "test", + }, + { + code: OptionBootfileName, + value: []byte("test"), + want: "test", + }, + { + code: OptionBroadcastAddress, + value: []byte{192, 168, 1, 1}, + want: "192.168.1.1", + }, + { + code: OptionRequestedIPAddress, + value: []byte{192, 168, 1, 1}, + want: "192.168.1.1", + }, + { + code: OptionIPAddressLeaseTime, + value: []byte{0, 0, 0, 12}, + want: "12s", + }, + { + code: OptionDHCPMessageType, + value: []byte{1}, + want: "DISCOVER", + }, + { + code: OptionParameterRequestList, + value: []byte{3, 4, 5}, + want: "Router, Time Server, Name Server", + }, + { + code: OptionMaximumDHCPMessageSize, + value: []byte{1, 2}, + want: "258", + }, + { + code: OptionUserClassInformation, + value: []byte{4, 't', 'e', 's', 't', 3, 'f', 'o', 'o'}, + want: "test, foo", + }, + { + code: OptionRelayAgentInformation, + value: []byte{1, 4, 129, 168, 0, 1}, + want: " unknown (1): [129 168 0 1]\n", + }, + { + code: OptionClientSystemArchitectureType, + value: []byte{0, 0}, + want: "Intel x86PC", + }, + } { + s := parseOption(tt.code, tt.value) + if got := s.String(); got != tt.want { + t.Errorf("parseOption(%s, %v) = %s, want %s", tt.code, tt.value, got, tt.want) + } + } +} - // Option user class information - option = []byte{4, 't', 'e', 's', 't'} - opt, err = ParseOption(OptionUserClassInformation, option) - require.NoError(t, err) - require.Equal(t, OptionUserClassInformation, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") +func TestOptionToBytes(t *testing.T) { + o := Option{ + Code: OptionDHCPMessageType, + Value: &OptionGeneric{[]byte{byte(MessageTypeDiscover)}}, + } + serialized := o.Value.ToBytes() + expected := []byte{1} + require.Equal(t, expected, serialized) +} - // Option relay agent information - option = []byte{1, 4, 129, 168, 0, 1} - opt, err = ParseOption(OptionRelayAgentInformation, option) - require.NoError(t, err) - require.Equal(t, OptionRelayAgentInformation, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") +func TestOptionString(t *testing.T) { + o := Option{ + Code: OptionDHCPMessageType, + Value: MessageTypeDiscover, + } + require.Equal(t, "DHCP Message Type: DISCOVER", o.String()) +} - // Option client system architecture type option - option = []byte{'t', 'e', 's', 't'} - opt, err = ParseOption(OptionClientSystemArchitectureType, option) - require.NoError(t, err) - require.Equal(t, OptionClientSystemArchitectureType, opt.Code(), "Code") - require.Equal(t, option, opt.ToBytes(), "ToBytes") +func TestOptionStringUnknown(t *testing.T) { + o := Option{ + Code: GenericOptionCode(102), // Returend option code. + Value: &OptionGeneric{[]byte{byte(MessageTypeDiscover)}}, + } + require.Equal(t, "unknown (102): [1]", o.String()) } func TestOptionsMarshal(t *testing.T) { @@ -172,10 +166,7 @@ func TestOptionsMarshal(t *testing.T) { }, { opts: Options{ - &OptionGeneric{ - OptionCode: optionCode(5), - Data: []byte{1, 2, 3, 4}, - }, + 5: []byte{1, 2, 3, 4}, }, want: []byte{ 5 /* key */, 4 /* length */, 1, 2, 3, 4, @@ -184,14 +175,9 @@ func TestOptionsMarshal(t *testing.T) { { // Test sorted key order. opts: Options{ - &OptionGeneric{ - OptionCode: optionCode(5), - Data: []byte{1, 2, 3}, - }, - &OptionGeneric{ - OptionCode: optionCode(100), - Data: []byte{101, 102, 103}, - }, + 5: []byte{1, 2, 3}, + 100: []byte{101, 102, 103}, + 255: []byte{}, }, want: []byte{ 5, 3, 1, 2, 3, @@ -201,10 +187,7 @@ func TestOptionsMarshal(t *testing.T) { { // Test RFC 3396. opts: Options{ - &OptionGeneric{ - OptionCode: optionCode(5), - Data: bytes.Repeat([]byte{10}, math.MaxUint8+1), - }, + 5: bytes.Repeat([]byte{10}, math.MaxUint8+1), }, want: append(append( []byte{5, math.MaxUint8}, bytes.Repeat([]byte{10}, math.MaxUint8)...), @@ -262,10 +245,7 @@ func TestOptionsUnmarshal(t *testing.T) { byte(OptionEnd), }, want: Options{ - &OptionGeneric{ - OptionCode: optionCode(3), - Data: []byte{5, 6}, - }, + 3: []byte{5, 6}, }, }, { @@ -276,10 +256,7 @@ func TestOptionsUnmarshal(t *testing.T) { byte(OptionEnd), ), want: Options{ - &OptionGeneric{ - OptionCode: optionCode(3), - Data: bytes.Repeat([]byte{10}, math.MaxUint8+5), - }, + 3: bytes.Repeat([]byte{10}, math.MaxUint8+5), }, }, { @@ -289,14 +266,8 @@ func TestOptionsUnmarshal(t *testing.T) { byte(OptionEnd), }, want: Options{ - &OptionGeneric{ - OptionCode: optionCode(10), - Data: []byte{255, 254}, - }, - &OptionGeneric{ - OptionCode: optionCode(11), - Data: []byte{5, 5, 5}, - }, + 10: []byte{255, 254}, + 11: []byte{5, 5, 5}, }, }, { @@ -305,15 +276,13 @@ func TestOptionsUnmarshal(t *testing.T) { byte(OptionEnd), ), want: Options{ - &OptionGeneric{ - OptionCode: optionCode(10), - Data: []byte{255, 254}, - }, + 10: []byte{255, 254}, }, }, } { t.Run(fmt.Sprintf("Test %02d", i), func(t *testing.T) { - opt, err := OptionsFromBytesWithParser(tt.input, codeGetter, ParseOptionGeneric, true) + opt := make(Options) + err := opt.fromBytesCheckEnd(tt.input, true) if tt.wantError { require.Error(t, err) } else { diff --git a/dhcpv4/server_test.go b/dhcpv4/server_test.go index 4307924c..8626451d 100644 --- a/dhcpv4/server_test.go +++ b/dhcpv4/server_test.go @@ -41,19 +41,15 @@ func DORAHandler(conn net.PacketConn, peer net.Addr, m *DHCPv4) { log.Printf("NewReplyFromRequest failed: %v", err) return } - reply.UpdateOption(&OptServerIdentifier{ServerID: net.IP{1, 2, 3, 4}}) - opt := m.GetOneOption(OptionDHCPMessageType) - if opt == nil { - log.Printf("No message type found!") - return - } - switch opt.(*OptMessageType).MessageType { + reply.UpdateOption(OptServerIdentifier(net.IP{1, 2, 3, 4})) + mt := GetMessageType(m.Options) + switch mt { case MessageTypeDiscover: - reply.UpdateOption(&OptMessageType{MessageType: MessageTypeOffer}) + reply.UpdateOption(OptMessageType(MessageTypeOffer)) case MessageTypeRequest: - reply.UpdateOption(&OptMessageType{MessageType: MessageTypeAck}) + reply.UpdateOption(OptMessageType(MessageTypeAck)) default: - log.Printf("Unhandled message type: %v", opt.(*OptMessageType).MessageType) + log.Printf("Unhandled message type: %v", mt) return } diff --git a/dhcpv4/types.go b/dhcpv4/types.go index 6214dbd8..e1762cc0 100644 --- a/dhcpv4/types.go +++ b/dhcpv4/types.go @@ -2,6 +2,8 @@ package dhcpv4 import ( "fmt" + + "github.com/u-root/u-root/pkg/uio" ) // values from http://www.networksorcery.com/enp/protocol/dhcp.htm and @@ -36,6 +38,13 @@ const ( MessageTypeInform MessageType = 8 ) +// ToBytes returns the serialized version of this option described by RFC 2132, +// Section 9.6. +func (m MessageType) ToBytes() []byte { + return []byte{byte(m)} +} + +// String prints a human-readable message type name. func (m MessageType) String() string { if s, ok := messageTypeToString[m]; ok { return s @@ -43,6 +52,14 @@ func (m MessageType) String() string { return fmt.Sprintf("unknown (%d)", byte(m)) } +// FromBytes reads a message type from data as described by RFC 2132, Section +// 9.6. +func (m *MessageType) FromBytes(data []byte) error { + buf := uio.NewBigEndianBuffer(data) + *m = MessageType(buf.Read8()) + return buf.FinError() +} + var messageTypeToString = map[MessageType]string{ MessageTypeDiscover: "DISCOVER", MessageTypeOffer: "OFFER", @@ -81,22 +98,40 @@ var opcodeToString = map[OpcodeType]string{ // with the same Code value, as vendor-specific options use option codes that // have the same value, but mean a different thing. type OptionCode interface { + // Code is the 1 byte option code for the wire. Code() uint8 + + // String returns the option's name. String() string } // optionCode is a DHCP option code. type optionCode uint8 +// Code implements OptionCode.Code. func (o optionCode) Code() uint8 { return uint8(o) } +// String returns an option name. func (o optionCode) String() string { if s, ok := optionCodeToString[o]; ok { return s } - return fmt.Sprintf("unknown (%d)", o) + return fmt.Sprintf("unknown (%d)", uint8(o)) +} + +// GenericOptionCode is an unnamed option code. +type GenericOptionCode uint8 + +// Code implements OptionCode.Code. +func (o GenericOptionCode) Code() uint8 { + return uint8(o) +} + +// String returns the option's name. +func (o GenericOptionCode) String() string { + return fmt.Sprintf("unknown (%d)", uint8(o)) } // DHCPv4 Options @@ -263,7 +298,7 @@ const ( OptionEnd optionCode = 255 ) -var optionCodeToString = map[optionCode]string{ +var optionCodeToString = map[OptionCode]string{ OptionPad: "Pad", OptionSubnetMask: "Subnet Mask", OptionTimeOffset: "Time Offset", diff --git a/dhcpv4/ztpv4/ztp.go b/dhcpv4/ztpv4/ztp.go index 18075e9a..4401e9dd 100644 --- a/dhcpv4/ztpv4/ztp.go +++ b/dhcpv4/ztpv4/ztp.go @@ -18,11 +18,10 @@ var errVendorOptionMalformed = errors.New("malformed vendor option") // ParseVendorData will try to parse dhcp4 options looking for more // specific vendor data (like model, serial number, etc). func ParseVendorData(packet *dhcpv4.DHCPv4) (*VendorData, error) { - opt := packet.GetOneOption(dhcpv4.OptionClassIdentifier) - if opt == nil { + vc := dhcpv4.GetClassIdentifier(packet.Options) + if len(vc) == 0 { return nil, errors.New("vendor options not found") } - vc := opt.(*dhcpv4.OptClassIdentifier).Identifier vd := &VendorData{} switch { @@ -59,9 +58,8 @@ func ParseVendorData(packet *dhcpv4.DHCPv4) (*VendorData, error) { p := strings.Split(vc, "-") if len(p) < 3 { vd.Model = p[1] - if opt := packet.GetOneOption(dhcpv4.OptionHostName); opt != nil { - vd.Serial = opt.(*dhcpv4.OptHostName).HostName - } else { + vd.Serial = dhcpv4.GetHostName(packet.Options) + if len(vd.Serial) == 0 { return nil, errors.New("host name option is missing") } } else { diff --git a/dhcpv4/ztpv4/ztp_test.go b/dhcpv4/ztpv4/ztp_test.go index 680f15a9..6e050d9b 100644 --- a/dhcpv4/ztpv4/ztp_test.go +++ b/dhcpv4/ztpv4/ztp_test.go @@ -54,15 +54,10 @@ func TestParseV4VendorClass(t *testing.T) { } if tc.vc != "" { - packet.UpdateOption(&dhcpv4.OptClassIdentifier{ - Identifier: tc.vc, - }) + packet.UpdateOption(dhcpv4.OptClassIdentifier(tc.vc)) } - if tc.hostname != "" { - packet.UpdateOption(&dhcpv4.OptHostName{ - HostName: tc.hostname, - }) + packet.UpdateOption(dhcpv4.OptHostName(tc.hostname)) } vd, err := ParseVendorData(packet) diff --git a/iana/archtype.go b/iana/archtype.go index 510c6fc5..255687ce 100644 --- a/iana/archtype.go +++ b/iana/archtype.go @@ -1,5 +1,12 @@ package iana +import ( + "fmt" + "strings" + + "github.com/u-root/u-root/pkg/uio" +) + // Arch encodes an architecture type per RFC 4578, Section 2.1. type Arch uint16 @@ -38,3 +45,40 @@ func (a Arch) String() string { } return "unknown" } + +// Archs represents multiple Arch values. +type Archs []Arch + +// ToBytes returns the serialized option defined by RFC 4578 (DHCPv4) and RFC +// 5970 (DHCPv6) as the Client System Architecture Option. +func (a Archs) ToBytes() []byte { + buf := uio.NewBigEndianBuffer(nil) + for _, at := range a { + buf.Write16(uint16(at)) + } + return buf.Data() +} + +// String returns the list of archs in a human-readable manner. +func (a Archs) String() string { + s := make([]string, 0, len(a)) + for _, arch := range a { + s = append(s, arch.String()) + } + return strings.Join(s, ", ") +} + +// FromBytes parses a DHCP list of architecture types as defined by RFC 4578 +// and RFC 5970. +func (a *Archs) FromBytes(data []byte) error { + buf := uio.NewBigEndianBuffer(data) + if buf.Len() == 0 { + return fmt.Errorf("must have at least one archtype if option is present") + } + + *a = make([]Arch, 0, buf.Len()/2) + for buf.Has(2) { + *a = append(*a, Arch(buf.Read16())) + } + return buf.FinError() +} diff --git a/netboot/netconf.go b/netboot/netconf.go index 9dfa858c..8c562623 100644 --- a/netboot/netconf.go +++ b/netboot/netconf.go @@ -87,11 +87,10 @@ func GetNetConfFromPacketv4(d *dhcpv4.DHCPv4) (*NetConf, error) { // get the subnet mask from OptionSubnetMask. If the netmask is not defined // in the packet, an error is returned - netmaskOption := d.GetOneOption(dhcpv4.OptionSubnetMask) - if netmaskOption == nil { + netmask := dhcpv4.GetSubnetMask(d.Options) + if netmask == nil { return nil, errors.New("no netmask option in response packet") } - netmask := netmaskOption.(*dhcpv4.OptSubnetMask).SubnetMask ones, _ := netmask.Size() if ones == 0 { return nil, errors.New("netmask extracted from OptSubnetMask options is null") @@ -100,11 +99,7 @@ func GetNetConfFromPacketv4(d *dhcpv4.DHCPv4) (*NetConf, error) { // netconf struct requires a valid lifetime to be specified. ValidLifetime is a dhcpv6 // concept, the closest mapping in dhcpv4 world is "IP Address Lease Time". If the lease // time option is nil, we set it to 0 - leaseTimeOption := d.GetOneOption(dhcpv4.OptionIPAddressLeaseTime) - leaseTime := uint32(0) - if leaseTimeOption != nil { - leaseTime = leaseTimeOption.(*dhcpv4.OptIPAddressLeaseTime).LeaseTime - } + leaseTime := dhcpv4.GetIPAddressLeaseTime(d.Options, 0) netconf.Addresses = append(netconf.Addresses, AddrConf{ IPNet: net.IPNet{ @@ -112,24 +107,19 @@ func GetNetConfFromPacketv4(d *dhcpv4.DHCPv4) (*NetConf, error) { Mask: netmask, }, PreferredLifetime: 0, - ValidLifetime: int(leaseTime), + ValidLifetime: int(leaseTime / time.Second), }) // get DNS configuration - dnsServersOption := d.GetOneOption(dhcpv4.OptionDomainNameServer) - if dnsServersOption == nil { - return nil, errors.New("name servers option is empty") - } - dnsServers := dnsServersOption.(*dhcpv4.OptDomainNameServer).NameServers + dnsServers := dhcpv4.GetDNS(d.Options) if len(dnsServers) == 0 { return nil, errors.New("no dns servers options in response packet") } netconf.DNSServers = dnsServers // get domain search list - dnsDomainSearchListOption := d.GetOneOption(dhcpv4.OptionDNSDomainSearchList) - if dnsDomainSearchListOption != nil { - dnsSearchList := dnsDomainSearchListOption.(*dhcpv4.OptDomainSearch).DomainSearch + dnsSearchList := dhcpv4.GetDomainSearch(d.Options) + if dnsSearchList != nil { if len(dnsSearchList.Labels) == 0 { return nil, errors.New("dns search list is empty") } @@ -137,18 +127,11 @@ func GetNetConfFromPacketv4(d *dhcpv4.DHCPv4) (*NetConf, error) { } // get default gateway - routerOption := d.GetOneOption(dhcpv4.OptionRouter) - if routerOption == nil { - return nil, errors.New("no router option specified in response packet") - } - - routersList := routerOption.(*dhcpv4.OptRouter).Routers + routersList := dhcpv4.GetRouter(d.Options) if len(routersList) == 0 { return nil, errors.New("no routers specified in the corresponding option") } - netconf.Routers = routersList - return &netconf, nil } diff --git a/netboot/netconf_test.go b/netboot/netconf_test.go index 00b39b87..5e954fa1 100644 --- a/netboot/netconf_test.go +++ b/netboot/netconf_test.go @@ -224,13 +224,13 @@ func TestGetNetConfFromPacketv4(t *testing.T) { require.Equal(t, 5200, netconf.Addresses[0].ValidLifetime) // check DNSes require.Equal(t, 2, len(netconf.DNSServers)) - require.Equal(t, net.ParseIP("10.10.0.1"), netconf.DNSServers[0]) - require.Equal(t, net.ParseIP("10.10.0.2"), netconf.DNSServers[1]) + require.Equal(t, net.ParseIP("10.10.0.1").To4(), netconf.DNSServers[0]) + require.Equal(t, net.ParseIP("10.10.0.2").To4(), netconf.DNSServers[1]) // check DNS search list require.Equal(t, 2, len(netconf.DNSSearchList)) require.Equal(t, "slackware.it", netconf.DNSSearchList[0]) require.Equal(t, "dhcp.slackware.it", netconf.DNSSearchList[1]) // check routers require.Equal(t, 1, len(netconf.Routers)) - require.Equal(t, net.ParseIP("10.0.0.254"), netconf.Routers[0]) + require.Equal(t, net.ParseIP("10.0.0.254").To4(), netconf.Routers[0]) } diff --git a/rfc1035label/label.go b/rfc1035label/label.go index 5093de85..5a67d7c9 100644 --- a/rfc1035label/label.go +++ b/rfc1035label/label.go @@ -2,13 +2,14 @@ package rfc1035label import ( "errors" + "fmt" "strings" ) +// Labels represents RFC1035 labels +// // This implements RFC 1035 labels, including compression. // https://tools.ietf.org/html/rfc1035#section-4.1.4 - -// Labels represents RFC1035 labels type Labels struct { // original contains the original bytes if the object was parsed from a byte // sequence, or nil otherwise. The `original` field is necessary to deal @@ -33,6 +34,11 @@ func same(a, b []string) bool { return true } +// String prints labels. +func (l *Labels) String() string { + return fmt.Sprintf("%v", l.Labels) +} + // ToBytes returns a byte sequence representing the labels. If the original // sequence is modified, the labels are parsed again, otherwise the original // byte sequence is returned. @@ -62,17 +68,25 @@ func NewLabels() *Labels { } } +// FromBytes reads labels from a bytes stream according to RFC 1035. +func (l *Labels) FromBytes(data []byte) error { + labs, err := labelsFromBytes(data) + if err != nil { + return err + } + l.original = data + l.Labels = labs + return nil +} + // FromBytes returns a Labels object from the given byte sequence, or an error if // any. func FromBytes(data []byte) (*Labels, error) { - lab := NewLabels() - l, err := labelsFromBytes(data) - if err != nil { + var l Labels + if err := l.FromBytes(data); err != nil { return nil, err } - lab.original = data - lab.Labels = l - return lab, nil + return &l, nil } // fromBytes decodes a serialized stream and returns a list of labels From a4a666c6477431358a1d6ed7b556398ed690ab5c Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 21:13:30 +0000 Subject: [PATCH 08/43] dhcpv4: getters instead of getters From: r := GetRouter(d.Options) To: r := d.Router() --- dhcpv4/bsdp/boot_image.go | 10 - dhcpv4/bsdp/bsdp.go | 6 +- dhcpv4/bsdp/bsdp_option_boot_image_list.go | 13 - dhcpv4/bsdp/bsdp_option_message_type.go | 13 - dhcpv4/bsdp/bsdp_option_misc.go | 33 --- dhcpv4/bsdp/bsdp_option_misc_test.go | 36 ++- dhcpv4/bsdp/bsdp_test.go | 6 +- .../option_vendor_specific_information.go | 70 ++++++ dhcpv4/dhcpv4.go | 235 +++++++++++++++++- dhcpv4/modifiers.go | 15 +- dhcpv4/modifiers_test.go | 26 +- dhcpv4/option_archtype.go | 13 - dhcpv4/option_archtype_test.go | 19 +- dhcpv4/option_domain_search.go | 15 -- dhcpv4/option_domain_search_test.go | 9 +- dhcpv4/option_ip.go | 21 -- dhcpv4/option_ip_address_lease_time.go | 16 -- dhcpv4/option_ip_address_lease_time_test.go | 15 +- dhcpv4/option_ips.go | 21 -- dhcpv4/option_ips_test.go | 24 +- dhcpv4/option_maximum_dhcp_message_size.go | 7 - .../option_maximum_dhcp_message_size_test.go | 12 +- dhcpv4/option_message_type.go | 13 - dhcpv4/option_message_type_test.go | 8 +- dhcpv4/option_parameter_request_list.go | 15 -- dhcpv4/option_relay_agent_information.go | 15 -- dhcpv4/option_relay_agent_information_test.go | 25 +- dhcpv4/option_string.go | 43 ---- dhcpv4/option_string_test.go | 52 ++-- dhcpv4/option_subnet_mask.go | 15 -- dhcpv4/option_subnet_mask_test.go | 12 +- dhcpv4/option_userclass.go | 15 -- dhcpv4/option_vivc.go | 13 - dhcpv4/option_vivc_test.go | 15 +- dhcpv4/server_test.go | 3 +- dhcpv4/ztpv4/ztp.go | 4 +- netboot/netconf.go | 10 +- 37 files changed, 454 insertions(+), 439 deletions(-) diff --git a/dhcpv4/bsdp/boot_image.go b/dhcpv4/bsdp/boot_image.go index 58b5167b..e494da4d 100644 --- a/dhcpv4/bsdp/boot_image.go +++ b/dhcpv4/bsdp/boot_image.go @@ -129,18 +129,8 @@ func OptDefaultBootImageID(b BootImageID) dhcpv4.Option { return dhcpv4.Option{Code: OptionDefaultBootImageID, Value: b} } -// GetDefaultBootImageID returns the default boot image ID contained in o. -func GetDefaultBootImageID(o dhcpv4.Options) *BootImageID { - return getBootImageID(OptionDefaultBootImageID, o) -} - // OptSelectedBootImageID returns a new selected boot image ID option as per // BSDP. func OptSelectedBootImageID(b BootImageID) dhcpv4.Option { return dhcpv4.Option{Code: OptionSelectedBootImageID, Value: b} } - -// GetSelectedBootImageID returns the selected boot image ID contained in o. -func GetSelectedBootImageID(o dhcpv4.Options) *BootImageID { - return getBootImageID(OptionSelectedBootImageID, o) -} diff --git a/dhcpv4/bsdp/bsdp.go b/dhcpv4/bsdp/bsdp.go index 9bcc15d6..c9f7c26d 100644 --- a/dhcpv4/bsdp/bsdp.go +++ b/dhcpv4/bsdp/bsdp.go @@ -35,7 +35,7 @@ func ParseBootImageListFromAck(ack *dhcpv4.DHCPv4) ([]BootImage, error) { if vendorOpts == nil { return nil, errors.New("ParseBootImageListFromAck: could not find vendor-specific option") } - return GetBootImageList(vendorOpts.Options), nil + return vendorOpts.BootImageList(), nil } func needsReplyPort(replyPort uint16) bool { @@ -50,7 +50,7 @@ func MessageTypeFromPacket(packet *dhcpv4.DHCPv4) MessageType { if vendorOpts == nil { return MessageTypeNone } - return GetMessageType(vendorOpts.Options) + return vendorOpts.MessageType() } // Packet is a BSDP packet wrapper around a DHCPv4 packet in order to print the @@ -156,7 +156,7 @@ func InformSelectForAck(ack *Packet, replyPort uint16, selectedImage BootImage) } // Find server IP address - serverIP := dhcpv4.GetServerIdentifier(ack.Options) + serverIP := ack.ServerIdentifier() if serverIP.To4() == nil { return nil, fmt.Errorf("could not parse server identifier from ACK") } diff --git a/dhcpv4/bsdp/bsdp_option_boot_image_list.go b/dhcpv4/bsdp/bsdp_option_boot_image_list.go index ebbbd2de..1f99196f 100644 --- a/dhcpv4/bsdp/bsdp_option_boot_image_list.go +++ b/dhcpv4/bsdp/bsdp_option_boot_image_list.go @@ -51,16 +51,3 @@ func OptBootImageList(b ...BootImage) dhcpv4.Option { Value: BootImageList(b), } } - -// GetBootImageList returns the BSDP boot image list. -func GetBootImageList(o dhcpv4.Options) BootImageList { - v := o.Get(OptionBootImageList) - if v == nil { - return nil - } - var bil BootImageList - if err := bil.FromBytes(v); err != nil { - return nil - } - return bil -} diff --git a/dhcpv4/bsdp/bsdp_option_message_type.go b/dhcpv4/bsdp/bsdp_option_message_type.go index cb0c5cf6..02bf2433 100644 --- a/dhcpv4/bsdp/bsdp_option_message_type.go +++ b/dhcpv4/bsdp/bsdp_option_message_type.go @@ -55,16 +55,3 @@ func OptMessageType(mt MessageType) dhcpv4.Option { Value: mt, } } - -// GetMessageType returns the BSDP Message Type in o. -func GetMessageType(o dhcpv4.Options) MessageType { - v := o.Get(OptionMessageType) - if v == nil { - return MessageTypeNone - } - var m MessageType - if err := m.FromBytes(v); err != nil { - return MessageTypeNone - } - return m -} diff --git a/dhcpv4/bsdp/bsdp_option_misc.go b/dhcpv4/bsdp/bsdp_option_misc.go index 2d3a7bfb..e3193f01 100644 --- a/dhcpv4/bsdp/bsdp_option_misc.go +++ b/dhcpv4/bsdp/bsdp_option_misc.go @@ -18,31 +18,16 @@ func OptReplyPort(port uint16) dhcpv4.Option { return dhcpv4.Option{Code: OptionReplyPort, Value: dhcpv4.Uint16(port)} } -// GetReplyPort returns the BSDP reply port in o, if present. -func GetReplyPort(o dhcpv4.Options) (uint16, error) { - return dhcpv4.GetUint16(OptionReplyPort, o) -} - // OptServerPriority returns a new BSDP server priority option. func OptServerPriority(prio uint16) dhcpv4.Option { return dhcpv4.Option{Code: OptionServerPriority, Value: dhcpv4.Uint16(prio)} } -// GetServerPriority returns the BSDP server priority in o if present. -func GetServerPriority(o dhcpv4.Options) (uint16, error) { - return dhcpv4.GetUint16(OptionServerPriority, o) -} - // OptMachineName returns a BSDP Machine Name option. func OptMachineName(name string) dhcpv4.Option { return dhcpv4.Option{Code: OptionMachineName, Value: dhcpv4.String(name)} } -// GetMachineName finds and parses the BSDP Machine Name option from o. -func GetMachineName(o dhcpv4.Options) string { - return dhcpv4.GetString(OptionMachineName, o) -} - // Version is the BSDP protocol version. Can be one of 1.0 or 1.1. type Version [2]byte @@ -75,24 +60,6 @@ func OptVersion(version Version) dhcpv4.Option { return dhcpv4.Option{Code: OptionVersion, Value: version} } -// GetVersion returns the BSDP version in o if present. -func GetVersion(o dhcpv4.Options) (Version, error) { - v := o.Get(OptionVersion) - if v == nil { - return Version{0, 0}, fmt.Errorf("version not found") - } - var ver Version - if err := ver.FromBytes(v); err != nil { - return Version{0, 0}, err - } - return ver, nil -} - -// GetServerIdentifier returns the BSDP Server Identifier value in o. -func GetServerIdentifier(o dhcpv4.Options) net.IP { - return dhcpv4.GetIP(OptionServerIdentifier, o) -} - // OptServerIdentifier returns a new BSDP Server Identifier option. func OptServerIdentifier(ip net.IP) dhcpv4.Option { return dhcpv4.Option{Code: OptionServerIdentifier, Value: dhcpv4.IP(ip)} diff --git a/dhcpv4/bsdp/bsdp_option_misc_test.go b/dhcpv4/bsdp/bsdp_option_misc_test.go index dfa81b58..44e28131 100644 --- a/dhcpv4/bsdp/bsdp_option_misc_test.go +++ b/dhcpv4/bsdp/bsdp_option_misc_test.go @@ -17,11 +17,12 @@ func TestOptReplyPort(t *testing.T) { func TestGetReplyPort(t *testing.T) { o := VendorOptions{dhcpv4.OptionsFromList(OptReplyPort(1234))} - port, err := GetReplyPort(o.Options) + port, err := o.ReplyPort() require.NoError(t, err) require.Equal(t, uint16(1234), port) - port, err = GetReplyPort(dhcpv4.Options{}) + o = VendorOptions{dhcpv4.Options{}} + port, err = o.ReplyPort() require.Error(t, err, "no reply port present") } @@ -34,11 +35,12 @@ func TestOptServerPriority(t *testing.T) { func TestGetServerPriority(t *testing.T) { o := VendorOptions{dhcpv4.OptionsFromList(OptServerPriority(1234))} - prio, err := GetServerPriority(o.Options) + prio, err := o.ServerPriority() require.NoError(t, err) require.Equal(t, uint16(1234), prio) - prio, err = GetServerPriority(dhcpv4.Options{}) + o = VendorOptions{dhcpv4.Options{}} + prio, err = o.ServerPriority() require.Error(t, err, "no server prio present") } @@ -51,8 +53,10 @@ func TestOptMachineName(t *testing.T) { func TestGetMachineName(t *testing.T) { o := VendorOptions{dhcpv4.OptionsFromList(OptMachineName("foo"))} - require.Equal(t, "foo", GetMachineName(o.Options)) - require.Equal(t, "", GetMachineName(dhcpv4.Options{})) + require.Equal(t, "foo", o.MachineName()) + + o = VendorOptions{dhcpv4.Options{}} + require.Equal(t, "", o.MachineName()) } func TestOptVersion(t *testing.T) { @@ -64,20 +68,24 @@ func TestOptVersion(t *testing.T) { func TestGetVersion(t *testing.T) { o := VendorOptions{dhcpv4.OptionsFromList(OptVersion(Version1_1))} - ver, err := GetVersion(o.Options) + ver, err := o.Version() require.NoError(t, err) require.Equal(t, ver, Version1_1) - ver, err = GetVersion(dhcpv4.Options{}) + o = VendorOptions{dhcpv4.Options{}} + ver, err = o.Version() require.Error(t, err, "no version present") - ver, err = GetVersion(dhcpv4.Options{OptionVersion.Code(): []byte{}}) + o = VendorOptions{dhcpv4.Options{OptionVersion.Code(): []byte{}}} + ver, err = o.Version() require.Error(t, err, "empty version field") - ver, err = GetVersion(dhcpv4.Options{OptionVersion.Code(): []byte{1}}) + o = VendorOptions{dhcpv4.Options{OptionVersion.Code(): []byte{1}}} + ver, err = o.Version() require.Error(t, err, "version option too short") - ver, err = GetVersion(dhcpv4.Options{OptionVersion.Code(): []byte{1, 2, 3}}) + o = VendorOptions{dhcpv4.Options{OptionVersion.Code(): []byte{1, 2, 3}}} + ver, err = o.Version() require.Error(t, err, "version option too long") } @@ -90,6 +98,8 @@ func TestOptServerIdentifier(t *testing.T) { func TestGetServerIdentifier(t *testing.T) { o := VendorOptions{dhcpv4.OptionsFromList(OptServerIdentifier(net.IP{1, 1, 1, 1}))} - require.Equal(t, net.IP{1, 1, 1, 1}, GetServerIdentifier(o.Options)) - require.Equal(t, net.IP(nil), GetServerIdentifier(dhcpv4.Options{})) + require.Equal(t, net.IP{1, 1, 1, 1}, o.ServerIdentifier()) + + o = VendorOptions{dhcpv4.Options{}} + require.Nil(t, o.ServerIdentifier()) } diff --git a/dhcpv4/bsdp/bsdp_test.go b/dhcpv4/bsdp/bsdp_test.go index e0378c2c..05cd85c0 100644 --- a/dhcpv4/bsdp/bsdp_test.go +++ b/dhcpv4/bsdp/bsdp_test.go @@ -75,7 +75,7 @@ func TestNewInformList_NoReplyPort(t *testing.T) { require.True(t, vendorOpts.Has(OptionMessageType)) require.True(t, vendorOpts.Has(OptionVersion)) - mt := GetMessageType(vendorOpts.Options) + mt := vendorOpts.MessageType() require.Equal(t, MessageTypeList, mt) } @@ -96,7 +96,7 @@ func TestNewInformList_ReplyPort(t *testing.T) { vendorOpts := GetVendorOptions(m.Options) require.True(t, vendorOpts.Options.Has(OptionReplyPort)) - port, err := GetReplyPort(vendorOpts.Options) + port, err := vendorOpts.ReplyPort() require.NoError(t, err) require.Equal(t, replyPort, port) } @@ -139,7 +139,7 @@ func TestInformSelectForAck_Broadcast(t *testing.T) { require.True(t, m.Options.Has(dhcpv4.OptionClassIdentifier)) require.True(t, m.Options.Has(dhcpv4.OptionParameterRequestList)) require.True(t, m.Options.Has(dhcpv4.OptionDHCPMessageType)) - mt := dhcpv4.GetMessageType(m.Options) + mt := m.MessageType() require.Equal(t, dhcpv4.MessageTypeInform, mt) // Validate vendor opts. diff --git a/dhcpv4/bsdp/option_vendor_specific_information.go b/dhcpv4/bsdp/option_vendor_specific_information.go index 4e107e17..abdd9a50 100644 --- a/dhcpv4/bsdp/option_vendor_specific_information.go +++ b/dhcpv4/bsdp/option_vendor_specific_information.go @@ -2,6 +2,7 @@ package bsdp import ( "fmt" + "net" "github.com/insomniacslk/dhcp/dhcpv4" ) @@ -23,6 +24,75 @@ func (v *VendorOptions) FromBytes(data []byte) error { return v.Options.FromBytes(data) } +// DefaultBootImageID returns the default boot image ID in v. +func (v VendorOptions) DefaultBootImageID() *BootImageID { + return getBootImageID(OptionDefaultBootImageID, v.Options) +} + +// SelectedBootImageID returns the selected boot image ID in v. +func (v VendorOptions) SelectedBootImageID() *BootImageID { + return getBootImageID(OptionSelectedBootImageID, v.Options) +} + +// BootImageList returns the BSDP boot image list in v. +func (v VendorOptions) BootImageList() BootImageList { + val := v.Options.Get(OptionBootImageList) + if val == nil { + return nil + } + var bil BootImageList + if err := bil.FromBytes(val); err != nil { + return nil + } + return bil +} + +// MessageType returns the BSDP Message Type in v. +func (v VendorOptions) MessageType() MessageType { + val := v.Options.Get(OptionMessageType) + if val == nil { + return MessageTypeNone + } + var m MessageType + if err := m.FromBytes(val); err != nil { + return MessageTypeNone + } + return m +} + +// GetVersion returns the BSDP version in v if present. +func (v VendorOptions) Version() (Version, error) { + val := v.Options.Get(OptionVersion) + if val == nil { + return Version{0, 0}, fmt.Errorf("version not found") + } + var ver Version + if err := ver.FromBytes(val); err != nil { + return Version{0, 0}, err + } + return ver, nil +} + +// GetServerIdentifier returns the BSDP Server Identifier value in v if present. +func (v VendorOptions) ServerIdentifier() net.IP { + return dhcpv4.GetIP(OptionServerIdentifier, v.Options) +} + +// GetReplyPort returns the BSDP reply port in v if present. +func (v VendorOptions) ReplyPort() (uint16, error) { + return dhcpv4.GetUint16(OptionReplyPort, v.Options) +} + +// GetServerPriority returns the BSDP server priority in v if present. +func (v VendorOptions) ServerPriority() (uint16, error) { + return dhcpv4.GetUint16(OptionServerPriority, v.Options) +} + +// GetMachineName finds and parses the BSDP Machine Name option from v. +func (v VendorOptions) MachineName() string { + return dhcpv4.GetString(OptionMachineName, v.Options) +} + // OptVendorOptions returns the BSDP Vendor Specific Info in o. func OptVendorOptions(o ...dhcpv4.Option) dhcpv4.Option { return dhcpv4.Option{ diff --git a/dhcpv4/dhcpv4.go b/dhcpv4/dhcpv4.go index d94c58ab..5f6943b0 100644 --- a/dhcpv4/dhcpv4.go +++ b/dhcpv4/dhcpv4.go @@ -9,7 +9,7 @@ // p.UpdateOption(dhcpv4.OptServerIdentifier(net.IP{192, 110, 110, 110})) // // // Retrieve the DHCP Message Type option. -// m := dhcpv4.GetMessageType(p.Options) +// m := p.MessageType() // // bytesOnTheWire := p.ToBytes() // longSummary := p.Summary() @@ -21,8 +21,10 @@ import ( "fmt" "net" "strings" + "time" "github.com/insomniacslk/dhcp/iana" + "github.com/insomniacslk/dhcp/rfc1035label" "github.com/u-root/u-root/pkg/uio" ) @@ -218,7 +220,7 @@ func NewInform(hwaddr net.HardwareAddr, localIP net.IP, modifiers ...Modifier) ( // NewRequestFromOffer builds a DHCPv4 request from an offer. func NewRequestFromOffer(offer *DHCPv4, modifiers ...Modifier) (*DHCPv4, error) { // find server IP address - serverIP := GetServerIdentifier(offer.Options) + serverIP := offer.ServerIdentifier() if serverIP == nil { return nil, errors.New("Missing Server IP Address in DHCP Offer") } @@ -350,12 +352,6 @@ func (d *DHCPv4) UpdateOption(opt Option) { d.Options.Update(opt) } -// MessageType returns the message type, trying to extract it from the -// OptMessageType option. It returns nil if the message type cannot be extracted -func (d *DHCPv4) MessageType() MessageType { - return GetMessageType(d.Options) -} - // String implements fmt.Stringer. func (d *DHCPv4) String() string { return fmt.Sprintf("DHCPv4(opcode=%s xid=%s hwtype=%s hwaddr=%s)", @@ -408,7 +404,7 @@ func (d *DHCPv4) Summary() string { // IsOptionRequested returns true if that option is within the requested // options of the DHCPv4 message. func (d *DHCPv4) IsOptionRequested(requested OptionCode) bool { - for _, o := range GetParameterRequestList(d.Options) { + for _, o := range d.ParameterRequestList() { if o == requested { return true } @@ -470,3 +466,224 @@ func (d *DHCPv4) ToBytes() []byte { return buf.Data() } + +// GetBroadcastAddress returns the DHCPv4 Broadcast Address value in d. +// +// The broadcast address option is described in RFC 2132, Section 5.3. +func (d *DHCPv4) BroadcastAddress() net.IP { + return GetIP(OptionBroadcastAddress, d.Options) +} + +// RequestedIPAddress returns the DHCPv4 Requested IP Address value in d. +// +// The requested IP address option is described by RFC 2132, Section 9.1. +func (d *DHCPv4) RequestedIPAddress() net.IP { + return GetIP(OptionRequestedIPAddress, d.Options) +} + +// ServerIdentifier returns the DHCPv4 Server Identifier value in d. +// +// The server identifier option is described by RFC 2132, Section 9.7. +func (d *DHCPv4) ServerIdentifier() net.IP { + return GetIP(OptionServerIdentifier, d.Options) +} + +// Router parses the DHCPv4 Router option if present. +// +// The Router option is described by RFC 2132, Section 3.5. +func (d *DHCPv4) Router() []net.IP { + return GetIPs(OptionRouter, d.Options) +} + +// NTPServers parses the DHCPv4 NTP Servers option if present. +// +// The NTP servers option is described by RFC 2132, Section 8.3. +func (d *DHCPv4) NTPServers() []net.IP { + return GetIPs(OptionNTPServers, d.Options) +} + +// DNS parses the DHCPv4 Domain Name Server option if present. +// +// The DNS server option is described by RFC 2132, Section 3.8. +func (d *DHCPv4) DNS() []net.IP { + return GetIPs(OptionDomainNameServer, d.Options) +} + +// DomainName parses the DHCPv4 Domain Name option if present. +// +// The Domain Name option is described by RFC 2132, Section 3.17. +func (d *DHCPv4) DomainName() string { + return GetString(OptionDomainName, d.Options) +} + +// HostName parses the DHCPv4 Host Name option if present. +// +// The Host Name option is described by RFC 2132, Section 3.14. +func (d *DHCPv4) HostName() string { + return GetString(OptionHostName, d.Options) +} + +// RootPath parses the DHCPv4 Root Path option if present. +// +// The Root Path option is described by RFC 2132, Section 3.19. +func (d *DHCPv4) RootPath() string { + return GetString(OptionRootPath, d.Options) +} + +// BootFileNameOption parses the DHCPv4 Bootfile Name option if present. +// +// The Bootfile Name option is described by RFC 2132, Section 9.5. +func (d *DHCPv4) BootFileNameOption() string { + return GetString(OptionBootfileName, d.Options) +} + +// TFTPServerName parses the DHCPv4 TFTP Server Name option if present. +// +// The TFTP Server Name option is described by RFC 2132, Section 9.4. +func (d *DHCPv4) TFTPServerName() string { + return GetString(OptionTFTPServerName, d.Options) +} + +// ClassIdentifier parses the DHCPv4 Class Identifier option if present. +// +// The Vendor Class Identifier option is described by RFC 2132, Section 9.13. +func (d *DHCPv4) ClassIdentifier() string { + return GetString(OptionClassIdentifier, d.Options) +} + +// ClientArch returns the Client System Architecture Type option. +func (d *DHCPv4) ClientArch() []iana.Arch { + v := d.Options.Get(OptionClientSystemArchitectureType) + if v == nil { + return nil + } + var archs iana.Archs + if err := archs.FromBytes(v); err != nil { + return nil + } + return archs +} + +// DomainSearch returns the domain search list if present. +// +// The domain search option is described by RFC 3397, Section 2. +func (d *DHCPv4) DomainSearch() *rfc1035label.Labels { + v := d.Options.Get(OptionDNSDomainSearchList) + if v == nil { + return nil + } + labels, err := rfc1035label.FromBytes(v) + if err != nil { + return nil + } + return labels +} + +// IPAddressLeaseTime returns the IP address lease time or the given +// default duration if not present. +// +// The IP address lease time option is described by RFC 2132, Section 9.2. +func (d *DHCPv4) IPAddressLeaseTime(def time.Duration) time.Duration { + v := d.Options.Get(OptionIPAddressLeaseTime) + if v == nil { + return def + } + var dur Duration + if err := dur.FromBytes(v); err != nil { + return def + } + return time.Duration(dur) +} + +// MaxMessageSize returns the DHCP Maximum Message Size if present. +// +// The Maximum DHCP Message Size option is described by RFC 2132, Section 9.10. +func (d *DHCPv4) MaxMessageSize() (uint16, error) { + return GetUint16(OptionMaximumDHCPMessageSize, d.Options) +} + +// MessageType returns the DHCPv4 Message Type option. +func (d *DHCPv4) MessageType() MessageType { + v := d.Options.Get(OptionDHCPMessageType) + if v == nil { + return MessageTypeNone + } + var m MessageType + if err := m.FromBytes(v); err != nil { + return MessageTypeNone + } + return m +} + +// ParameterRequestList returns the DHCPv4 Parameter Request List. +// +// The parameter request list option is described by RFC 2132, Section 9.8. +func (d *DHCPv4) ParameterRequestList() OptionCodeList { + v := d.Options.Get(OptionParameterRequestList) + if v == nil { + return nil + } + var codes OptionCodeList + if err := codes.FromBytes(v); err != nil { + return nil + } + return codes +} + +// RelayAgentInfo returns options embedded by the relay agent. +// +// The relay agent info option is described by RFC 3046. +func (d *DHCPv4) RelayAgentInfo() *RelayOptions { + v := d.Options.Get(OptionRelayAgentInformation) + if v == nil { + return nil + } + var relayOptions RelayOptions + if err := relayOptions.FromBytes(v); err != nil { + return nil + } + return &relayOptions +} + +// SubnetMask returns a subnet mask option contained if present. +// +// The subnet mask option is described by RFC 2132, Section 3.3. +func (d *DHCPv4) SubnetMask() net.IPMask { + v := d.Options.Get(OptionSubnetMask) + if v == nil { + return nil + } + var im IPMask + if err := im.FromBytes(v); err != nil { + return nil + } + return net.IPMask(im) +} + +// UserClass returns the user class if present. +// +// The user class information option is defined by RFC 3004. +func (d *DHCPv4) UserClass() *UserClass { + v := d.Options.Get(OptionUserClassInformation) + if v == nil { + return nil + } + var uc UserClass + if err := uc.FromBytes(v); err != nil { + return nil + } + return &uc +} + +// VIVC returns the vendor-identifying vendor class option if present. +func (d *DHCPv4) VIVC() VIVCIdentifiers { + v := d.Options.Get(OptionVendorIdentifyingVendorClass) + if v == nil { + return nil + } + var ids VIVCIdentifiers + if err := ids.FromBytes(v); err != nil { + return nil + } + return ids +} diff --git a/dhcpv4/modifiers.go b/dhcpv4/modifiers.go index 431fdfd1..41ad4f43 100644 --- a/dhcpv4/modifiers.go +++ b/dhcpv4/modifiers.go @@ -112,14 +112,9 @@ func WithMessageType(m MessageType) Modifier { // WithRequestedOptions adds requested options to the packet. func WithRequestedOptions(optionCodes ...OptionCode) Modifier { return func(d *DHCPv4) { - params := d.GetOneOption(OptionParameterRequestList) - if params == nil { - d.UpdateOption(OptParameterRequestList(optionCodes...)) - } else { - cl := OptionCodeList(GetParameterRequestList(d.Options)) - cl.Add(optionCodes...) - d.UpdateOption(OptParameterRequestList(cl...)) - } + cl := d.ParameterRequestList() + cl.Add(optionCodes...) + d.UpdateOption(OptParameterRequestList(cl...)) } } @@ -149,3 +144,7 @@ func WithDomainSearchList(searchList ...string) Modifier { Labels: searchList, })) } + +func WithGeneric(code OptionCode, value []byte) Modifier { + return WithOption(OptGeneric(code, value)) +} diff --git a/dhcpv4/modifiers_test.go b/dhcpv4/modifiers_test.go index 6233a7de..9b6c8ca7 100644 --- a/dhcpv4/modifiers_test.go +++ b/dhcpv4/modifiers_test.go @@ -39,7 +39,7 @@ func TestWithOptionModifier(t *testing.T) { d, err := New(WithOption(OptDomainName("slackware.it"))) require.NoError(t, err) - dnOpt := GetDomainName(d.Options) + dnOpt := d.DomainName() require.NotNil(t, dnOpt) require.Equal(t, "slackware.it", dnOpt) } @@ -68,28 +68,28 @@ func TestWithNetboot(t *testing.T) { d, err := New(WithNetboot) require.NoError(t, err) - require.Equal(t, "TFTP Server Name, Bootfile Name", GetParameterRequestList(d.Options).String()) + require.Equal(t, "TFTP Server Name, Bootfile Name", d.ParameterRequestList().String()) } func TestWithNetbootExistingTFTP(t *testing.T) { d, _ := New() d.UpdateOption(OptParameterRequestList(OptionTFTPServerName)) WithNetboot(d) - require.Equal(t, "TFTP Server Name, Bootfile Name", GetParameterRequestList(d.Options).String()) + require.Equal(t, "TFTP Server Name, Bootfile Name", d.ParameterRequestList().String()) } func TestWithNetbootExistingBootfileName(t *testing.T) { d, _ := New() d.UpdateOption(OptParameterRequestList(OptionBootfileName)) WithNetboot(d) - require.Equal(t, "TFTP Server Name, Bootfile Name", GetParameterRequestList(d.Options).String()) + require.Equal(t, "TFTP Server Name, Bootfile Name", d.ParameterRequestList().String()) } func TestWithNetbootExistingBoth(t *testing.T) { d, _ := New() d.UpdateOption(OptParameterRequestList(OptionBootfileName, OptionTFTPServerName)) WithNetboot(d) - require.Equal(t, "TFTP Server Name, Bootfile Name", GetParameterRequestList(d.Options).String()) + require.Equal(t, "TFTP Server Name, Bootfile Name", d.ParameterRequestList().String()) } func TestWithRequestedOptions(t *testing.T) { @@ -98,13 +98,13 @@ func TestWithRequestedOptions(t *testing.T) { require.NoError(t, err) require.NotNil(t, d) - opts := GetParameterRequestList(d.Options) + opts := d.ParameterRequestList() require.NotNil(t, opts) require.ElementsMatch(t, opts, []OptionCode{OptionFQDN}) // Check if already set options are preserved WithRequestedOptions(OptionHostName)(d) require.NotNil(t, d) - opts = GetParameterRequestList(d.Options) + opts = d.ParameterRequestList() require.NotNil(t, opts) require.ElementsMatch(t, opts, []OptionCode{OptionFQDN, OptionHostName}) } @@ -123,8 +123,7 @@ func TestWithNetmask(t *testing.T) { d, err := New(WithNetmask(net.IPv4Mask(255, 255, 255, 0))) require.NoError(t, err) - osm := GetSubnetMask(d.Options) - require.Equal(t, net.IPv4Mask(255, 255, 255, 0), osm) + require.Equal(t, net.IPv4Mask(255, 255, 255, 0), d.SubnetMask()) } func TestWithLeaseTime(t *testing.T) { @@ -132,15 +131,14 @@ func TestWithLeaseTime(t *testing.T) { require.NoError(t, err) require.True(t, d.Options.Has(OptionIPAddressLeaseTime)) - olt := GetIPAddressLeaseTime(d.Options, 10*time.Second) - require.Equal(t, 3600*time.Second, olt) + require.Equal(t, 3600*time.Second, d.IPAddressLeaseTime(10*time.Second)) } func TestWithDNS(t *testing.T) { d, err := New(WithDNS(net.ParseIP("10.0.0.1"), net.ParseIP("10.0.0.2"))) require.NoError(t, err) - dns := GetDNS(d.Options) + dns := d.DNS() require.Equal(t, net.ParseIP("10.0.0.1").To4(), dns[0]) require.Equal(t, net.ParseIP("10.0.0.2").To4(), dns[1]) } @@ -149,7 +147,7 @@ func TestWithDomainSearchList(t *testing.T) { d, err := New(WithDomainSearchList("slackware.it", "dhcp.slackware.it")) require.NoError(t, err) - osl := GetDomainSearch(d.Options) + osl := d.DomainSearch() require.NotNil(t, osl) require.Equal(t, 2, len(osl.Labels)) require.Equal(t, "slackware.it", osl.Labels[0]) @@ -161,6 +159,6 @@ func TestWithRouter(t *testing.T) { d, err := New(WithRouter(rtr)) require.NoError(t, err) - ortr := GetRouter(d.Options) + ortr := d.Router() require.Equal(t, rtr, ortr[0]) } diff --git a/dhcpv4/option_archtype.go b/dhcpv4/option_archtype.go index 00a44172..c0a901da 100644 --- a/dhcpv4/option_archtype.go +++ b/dhcpv4/option_archtype.go @@ -8,16 +8,3 @@ import ( func OptClientArch(archs ...iana.Arch) Option { return Option{Code: OptionClientSystemArchitectureType, Value: iana.Archs(archs)} } - -// GetClientArch returns the Client System Architecture Type option. -func GetClientArch(o Options) []iana.Arch { - v := o.Get(OptionClientSystemArchitectureType) - if v == nil { - return nil - } - var archs iana.Archs - if err := archs.FromBytes(v); err != nil { - return nil - } - return archs -} diff --git a/dhcpv4/option_archtype_test.go b/dhcpv4/option_archtype_test.go index fcf526b9..e5e501a5 100644 --- a/dhcpv4/option_archtype_test.go +++ b/dhcpv4/option_archtype_test.go @@ -8,33 +8,34 @@ import ( ) func TestParseOptClientArchType(t *testing.T) { - o := Options{OptionClientSystemArchitectureType.Code(): []byte{ + m, _ := New(WithGeneric(OptionClientSystemArchitectureType, []byte{ 0, 6, // EFI_IA32 - }} - archs := GetClientArch(o) + })) + archs := m.ClientArch() require.NotNil(t, archs) require.Equal(t, archs[0], iana.EFI_IA32) } func TestParseOptClientArchTypeMultiple(t *testing.T) { - o := Options{OptionClientSystemArchitectureType.Code(): []byte{ + m, _ := New(WithGeneric(OptionClientSystemArchitectureType, []byte{ 0, 6, // EFI_IA32 0, 2, // EFI_ITANIUM - }} - archs := GetClientArch(o) + })) + archs := m.ClientArch() require.NotNil(t, archs) require.Equal(t, archs[0], iana.EFI_IA32) require.Equal(t, archs[1], iana.EFI_ITANIUM) } func TestParseOptClientArchTypeInvalid(t *testing.T) { - o := Options{OptionClientSystemArchitectureType.Code(): []byte{42}} - archs := GetClientArch(o) + m, _ := New(WithGeneric(OptionClientSystemArchitectureType, []byte{42})) + archs := m.ClientArch() require.Nil(t, archs) } func TestGetClientArchEmpty(t *testing.T) { - require.Nil(t, GetClientArch(Options{})) + m, _ := New() + require.Nil(t, m.ClientArch()) } func TestOptClientArchTypeParseAndToBytesMultiple(t *testing.T) { diff --git a/dhcpv4/option_domain_search.go b/dhcpv4/option_domain_search.go index 6d2f7b21..b57754f5 100644 --- a/dhcpv4/option_domain_search.go +++ b/dhcpv4/option_domain_search.go @@ -10,18 +10,3 @@ import ( func OptDomainSearch(labels *rfc1035label.Labels) Option { return Option{Code: OptionDNSDomainSearchList, Value: labels} } - -// GetDomainSearch returns the domain search list in o, if present. -// -// The domain search option is described by RFC 3397, Section 2. -func GetDomainSearch(o Options) *rfc1035label.Labels { - v := o.Get(OptionDNSDomainSearchList) - if v == nil { - return nil - } - labels, err := rfc1035label.FromBytes(v) - if err != nil { - return nil - } - return labels -} diff --git a/dhcpv4/option_domain_search_test.go b/dhcpv4/option_domain_search_test.go index 9a508f2b..508797c8 100644 --- a/dhcpv4/option_domain_search_test.go +++ b/dhcpv4/option_domain_search_test.go @@ -12,10 +12,8 @@ func TestGetDomainSearch(t *testing.T) { 7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'c', 'o', 'm', 0, 6, 's', 'u', 'b', 'n', 'e', 't', 7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'o', 'r', 'g', 0, } - o := Options{ - OptionDNSDomainSearchList.Code(): data, - } - labels := GetDomainSearch(o) + m, _ := New(WithGeneric(OptionDNSDomainSearchList, data)) + labels := m.DomainSearch() require.NotNil(t, labels) require.Equal(t, 2, len(labels.Labels)) require.Equal(t, data, labels.ToBytes()) @@ -33,7 +31,6 @@ func TestOptDomainSearchToBytes(t *testing.T) { "example.com", "subnet.example.org", }, - }, - ) + }) require.Equal(t, opt.Value.ToBytes(), expected) } diff --git a/dhcpv4/option_ip.go b/dhcpv4/option_ip.go index 6a4206cf..a32d215d 100644 --- a/dhcpv4/option_ip.go +++ b/dhcpv4/option_ip.go @@ -40,13 +40,6 @@ func GetIP(code OptionCode, o Options) net.IP { return net.IP(ip) } -// GetBroadcastAddress returns the DHCPv4 Broadcast Address value in o. -// -// The broadcast address option is described in RFC 2132, Section 5.3. -func GetBroadcastAddress(o Options) net.IP { - return GetIP(OptionBroadcastAddress, o) -} - // OptBroadcastAddress returns a new DHCPv4 Broadcast Address option. // // The broadcast address option is described in RFC 2132, Section 5.3. @@ -54,13 +47,6 @@ func OptBroadcastAddress(ip net.IP) Option { return Option{Code: OptionBroadcastAddress, Value: IP(ip)} } -// GetRequestedIPAddress returns the DHCPv4 Requested IP Address value in o. -// -// The requested IP address option is described by RFC 2132, Section 9.1. -func GetRequestedIPAddress(o Options) net.IP { - return GetIP(OptionRequestedIPAddress, o) -} - // OptRequestedIPAddress returns a new DHCPv4 Requested IP Address option. // // The requested IP address option is described by RFC 2132, Section 9.1. @@ -68,13 +54,6 @@ func OptRequestedIPAddress(ip net.IP) Option { return Option{Code: OptionRequestedIPAddress, Value: IP(ip)} } -// GetServerIdentifier returns the DHCPv4 Server Identifier value in o. -// -// The server identifier option is described by RFC 2132, Section 9.7. -func GetServerIdentifier(o Options) net.IP { - return GetIP(OptionServerIdentifier, o) -} - // OptServerIdentifier returns a new DHCPv4 Server Identifier option. // // The server identifier option is described by RFC 2132, Section 9.7. diff --git a/dhcpv4/option_ip_address_lease_time.go b/dhcpv4/option_ip_address_lease_time.go index 6e092332..20ee2b8a 100644 --- a/dhcpv4/option_ip_address_lease_time.go +++ b/dhcpv4/option_ip_address_lease_time.go @@ -36,19 +36,3 @@ func (d Duration) String() string { func OptIPAddressLeaseTime(d time.Duration) Option { return Option{Code: OptionIPAddressLeaseTime, Value: Duration(d)} } - -// GetIPAddressLeaseTime returns the IP address lease time in o, or the given -// default duration if not present. -// -// The IP address lease time option is described by RFC 2132, Section 9.2. -func GetIPAddressLeaseTime(o Options, def time.Duration) time.Duration { - v := o.Get(OptionIPAddressLeaseTime) - if v == nil { - return def - } - var d Duration - if err := d.FromBytes(v); err != nil { - return def - } - return time.Duration(d) -} diff --git a/dhcpv4/option_ip_address_lease_time_test.go b/dhcpv4/option_ip_address_lease_time_test.go index 70c40473..edd709f3 100644 --- a/dhcpv4/option_ip_address_lease_time_test.go +++ b/dhcpv4/option_ip_address_lease_time_test.go @@ -15,20 +15,21 @@ func TestOptIPAddressLeaseTime(t *testing.T) { } func TestGetIPAddressLeaseTime(t *testing.T) { - o := Options{OptionIPAddressLeaseTime.Code(): []byte{0, 0, 168, 192}} - leaseTime := GetIPAddressLeaseTime(o, 0) + m, _ := New(WithGeneric(OptionIPAddressLeaseTime, []byte{0, 0, 168, 192})) + leaseTime := m.IPAddressLeaseTime(0) require.Equal(t, 43200*time.Second, leaseTime) // Too short. - o = Options{OptionIPAddressLeaseTime.Code(): []byte{168, 192}} - leaseTime = GetIPAddressLeaseTime(o, 0) + m, _ = New(WithGeneric(OptionIPAddressLeaseTime, []byte{168, 192})) + leaseTime = m.IPAddressLeaseTime(0) require.Equal(t, time.Duration(0), leaseTime) // Too long. - o = Options{OptionIPAddressLeaseTime.Code(): []byte{1, 1, 1, 1, 1}} - leaseTime = GetIPAddressLeaseTime(o, 0) + m, _ = New(WithGeneric(OptionIPAddressLeaseTime, []byte{1, 1, 1, 1, 1})) + leaseTime = m.IPAddressLeaseTime(0) require.Equal(t, time.Duration(0), leaseTime) // Empty. - require.Equal(t, time.Duration(10), GetIPAddressLeaseTime(Options{}, 10)) + m, _ = New() + require.Equal(t, time.Duration(10), m.IPAddressLeaseTime(10)) } diff --git a/dhcpv4/option_ips.go b/dhcpv4/option_ips.go index 693d62da..2a43dcfe 100644 --- a/dhcpv4/option_ips.go +++ b/dhcpv4/option_ips.go @@ -62,13 +62,6 @@ func GetIPs(code OptionCode, o Options) []net.IP { return []net.IP(ips) } -// GetRouter parses the DHCPv4 Router option if present. -// -// The Router option is described by RFC 2132, Section 3.5. -func GetRouter(o Options) []net.IP { - return GetIPs(OptionRouter, o) -} - // OptRouter returns a new DHCPv4 Router option. // // The Router option is described by RFC 2132, Section 3.5. @@ -84,13 +77,6 @@ func WithRouter(routers ...net.IP) Modifier { return WithOption(OptRouter(routers...)) } -// GetNTPServers parses the DHCPv4 NTP Servers option if present. -// -// The NTP servers option is described by RFC 2132, Section 8.3. -func GetNTPServers(o Options) []net.IP { - return GetIPs(OptionNTPServers, o) -} - // OptNTPServers returns a new DHCPv4 NTP Server option. // // The NTP servers option is described by RFC 2132, Section 8.3. @@ -101,13 +87,6 @@ func OptNTPServers(ntpServers ...net.IP) Option { } } -// GetDNS parses the DHCPv4 Domain Name Server option if present. -// -// The DNS server option is described by RFC 2132, Section 3.8. -func GetDNS(o Options) []net.IP { - return GetIPs(OptionDomainNameServer, o) -} - // OptDNS returns a new DHCPv4 Domain Name Server option. // // The DNS server option is described by RFC 2132, Section 3.8. diff --git a/dhcpv4/option_ips_test.go b/dhcpv4/option_ips_test.go index 1e1b772b..05b29393 100644 --- a/dhcpv4/option_ips_test.go +++ b/dhcpv4/option_ips_test.go @@ -43,9 +43,11 @@ func TestGetDomainNameServer(t *testing.T) { net.IP{192, 168, 0, 1}, net.IP{192, 168, 0, 10}, } - o := OptionsFromList(OptDNS(ips...)) - require.Equal(t, ips, GetDNS(o)) - require.Nil(t, GetDNS(Options{})) + m, _ := New(WithOption(OptDNS(ips...))) + require.Equal(t, ips, m.DNS()) + + m, _ = New() + require.Nil(t, m.DNS()) } func TestOptNTPServers(t *testing.T) { @@ -60,9 +62,11 @@ func TestGetNTPServers(t *testing.T) { net.IP{192, 168, 0, 1}, net.IP{192, 168, 0, 10}, } - o := OptionsFromList(OptNTPServers(ips...)) - require.Equal(t, ips, GetNTPServers(o)) - require.Nil(t, GetNTPServers(Options{})) + m, _ := New(WithOption(OptNTPServers(ips...))) + require.Equal(t, ips, m.NTPServers()) + + m, _ = New() + require.Nil(t, m.NTPServers()) } func TestOptRouter(t *testing.T) { @@ -77,7 +81,9 @@ func TestGetRouter(t *testing.T) { net.IP{192, 168, 0, 1}, net.IP{192, 168, 0, 10}, } - o := OptionsFromList(OptRouter(ips...)) - require.Equal(t, ips, GetRouter(o)) - require.Nil(t, GetRouter(Options{})) + m, _ := New(WithOption(OptRouter(ips...))) + require.Equal(t, ips, m.Router()) + + m, _ = New() + require.Nil(t, m.Router()) } diff --git a/dhcpv4/option_maximum_dhcp_message_size.go b/dhcpv4/option_maximum_dhcp_message_size.go index 900eea57..1f31bc24 100644 --- a/dhcpv4/option_maximum_dhcp_message_size.go +++ b/dhcpv4/option_maximum_dhcp_message_size.go @@ -48,10 +48,3 @@ func GetUint16(code OptionCode, o Options) (uint16, error) { func OptMaxMessageSize(size uint16) Option { return Option{Code: OptionMaximumDHCPMessageSize, Value: Uint16(size)} } - -// GetMaxMessageSize returns the DHCP Maximum Message Size in o if present. -// -// The Maximum DHCP Message Size option is described by RFC 2132, Section 9.10. -func GetMaxMessageSize(o Options) (uint16, error) { - return GetUint16(OptionMaximumDHCPMessageSize, o) -} diff --git a/dhcpv4/option_maximum_dhcp_message_size_test.go b/dhcpv4/option_maximum_dhcp_message_size_test.go index 147f2808..2f855603 100644 --- a/dhcpv4/option_maximum_dhcp_message_size_test.go +++ b/dhcpv4/option_maximum_dhcp_message_size_test.go @@ -14,18 +14,18 @@ func TestOptMaximumDHCPMessageSize(t *testing.T) { } func TestGetMaximumDHCPMessageSize(t *testing.T) { - options := Options{OptionMaximumDHCPMessageSize.Code(): []byte{5, 220}} - o, err := GetMaxMessageSize(options) + m, _ := New(WithGeneric(OptionMaximumDHCPMessageSize, []byte{5, 220})) + o, err := m.MaxMessageSize() require.NoError(t, err) require.Equal(t, uint16(1500), o) // Short byte stream - options = Options{OptionMaximumDHCPMessageSize.Code(): []byte{2}} - _, err = GetMaxMessageSize(options) + m, _ = New(WithGeneric(OptionMaximumDHCPMessageSize, []byte{2})) + _, err = m.MaxMessageSize() require.Error(t, err, "should get error from short byte stream") // Bad length - options = Options{OptionMaximumDHCPMessageSize.Code(): []byte{1, 1, 1}} - _, err = GetMaxMessageSize(options) + m, _ = New(WithGeneric(OptionMaximumDHCPMessageSize, []byte{2, 2, 2})) + _, err = m.MaxMessageSize() require.Error(t, err, "should get error from bad length") } diff --git a/dhcpv4/option_message_type.go b/dhcpv4/option_message_type.go index 141e3b79..1f4c14f2 100644 --- a/dhcpv4/option_message_type.go +++ b/dhcpv4/option_message_type.go @@ -4,16 +4,3 @@ package dhcpv4 func OptMessageType(m MessageType) Option { return Option{Code: OptionDHCPMessageType, Value: m} } - -// GetMessageType returns the DHCPv4 Message Type option in o. -func GetMessageType(o Options) MessageType { - v := o.Get(OptionDHCPMessageType) - if v == nil { - return MessageTypeNone - } - var m MessageType - if err := m.FromBytes(v); err != nil { - return MessageTypeNone - } - return m -} diff --git a/dhcpv4/option_message_type_test.go b/dhcpv4/option_message_type_test.go index a97889e7..4ba5338c 100644 --- a/dhcpv4/option_message_type_test.go +++ b/dhcpv4/option_message_type_test.go @@ -31,7 +31,9 @@ func TestParseOptMessageType(t *testing.T) { } func TestGetMessageType(t *testing.T) { - o := OptionsFromList(OptMessageType(MessageTypeDiscover)) - require.Equal(t, MessageTypeDiscover, GetMessageType(o)) - require.Equal(t, MessageTypeNone, GetMessageType(Options{})) + m, _ := New(WithMessageType(MessageTypeDiscover)) + require.Equal(t, MessageTypeDiscover, m.MessageType()) + + m, _ = New() + require.Equal(t, MessageTypeNone, m.MessageType()) } diff --git a/dhcpv4/option_parameter_request_list.go b/dhcpv4/option_parameter_request_list.go index 81d5efbe..99f2445c 100644 --- a/dhcpv4/option_parameter_request_list.go +++ b/dhcpv4/option_parameter_request_list.go @@ -64,21 +64,6 @@ func (ol *OptionCodeList) FromBytes(data []byte) error { return buf.FinError() } -// GetParameterRequestList returns the DHCPv4 Parameter Request List in o. -// -// The parameter request list option is described by RFC 2132, Section 9.8. -func GetParameterRequestList(o Options) OptionCodeList { - v := o.Get(OptionParameterRequestList) - if v == nil { - return nil - } - var codes OptionCodeList - if err := codes.FromBytes(v); err != nil { - return nil - } - return codes -} - // OptParameterRequestList returns a new DHCPv4 Parameter Request List. // // The parameter request list option is described by RFC 2132, Section 9.8. diff --git a/dhcpv4/option_relay_agent_information.go b/dhcpv4/option_relay_agent_information.go index fb86c70d..8b88b0cb 100644 --- a/dhcpv4/option_relay_agent_information.go +++ b/dhcpv4/option_relay_agent_information.go @@ -36,18 +36,3 @@ func (r *RelayOptions) FromBytes(data []byte) error { func OptRelayAgentInfo(o ...Option) Option { return Option{Code: OptionRelayAgentInformation, Value: RelayOptions{OptionsFromList(o...)}} } - -// GetRelayAgentInfo returns options embedded by the relay agent. -// -// The relay agent info option is described by RFC 3046. -func GetRelayAgentInfo(o Options) *RelayOptions { - v := o.Get(OptionRelayAgentInformation) - if v == nil { - return nil - } - var relayOptions RelayOptions - if err := relayOptions.FromBytes(v); err != nil { - return nil - } - return &relayOptions -} diff --git a/dhcpv4/option_relay_agent_information_test.go b/dhcpv4/option_relay_agent_information_test.go index 6a7b2753..d16aedd5 100644 --- a/dhcpv4/option_relay_agent_information_test.go +++ b/dhcpv4/option_relay_agent_information_test.go @@ -7,14 +7,12 @@ import ( ) func TestGetRelayAgentInformation(t *testing.T) { - o := Options{ - OptionRelayAgentInformation.Code(): []byte{ - 1, 5, 'l', 'i', 'n', 'u', 'x', - 2, 4, 'b', 'o', 'o', 't', - }, - } + m, _ := New(WithGeneric(OptionRelayAgentInformation, []byte{ + 1, 5, 'l', 'i', 'n', 'u', 'x', + 2, 4, 'b', 'o', 'o', 't', + })) - opt := GetRelayAgentInfo(o) + opt := m.RelayAgentInfo() require.NotNil(t, opt) require.Equal(t, len(opt.Options), 2) @@ -24,15 +22,14 @@ func TestGetRelayAgentInformation(t *testing.T) { require.Equal(t, remote, []byte("boot")) // Empty. - require.Nil(t, GetRelayAgentInfo(Options{})) + m, _ = New() + require.Nil(t, m.RelayAgentInfo()) // Invalid contents. - o = Options{ - OptionRelayAgentInformation.Code(): []byte{ - 1, 7, 'l', 'i', 'n', 'u', 'x', - }, - } - require.Nil(t, GetRelayAgentInfo(o)) + m, _ = New(WithGeneric(OptionRelayAgentInformation, []byte{ + 1, 7, 'l', 'i', 'n', 'u', 'x', + })) + require.Nil(t, m.RelayAgentInfo()) } func TestOptRelayAgentInfo(t *testing.T) { diff --git a/dhcpv4/option_string.go b/dhcpv4/option_string.go index 9e16d6c6..b505575c 100644 --- a/dhcpv4/option_string.go +++ b/dhcpv4/option_string.go @@ -38,13 +38,6 @@ func OptDomainName(name string) Option { return Option{Code: OptionDomainName, Value: String(name)} } -// GetDomainName parses the DHCPv4 Domain Name option from o if present. -// -// The Domain Name option is described by RFC 2132, Section 3.17. -func GetDomainName(o Options) string { - return GetString(OptionDomainName, o) -} - // OptHostName returns a new DHCPv4 Host Name option. // // The Host Name option is described by RFC 2132, Section 3.14. @@ -52,13 +45,6 @@ func OptHostName(name string) Option { return Option{Code: OptionHostName, Value: String(name)} } -// GetHostName parses the DHCPv4 Host Name option from o if present. -// -// The Host Name option is described by RFC 2132, Section 3.14. -func GetHostName(o Options) string { - return GetString(OptionHostName, o) -} - // OptRootPath returns a new DHCPv4 Root Path option. // // The Root Path option is described by RFC 2132, Section 3.19. @@ -66,13 +52,6 @@ func OptRootPath(name string) Option { return Option{Code: OptionRootPath, Value: String(name)} } -// GetRootPath parses the DHCPv4 Root Path option from o if present. -// -// The Root Path option is described by RFC 2132, Section 3.19. -func GetRootPath(o Options) string { - return GetString(OptionRootPath, o) -} - // OptBootFileName returns a new DHCPv4 Boot File Name option. // // The Bootfile Name option is described by RFC 2132, Section 9.5. @@ -80,13 +59,6 @@ func OptBootFileName(name string) Option { return Option{Code: OptionBootfileName, Value: String(name)} } -// GetBootFileName parses the DHCPv4 Bootfile Name option from o if present. -// -// The Bootfile Name option is described by RFC 2132, Section 9.5. -func GetBootFileName(o Options) string { - return GetString(OptionBootfileName, o) -} - // OptTFTPServerName returns a new DHCPv4 TFTP Server Name option. // // The TFTP Server Name option is described by RFC 2132, Section 9.4. @@ -94,24 +66,9 @@ func OptTFTPServerName(name string) Option { return Option{Code: OptionTFTPServerName, Value: String(name)} } -// GetTFTPServerName parses the DHCPv4 TFTP Server Name option from o if -// present. -// -// The TFTP Server Name option is described by RFC 2132, Section 9.4. -func GetTFTPServerName(o Options) string { - return GetString(OptionTFTPServerName, o) -} - // OptClassIdentifier returns a new DHCPv4 Class Identifier option. // // The Vendor Class Identifier option is described by RFC 2132, Section 9.13. func OptClassIdentifier(name string) Option { return Option{Code: OptionClassIdentifier, Value: String(name)} } - -// GetClassIdentifier parses the DHCPv4 Class Identifier option from o if present. -// -// The Vendor Class Identifier option is described by RFC 2132, Section 9.13. -func GetClassIdentifier(o Options) string { - return GetString(OptionClassIdentifier, o) -} diff --git a/dhcpv4/option_string_test.go b/dhcpv4/option_string_test.go index bda6009f..4dbb77df 100644 --- a/dhcpv4/option_string_test.go +++ b/dhcpv4/option_string_test.go @@ -14,11 +14,11 @@ func TestOptDomainName(t *testing.T) { } func TestParseOptDomainName(t *testing.T) { - o := Options{ - OptionDomainName.Code(): []byte{'t', 'e', 's', 't'}, - } - require.Equal(t, "test", GetDomainName(o)) - require.Equal(t, "", GetDomainName(Options{})) + m, _ := New(WithGeneric(OptionDomainName, []byte{'t', 'e', 's', 't'})) + require.Equal(t, "test", m.DomainName()) + + m, _ = New() + require.Equal(t, "", m.DomainName()) } func TestOptHostName(t *testing.T) { @@ -29,11 +29,11 @@ func TestOptHostName(t *testing.T) { } func TestParseOptHostName(t *testing.T) { - o := Options{ - OptionHostName.Code(): []byte{'t', 'e', 's', 't'}, - } - require.Equal(t, "test", GetHostName(o)) - require.Equal(t, "", GetHostName(Options{})) + m, _ := New(WithGeneric(OptionHostName, []byte{'t', 'e', 's', 't'})) + require.Equal(t, "test", m.HostName()) + + m, _ = New() + require.Equal(t, "", m.HostName()) } func TestOptRootPath(t *testing.T) { @@ -44,9 +44,11 @@ func TestOptRootPath(t *testing.T) { } func TestParseOptRootPath(t *testing.T) { - o := OptionsFromList(OptRootPath("test")) - require.Equal(t, "test", GetRootPath(o)) - require.Equal(t, "", GetRootPath(Options{})) + m, _ := New(WithGeneric(OptionRootPath, []byte{'t', 'e', 's', 't'})) + require.Equal(t, "test", m.RootPath()) + + m, _ = New() + require.Equal(t, "", m.RootPath()) } func TestOptBootFileName(t *testing.T) { @@ -57,9 +59,11 @@ func TestOptBootFileName(t *testing.T) { } func TestParseOptBootFileName(t *testing.T) { - o := OptionsFromList(OptBootFileName("test")) - require.Equal(t, "test", GetBootFileName(o)) - require.Equal(t, "", GetBootFileName(Options{})) + m, _ := New(WithGeneric(OptionBootfileName, []byte{'t', 'e', 's', 't'})) + require.Equal(t, "test", m.BootFileNameOption()) + + m, _ = New() + require.Equal(t, "", m.BootFileNameOption()) } func TestOptTFTPServerName(t *testing.T) { @@ -70,9 +74,11 @@ func TestOptTFTPServerName(t *testing.T) { } func TestParseOptTFTPServerName(t *testing.T) { - o := OptionsFromList(OptTFTPServerName("test")) - require.Equal(t, "test", GetTFTPServerName(o)) - require.Equal(t, "", GetTFTPServerName(Options{})) + m, _ := New(WithGeneric(OptionTFTPServerName, []byte{'t', 'e', 's', 't'})) + require.Equal(t, "test", m.TFTPServerName()) + + m, _ = New() + require.Equal(t, "", m.TFTPServerName()) } func TestOptClassIdentifier(t *testing.T) { @@ -83,7 +89,9 @@ func TestOptClassIdentifier(t *testing.T) { } func TestParseOptClassIdentifier(t *testing.T) { - o := OptionsFromList(OptClassIdentifier("test")) - require.Equal(t, "test", GetClassIdentifier(o)) - require.Equal(t, "", GetClassIdentifier(Options{})) + m, _ := New(WithGeneric(OptionClassIdentifier, []byte{'t', 'e', 's', 't'})) + require.Equal(t, "test", m.ClassIdentifier()) + + m, _ = New() + require.Equal(t, "", m.ClassIdentifier()) } diff --git a/dhcpv4/option_subnet_mask.go b/dhcpv4/option_subnet_mask.go index 82b344b6..a0c6567b 100644 --- a/dhcpv4/option_subnet_mask.go +++ b/dhcpv4/option_subnet_mask.go @@ -31,21 +31,6 @@ func (im *IPMask) FromBytes(data []byte) error { return buf.FinError() } -// GetSubnetMask returns a subnet mask option contained in o, if there is one. -// -// The subnet mask option is described by RFC 2132, Section 3.3. -func GetSubnetMask(o Options) net.IPMask { - v := o.Get(OptionSubnetMask) - if v == nil { - return nil - } - var im IPMask - if err := im.FromBytes(v); err != nil { - return nil - } - return net.IPMask(im) -} - // OptSubnetMask returns a new DHCPv4 SubnetMask option per RFC 2132, Section 3.3. func OptSubnetMask(mask net.IPMask) Option { return Option{ diff --git a/dhcpv4/option_subnet_mask_test.go b/dhcpv4/option_subnet_mask_test.go index bc82cf1e..f9831b6c 100644 --- a/dhcpv4/option_subnet_mask_test.go +++ b/dhcpv4/option_subnet_mask_test.go @@ -15,15 +15,15 @@ func TestOptSubnetMask(t *testing.T) { } func TestGetSubnetMask(t *testing.T) { - o := OptionsFromList(OptSubnetMask(net.IPMask{})) - mask := GetSubnetMask(o) + m, _ := New(WithOption(OptSubnetMask(net.IPMask{}))) + mask := m.SubnetMask() require.Nil(t, mask, "empty byte stream") - o = OptionsFromList(OptSubnetMask(net.IPMask{255})) - mask = GetSubnetMask(o) + m, _ = New(WithOption(OptSubnetMask(net.IPMask{255}))) + mask = m.SubnetMask() require.Nil(t, mask, "short byte stream") - o = OptionsFromList(OptSubnetMask(net.IPMask{255, 255, 255, 0})) - mask = GetSubnetMask(o) + m, _ = New(WithOption(OptSubnetMask(net.IPMask{255, 255, 255, 0}))) + mask = m.SubnetMask() require.Equal(t, net.IPMask{255, 255, 255, 0}, mask) } diff --git a/dhcpv4/option_userclass.go b/dhcpv4/option_userclass.go index f273a846..69ceebaf 100644 --- a/dhcpv4/option_userclass.go +++ b/dhcpv4/option_userclass.go @@ -14,21 +14,6 @@ type UserClass struct { RFC3004 bool } -// GetUserClass returns the user class in o if present. -// -// The user class information option is defined by RFC 3004. -func GetUserClass(o Options) *UserClass { - v := o.Get(OptionUserClassInformation) - if v == nil { - return nil - } - var uc UserClass - if err := uc.FromBytes(v); err != nil { - return nil - } - return &uc -} - // OptUserClass returns a new user class option. func OptUserClass(v []byte) Option { return Option{ diff --git a/dhcpv4/option_vivc.go b/dhcpv4/option_vivc.go index 509ba808..a669d273 100644 --- a/dhcpv4/option_vivc.go +++ b/dhcpv4/option_vivc.go @@ -25,19 +25,6 @@ func OptVIVC(identifiers ...VIVCIdentifier) Option { } } -// GetVIVC returns the vendor-identifying vendor class option in o if present. -func GetVIVC(o Options) VIVCIdentifiers { - v := o.Get(OptionVendorIdentifyingVendorClass) - if v == nil { - return nil - } - var ids VIVCIdentifiers - if err := ids.FromBytes(v); err != nil { - return nil - } - return ids -} - // VIVCIdentifiers implements encoding and decoding methods for a DHCP option // described in RFC 3925. type VIVCIdentifiers []VIVCIdentifier diff --git a/dhcpv4/option_vivc_test.go b/dhcpv4/option_vivc_test.go index b1ec398e..77b64b78 100644 --- a/dhcpv4/option_vivc_test.go +++ b/dhcpv4/option_vivc_test.go @@ -30,23 +30,24 @@ func TestOptVIVCInterfaceMethods(t *testing.T) { } func TestParseOptVICO(t *testing.T) { - options := Options{OptionVendorIdentifyingVendorClass.Code(): sampleVIVCOptRaw} - o := GetVIVC(options) + m, _ := New(WithGeneric(OptionVendorIdentifyingVendorClass, sampleVIVCOptRaw)) + o := m.VIVC() require.Equal(t, sampleVIVCOpt, o) // Identifier len too long data := make([]byte, len(sampleVIVCOptRaw)) copy(data, sampleVIVCOptRaw) data[4] = 40 - options = Options{OptionVendorIdentifyingVendorClass.Code(): data} - o = GetVIVC(options) + m, _ = New(WithGeneric(OptionVendorIdentifyingVendorClass, data)) + o = m.VIVC() require.Nil(t, o, "should get error from bad length") // Longer than length data[4] = 5 - options = Options{OptionVendorIdentifyingVendorClass.Code(): data[:10]} - o = GetVIVC(options) + m, _ = New(WithGeneric(OptionVendorIdentifyingVendorClass, data[:10])) + o = m.VIVC() require.Equal(t, o[0].Data, []byte("Cisco")) - require.Equal(t, VIVCIdentifiers(nil), GetVIVC(Options{})) + m, _ = New() + require.Equal(t, VIVCIdentifiers(nil), m.VIVC()) } diff --git a/dhcpv4/server_test.go b/dhcpv4/server_test.go index 8626451d..3cfd4e1d 100644 --- a/dhcpv4/server_test.go +++ b/dhcpv4/server_test.go @@ -42,8 +42,7 @@ func DORAHandler(conn net.PacketConn, peer net.Addr, m *DHCPv4) { return } reply.UpdateOption(OptServerIdentifier(net.IP{1, 2, 3, 4})) - mt := GetMessageType(m.Options) - switch mt { + switch mt := m.MessageType(); mt { case MessageTypeDiscover: reply.UpdateOption(OptMessageType(MessageTypeOffer)) case MessageTypeRequest: diff --git a/dhcpv4/ztpv4/ztp.go b/dhcpv4/ztpv4/ztp.go index 4401e9dd..1bcb44f9 100644 --- a/dhcpv4/ztpv4/ztp.go +++ b/dhcpv4/ztpv4/ztp.go @@ -18,7 +18,7 @@ var errVendorOptionMalformed = errors.New("malformed vendor option") // ParseVendorData will try to parse dhcp4 options looking for more // specific vendor data (like model, serial number, etc). func ParseVendorData(packet *dhcpv4.DHCPv4) (*VendorData, error) { - vc := dhcpv4.GetClassIdentifier(packet.Options) + vc := packet.ClassIdentifier() if len(vc) == 0 { return nil, errors.New("vendor options not found") } @@ -58,7 +58,7 @@ func ParseVendorData(packet *dhcpv4.DHCPv4) (*VendorData, error) { p := strings.Split(vc, "-") if len(p) < 3 { vd.Model = p[1] - vd.Serial = dhcpv4.GetHostName(packet.Options) + vd.Serial = packet.HostName() if len(vd.Serial) == 0 { return nil, errors.New("host name option is missing") } diff --git a/netboot/netconf.go b/netboot/netconf.go index 8c562623..de4d23d1 100644 --- a/netboot/netconf.go +++ b/netboot/netconf.go @@ -87,7 +87,7 @@ func GetNetConfFromPacketv4(d *dhcpv4.DHCPv4) (*NetConf, error) { // get the subnet mask from OptionSubnetMask. If the netmask is not defined // in the packet, an error is returned - netmask := dhcpv4.GetSubnetMask(d.Options) + netmask := d.SubnetMask() if netmask == nil { return nil, errors.New("no netmask option in response packet") } @@ -99,7 +99,7 @@ func GetNetConfFromPacketv4(d *dhcpv4.DHCPv4) (*NetConf, error) { // netconf struct requires a valid lifetime to be specified. ValidLifetime is a dhcpv6 // concept, the closest mapping in dhcpv4 world is "IP Address Lease Time". If the lease // time option is nil, we set it to 0 - leaseTime := dhcpv4.GetIPAddressLeaseTime(d.Options, 0) + leaseTime := d.IPAddressLeaseTime(0) netconf.Addresses = append(netconf.Addresses, AddrConf{ IPNet: net.IPNet{ @@ -111,14 +111,14 @@ func GetNetConfFromPacketv4(d *dhcpv4.DHCPv4) (*NetConf, error) { }) // get DNS configuration - dnsServers := dhcpv4.GetDNS(d.Options) + dnsServers := d.DNS() if len(dnsServers) == 0 { return nil, errors.New("no dns servers options in response packet") } netconf.DNSServers = dnsServers // get domain search list - dnsSearchList := dhcpv4.GetDomainSearch(d.Options) + dnsSearchList := d.DomainSearch() if dnsSearchList != nil { if len(dnsSearchList.Labels) == 0 { return nil, errors.New("dns search list is empty") @@ -127,7 +127,7 @@ func GetNetConfFromPacketv4(d *dhcpv4.DHCPv4) (*NetConf, error) { } // get default gateway - routersList := dhcpv4.GetRouter(d.Options) + routersList := d.Router() if len(routersList) == 0 { return nil, errors.New("no routers specified in the corresponding option") } From ee7c940a4ba8ec5f0971d2b0cf89ebcfc6057b18 Mon Sep 17 00:00:00 2001 From: insomniac Date: Fri, 25 Jan 2019 00:48:52 +0000 Subject: [PATCH 09/43] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 7ac418f8..8d1826b1 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -5,3 +5,4 @@ * Sean Karlage (BSDP package, and of tons of improvements to the DHCPv4 package) * Owen Mooney (several option fixes and modifiers) * Mikolaj Walczak (asynchronous DHCPv6 client) +* Chris Koch (tons of improvements in DHCPv4 and DHCPv6 internals and interface) From 6a9ec900f656439652b2f20e34b2452d561eb0a6 Mon Sep 17 00:00:00 2001 From: Pablo Mazzini Date: Fri, 25 Jan 2019 20:43:12 +0000 Subject: [PATCH 10/43] [async] re-add modifiers to Send method (#239) --- dhcpv4/async/client.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dhcpv4/async/client.go b/dhcpv4/async/client.go index 81b10f7c..617c7115 100644 --- a/dhcpv4/async/client.go +++ b/dhcpv4/async/client.go @@ -194,7 +194,11 @@ func (c *Client) remoteAddr() (*net.UDPAddr, error) { // Send inserts a message to the queue to be sent asynchronously. // Returns a future which resolves to response and error. -func (c *Client) Send(message *dhcpv4.DHCPv4) *promise.Future { +func (c *Client) Send(message *dhcpv4.DHCPv4, modifiers ...dhcpv4.Modifier) *promise.Future { + for _, mod := range modifiers { + mod(message) + } + p := promise.NewPromise() c.packetsLock.Lock() c.packets[message.TransactionID] = p From 8936b6e4e714e0b682e37fa81fde29606e58e7c2 Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 04:05:36 +0000 Subject: [PATCH 11/43] dhcpv6: introduce options type. --- dhcpv6/dhcpv6.go | 41 +----------- dhcpv6/dhcpv6message.go | 18 ++---- dhcpv6/dhcpv6relay.go | 19 ++---- dhcpv6/option_iaaddress.go | 6 +- dhcpv6/option_iaprefix.go | 10 ++- dhcpv6/option_nontemporaryaddress.go | 12 ++-- dhcpv6/option_nontemporaryaddress_test.go | 4 +- dhcpv6/option_prefixdelegation.go | 10 ++- dhcpv6/option_relaymsg_test.go | 3 +- dhcpv6/option_vendor_opts.go | 6 +- dhcpv6/options.go | 79 +++++++++++++++++++---- 11 files changed, 102 insertions(+), 106 deletions(-) diff --git a/dhcpv6/dhcpv6.go b/dhcpv6/dhcpv6.go index 9382334c..c9f8c054 100644 --- a/dhcpv6/dhcpv6.go +++ b/dhcpv6/dhcpv6.go @@ -57,12 +57,10 @@ func FromBytes(data []byte) (DHCPv6, error) { d.linkAddr = linkAddr peerAddr = append(peerAddr, data[18:34]...) d.peerAddr = peerAddr - options, err := OptionsFromBytes(data[34:]) - if err != nil { + // TODO fail if no OptRelayMessage is present + if err := d.options.FromBytes(data[34:]); err != nil { return nil, err } - // TODO fail if no OptRelayMessage is present - d.options = options return &d, nil } else { tid, err := BytesToTransactionID(data[1:4]) @@ -73,11 +71,9 @@ func FromBytes(data []byte) (DHCPv6, error) { messageType: messageType, transactionID: *tid, } - options, err := OptionsFromBytes(data[4:]) - if err != nil { + if err := d.options.FromBytes(data[4:]); err != nil { return nil, err } - d.options = options return &d, nil } } @@ -100,37 +96,6 @@ func NewMessage(modifiers ...Modifier) (DHCPv6, error) { return d, nil } -func getOptions(options []Option, code OptionCode, onlyFirst bool) []Option { - var ret []Option - for _, opt := range options { - if opt.Code() == code { - ret = append(ret, opt) - if onlyFirst { - break - } - } - } - return ret -} - -func getOption(options []Option, code OptionCode) Option { - opts := getOptions(options, code, true) - if opts == nil { - return nil - } - return opts[0] -} - -func delOption(options []Option, code OptionCode) []Option { - newOpts := make([]Option, 0, len(options)) - for _, opt := range options { - if opt.Code() != code { - newOpts = append(newOpts, opt) - } - } - return newOpts -} - // DecapsulateRelay extracts the content of a relay message. It does not recurse // if there are nested relay messages. Returns the original packet if is not not // a relay message diff --git a/dhcpv6/dhcpv6message.go b/dhcpv6/dhcpv6message.go index a95d9cea..abccf43b 100644 --- a/dhcpv6/dhcpv6message.go +++ b/dhcpv6/dhcpv6message.go @@ -17,7 +17,7 @@ const MessageHeaderSize = 4 type DHCPv6Message struct { messageType MessageType transactionID uint32 // only 24 bits are used though - options []Option + options Options } func BytesToTransactionID(data []byte) (*uint32, error) { @@ -277,21 +277,13 @@ func (d *DHCPv6Message) SetOptions(options []Option) { } func (d *DHCPv6Message) AddOption(option Option) { - d.options = append(d.options, option) + d.options.Add(option) } // UpdateOption updates the existing options with the passed option, adding it // at the end if not present already func (d *DHCPv6Message) UpdateOption(option Option) { - for idx, opt := range d.options { - if opt.Code() == option.Code() { - d.options[idx] = option - // don't look further - return - } - } - // if not found, add it - d.AddOption(option) + d.options.Update(option) } // IsNetboot returns true if the machine is trying to netboot. It checks if @@ -373,11 +365,11 @@ func (d *DHCPv6Message) Options() []Option { } func (d *DHCPv6Message) GetOption(code OptionCode) []Option { - return getOptions(d.options, code, false) + return d.options.Get(code) } func (d *DHCPv6Message) GetOneOption(code OptionCode) Option { - return getOption(d.options, code) + return d.options.GetOne(code) } func (d *DHCPv6Message) IsRelay() bool { diff --git a/dhcpv6/dhcpv6relay.go b/dhcpv6/dhcpv6relay.go index 220fd3db..b51c139f 100644 --- a/dhcpv6/dhcpv6relay.go +++ b/dhcpv6/dhcpv6relay.go @@ -13,7 +13,7 @@ type DHCPv6Relay struct { hopCount uint8 linkAddr net.IP peerAddr net.IP - options []Option + options Options } func (r *DHCPv6Relay) Type() MessageType { @@ -102,12 +102,13 @@ func (r *DHCPv6Relay) Length() int { func (r *DHCPv6Relay) Options() []Option { return r.options } + func (r *DHCPv6Relay) GetOption(code OptionCode) []Option { - return getOptions(r.options, code, false) + return r.options.Get(code) } func (r *DHCPv6Relay) GetOneOption(code OptionCode) Option { - return getOption(r.options, code) + return r.options.GetOne(code) } func (r *DHCPv6Relay) SetOptions(options []Option) { @@ -115,20 +116,12 @@ func (r *DHCPv6Relay) SetOptions(options []Option) { } func (r *DHCPv6Relay) AddOption(option Option) { - r.options = append(r.options, option) + r.options.Add(option) } // UpdateOption replaces the first option of the same type as the specified one. func (r *DHCPv6Relay) UpdateOption(option Option) { - for idx, opt := range r.options { - if opt.Code() == option.Code() { - r.options[idx] = option - // don't look further - return - } - } - // if not found, add it - r.AddOption(option) + r.options.Update(option) } func (r *DHCPv6Relay) IsRelay() bool { diff --git a/dhcpv6/option_iaaddress.go b/dhcpv6/option_iaaddress.go index 6f430db3..811cbbe6 100644 --- a/dhcpv6/option_iaaddress.go +++ b/dhcpv6/option_iaaddress.go @@ -14,7 +14,7 @@ type OptIAAddress struct { IPv6Addr net.IP PreferredLifetime uint32 ValidLifetime uint32 - Options []Option + Options Options } // Code returns the option's code @@ -54,7 +54,6 @@ func (op *OptIAAddress) String() string { // of bytes. The input data does not include option code and length // bytes. func ParseOptIAAddress(data []byte) (*OptIAAddress, error) { - var err error opt := OptIAAddress{} if len(data) < 24 { return nil, fmt.Errorf("Invalid IA Address data length. Expected at least 24 bytes, got %v", len(data)) @@ -62,8 +61,7 @@ func ParseOptIAAddress(data []byte) (*OptIAAddress, error) { opt.IPv6Addr = net.IP(data[:16]) opt.PreferredLifetime = binary.BigEndian.Uint32(data[16:20]) opt.ValidLifetime = binary.BigEndian.Uint32(data[20:24]) - opt.Options, err = OptionsFromBytes(data[24:]) - if err != nil { + if err := opt.Options.FromBytes(data[24:]); err != nil { return nil, err } return &opt, nil diff --git a/dhcpv6/option_iaprefix.go b/dhcpv6/option_iaprefix.go index 8a39531e..2f71fb04 100644 --- a/dhcpv6/option_iaprefix.go +++ b/dhcpv6/option_iaprefix.go @@ -14,7 +14,7 @@ type OptIAPrefix struct { ValidLifetime uint32 prefixLength byte ipv6Prefix net.IP - Options []Option + Options Options } func (op *OptIAPrefix) Code() OptionCode { @@ -70,18 +70,17 @@ func (op *OptIAPrefix) String() string { // 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) + return op.Options.GetOne(code) } // DelOption will remove all the options that match a Option code. func (op *OptIAPrefix) DelOption(code OptionCode) { - op.Options = delOption(op.Options, code) + op.Options.Del(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)) @@ -90,8 +89,7 @@ func ParseOptIAPrefix(data []byte) (*OptIAPrefix, error) { opt.ValidLifetime = binary.BigEndian.Uint32(data[4:8]) opt.prefixLength = data[8] opt.ipv6Prefix = net.IP(data[9:25]) - opt.Options, err = OptionsFromBytes(data[25:]) - if err != nil { + if err := opt.Options.FromBytes(data[25:]); err != nil { return nil, err } return &opt, nil diff --git a/dhcpv6/option_nontemporaryaddress.go b/dhcpv6/option_nontemporaryaddress.go index ec09937c..94f79c00 100644 --- a/dhcpv6/option_nontemporaryaddress.go +++ b/dhcpv6/option_nontemporaryaddress.go @@ -12,7 +12,7 @@ type OptIANA struct { IaId [4]byte T1 uint32 T2 uint32 - Options []Option + Options Options } func (op *OptIANA) Code() OptionCode { @@ -47,24 +47,23 @@ func (op *OptIANA) String() string { // AddOption adds an option at the end of the IA_NA options func (op *OptIANA) AddOption(opt Option) { - op.Options = append(op.Options, opt) + op.Options.Add(opt) } // GetOneOption will get an option of the give type from the Options field, if // it is present. It will return `nil` otherwise func (op *OptIANA) GetOneOption(code OptionCode) Option { - return getOption(op.Options, code) + return op.Options.GetOne(code) } // DelOption will remove all the options that match a Option code. func (op *OptIANA) DelOption(code OptionCode) { - op.Options = delOption(op.Options, code) + op.Options.Del(code) } // build an OptIANA structure from a sequence of bytes. // The input data does not include option code and length bytes. func ParseOptIANA(data []byte) (*OptIANA, error) { - var err error opt := OptIANA{} if len(data) < 12 { return nil, fmt.Errorf("Invalid IA for Non-temporary Addresses data length. Expected at least 12 bytes, got %v", len(data)) @@ -72,8 +71,7 @@ func ParseOptIANA(data []byte) (*OptIANA, error) { copy(opt.IaId[:], data[:4]) opt.T1 = binary.BigEndian.Uint32(data[4:8]) opt.T2 = binary.BigEndian.Uint32(data[8:12]) - opt.Options, err = OptionsFromBytes(data[12:]) - if err != nil { + if err := opt.Options.FromBytes(data[12:]); err != nil { return nil, err } return &opt, nil diff --git a/dhcpv6/option_nontemporaryaddress_test.go b/dhcpv6/option_nontemporaryaddress_test.go index a03e0c9c..a42601df 100644 --- a/dhcpv6/option_nontemporaryaddress_test.go +++ b/dhcpv6/option_nontemporaryaddress_test.go @@ -78,13 +78,13 @@ func TestOptIANADelOption(t *testing.T) { optiana1.Options = append(optiana1.Options, &optiaaddr) optiana1.Options = append(optiana1.Options, &optiaaddr) optiana1.DelOption(OptionIAAddr) - require.Equal(t, optiana1.Options, []Option{&optsc}) + require.Equal(t, optiana1.Options, Options{&optsc}) optiana2.Options = append(optiana2.Options, &optiaaddr) optiana2.Options = append(optiana2.Options, &optsc) optiana2.Options = append(optiana2.Options, &optiaaddr) optiana2.DelOption(OptionIAAddr) - require.Equal(t, optiana2.Options, []Option{&optsc}) + require.Equal(t, optiana2.Options, Options{&optsc}) } func TestOptIANAToBytes(t *testing.T) { diff --git a/dhcpv6/option_prefixdelegation.go b/dhcpv6/option_prefixdelegation.go index 87c027ee..da5dff67 100644 --- a/dhcpv6/option_prefixdelegation.go +++ b/dhcpv6/option_prefixdelegation.go @@ -12,7 +12,7 @@ type OptIAForPrefixDelegation struct { IaId [4]byte T1 uint32 T2 uint32 - Options []Option + Options Options } // Code returns the option code @@ -52,18 +52,17 @@ func (op *OptIAForPrefixDelegation) String() string { // 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) + return op.Options.GetOne(code) } // DelOption will remove all the options that match a Option code. func (op *OptIAForPrefixDelegation) DelOption(code OptionCode) { - op.Options = delOption(op.Options, code) + op.Options.Del(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)) @@ -71,8 +70,7 @@ 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, err = OptionsFromBytes(data[12:]) - if err != nil { + if err := opt.Options.FromBytes(data[12:]); err != nil { return nil, err } return &opt, nil diff --git a/dhcpv6/option_relaymsg_test.go b/dhcpv6/option_relaymsg_test.go index 15d869a9..3e0deaa9 100644 --- a/dhcpv6/option_relaymsg_test.go +++ b/dhcpv6/option_relaymsg_test.go @@ -26,7 +26,8 @@ func TestRelayMsgParseOptRelayMsg(t *testing.T) { } func TestRelayMsgOptionsFromBytes(t *testing.T) { - opts, err := OptionsFromBytes([]byte{ + var opts Options + err := opts.FromBytes([]byte{ 0, 9, // option: relay message 0, 10, // relayed message length 1, // MessageTypeSolicit diff --git a/dhcpv6/option_vendor_opts.go b/dhcpv6/option_vendor_opts.go index de35141c..f791ddff 100644 --- a/dhcpv6/option_vendor_opts.go +++ b/dhcpv6/option_vendor_opts.go @@ -36,7 +36,7 @@ import ( // OptVendorOpts represents a DHCPv6 Status Code option type OptVendorOpts struct { EnterpriseNumber uint32 - VendorOpts []Option + VendorOpts Options } // Code returns the option code @@ -81,9 +81,7 @@ func ParseOptVendorOpts(data []byte) (*OptVendorOpts, error) { } opt.EnterpriseNumber = binary.BigEndian.Uint32(data[:4]) - var err error - opt.VendorOpts, err = OptionsFromBytesWithParser(data[4:], vendParseOption) - if err != nil { + if err := opt.VendorOpts.FromBytesWithParser(data[4:], vendParseOption); err != nil { return nil, err } return &opt, nil diff --git a/dhcpv6/options.go b/dhcpv6/options.go index 8508b089..33f0d20d 100644 --- a/dhcpv6/options.go +++ b/dhcpv6/options.go @@ -121,26 +121,81 @@ func ParseOption(dataStart []byte) (Option, error) { return opt, nil } -func OptionsFromBytes(data []byte) ([]Option, error) { - return OptionsFromBytesWithParser(data, ParseOption) +// Options is a collection of options. +type Options []Option + +// Get returns all options matching the option code. +func (o Options) Get(code OptionCode) []Option { + var ret []Option + for _, opt := range o { + if opt.Code() == code { + ret = append(ret, opt) + } + } + return ret +} + +// GetOne returns the first option matching the option code. +func (o Options) GetOne(code OptionCode) Option { + for _, opt := range o { + if opt.Code() == code { + return opt + } + } + return nil +} + +// Add appends one option. +func (o *Options) Add(option Option) { + *o = append(*o, option) +} + +// Del deletes all options matching the option code. +func (o *Options) Del(code OptionCode) { + newOpts := make(Options, 0, len(*o)) + for _, opt := range *o { + if opt.Code() != code { + newOpts = append(newOpts, opt) + } + } + *o = newOpts +} + +// Update replaces the first option of the same type as the specified one. +func (o *Options) Update(option Option) { + for idx, opt := range *o { + if opt.Code() == option.Code() { + (*o)[idx] = option + // don't look further + return + } + } + // if not found, add it + o.Add(option) +} + +// FromBytes reads data into o and returns an error if the options are not a +// valid serialized representation of DHCPv6 options per RFC 3315. +func (o *Options) FromBytes(data []byte) error { + return o.FromBytesWithParser(data, ParseOption) } // OptionParser is a function signature for option parsing type OptionParser func(data []byte) (Option, error) -// OptionsFromBytesWithParser parses Options from byte sequences using the -// parsing function that is passed in as a paremeter -func OptionsFromBytesWithParser(data []byte, parser OptionParser) ([]Option, error) { +// FromBytesWithParser parses Options from byte sequences using the parsing +// function that is passed in as a paremeter +func (o *Options) FromBytesWithParser(data []byte, parser OptionParser) error { // Parse a sequence of bytes until the end and build a list of options from // it. Returns an error if any invalid option or length is found. - options := make([]Option, 0, 10) + *o = make(Options, 0, 10) if len(data) == 0 { // no options, no party - return options, nil + return nil } if len(data) < 4 { // cannot be shorter than option code (2 bytes) + length (2 bytes) - return nil, fmt.Errorf("Invalid options: shorter than 4 bytes") + return fmt.Errorf("Invalid options: shorter than 4 bytes") } idx := 0 for { @@ -149,14 +204,14 @@ func OptionsFromBytesWithParser(data []byte, parser OptionParser) ([]Option, err } if idx > len(data) { // this should never happen - return nil, fmt.Errorf("Error: reading past the end of options") + return fmt.Errorf("Error: reading past the end of options") } opt, err := parser(data[idx:]) if err != nil { - return nil, err + return err } - options = append(options, opt) + *o = append(*o, opt) idx += opt.Length() + 4 // 4 bytes for type + length } - return options, nil + return nil } From 5604533269d24e72911e36f94d335337849decae Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 04:08:48 +0000 Subject: [PATCH 12/43] dhcpv6: clean up MessageType - print unknown message type numbers. - unexport unneeded map of strings. --- dhcpv6/types.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/dhcpv6/types.go b/dhcpv6/types.go index 4629cf6f..f842ff11 100644 --- a/dhcpv6/types.go +++ b/dhcpv6/types.go @@ -1,13 +1,15 @@ package dhcpv6 -// from http://www.networksorcery.com/enp/protocol/dhcpv6.htm +import ( + "fmt" +) // MessageType represents the kind of DHCPv6 message. type MessageType uint8 -// The different kinds of DHCPv6 message types. +// The DHCPv6 message types defined per RFC 3315, Section 5.3. const ( - // MessageTypeNone is used internally and is not part of the RFC + // MessageTypeNone is used internally and is not part of the RFC. MessageTypeNone MessageType = 0 MessageTypeSolicit MessageType = 1 MessageTypeAdvertise MessageType = 2 @@ -28,16 +30,17 @@ const ( MessageTypeLeaseQueryData MessageType = 17 ) +// String prints the message type name. func (m MessageType) String() string { - if s, ok := MessageTypeToStringMap[m]; ok { + if s, ok := messageTypeToStringMap[m]; ok { return s } - return "Unknown" + return fmt.Sprintf("unknown (%d)", m) } -// MessageTypeToStringMap contains the mapping of MessageTypes to human-readable -// strings. -var MessageTypeToStringMap = map[MessageType]string{ +// messageTypeToStringMap contains the mapping of MessageTypes to +// human-readable strings. +var messageTypeToStringMap = map[MessageType]string{ MessageTypeSolicit: "SOLICIT", MessageTypeAdvertise: "ADVERTISE", MessageTypeRequest: "REQUEST", From c09728dd0f8ccf56e74efe7df7328191a347e821 Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 04:23:39 +0000 Subject: [PATCH 13/43] dhcpv6: introduce TransactionID type --- dhcpv4/dhcpv4.go | 3 ++ dhcpv6/async/client.go | 4 +- dhcpv6/dhcpv6.go | 16 +++----- dhcpv6/dhcpv6_test.go | 69 ++++++++-------------------------- dhcpv6/dhcpv6message.go | 65 ++++++++------------------------ dhcpv6/dhcpv6relay_test.go | 2 +- dhcpv6/option_relaymsg_test.go | 3 +- dhcpv6/types.go | 8 ++++ 8 files changed, 54 insertions(+), 116 deletions(-) diff --git a/dhcpv4/dhcpv4.go b/dhcpv4/dhcpv4.go index 5f6943b0..1e6c26e0 100644 --- a/dhcpv4/dhcpv4.go +++ b/dhcpv4/dhcpv4.go @@ -112,6 +112,9 @@ func GetExternalIPv4Addrs(addrs []net.Addr) ([]net.IP, error) { func GenerateTransactionID() (TransactionID, error) { var xid TransactionID n, err := rand.Read(xid[:]) + if err != nil { + return xid, err + } if n != 4 { return xid, errors.New("invalid random sequence for transaction ID: smaller than 32 bits") } diff --git a/dhcpv6/async/client.go b/dhcpv6/async/client.go index c574208f..7a8b9ec2 100644 --- a/dhcpv6/async/client.go +++ b/dhcpv6/async/client.go @@ -25,7 +25,7 @@ type Client struct { receiveQueue chan dhcpv6.DHCPv6 sendQueue chan dhcpv6.DHCPv6 packetsLock sync.Mutex - packets map[uint32]*promise.Promise + packets map[dhcpv6.TransactionID]*promise.Promise errors chan error } @@ -69,7 +69,7 @@ func (c *Client) Open(bufferSize int) error { c.stopping = new(sync.WaitGroup) c.sendQueue = make(chan dhcpv6.DHCPv6, bufferSize) c.receiveQueue = make(chan dhcpv6.DHCPv6, bufferSize) - c.packets = make(map[uint32]*promise.Promise) + c.packets = make(map[dhcpv6.TransactionID]*promise.Promise) c.packetsLock = sync.Mutex{} c.errors = make(chan error) diff --git a/dhcpv6/dhcpv6.go b/dhcpv6/dhcpv6.go index c9f8c054..70c2bff8 100644 --- a/dhcpv6/dhcpv6.go +++ b/dhcpv6/dhcpv6.go @@ -63,14 +63,10 @@ func FromBytes(data []byte) (DHCPv6, error) { } return &d, nil } else { - tid, err := BytesToTransactionID(data[1:4]) - if err != nil { - return nil, err - } d := DHCPv6Message{ - messageType: messageType, - transactionID: *tid, + messageType: messageType, } + copy(d.transactionID[:], data[1:4]) if err := d.options.FromBytes(data[4:]); err != nil { return nil, err } @@ -86,7 +82,7 @@ func NewMessage(modifiers ...Modifier) (DHCPv6, error) { } msg := DHCPv6Message{ messageType: MessageTypeSolicit, - transactionID: *tid, + transactionID: tid, } // apply modifiers d := DHCPv6(&msg) @@ -209,16 +205,16 @@ func IsUsingUEFI(msg DHCPv6) bool { // GetTransactionID returns a transactionID of a message or its inner message // in case of relay -func GetTransactionID(packet DHCPv6) (uint32, error) { +func GetTransactionID(packet DHCPv6) (TransactionID, error) { if message, ok := packet.(*DHCPv6Message); ok { return message.TransactionID(), nil } if relay, ok := packet.(*DHCPv6Relay); ok { message, err := relay.GetInnerMessage() if err != nil { - return 0, err + return TransactionID{0, 0, 0}, err } return GetTransactionID(message) } - return 0, errors.New("Invalid DHCPv6 packet") + return TransactionID{0, 0, 0}, errors.New("Invalid DHCPv6 packet") } diff --git a/dhcpv6/dhcpv6_test.go b/dhcpv6/dhcpv6_test.go index 3a9e3f1d..d5a29aaf 100644 --- a/dhcpv6/dhcpv6_test.go +++ b/dhcpv6/dhcpv6_test.go @@ -7,52 +7,12 @@ import ( "net" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" "github.com/insomniacslk/dhcp/iana" ) -func TestBytesToTransactionID(t *testing.T) { - // Check if the function transforms the bytes for the exact length input - b := make([]byte, 4) - binary.LittleEndian.PutUint32(b, 0x01020304) - tid, err := BytesToTransactionID(b) - require.NoError(t, err) - require.NotNil(t, tid) - assert.Equal(t, *tid, uint32(0x000040302)) - - binary.BigEndian.PutUint32(b, 0x01020304) - tid, err = BytesToTransactionID(b) - require.NoError(t, err) - require.NotNil(t, tid) - assert.Equal(t, *tid, uint32(0x00010203)) - - // Check if the function transforms only the first bytes for a longer input - b = make([]byte, 8) - binary.LittleEndian.PutUint32(b, 0x01020304) - binary.LittleEndian.PutUint32(b[4:], 0x11121314) - tid, err = BytesToTransactionID(b) - require.NoError(t, err) - require.NotNil(t, tid) - assert.Equal(t, *tid, uint32(0x000040302)) - - binary.BigEndian.PutUint32(b, 0x01020304) - binary.BigEndian.PutUint32(b[4:], 0x11121314) - tid, err = BytesToTransactionID(b) - require.NoError(t, err) - require.NotNil(t, tid) - assert.Equal(t, *tid, uint32(0x00010203)) -} - -func TestBytesToTransactionIDShortData(t *testing.T) { - // short sequence, less than three bytes - tid, err := BytesToTransactionID([]byte{0x11, 0x22}) - require.Error(t, err) - require.Nil(t, tid) -} - func randomReadMock(value []byte, n int, err error) func([]byte) (int, error) { return func(b []byte) (int, error) { copy(b, value) @@ -77,22 +37,21 @@ func (s *GenerateTransactionIDTestSuite) TestErrors() { // Error is returned from random number generator e := errors.New("mocked error") randomRead = randomReadMock(s.random, 0, e) - tid, err := GenerateTransactionID() + _, err := GenerateTransactionID() s.Assert().Equal(e, err) - s.Assert().Nil(tid) // Less than 4 bytes are generated - randomRead = randomReadMock(s.random, 3, nil) + randomRead = randomReadMock(s.random, 2, nil) _, err = GenerateTransactionID() - s.Assert().EqualError(err, "invalid random sequence: shorter than 4 bytes") + s.Assert().EqualError(err, "invalid random sequence: shorter than 3 bytes") } func (s *GenerateTransactionIDTestSuite) TestSuccess() { - binary.BigEndian.PutUint32(s.random, 0x01020304) - randomRead = randomReadMock(s.random, 4, nil) + binary.BigEndian.PutUint32(s.random, 0x01020300) + randomRead = randomReadMock(s.random, 3, nil) tid, err := GenerateTransactionID() s.Require().NoError(err) - s.Assert().Equal(*tid, uint32(0x00010203)) + s.Assert().Equal(TransactionID{0x1, 0x2, 0x3}, tid) } func TestGenerateTransactionIDTestSuite(t *testing.T) { @@ -159,8 +118,9 @@ func TestSettersAndGetters(t *testing.T) { require.Equal(t, MessageTypeAdvertise, d.Type()) // TransactionID - d.SetTransactionID(12345) - require.Equal(t, uint32(12345), d.TransactionID()) + xid := TransactionID{0xa, 0xb, 0xc} + d.SetTransactionID(xid) + require.Equal(t, xid, d.TransactionID()) // Options require.Empty(t, d.Options()) @@ -180,11 +140,12 @@ func TestAddOption(t *testing.T) { func TestToBytes(t *testing.T) { d := DHCPv6Message{} d.SetMessage(MessageTypeSolicit) - d.SetTransactionID(0xabcdef) + xid := TransactionID{0xa, 0xb, 0xc} + d.SetTransactionID(xid) opt := OptionGeneric{OptionCode: 0, OptionData: []byte{}} d.AddOption(&opt) bytes := d.ToBytes() - expected := []byte{01, 0xab, 0xcd, 0xef, 0x00, 0x00, 0x00, 0x00} + expected := []byte{01, 0xa, 0xb, 0xc, 0x00, 0x00, 0x00, 0x00} require.Equal(t, expected, bytes) } @@ -199,7 +160,8 @@ func TestFromAndToBytes(t *testing.T) { func TestNewAdvertiseFromSolicit(t *testing.T) { s := DHCPv6Message{} s.SetMessage(MessageTypeSolicit) - s.SetTransactionID(0xabcdef) + xid := TransactionID{0xa, 0xb, 0xc} + s.SetTransactionID(xid) cid := OptClientId{} s.AddOption(&cid) duid := Duid{} @@ -212,7 +174,8 @@ func TestNewAdvertiseFromSolicit(t *testing.T) { func TestNewReplyFromDHCPv6Message(t *testing.T) { msg := DHCPv6Message{} - msg.SetTransactionID(0xabcdef) + xid := TransactionID{0xa, 0xb, 0xc} + msg.SetTransactionID(xid) cid := OptClientId{} msg.AddOption(&cid) sid := OptServerId{} diff --git a/dhcpv6/dhcpv6message.go b/dhcpv6/dhcpv6message.go index abccf43b..85d93a36 100644 --- a/dhcpv6/dhcpv6message.go +++ b/dhcpv6/dhcpv6message.go @@ -2,7 +2,6 @@ package dhcpv6 import ( "crypto/rand" - "encoding/binary" "errors" "fmt" "log" @@ -16,49 +15,21 @@ const MessageHeaderSize = 4 type DHCPv6Message struct { messageType MessageType - transactionID uint32 // only 24 bits are used though + transactionID TransactionID options Options } -func BytesToTransactionID(data []byte) (*uint32, error) { - // return a uint32 from a sequence of bytes, representing a transaction ID. - // Transaction IDs are three-bytes long. If the provided data is shorter than - // 3 bytes, it return an error. If longer, will use the first three bytes - // only. - if len(data) < 3 { - return nil, fmt.Errorf("Invalid transaction ID: less than 3 bytes") - } - buf := make([]byte, 4) - copy(buf[1:4], data[:3]) - tid := binary.BigEndian.Uint32(buf) - return &tid, nil -} - var randomRead = rand.Read -func GenerateTransactionID() (*uint32, error) { - var tid *uint32 - for { - tidBytes := make([]byte, 4) - n, err := randomRead(tidBytes) - if err != nil { - return nil, err - } - if n != 4 { - return nil, fmt.Errorf("invalid random sequence: shorter than 4 bytes") - } - tid, err = BytesToTransactionID(tidBytes) - if err != nil { - return nil, err - } - if tid == nil { - return nil, fmt.Errorf("got a nil Transaction ID") - } - // retry until != 0 - // TODO add retry limit - if *tid != 0 { - break - } +// GenerateTransactionID generates a random 3-byte transaction ID. +func GenerateTransactionID() (TransactionID, error) { + var tid TransactionID + n, err := randomRead(tid[:]) + if err != nil { + return tid, err + } + if n != len(tid) { + return tid, fmt.Errorf("invalid random sequence: shorter than 3 bytes") } return tid, nil } @@ -260,16 +231,14 @@ func (d *DHCPv6Message) MessageTypeToString() string { return d.messageType.String() } -func (d *DHCPv6Message) TransactionID() uint32 { +// TransactionID returns this message's transaction id. +func (d *DHCPv6Message) TransactionID() TransactionID { return d.transactionID } -func (d *DHCPv6Message) SetTransactionID(tid uint32) { - ttid := tid & 0x00ffffff - if ttid != tid { - log.Printf("Warning: truncating transaction ID that is longer than 24 bits: %v", tid) - } - d.transactionID = ttid +// SetTransactionID sets this message's transaction id. +func (d *DHCPv6Message) SetTransactionID(tid TransactionID) { + d.transactionID = tid } func (d *DHCPv6Message) SetOptions(options []Option) { @@ -343,9 +312,7 @@ func (d *DHCPv6Message) Summary() string { func (d *DHCPv6Message) ToBytes() []byte { var ret []byte ret = append(ret, byte(d.messageType)) - tidBytes := make([]byte, 4) - binary.BigEndian.PutUint32(tidBytes, d.transactionID) - ret = append(ret, tidBytes[1:4]...) // discard the first byte + ret = append(ret, d.transactionID[:]...) // discard the first byte for _, opt := range d.options { ret = append(ret, opt.ToBytes()...) } diff --git a/dhcpv6/dhcpv6relay_test.go b/dhcpv6/dhcpv6relay_test.go index 0710c5dd..d2446ec4 100644 --- a/dhcpv6/dhcpv6relay_test.go +++ b/dhcpv6/dhcpv6relay_test.go @@ -92,7 +92,7 @@ func TestDHCPv6RelayToBytes(t *testing.T) { opt := OptRelayMsg{ relayMessage: &DHCPv6Message{ messageType: MessageTypeSolicit, - transactionID: 0xaabbcc, + transactionID: TransactionID{0xaa, 0xbb, 0xcc}, options: []Option{ &OptElapsedTime{ ElapsedTime: 0, diff --git a/dhcpv6/option_relaymsg_test.go b/dhcpv6/option_relaymsg_test.go index 3e0deaa9..996b5142 100644 --- a/dhcpv6/option_relaymsg_test.go +++ b/dhcpv6/option_relaymsg_test.go @@ -102,7 +102,8 @@ func TestRelayMsgParseOptRelayMsgSingleEncapsulation(t *testing.T) { MessageTypeSolicit, dType, ) } - if tID := innerDHCP.TransactionID(); tID != 0xaabbcc { + xid := TransactionID{0xaa, 0xbb, 0xcc} + if tID := innerDHCP.TransactionID(); tID != xid { t.Fatalf("Invalid inner DHCP transaction ID. Expected 0xaabbcc, got %v", tID) } if len(innerDHCP.options) != 1 { diff --git a/dhcpv6/types.go b/dhcpv6/types.go index f842ff11..77b1e757 100644 --- a/dhcpv6/types.go +++ b/dhcpv6/types.go @@ -4,6 +4,14 @@ import ( "fmt" ) +// TransactionID is a DHCPv6 Transaction ID defined by RFC 3315, Section 6. +type TransactionID [3]byte + +// String prints the transaction ID as a hex value. +func (xid TransactionID) String() string { + return fmt.Sprintf("0x%x", xid[:]) +} + // MessageType represents the kind of DHCPv6 message. type MessageType uint8 From 116fb1d0a3124d2a2dc14ead7db6b497224377ab Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 19:09:02 +0000 Subject: [PATCH 14/43] dhcpv6: move option code types; add Stringer. --- dhcpv6/option_requestedoption.go | 19 +-- dhcpv6/option_requestedoption_test.go | 2 +- dhcpv6/option_types.go | 153 ------------------------ dhcpv6/options.go | 9 +- dhcpv6/types.go | 163 ++++++++++++++++++++++++++ 5 files changed, 171 insertions(+), 175 deletions(-) delete mode 100644 dhcpv6/option_types.go diff --git a/dhcpv6/option_requestedoption.go b/dhcpv6/option_requestedoption.go index 9da93739..0324642d 100644 --- a/dhcpv6/option_requestedoption.go +++ b/dhcpv6/option_requestedoption.go @@ -6,6 +6,7 @@ package dhcpv6 import ( "encoding/binary" "fmt" + "strings" ) type OptRequestedOption struct { @@ -39,7 +40,7 @@ func (op *OptRequestedOption) SetRequestedOptions(opts []OptionCode) { func (op *OptRequestedOption) AddRequestedOption(opt OptionCode) { for _, requestedOption := range op.requestedOptions { if opt == requestedOption { - fmt.Printf("Warning: option %s is already set, appending duplicate", OptionCodeToString[opt]) + fmt.Printf("Warning: option %s is already set, appending duplicate", opt) } } op.requestedOptions = append(op.requestedOptions, opt) @@ -50,19 +51,11 @@ func (op *OptRequestedOption) Length() int { } func (op *OptRequestedOption) String() string { - roString := "[" - for idx, code := range op.requestedOptions { - if name, ok := OptionCodeToString[OptionCode(code)]; ok { - roString += name - } else { - roString += "Unknown" - } - if idx < len(op.requestedOptions)-1 { - roString += ", " - } + names := make([]string, 0, len(op.requestedOptions)) + for _, code := range op.requestedOptions { + names = append(names, code.String()) } - roString += "]" - return fmt.Sprintf("OptRequestedOption{options=%v}", roString) + return fmt.Sprintf("OptRequestedOption{options=[%v]}", strings.Join(names, ", ")) } // build an OptRequestedOption structure from a sequence of bytes. diff --git a/dhcpv6/option_requestedoption_test.go b/dhcpv6/option_requestedoption_test.go index 7e95e366..a0247425 100644 --- a/dhcpv6/option_requestedoption_test.go +++ b/dhcpv6/option_requestedoption_test.go @@ -32,7 +32,7 @@ func TestOptRequestedOptionString(t *testing.T) { require.Contains( t, opt.String(), - "Unknown", + "unknown", "String() should contain 'Unknown' for an illegal option", ) } diff --git a/dhcpv6/option_types.go b/dhcpv6/option_types.go deleted file mode 100644 index 6a852ad2..00000000 --- a/dhcpv6/option_types.go +++ /dev/null @@ -1,153 +0,0 @@ -package dhcpv6 - -// All DHCPv6 options. -const ( - OptionClientID OptionCode = 1 - OptionServerID OptionCode = 2 - OptionIANA OptionCode = 3 - OptionIATA OptionCode = 4 - OptionIAAddr OptionCode = 5 - OptionORO OptionCode = 6 - OptionPreference OptionCode = 7 - OptionElapsedTime OptionCode = 8 - OptionRelayMsg OptionCode = 9 - // skip 10 - OptionAuth OptionCode = 11 - OptionUnicast OptionCode = 12 - OptionStatusCode OptionCode = 13 - OptionRapidCommit OptionCode = 14 - OptionUserClass OptionCode = 15 - OptionVendorClass OptionCode = 16 - OptionVendorOpts OptionCode = 17 - OptionInterfaceID OptionCode = 18 - OptionReconfMessage OptionCode = 19 - OptionReconfAccept OptionCode = 20 - OptionSIPServersDomainNameList OptionCode = 21 - OptionSIPServersIPv6AddressList OptionCode = 22 - OptionDNSRecursiveNameServer OptionCode = 23 - OptionDomainSearchList OptionCode = 24 - OptionIAPD OptionCode = 25 - OptionIAPrefix OptionCode = 26 - OptionNISServers OptionCode = 27 - OptionNISPServers OptionCode = 28 - OptionNISDomainName OptionCode = 29 - OptionNISPDomainName OptionCode = 30 - OptionSNTPServerList OptionCode = 31 - OptionInformationRefreshTime OptionCode = 32 - OptionBCMCSControllerDomainNameList OptionCode = 33 - OptionBCMCSControllerIPv6AddressList OptionCode = 34 - // skip 35 - OptionGeoConfCivic OptionCode = 36 - OptionRemoteID OptionCode = 37 - OptionRelayAgentSubscriberID OptionCode = 38 - OptionFQDN OptionCode = 39 - OptionPANAAuthenticationAgent OptionCode = 40 - OptionNewPOSIXTimezone OptionCode = 41 - OptionNewTZDBTimezone OptionCode = 42 - OptionEchoRequest OptionCode = 43 - OptionLQQuery OptionCode = 44 - OptionClientData OptionCode = 45 - OptionCLTTime OptionCode = 46 - OptionLQRelayData OptionCode = 47 - OptionLQClientLink OptionCode = 48 - OptionMIPv6HomeNetworkIDFQDN OptionCode = 49 - OptionMIPv6VisitedHomeNetworkInformation OptionCode = 50 - OptionLoSTServer OptionCode = 51 - OptionCAPWAPAccessControllerAddresses OptionCode = 52 - OptionRelayID OptionCode = 53 - OptionIPv6AddressMOS OptionCode = 54 - OptionIPv6FQDNMOS OptionCode = 55 - OptionNTPServer OptionCode = 56 - OptionV6AccessDomain OptionCode = 57 - OptionSIPUACSList OptionCode = 58 - OptionBootfileURL OptionCode = 59 - OptionBootfileParam OptionCode = 60 - OptionClientArchType OptionCode = 61 - OptionNII OptionCode = 62 - OptionGeolocation OptionCode = 63 - OptionAFTRName OptionCode = 64 - OptionERPLocalDomainName OptionCode = 65 - OptionRSOO OptionCode = 66 - OptionPDExclude OptionCode = 67 - OptionVirtualSubnetSelection OptionCode = 68 - OptionMIPv6IdentifiedHomeNetworkInformation OptionCode = 69 - OptionMIPv6UnrestrictedHomeNetworkInformation OptionCode = 70 - OptionMIPv6HomeNetworkPrefix OptionCode = 71 - OptionMIPv6HomeAgentAddress OptionCode = 72 - OptionMIPv6HomeAgentFQDN OptionCode = 73 -) - -// OptionCodeToString maps DHCPv6 OptionCodes to human-readable strings. -var OptionCodeToString = map[OptionCode]string{ - OptionClientID: "OPTION_CLIENTID", - OptionServerID: "OPTION_SERVERID", - OptionIANA: "OPTION_IA_NA", - OptionIATA: "OPTION_IA_TA", - OptionIAAddr: "OPTION_IAADDR", - OptionORO: "OPTION_ORO", - OptionPreference: "OPTION_PREFERENCE", - OptionElapsedTime: "OPTION_ELAPSED_TIME", - OptionRelayMsg: "OPTION_RELAY_MSG", - OptionAuth: "OPTION_AUTH", - OptionUnicast: "OPTION_UNICAST", - OptionStatusCode: "OPTION_STATUS_CODE", - OptionRapidCommit: "OPTION_RAPID_COMMIT", - OptionUserClass: "OPTION_USER_CLASS", - OptionVendorClass: "OPTION_VENDOR_CLASS", - OptionVendorOpts: "OPTION_VENDOR_OPTS", - OptionInterfaceID: "OPTION_INTERFACE_ID", - OptionReconfMessage: "OPTION_RECONF_MSG", - OptionReconfAccept: "OPTION_RECONF_ACCEPT", - OptionSIPServersDomainNameList: "SIP Servers Domain Name List", - OptionSIPServersIPv6AddressList: "SIP Servers IPv6 Address List", - OptionDNSRecursiveNameServer: "DNS Recursive Name Server", - OptionDomainSearchList: "Domain Search List", - OptionIAPD: "OPTION_IA_PD", - OptionIAPrefix: "OPTION_IAPREFIX", - OptionNISServers: "OPTION_NIS_SERVERS", - OptionNISPServers: "OPTION_NISP_SERVERS", - OptionNISDomainName: "OPTION_NIS_DOMAIN_NAME", - OptionNISPDomainName: "OPTION_NISP_DOMAIN_NAME", - OptionSNTPServerList: "SNTP Server List", - OptionInformationRefreshTime: "Information Refresh Time", - OptionBCMCSControllerDomainNameList: "BCMCS Controller Domain Name List", - OptionBCMCSControllerIPv6AddressList: "BCMCS Controller IPv6 Address List", - OptionGeoConfCivic: "OPTION_GEOCONF", - OptionRemoteID: "OPTION_REMOTE_ID", - OptionRelayAgentSubscriberID: "Relay-Agent Subscriber ID", - OptionFQDN: "FQDN", - OptionPANAAuthenticationAgent: "PANA Authentication Agent", - OptionNewPOSIXTimezone: "OPTION_NEW_POSIX_TIME_ZONE", - OptionNewTZDBTimezone: "OPTION_NEW_TZDB_TIMEZONE", - OptionEchoRequest: "Echo Request", - OptionLQQuery: "OPTION_LQ_QUERY", - OptionClientData: "OPTION_CLIENT_DATA", - OptionCLTTime: "OPTION_CLT_TIME", - OptionLQRelayData: "OPTION_LQ_RELAY_DATA", - OptionLQClientLink: "OPTION_LQ_CLIENT_LINK", - OptionMIPv6HomeNetworkIDFQDN: "MIPv6 Home Network ID FQDN", - OptionMIPv6VisitedHomeNetworkInformation: "MIPv6 Visited Home Network Information", - OptionLoSTServer: "LoST Server", - OptionCAPWAPAccessControllerAddresses: "CAPWAP Access Controller Addresses", - OptionRelayID: "RELAY_ID", - OptionIPv6AddressMOS: "OPTION-IPv6_Address-MoS", - OptionIPv6FQDNMOS: "OPTION-IPv6-FQDN-MoS", - OptionNTPServer: "OPTION_NTP_SERVER", - OptionV6AccessDomain: "OPTION_V6_ACCESS_DOMAIN", - OptionSIPUACSList: "OPTION_SIP_UA_CS_LIST", - OptionBootfileURL: "OPT_BOOTFILE_URL", - OptionBootfileParam: "OPT_BOOTFILE_PARAM", - OptionClientArchType: "OPTION_CLIENT_ARCH_TYPE", - OptionNII: "OPTION_NII", - OptionGeolocation: "OPTION_GEOLOCATION", - OptionAFTRName: "OPTION_AFTR_NAME", - OptionERPLocalDomainName: "OPTION_ERP_LOCAL_DOMAIN_NAME", - OptionRSOO: "OPTION_RSOO", - OptionPDExclude: "OPTION_PD_EXCLUDE", - OptionVirtualSubnetSelection: "Virtual Subnet Selection", - OptionMIPv6IdentifiedHomeNetworkInformation: "MIPv6 Identified Home Network Information", - OptionMIPv6UnrestrictedHomeNetworkInformation: "MIPv6 Unrestricted Home Network Information", - OptionMIPv6HomeNetworkPrefix: "MIPv6 Home Network Prefix", - OptionMIPv6HomeAgentAddress: "MIPv6 Home Agent Address", - OptionMIPv6HomeAgentFQDN: "MIPv6 Home Agent FQDN", -} diff --git a/dhcpv6/options.go b/dhcpv6/options.go index 33f0d20d..23ad5891 100644 --- a/dhcpv6/options.go +++ b/dhcpv6/options.go @@ -5,9 +5,6 @@ import ( "fmt" ) -// OptionCode is a single byte representing the code for a given Option. -type OptionCode uint16 - // Option is an interface that all DHCPv6 options adhere to. type Option interface { Code() OptionCode @@ -38,11 +35,7 @@ func (og *OptionGeneric) ToBytes() []byte { } func (og *OptionGeneric) String() string { - code, ok := OptionCodeToString[og.OptionCode] - if !ok { - code = "UnknownOption" - } - return fmt.Sprintf("%v -> %v", code, og.OptionData) + return fmt.Sprintf("%s -> %v", og.OptionCode, og.OptionData) } func (og *OptionGeneric) Length() int { diff --git a/dhcpv6/types.go b/dhcpv6/types.go index 77b1e757..42854657 100644 --- a/dhcpv6/types.go +++ b/dhcpv6/types.go @@ -67,3 +67,166 @@ var messageTypeToStringMap = map[MessageType]string{ MessageTypeLeaseQueryDone: "LEASEQUERY-DONE", MessageTypeLeaseQueryData: "LEASEQUERY-DATA", } + +// OptionCode is a single byte representing the code for a given Option. +type OptionCode uint16 + +// String returns the option code name. +func (o OptionCode) String() string { + if s, ok := optionCodeToString[o]; ok { + return s + } + return fmt.Sprintf("unknown (%d)", o) +} + +// All DHCPv6 options. +const ( + OptionClientID OptionCode = 1 + OptionServerID OptionCode = 2 + OptionIANA OptionCode = 3 + OptionIATA OptionCode = 4 + OptionIAAddr OptionCode = 5 + OptionORO OptionCode = 6 + OptionPreference OptionCode = 7 + OptionElapsedTime OptionCode = 8 + OptionRelayMsg OptionCode = 9 + // skip 10 + OptionAuth OptionCode = 11 + OptionUnicast OptionCode = 12 + OptionStatusCode OptionCode = 13 + OptionRapidCommit OptionCode = 14 + OptionUserClass OptionCode = 15 + OptionVendorClass OptionCode = 16 + OptionVendorOpts OptionCode = 17 + OptionInterfaceID OptionCode = 18 + OptionReconfMessage OptionCode = 19 + OptionReconfAccept OptionCode = 20 + OptionSIPServersDomainNameList OptionCode = 21 + OptionSIPServersIPv6AddressList OptionCode = 22 + OptionDNSRecursiveNameServer OptionCode = 23 + OptionDomainSearchList OptionCode = 24 + OptionIAPD OptionCode = 25 + OptionIAPrefix OptionCode = 26 + OptionNISServers OptionCode = 27 + OptionNISPServers OptionCode = 28 + OptionNISDomainName OptionCode = 29 + OptionNISPDomainName OptionCode = 30 + OptionSNTPServerList OptionCode = 31 + OptionInformationRefreshTime OptionCode = 32 + OptionBCMCSControllerDomainNameList OptionCode = 33 + OptionBCMCSControllerIPv6AddressList OptionCode = 34 + // skip 35 + OptionGeoConfCivic OptionCode = 36 + OptionRemoteID OptionCode = 37 + OptionRelayAgentSubscriberID OptionCode = 38 + OptionFQDN OptionCode = 39 + OptionPANAAuthenticationAgent OptionCode = 40 + OptionNewPOSIXTimezone OptionCode = 41 + OptionNewTZDBTimezone OptionCode = 42 + OptionEchoRequest OptionCode = 43 + OptionLQQuery OptionCode = 44 + OptionClientData OptionCode = 45 + OptionCLTTime OptionCode = 46 + OptionLQRelayData OptionCode = 47 + OptionLQClientLink OptionCode = 48 + OptionMIPv6HomeNetworkIDFQDN OptionCode = 49 + OptionMIPv6VisitedHomeNetworkInformation OptionCode = 50 + OptionLoSTServer OptionCode = 51 + OptionCAPWAPAccessControllerAddresses OptionCode = 52 + OptionRelayID OptionCode = 53 + OptionIPv6AddressMOS OptionCode = 54 + OptionIPv6FQDNMOS OptionCode = 55 + OptionNTPServer OptionCode = 56 + OptionV6AccessDomain OptionCode = 57 + OptionSIPUACSList OptionCode = 58 + OptionBootfileURL OptionCode = 59 + OptionBootfileParam OptionCode = 60 + OptionClientArchType OptionCode = 61 + OptionNII OptionCode = 62 + OptionGeolocation OptionCode = 63 + OptionAFTRName OptionCode = 64 + OptionERPLocalDomainName OptionCode = 65 + OptionRSOO OptionCode = 66 + OptionPDExclude OptionCode = 67 + OptionVirtualSubnetSelection OptionCode = 68 + OptionMIPv6IdentifiedHomeNetworkInformation OptionCode = 69 + OptionMIPv6UnrestrictedHomeNetworkInformation OptionCode = 70 + OptionMIPv6HomeNetworkPrefix OptionCode = 71 + OptionMIPv6HomeAgentAddress OptionCode = 72 + OptionMIPv6HomeAgentFQDN OptionCode = 73 +) + +// optionCodeToString maps DHCPv6 OptionCodes to human-readable strings. +var optionCodeToString = map[OptionCode]string{ + OptionClientID: "OPTION_CLIENTID", + OptionServerID: "OPTION_SERVERID", + OptionIANA: "OPTION_IA_NA", + OptionIATA: "OPTION_IA_TA", + OptionIAAddr: "OPTION_IAADDR", + OptionORO: "OPTION_ORO", + OptionPreference: "OPTION_PREFERENCE", + OptionElapsedTime: "OPTION_ELAPSED_TIME", + OptionRelayMsg: "OPTION_RELAY_MSG", + OptionAuth: "OPTION_AUTH", + OptionUnicast: "OPTION_UNICAST", + OptionStatusCode: "OPTION_STATUS_CODE", + OptionRapidCommit: "OPTION_RAPID_COMMIT", + OptionUserClass: "OPTION_USER_CLASS", + OptionVendorClass: "OPTION_VENDOR_CLASS", + OptionVendorOpts: "OPTION_VENDOR_OPTS", + OptionInterfaceID: "OPTION_INTERFACE_ID", + OptionReconfMessage: "OPTION_RECONF_MSG", + OptionReconfAccept: "OPTION_RECONF_ACCEPT", + OptionSIPServersDomainNameList: "SIP Servers Domain Name List", + OptionSIPServersIPv6AddressList: "SIP Servers IPv6 Address List", + OptionDNSRecursiveNameServer: "DNS Recursive Name Server", + OptionDomainSearchList: "Domain Search List", + OptionIAPD: "OPTION_IA_PD", + OptionIAPrefix: "OPTION_IAPREFIX", + OptionNISServers: "OPTION_NIS_SERVERS", + OptionNISPServers: "OPTION_NISP_SERVERS", + OptionNISDomainName: "OPTION_NIS_DOMAIN_NAME", + OptionNISPDomainName: "OPTION_NISP_DOMAIN_NAME", + OptionSNTPServerList: "SNTP Server List", + OptionInformationRefreshTime: "Information Refresh Time", + OptionBCMCSControllerDomainNameList: "BCMCS Controller Domain Name List", + OptionBCMCSControllerIPv6AddressList: "BCMCS Controller IPv6 Address List", + OptionGeoConfCivic: "OPTION_GEOCONF", + OptionRemoteID: "OPTION_REMOTE_ID", + OptionRelayAgentSubscriberID: "Relay-Agent Subscriber ID", + OptionFQDN: "FQDN", + OptionPANAAuthenticationAgent: "PANA Authentication Agent", + OptionNewPOSIXTimezone: "OPTION_NEW_POSIX_TIME_ZONE", + OptionNewTZDBTimezone: "OPTION_NEW_TZDB_TIMEZONE", + OptionEchoRequest: "Echo Request", + OptionLQQuery: "OPTION_LQ_QUERY", + OptionClientData: "OPTION_CLIENT_DATA", + OptionCLTTime: "OPTION_CLT_TIME", + OptionLQRelayData: "OPTION_LQ_RELAY_DATA", + OptionLQClientLink: "OPTION_LQ_CLIENT_LINK", + OptionMIPv6HomeNetworkIDFQDN: "MIPv6 Home Network ID FQDN", + OptionMIPv6VisitedHomeNetworkInformation: "MIPv6 Visited Home Network Information", + OptionLoSTServer: "LoST Server", + OptionCAPWAPAccessControllerAddresses: "CAPWAP Access Controller Addresses", + OptionRelayID: "RELAY_ID", + OptionIPv6AddressMOS: "OPTION-IPv6_Address-MoS", + OptionIPv6FQDNMOS: "OPTION-IPv6-FQDN-MoS", + OptionNTPServer: "OPTION_NTP_SERVER", + OptionV6AccessDomain: "OPTION_V6_ACCESS_DOMAIN", + OptionSIPUACSList: "OPTION_SIP_UA_CS_LIST", + OptionBootfileURL: "OPT_BOOTFILE_URL", + OptionBootfileParam: "OPT_BOOTFILE_PARAM", + OptionClientArchType: "OPTION_CLIENT_ARCH_TYPE", + OptionNII: "OPTION_NII", + OptionGeolocation: "OPTION_GEOLOCATION", + OptionAFTRName: "OPTION_AFTR_NAME", + OptionERPLocalDomainName: "OPTION_ERP_LOCAL_DOMAIN_NAME", + OptionRSOO: "OPTION_RSOO", + OptionPDExclude: "OPTION_PD_EXCLUDE", + OptionVirtualSubnetSelection: "Virtual Subnet Selection", + OptionMIPv6IdentifiedHomeNetworkInformation: "MIPv6 Identified Home Network Information", + OptionMIPv6UnrestrictedHomeNetworkInformation: "MIPv6 Unrestricted Home Network Information", + OptionMIPv6HomeNetworkPrefix: "MIPv6 Home Network Prefix", + OptionMIPv6HomeAgentAddress: "MIPv6 Home Agent Address", + OptionMIPv6HomeAgentFQDN: "MIPv6 Home Agent FQDN", +} From e62883f5b5683ae2259ad01b7ffbe20671deb6b2 Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 04:41:32 +0000 Subject: [PATCH 15/43] dhcpv6: use uio buffer in DHCPv6 message parsing --- dhcpv6/dhcpv6.go | 38 +++++++++---------------------- dhcpv6/dhcpv6message.go | 15 ++++++------ dhcpv6/dhcpv6relay.go | 19 +++++++++------- dhcpv6/option_prefixdelegation.go | 5 ++-- 4 files changed, 32 insertions(+), 45 deletions(-) diff --git a/dhcpv6/dhcpv6.go b/dhcpv6/dhcpv6.go index 70c2bff8..25fdcd03 100644 --- a/dhcpv6/dhcpv6.go +++ b/dhcpv6/dhcpv6.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/insomniacslk/dhcp/iana" + "github.com/u-root/u-root/pkg/uio" ) type DHCPv6 interface { @@ -29,36 +30,19 @@ type DHCPv6 interface { type Modifier func(d DHCPv6) DHCPv6 func FromBytes(data []byte) (DHCPv6, error) { - var ( - isRelay = false - headerSize int - messageType = MessageType(data[0]) - ) + buf := uio.NewBigEndianBuffer(data) + messageType := MessageType(buf.Read8()) + if messageType == MessageTypeRelayForward || messageType == MessageTypeRelayReply { - isRelay = true - } - if isRelay { - headerSize = RelayHeaderSize - } else { - headerSize = MessageHeaderSize - } - if len(data) < headerSize { - return nil, fmt.Errorf("Invalid header size: shorter than %v bytes", headerSize) - } - if isRelay { - var ( - linkAddr, peerAddr []byte - ) d := DHCPv6Relay{ messageType: messageType, - hopCount: uint8(data[1]), + hopCount: buf.Read8(), } - linkAddr = append(linkAddr, data[2:18]...) - d.linkAddr = linkAddr - peerAddr = append(peerAddr, data[18:34]...) - d.peerAddr = peerAddr + d.linkAddr = net.IP(buf.CopyN(net.IPv6len)) + d.peerAddr = net.IP(buf.CopyN(net.IPv6len)) + // TODO fail if no OptRelayMessage is present - if err := d.options.FromBytes(data[34:]); err != nil { + if err := d.options.FromBytes(buf.Data()); err != nil { return nil, err } return &d, nil @@ -66,8 +50,8 @@ func FromBytes(data []byte) (DHCPv6, error) { d := DHCPv6Message{ messageType: messageType, } - copy(d.transactionID[:], data[1:4]) - if err := d.options.FromBytes(data[4:]); err != nil { + buf.ReadBytes(d.transactionID[:]) + if err := d.options.FromBytes(buf.Data()); err != nil { return nil, err } return &d, nil diff --git a/dhcpv6/dhcpv6message.go b/dhcpv6/dhcpv6message.go index 85d93a36..078f72ab 100644 --- a/dhcpv6/dhcpv6message.go +++ b/dhcpv6/dhcpv6message.go @@ -9,6 +9,7 @@ import ( "time" "github.com/insomniacslk/dhcp/iana" + "github.com/u-root/u-root/pkg/uio" ) const MessageHeaderSize = 4 @@ -307,16 +308,16 @@ func (d *DHCPv6Message) Summary() string { return ret } -// Convert a DHCPv6Message structure into its binary representation, suitable for being -// sent over the network +// ToBytes returns the serialized version of this message as defined by RFC +// 3315, Section 5. func (d *DHCPv6Message) ToBytes() []byte { - var ret []byte - ret = append(ret, byte(d.messageType)) - ret = append(ret, d.transactionID[:]...) // discard the first byte + buf := uio.NewBigEndianBuffer(nil) + buf.Write8(uint8(d.messageType)) + buf.WriteBytes(d.transactionID[:]) for _, opt := range d.options { - ret = append(ret, opt.ToBytes()...) + buf.WriteBytes(opt.ToBytes()) } - return ret + return buf.Data() } func (d *DHCPv6Message) Length() int { diff --git a/dhcpv6/dhcpv6relay.go b/dhcpv6/dhcpv6relay.go index b51c139f..e2024f45 100644 --- a/dhcpv6/dhcpv6relay.go +++ b/dhcpv6/dhcpv6relay.go @@ -4,6 +4,8 @@ import ( "errors" "fmt" "net" + + "github.com/u-root/u-root/pkg/uio" ) const RelayHeaderSize = 34 @@ -49,17 +51,18 @@ func (r *DHCPv6Relay) Summary() string { return ret } +// ToBytes returns the serialized version of this relay message as defined by +// RFC 3315, Section 6. func (r *DHCPv6Relay) ToBytes() []byte { - ret := make([]byte, RelayHeaderSize) - ret[0] = byte(r.messageType) - ret[1] = byte(r.hopCount) - copy(ret[2:18], r.linkAddr) - copy(ret[18:34], r.peerAddr) + buf := uio.NewBigEndianBuffer(make([]byte, 0, RelayHeaderSize)) + buf.Write8(byte(r.messageType)) + buf.Write8(byte(r.hopCount)) + buf.WriteBytes(r.linkAddr.To16()) + buf.WriteBytes(r.peerAddr.To16()) for _, opt := range r.options { - ret = append(ret, opt.ToBytes()...) + buf.WriteBytes(opt.ToBytes()) } - - return ret + return buf.Data() } func (r *DHCPv6Relay) SetMessageType(messageType MessageType) { diff --git a/dhcpv6/option_prefixdelegation.go b/dhcpv6/option_prefixdelegation.go index da5dff67..58751620 100644 --- a/dhcpv6/option_prefixdelegation.go +++ b/dhcpv6/option_prefixdelegation.go @@ -1,13 +1,12 @@ package dhcpv6 -// This module defines the OptIAForPrefixDelegation structure. -// https://www.ietf.org/rfc/rfc3633.txt - import ( "encoding/binary" "fmt" ) +// OptIAForPrefixDelegation implements the identity association for prefix +// delegation option defined by RFC 3633, Section 9. type OptIAForPrefixDelegation struct { IaId [4]byte T1 uint32 From 3478513076477d0f19eaeaf441f29949a9f6bc92 Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 04:47:08 +0000 Subject: [PATCH 16/43] 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. --- dhcpv6/option_archtype.go | 36 +++++------ dhcpv6/option_bootfileurl.go | 21 ++++--- dhcpv6/option_clientid.go | 26 ++++---- dhcpv6/option_dnsrecursivenameserver.go | 36 +++++------ dhcpv6/option_domainsearchlist.go | 25 ++++---- dhcpv6/option_elapsedtime.go | 31 ++++----- dhcpv6/option_iaaddress.go | 45 +++++++------ dhcpv6/option_iaprefix.go | 51 +++++++-------- dhcpv6/option_interfaceid.go | 23 ++++--- dhcpv6/option_nii.go | 40 ++++++------ dhcpv6/option_nontemporaryaddress.go | 50 +++++++-------- dhcpv6/option_prefixdelegation.go | 37 +++++------ dhcpv6/option_relaymsg.go | 15 ++--- dhcpv6/option_remoteid.go | 36 +++++------ dhcpv6/option_requestedoption.go | 36 +++++------ dhcpv6/option_serverid.go | 28 ++++----- dhcpv6/option_statuscode.go | 32 +++++----- dhcpv6/option_userclass.go | 51 ++++++--------- dhcpv6/option_vendor_opts.go | 84 ++++++------------------- dhcpv6/option_vendor_opts_test.go | 25 -------- dhcpv6/option_vendorclass.go | 46 +++++--------- dhcpv6/options.go | 76 +++++++++------------- 22 files changed, 360 insertions(+), 490 deletions(-) diff --git a/dhcpv6/option_archtype.go b/dhcpv6/option_archtype.go index 058754ae..b3d36a4f 100644 --- a/dhcpv6/option_archtype.go +++ b/dhcpv6/option_archtype.go @@ -1,17 +1,17 @@ package dhcpv6 -// This module defines the OptClientArchType structure. -// https://www.ietf.org/rfc/rfc5970.txt - import ( - "encoding/binary" "fmt" "strings" "github.com/insomniacslk/dhcp/iana" + "github.com/u-root/u-root/pkg/uio" ) // OptClientArchType represents an option CLIENT_ARCH_TYPE +// +// This module defines the OptClientArchType structure. +// https://www.ietf.org/rfc/rfc5970.txt type OptClientArchType struct { ArchTypes []iana.Arch } @@ -20,20 +20,19 @@ func (op *OptClientArchType) Code() OptionCode { return OptionClientArchType } +// ToBytes marshals the client arch type as defined by RFC 5970. func (op *OptClientArchType) ToBytes() []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionClientArchType)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - u16 := make([]byte, 2) + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionClientArchType)) + buf.Write16(uint16(op.Length())) for _, at := range op.ArchTypes { - binary.BigEndian.PutUint16(u16, uint16(at)) - buf = append(buf, u16...) + buf.Write16(uint16(at)) } - return buf + return buf.Data() } func (op *OptClientArchType) Length() int { - return 2*len(op.ArchTypes) + return 2 * len(op.ArchTypes) } func (op *OptClientArchType) String() string { @@ -48,13 +47,10 @@ func (op *OptClientArchType) String() string { // a sequence of bytes The input data does not include option code and // length bytes. func ParseOptClientArchType(data []byte) (*OptClientArchType, error) { - opt := OptClientArchType{} - if len(data) == 0 || len(data)%2 != 0 { - return nil, fmt.Errorf("Invalid arch type data length. Expected multiple of 2 larger than 2, got %v", len(data)) - } - for idx := 0; idx < len(data); idx += 2 { - b := data[idx : idx+2] - opt.ArchTypes = append(opt.ArchTypes, iana.Arch(binary.BigEndian.Uint16(b))) + var opt OptClientArchType + buf := uio.NewBigEndianBuffer(data) + for buf.Has(2) { + opt.ArchTypes = append(opt.ArchTypes, iana.Arch(buf.Read16())) } - return &opt, nil + return &opt, buf.FinError() } diff --git a/dhcpv6/option_bootfileurl.go b/dhcpv6/option_bootfileurl.go index d2da0c34..e0ad63e0 100644 --- a/dhcpv6/option_bootfileurl.go +++ b/dhcpv6/option_bootfileurl.go @@ -1,14 +1,15 @@ package dhcpv6 -// This module defines the OptBootFileURL structure. -// https://www.ietf.org/rfc/rfc5970.txt - import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) // OptBootFileURL implements the OptionBootfileURL option +// +// This module defines the OptBootFileURL structure. +// https://www.ietf.org/rfc/rfc5970.txt type OptBootFileURL struct { BootFileURL []byte } @@ -20,11 +21,11 @@ func (op *OptBootFileURL) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptBootFileURL) ToBytes() []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionBootfileURL)) - binary.BigEndian.PutUint16(buf[2:4], uint16(len(op.BootFileURL))) - buf = append(buf, op.BootFileURL...) - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionBootfileURL)) + buf.Write16(uint16(len(op.BootFileURL))) + buf.WriteBytes(op.BootFileURL) + return buf.Data() } // Length returns the option length in bytes @@ -39,7 +40,7 @@ func (op *OptBootFileURL) String() string { // ParseOptBootFileURL builds an OptBootFileURL structure from a sequence // of bytes. The input data does not include option code and length bytes. func ParseOptBootFileURL(data []byte) (*OptBootFileURL, error) { - opt := OptBootFileURL{} + var opt OptBootFileURL opt.BootFileURL = append([]byte(nil), data...) return &opt, nil } diff --git a/dhcpv6/option_clientid.go b/dhcpv6/option_clientid.go index fc68ae78..92ceb249 100644 --- a/dhcpv6/option_clientid.go +++ b/dhcpv6/option_clientid.go @@ -1,14 +1,15 @@ package dhcpv6 -// This module defines the OptClientId and DUID structures. -// https://www.ietf.org/rfc/rfc3315.txt - import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) // OptClientId represents a Client ID option +// +// This module defines the OptClientId and DUID structures. +// https://www.ietf.org/rfc/rfc3315.txt type OptClientId struct { Cid Duid } @@ -17,12 +18,13 @@ func (op *OptClientId) Code() OptionCode { return OptionClientID } +// ToBytes marshals the Client ID option as defined by RFC 3315, Section 22.2. func (op *OptClientId) ToBytes() []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionClientID)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - buf = append(buf, op.Cid.ToBytes()...) - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionClientID)) + buf.Write16(uint16(op.Length())) + buf.WriteBytes(op.Cid.ToBytes()) + return buf.Data() } func (op *OptClientId) Length() int { @@ -37,11 +39,7 @@ func (op *OptClientId) String() string { // of bytes. The input data does not include option code and length // bytes. func ParseOptClientId(data []byte) (*OptClientId, error) { - if len(data) < 2 { - // at least the DUID type is necessary to continue - return nil, fmt.Errorf("Invalid OptClientId data: shorter than 2 bytes") - } - opt := OptClientId{} + var opt OptClientId cid, err := DuidFromBytes(data) if err != nil { return nil, err diff --git a/dhcpv6/option_dnsrecursivenameserver.go b/dhcpv6/option_dnsrecursivenameserver.go index 72b0767c..9018c4dc 100644 --- a/dhcpv6/option_dnsrecursivenameserver.go +++ b/dhcpv6/option_dnsrecursivenameserver.go @@ -1,15 +1,16 @@ package dhcpv6 -// This module defines the OptDNSRecursiveNameServer structure. -// https://www.ietf.org/rfc/rfc3646.txt - import ( - "encoding/binary" "fmt" "net" + + "github.com/u-root/u-root/pkg/uio" ) // OptDNSRecursiveNameServer represents a OptionDNSRecursiveNameServer option +// +// This module defines the OptDNSRecursiveNameServer structure. +// https://www.ietf.org/rfc/rfc3646.txt type OptDNSRecursiveNameServer struct { NameServers []net.IP } @@ -19,16 +20,15 @@ func (op *OptDNSRecursiveNameServer) Code() OptionCode { return OptionDNSRecursiveNameServer } -// ToBytes returns the option serialized to bytes, including option code and -// length +// ToBytes returns the option serialized to bytes. func (op *OptDNSRecursiveNameServer) ToBytes() []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionDNSRecursiveNameServer)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionDNSRecursiveNameServer)) + buf.Write16(uint16(op.Length())) for _, ns := range op.NameServers { - buf = append(buf, ns...) + buf.WriteBytes(ns.To16()) } - return buf + return buf.Data() } // Length returns the option length @@ -44,14 +44,10 @@ func (op *OptDNSRecursiveNameServer) String() string { // from a sequence of bytes. The input data does not include option code and length // bytes. func ParseOptDNSRecursiveNameServer(data []byte) (*OptDNSRecursiveNameServer, error) { - if len(data)%net.IPv6len != 0 { - return nil, fmt.Errorf("Invalid OptDNSRecursiveNameServer data: length is not a multiple of %d", net.IPv6len) - } - opt := OptDNSRecursiveNameServer{} - var nameServers []net.IP - for i := 0; i < len(data); i += net.IPv6len { - nameServers = append(nameServers, data[i:i+net.IPv6len]) + var opt OptDNSRecursiveNameServer + buf := uio.NewBigEndianBuffer(data) + for buf.Has(net.IPv6len) { + opt.NameServers = append(opt.NameServers, buf.CopyN(net.IPv6len)) } - opt.NameServers = nameServers - return &opt, nil + return &opt, buf.FinError() } diff --git a/dhcpv6/option_domainsearchlist.go b/dhcpv6/option_domainsearchlist.go index b7a356e7..404a1095 100644 --- a/dhcpv6/option_domainsearchlist.go +++ b/dhcpv6/option_domainsearchlist.go @@ -1,16 +1,16 @@ package dhcpv6 -// This module defines the OptDomainSearchList structure. -// https://www.ietf.org/rfc/rfc3646.txt - import ( - "encoding/binary" "fmt" "github.com/insomniacslk/dhcp/rfc1035label" + "github.com/u-root/u-root/pkg/uio" ) // OptDomainSearchList list implements a OptionDomainSearchList option +// +// This module defines the OptDomainSearchList structure. +// https://www.ietf.org/rfc/rfc3646.txt type OptDomainSearchList struct { DomainSearchList *rfc1035label.Labels } @@ -19,12 +19,13 @@ func (op *OptDomainSearchList) Code() OptionCode { return OptionDomainSearchList } +// ToBytes marshals this option to bytes. func (op *OptDomainSearchList) ToBytes() []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionDomainSearchList)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - buf = append(buf, op.DomainSearchList.ToBytes()...) - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionDomainSearchList)) + buf.Write16(uint16(op.Length())) + buf.WriteBytes(op.DomainSearchList.ToBytes()) + return buf.Data() } func (op *OptDomainSearchList) Length() int { @@ -42,11 +43,11 @@ func (op *OptDomainSearchList) String() string { // ParseOptDomainSearchList builds an OptDomainSearchList structure from a sequence // of bytes. The input data does not include option code and length bytes. func ParseOptDomainSearchList(data []byte) (*OptDomainSearchList, error) { - opt := OptDomainSearchList{} - labels, err := rfc1035label.FromBytes(data) + var opt OptDomainSearchList + var err error + opt.DomainSearchList, err = rfc1035label.FromBytes(data) if err != nil { return nil, err } - opt.DomainSearchList = labels return &opt, nil } diff --git a/dhcpv6/option_elapsedtime.go b/dhcpv6/option_elapsedtime.go index 6009bf8b..cca5a5d1 100644 --- a/dhcpv6/option_elapsedtime.go +++ b/dhcpv6/option_elapsedtime.go @@ -1,13 +1,15 @@ package dhcpv6 -// This module defines the OptElapsedTime structure. -// https://www.ietf.org/rfc/rfc3315.txt - import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) +// OptElapsedTime implements the Elapsed Time option. +// +// This module defines the OptElapsedTime structure. +// https://www.ietf.org/rfc/rfc3315.txt type OptElapsedTime struct { ElapsedTime uint16 } @@ -16,12 +18,13 @@ func (op *OptElapsedTime) Code() OptionCode { return OptionElapsedTime } +// ToBytes marshals this option to bytes. func (op *OptElapsedTime) ToBytes() []byte { - buf := make([]byte, 6) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionElapsedTime)) - binary.BigEndian.PutUint16(buf[2:4], 2) - binary.BigEndian.PutUint16(buf[4:6], uint16(op.ElapsedTime)) - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionElapsedTime)) + buf.Write16(2) + buf.Write16(uint16(op.ElapsedTime)) + return buf.Data() } func (op *OptElapsedTime) Length() int { @@ -35,10 +38,8 @@ func (op *OptElapsedTime) String() string { // build an OptElapsedTime structure from a sequence of bytes. // The input data does not include option code and length bytes. func ParseOptElapsedTime(data []byte) (*OptElapsedTime, error) { - opt := OptElapsedTime{} - if len(data) != 2 { - return nil, fmt.Errorf("Invalid elapsed time data length. Expected 2 bytes, got %v", len(data)) - } - opt.ElapsedTime = binary.BigEndian.Uint16(data) - return &opt, nil + var opt OptElapsedTime + buf := uio.NewBigEndianBuffer(data) + opt.ElapsedTime = buf.Read16() + return &opt, buf.FinError() } diff --git a/dhcpv6/option_iaaddress.go b/dhcpv6/option_iaaddress.go index 811cbbe6..096e50ca 100644 --- a/dhcpv6/option_iaaddress.go +++ b/dhcpv6/option_iaaddress.go @@ -1,15 +1,16 @@ package dhcpv6 -// This module defines the OptIAAddress structure. -// https://www.ietf.org/rfc/rfc3633.txt - import ( - "encoding/binary" "fmt" "net" + + "github.com/u-root/u-root/pkg/uio" ) -// OptIAAddress represents an OptionIAAddr +// OptIAAddress represents an OptionIAAddr. +// +// This module defines the OptIAAddress structure. +// https://www.ietf.org/rfc/rfc3633.txt type OptIAAddress struct { IPv6Addr net.IP PreferredLifetime uint32 @@ -24,16 +25,14 @@ func (op *OptIAAddress) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptIAAddress) ToBytes() []byte { - buf := make([]byte, 28) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionIAAddr)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - copy(buf[4:20], op.IPv6Addr[:]) - binary.BigEndian.PutUint32(buf[20:24], op.PreferredLifetime) - binary.BigEndian.PutUint32(buf[24:28], op.ValidLifetime) - for _, opt := range op.Options { - buf = append(buf, opt.ToBytes()...) - } - return buf + buf := uio.NewBigEndianBuffer(make([]byte, 0, 28)) + buf.Write16(uint16(OptionIAAddr)) + buf.Write16(uint16(op.Length())) + buf.WriteBytes(op.IPv6Addr.To16()) + buf.Write32(op.PreferredLifetime) + buf.Write32(op.ValidLifetime) + buf.WriteBytes(op.Options.ToBytes()) + return buf.Data() } // Length returns the option length @@ -54,15 +53,13 @@ func (op *OptIAAddress) String() string { // of bytes. The input data does not include option code and length // bytes. func ParseOptIAAddress(data []byte) (*OptIAAddress, error) { - opt := OptIAAddress{} - if len(data) < 24 { - return nil, fmt.Errorf("Invalid IA Address data length. Expected at least 24 bytes, got %v", len(data)) - } - opt.IPv6Addr = net.IP(data[:16]) - opt.PreferredLifetime = binary.BigEndian.Uint32(data[16:20]) - opt.ValidLifetime = binary.BigEndian.Uint32(data[20:24]) - if err := opt.Options.FromBytes(data[24:]); err != nil { + var opt OptIAAddress + buf := uio.NewBigEndianBuffer(data) + opt.IPv6Addr = net.IP(buf.CopyN(net.IPv6len)) + opt.PreferredLifetime = buf.Read32() + opt.ValidLifetime = buf.Read32() + if err := opt.Options.FromBytes(buf.ReadAll()); err != nil { return nil, err } - return &opt, nil + return &opt, buf.FinError() } diff --git a/dhcpv6/option_iaprefix.go b/dhcpv6/option_iaprefix.go index 2f71fb04..cad1a0c1 100644 --- a/dhcpv6/option_iaprefix.go +++ b/dhcpv6/option_iaprefix.go @@ -1,14 +1,16 @@ package dhcpv6 -// This module defines the OptIAPrefix structure. -// https://www.ietf.org/rfc/rfc3633.txt - import ( - "encoding/binary" "fmt" "net" + + "github.com/u-root/u-root/pkg/uio" ) +// OptIAPrefix implements the IAPrefix option. +// +// This module defines the OptIAPrefix structure. +// https://www.ietf.org/rfc/rfc3633.txt type OptIAPrefix struct { PreferredLifetime uint32 ValidLifetime uint32 @@ -21,18 +23,19 @@ func (op *OptIAPrefix) Code() OptionCode { return OptionIAPrefix } +// ToBytes marshals this option according to RFC 3633, Section 10. 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) - buf = append(buf, op.prefixLength) - buf = append(buf, op.ipv6Prefix...) + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionIAPrefix)) + buf.Write16(uint16(op.Length())) + buf.Write32(op.PreferredLifetime) + buf.Write32(op.ValidLifetime) + buf.Write8(op.prefixLength) + buf.WriteBytes(op.ipv6Prefix.To16()) for _, opt := range op.Options { - buf = append(buf, opt.ToBytes()...) + buf.WriteBytes(opt.ToBytes()) } - return buf + return buf.Data() } func (op *OptIAPrefix) PrefixLength() byte { @@ -78,19 +81,17 @@ func (op *OptIAPrefix) DelOption(code OptionCode) { op.Options.Del(code) } -// build an OptIAPrefix structure from a sequence of bytes. -// The input data does not include option code and length bytes. +// ParseOptIAPrefix 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) { - 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.prefixLength = data[8] - opt.ipv6Prefix = net.IP(data[9:25]) - if err := opt.Options.FromBytes(data[25:]); err != nil { + buf := uio.NewBigEndianBuffer(data) + var opt OptIAPrefix + opt.PreferredLifetime = buf.Read32() + opt.ValidLifetime = buf.Read32() + opt.prefixLength = buf.Read8() + opt.ipv6Prefix = net.IP(buf.CopyN(net.IPv6len)) + if err := opt.Options.FromBytes(buf.ReadAll()); err != nil { return nil, err } - return &opt, nil + return &opt, buf.FinError() } diff --git a/dhcpv6/option_interfaceid.go b/dhcpv6/option_interfaceid.go index 2bee7442..000be5dd 100644 --- a/dhcpv6/option_interfaceid.go +++ b/dhcpv6/option_interfaceid.go @@ -1,13 +1,16 @@ package dhcpv6 -// This module defines the OptInterfaceId structure. -// https://www.ietf.org/rfc/rfc3315.txt - import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) +// OptInterfaceId implements the interface-id option as defined by RFC 3315, +// Section 22.18. +// +// This module defines the OptInterfaceId structure. +// https://www.ietf.org/rfc/rfc3315.txt type OptInterfaceId struct { interfaceId []byte } @@ -17,11 +20,11 @@ func (op *OptInterfaceId) Code() OptionCode { } func (op *OptInterfaceId) ToBytes() []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionInterfaceID)) - binary.BigEndian.PutUint16(buf[2:4], uint16(len(op.interfaceId))) - buf = append(buf, op.interfaceId...) - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionInterfaceID)) + buf.Write16(uint16(len(op.interfaceId))) + buf.WriteBytes(op.interfaceId) + return buf.Data() } func (op *OptInterfaceId) InterfaceID() []byte { @@ -43,7 +46,7 @@ func (op *OptInterfaceId) String() string { // build an OptInterfaceId structure from a sequence of bytes. // The input data does not include option code and length bytes. func ParseOptInterfaceId(data []byte) (*OptInterfaceId, error) { - opt := OptInterfaceId{} + var opt OptInterfaceId opt.interfaceId = append([]byte(nil), data...) return &opt, nil } diff --git a/dhcpv6/option_nii.go b/dhcpv6/option_nii.go index 68e315e5..723c57a1 100644 --- a/dhcpv6/option_nii.go +++ b/dhcpv6/option_nii.go @@ -1,11 +1,9 @@ package dhcpv6 -// This module defines the OptNetworkInterfaceId structure. -// https://www.ietf.org/rfc/rfc5970.txt - import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) // see rfc4578 @@ -18,7 +16,7 @@ const ( NII_UNDI_EFI_GEN_II = 5 ) -var NIIToStringMap = map[uint8]string{ +var niiToStringMap = map[uint8]string{ NII_LANDESK_NOPXE: "LANDesk service agent boot ROMs. No PXE", NII_PXE_GEN_I: "First gen. PXE boot ROMs", NII_PXE_GEN_II: "Second gen. PXE boot ROMs", @@ -27,6 +25,8 @@ var NIIToStringMap = map[uint8]string{ NII_UNDI_EFI_GEN_II: "UNDI 32/64 bit. UEFI runtime 2nd gen", } +// OptNetworkInterfaceId implements the NIC ID option for network booting as +// defined by RFC 4578 Section 2.2 and RFC 5970 Section 3.4. type OptNetworkInterfaceId struct { type_ uint8 major, minor uint8 // revision number @@ -37,13 +37,13 @@ func (op *OptNetworkInterfaceId) Code() OptionCode { } func (op *OptNetworkInterfaceId) ToBytes() []byte { - buf := make([]byte, 7) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionNII)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - buf[4] = op.type_ - buf[5] = op.major - buf[6] = op.minor - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionNII)) + buf.Write16(uint16(op.Length())) + buf.Write8(op.type_) + buf.Write8(op.major) + buf.Write8(op.minor) + return buf.Data() } func (op *OptNetworkInterfaceId) Type() uint8 { @@ -75,7 +75,7 @@ func (op *OptNetworkInterfaceId) Length() int { } func (op *OptNetworkInterfaceId) String() string { - typeName, ok := NIIToStringMap[op.type_] + typeName, ok := niiToStringMap[op.type_] if !ok { typeName = "Unknown" } @@ -87,12 +87,10 @@ func (op *OptNetworkInterfaceId) String() string { // build an OptNetworkInterfaceId structure from a sequence of bytes. // The input data does not include option code and length bytes. func ParseOptNetworkInterfaceId(data []byte) (*OptNetworkInterfaceId, error) { - opt := OptNetworkInterfaceId{} - if len(data) != 3 { - return nil, fmt.Errorf("Invalid arch type data length. Expected 3 bytes, got %v", len(data)) - } - opt.type_ = data[0] - opt.major = data[1] - opt.minor = data[2] - return &opt, nil + buf := uio.NewBigEndianBuffer(data) + var opt OptNetworkInterfaceId + opt.type_ = buf.Read8() + opt.major = buf.Read8() + opt.minor = buf.Read8() + return &opt, buf.FinError() } diff --git a/dhcpv6/option_nontemporaryaddress.go b/dhcpv6/option_nontemporaryaddress.go index 94f79c00..7e8bbaf5 100644 --- a/dhcpv6/option_nontemporaryaddress.go +++ b/dhcpv6/option_nontemporaryaddress.go @@ -1,13 +1,16 @@ package dhcpv6 -// This module defines the OptIANA structure. -// https://www.ietf.org/rfc/rfc3633.txt - import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) +// OptIANA implements the identity association for non-temporary addresses +// option. +// +// This module defines the OptIANA structure. +// https://www.ietf.org/rfc/rfc3633.txt type OptIANA struct { IaId [4]byte T1 uint32 @@ -19,17 +22,16 @@ func (op *OptIANA) Code() OptionCode { return OptionIANA } +// ToBytes serializes IANA to DHCPv6 bytes. func (op *OptIANA) ToBytes() []byte { - buf := make([]byte, 16) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionIANA)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - copy(buf[4:8], op.IaId[:]) - binary.BigEndian.PutUint32(buf[8:12], op.T1) - binary.BigEndian.PutUint32(buf[12:16], op.T2) - for _, opt := range op.Options { - buf = append(buf, opt.ToBytes()...) - } - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionIANA)) + buf.Write16(uint16(op.Length())) + buf.WriteBytes(op.IaId[:]) + buf.Write32(op.T1) + buf.Write32(op.T2) + buf.WriteBytes(op.Options.ToBytes()) + return buf.Data() } func (op *OptIANA) Length() int { @@ -61,18 +63,16 @@ func (op *OptIANA) DelOption(code OptionCode) { op.Options.Del(code) } -// build an OptIANA structure from a sequence of bytes. -// The input data does not include option code and length bytes. +// ParseOptIANA builds an OptIANA structure from a sequence of bytes. The +// input data does not include option code and length bytes. func ParseOptIANA(data []byte) (*OptIANA, error) { - opt := OptIANA{} - if len(data) < 12 { - return nil, fmt.Errorf("Invalid IA for Non-temporary Addresses data length. Expected at least 12 bytes, got %v", len(data)) - } - copy(opt.IaId[:], data[:4]) - opt.T1 = binary.BigEndian.Uint32(data[4:8]) - opt.T2 = binary.BigEndian.Uint32(data[8:12]) - if err := opt.Options.FromBytes(data[12:]); err != nil { + var opt OptIANA + buf := uio.NewBigEndianBuffer(data) + buf.ReadBytes(opt.IaId[:]) + opt.T1 = buf.Read32() + opt.T2 = buf.Read32() + if err := opt.Options.FromBytes(buf.ReadAll()); err != nil { return nil, err } - return &opt, nil + return &opt, buf.FinError() } diff --git a/dhcpv6/option_prefixdelegation.go b/dhcpv6/option_prefixdelegation.go index 58751620..ee468768 100644 --- a/dhcpv6/option_prefixdelegation.go +++ b/dhcpv6/option_prefixdelegation.go @@ -1,8 +1,9 @@ package dhcpv6 import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) // OptIAForPrefixDelegation implements the identity association for prefix @@ -21,16 +22,14 @@ func (op *OptIAForPrefixDelegation) Code() OptionCode { // 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)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - copy(buf[4:8], op.IaId[:]) - binary.BigEndian.PutUint32(buf[8:12], op.T1) - binary.BigEndian.PutUint32(buf[12:16], op.T2) - for _, opt := range op.Options { - buf = append(buf, opt.ToBytes()...) - } - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionIAPD)) + buf.Write16(uint16(op.Length())) + buf.WriteBytes(op.IaId[:]) + buf.Write32(op.T1) + buf.Write32(op.T2) + buf.WriteBytes(op.Options.ToBytes()) + return buf.Data() } // Length returns the option length @@ -62,15 +61,13 @@ func (op *OptIAForPrefixDelegation) DelOption(code OptionCode) { // 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) { - 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)) - } - copy(opt.IaId[:], data[:4]) - opt.T1 = binary.BigEndian.Uint32(data[4:8]) - opt.T2 = binary.BigEndian.Uint32(data[8:12]) - if err := opt.Options.FromBytes(data[12:]); err != nil { + var opt OptIAForPrefixDelegation + buf := uio.NewBigEndianBuffer(data) + buf.ReadBytes(opt.IaId[:]) + opt.T1 = buf.Read32() + opt.T2 = buf.Read32() + if err := opt.Options.FromBytes(buf.ReadAll()); err != nil { return nil, err } - return &opt, nil + return &opt, buf.FinError() } diff --git a/dhcpv6/option_relaymsg.go b/dhcpv6/option_relaymsg.go index 89621ec2..09589f65 100644 --- a/dhcpv6/option_relaymsg.go +++ b/dhcpv6/option_relaymsg.go @@ -4,8 +4,9 @@ package dhcpv6 // https://www.ietf.org/rfc/rfc3315.txt import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) type OptRelayMsg struct { @@ -17,11 +18,11 @@ func (op *OptRelayMsg) Code() OptionCode { } func (op *OptRelayMsg) ToBytes() []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionRelayMsg)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - buf = append(buf, op.relayMessage.ToBytes()...) - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionRelayMsg)) + buf.Write16(uint16(op.Length())) + buf.WriteBytes(op.relayMessage.ToBytes()) + return buf.Data() } func (op *OptRelayMsg) RelayMessage() DHCPv6 { @@ -44,7 +45,7 @@ func (op *OptRelayMsg) String() string { // The input data does not include option code and length bytes. func ParseOptRelayMsg(data []byte) (*OptRelayMsg, error) { var err error - opt := OptRelayMsg{} + var opt OptRelayMsg opt.relayMessage, err = FromBytes(data) if err != nil { return nil, err diff --git a/dhcpv6/option_remoteid.go b/dhcpv6/option_remoteid.go index 9d249a75..6b1831d9 100644 --- a/dhcpv6/option_remoteid.go +++ b/dhcpv6/option_remoteid.go @@ -1,13 +1,14 @@ package dhcpv6 -// This module defines the OptRemoteId structure. -// https://www.ietf.org/rfc/rfc4649.txt - import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) +// OptRemoteId implemens the Remote ID option. +// +// https://www.ietf.org/rfc/rfc4649.txt type OptRemoteId struct { enterpriseNumber uint32 remoteId []byte @@ -17,13 +18,14 @@ func (op *OptRemoteId) Code() OptionCode { return OptionRemoteID } +// ToBytes serializes this option to a byte stream. func (op *OptRemoteId) ToBytes() []byte { - buf := make([]byte, 8) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionRemoteID)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - binary.BigEndian.PutUint32(buf[4:8], uint32(op.enterpriseNumber)) - buf = append(buf, op.remoteId...) - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionRemoteID)) + buf.Write16(uint16(op.Length())) + buf.Write32(uint32(op.enterpriseNumber)) + buf.WriteBytes(op.remoteId) + return buf.Data() } func (op *OptRemoteId) EnterpriseNumber() uint32 { @@ -52,14 +54,12 @@ func (op *OptRemoteId) String() string { ) } -// build an OptRemoteId structure from a sequence of bytes. +// ParseOptRemoteId builds an OptRemoteId structure from a sequence of bytes. // The input data does not include option code and length bytes. func ParseOptRemoteId(data []byte) (*OptRemoteId, error) { - opt := OptRemoteId{} - if len(data) < 4 { - return nil, fmt.Errorf("Invalid remote id data length. Expected at least 4 bytes, got %v", len(data)) - } - opt.enterpriseNumber = binary.BigEndian.Uint32(data[:4]) - opt.remoteId = append([]byte(nil), data[4:]...) - return &opt, nil + var opt OptRemoteId + buf := uio.NewBigEndianBuffer(data) + opt.enterpriseNumber = buf.Read32() + opt.remoteId = buf.ReadAll() + return &opt, buf.FinError() } diff --git a/dhcpv6/option_requestedoption.go b/dhcpv6/option_requestedoption.go index 0324642d..7f345f4a 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() } diff --git a/dhcpv6/option_serverid.go b/dhcpv6/option_serverid.go index dbc17f5a..4b1a828f 100644 --- a/dhcpv6/option_serverid.go +++ b/dhcpv6/option_serverid.go @@ -1,14 +1,15 @@ package dhcpv6 -// This module defines the OptServerId and DUID structures. -// https://www.ietf.org/rfc/rfc3315.txt - import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) -// OptServerId represents a Client ID option +// OptServerId represents a Server ID option +// +// This module defines the OptServerId and DUID structures. +// https://www.ietf.org/rfc/rfc3315.txt type OptServerId struct { Sid Duid } @@ -17,12 +18,13 @@ func (op *OptServerId) Code() OptionCode { return OptionServerID } +// ToBytes serializes this option. func (op *OptServerId) ToBytes() []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionServerID)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - buf = append(buf, op.Sid.ToBytes()...) - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionServerID)) + buf.Write16(uint16(op.Length())) + buf.WriteBytes(op.Sid.ToBytes()) + return buf.Data() } func (op *OptServerId) Length() int { @@ -36,11 +38,7 @@ func (op *OptServerId) String() string { // ParseOptServerId builds an OptServerId structure from a sequence of bytes. // The input data does not include option code and length bytes. func ParseOptServerId(data []byte) (*OptServerId, error) { - if len(data) < 2 { - // at least the DUID type is necessary to continue - return nil, fmt.Errorf("Invalid OptServerId data: shorter than 2 bytes") - } - opt := OptServerId{} + var opt OptServerId sid, err := DuidFromBytes(data) if err != nil { return nil, err diff --git a/dhcpv6/option_statuscode.go b/dhcpv6/option_statuscode.go index 74d200cb..a368a091 100644 --- a/dhcpv6/option_statuscode.go +++ b/dhcpv6/option_statuscode.go @@ -1,16 +1,16 @@ package dhcpv6 -// This module defines the OptStatusCode structure. -// https://www.ietf.org/rfc/rfc3315.txt - import ( - "encoding/binary" "fmt" "github.com/insomniacslk/dhcp/iana" + "github.com/u-root/u-root/pkg/uio" ) // OptStatusCode represents a DHCPv6 Status Code option +// +// This module defines the OptStatusCode structure. +// https://www.ietf.org/rfc/rfc3315.txt type OptStatusCode struct { StatusCode iana.StatusCode StatusMessage []byte @@ -23,12 +23,12 @@ func (op *OptStatusCode) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptStatusCode) ToBytes() []byte { - buf := make([]byte, 6) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionStatusCode)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - binary.BigEndian.PutUint16(buf[4:6], uint16(op.StatusCode)) - buf = append(buf, op.StatusMessage...) - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionStatusCode)) + buf.Write16(uint16(op.Length())) + buf.Write16(uint16(op.StatusCode)) + buf.WriteBytes(op.StatusMessage) + return buf.Data() } // Length returns the option length @@ -45,11 +45,9 @@ func (op *OptStatusCode) String() string { // ParseOptStatusCode builds an OptStatusCode structure from a sequence of // bytes. The input data does not include option code and length bytes. func ParseOptStatusCode(data []byte) (*OptStatusCode, error) { - if len(data) < 2 { - return nil, fmt.Errorf("Invalid OptStatusCode data: length is shorter than 2") - } - opt := OptStatusCode{} - opt.StatusCode = iana.StatusCode(binary.BigEndian.Uint16(data[0:2])) - opt.StatusMessage = append(opt.StatusMessage, data[2:]...) - return &opt, nil + var opt OptStatusCode + buf := uio.NewBigEndianBuffer(data) + opt.StatusCode = iana.StatusCode(buf.Read16()) + opt.StatusMessage = buf.ReadAll() + return &opt, buf.FinError() } diff --git a/dhcpv6/option_userclass.go b/dhcpv6/option_userclass.go index 652c2163..15f35127 100644 --- a/dhcpv6/option_userclass.go +++ b/dhcpv6/option_userclass.go @@ -1,16 +1,16 @@ package dhcpv6 -// This module defines the OptUserClass structure. -// https://www.ietf.org/rfc/rfc3315.txt - import ( - "encoding/binary" - "errors" "fmt" "strings" + + "github.com/u-root/u-root/pkg/uio" ) // OptUserClass represent a DHCPv6 User Class option +// +// This module defines the OptUserClass structure. +// https://www.ietf.org/rfc/rfc3315.txt type OptUserClass struct { UserClasses [][]byte } @@ -22,16 +22,14 @@ func (op *OptUserClass) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptUserClass) ToBytes() []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionUserClass)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - u16 := make([]byte, 2) + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionUserClass)) + buf.Write16(uint16(op.Length())) for _, uc := range op.UserClasses { - binary.BigEndian.PutUint16(u16, uint16(len(uc))) - buf = append(buf, u16...) - buf = append(buf, uc...) + buf.Write16(uint16(len(uc))) + buf.WriteBytes(uc) } - return buf + return buf.Data() } // Length returns the option length @@ -44,7 +42,7 @@ func (op *OptUserClass) Length() int { } func (op *OptUserClass) String() string { - ucStrings := make([]string, 0) + ucStrings := make([]string, 0, len(op.UserClasses)) for _, uc := range op.UserClasses { ucStrings = append(ucStrings, string(uc)) } @@ -54,23 +52,14 @@ func (op *OptUserClass) String() string { // ParseOptUserClass builds an OptUserClass structure from a sequence of // bytes. The input data does not include option code and length bytes. func ParseOptUserClass(data []byte) (*OptUserClass, error) { - opt := OptUserClass{} - for { - if len(data) == 0 { - break - } - if len(data) < 2 { - return nil, errors.New("ParseOptUserClass: short data: missing length field") - } - ucLen := int(binary.BigEndian.Uint16(data[:2])) - if len(data) < ucLen+2 { - return nil, fmt.Errorf("ParseOptUserClass: short data: less than %d bytes", ucLen+2) - } - opt.UserClasses = append(opt.UserClasses, data[2:ucLen+2]) - data = data[2+ucLen:] + var opt OptUserClass + if len(data) == 0 { + return nil, fmt.Errorf("user class option must not be empty") } - if len(opt.UserClasses) < 1 { - return nil, errors.New("ParseOptUserClass: at least one user class is required") + buf := uio.NewBigEndianBuffer(data) + for buf.Has(2) { + len := buf.Read16() + opt.UserClasses = append(opt.UserClasses, buf.CopyN(int(len))) } - return &opt, nil + return &opt, buf.FinError() } diff --git a/dhcpv6/option_vendor_opts.go b/dhcpv6/option_vendor_opts.go index f791ddff..027e7c34 100644 --- a/dhcpv6/option_vendor_opts.go +++ b/dhcpv6/option_vendor_opts.go @@ -1,39 +1,15 @@ package dhcpv6 -/* - This module defines the OptVendorOpts structure. - https://tools.ietf.org/html/rfc3315#section-22.17 - - Option 17 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | OPTION_VENDOR_OPTS | option-len | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | enterprise-number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - . . - . option-data (sub-options) . - . . - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - Sub-Option - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | opt-code | option-len | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - . . - . option-data . - . . - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -*/ - import ( - "encoding/binary" - "errors" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) // OptVendorOpts represents a DHCPv6 Status Code option +// +// This module defines the OptVendorOpts structure. +// https://tools.ietf.org/html/rfc3315#section-22.17 type OptVendorOpts struct { EnterpriseNumber uint32 VendorOpts Options @@ -46,14 +22,12 @@ func (op *OptVendorOpts) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptVendorOpts) ToBytes() []byte { - buf := make([]byte, 8) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionVendorOpts)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - binary.BigEndian.PutUint32(buf[4:8], uint32(op.EnterpriseNumber)) - for _, opt := range op.VendorOpts { - buf = append(buf, opt.ToBytes()...) - } - return buf + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionVendorOpts)) + buf.Write16(uint16(op.Length())) + buf.Write32(uint32(op.EnterpriseNumber)) + buf.WriteData(op.VendorOpts.ToBytes()) + return buf.Data() } // Length returns the option length @@ -75,41 +49,19 @@ func (op *OptVendorOpts) String() string { // ParseOptVendorOpts builds an OptVendorOpts structure from a sequence of bytes. // The input data does not include option code and length bytes. func ParseOptVendorOpts(data []byte) (*OptVendorOpts, error) { - opt := OptVendorOpts{} - if len(data) < 4 { - return nil, fmt.Errorf("Invalid vendor opts data length. Expected at least 4 bytes, got %v", len(data)) - } - opt.EnterpriseNumber = binary.BigEndian.Uint32(data[:4]) - - if err := opt.VendorOpts.FromBytesWithParser(data[4:], vendParseOption); err != nil { + var opt OptVendorOpts + buf := uio.NewBigEndianBuffer(data) + opt.EnterpriseNumber = buf.Read32() + if err := opt.VendorOpts.FromBytesWithParser(buf.ReadAll(), vendParseOption); err != nil { return nil, err } - return &opt, nil + return &opt, buf.FinError() } // vendParseOption builds a GenericOption from a slice of bytes // We cannot use the existing ParseOption function in options.go because the // sub-options include codes specific to each vendor. There are overlaps in these // codes with RFC standard codes. -func vendParseOption(dataStart []byte) (Option, error) { - // Parse a sequence of bytes as a single DHCPv6 option. - // Returns the option structure, or an error if any. - - if len(dataStart) < 4 { - return nil, fmt.Errorf("Invalid DHCPv6 vendor option: less than 4 bytes") - } - code := OptionCode(binary.BigEndian.Uint16(dataStart[:2])) - length := int(binary.BigEndian.Uint16(dataStart[2:4])) - if len(dataStart) < length+4 { - return nil, fmt.Errorf("Invalid option length for vendor option %v. Declared %v, actual %v", - code, length, len(dataStart)-4, - ) - } - - optData := dataStart[4 : 4+length] - if len(optData) < 1 { - return nil, errors.New("vendParseOption: at least one vendor options data is required") - } - - return &OptionGeneric{OptionCode: code, OptionData: optData}, nil +func vendParseOption(code OptionCode, data []byte) (Option, error) { + return &OptionGeneric{OptionCode: code, OptionData: data}, nil } diff --git a/dhcpv6/option_vendor_opts_test.go b/dhcpv6/option_vendor_opts_test.go index 468fea52..cce46504 100644 --- a/dhcpv6/option_vendor_opts_test.go +++ b/dhcpv6/option_vendor_opts_test.go @@ -48,28 +48,3 @@ func TestOptVendorOptsToBytes(t *testing.T) { toBytes := opt.ToBytes() require.Equal(t, expected, toBytes) } - -func TestVendParseOption(t *testing.T) { - var buf []byte - buf = append(buf, []byte{00, 1, 00, 33}...) - buf = append(buf, []byte("Arista;DCS-7304;01.00;HSH14425148")...) - - expected := &OptionGeneric{OptionCode: 1, OptionData: []byte("Arista;DCS-7304;01.00;HSH14425148")} - opt, err := vendParseOption(buf) - require.NoError(t, err) - require.Equal(t, expected, opt) - - shortData := make([]byte, 1) // data length too small - _, err = vendParseOption(shortData) - require.Error(t, err) - - shortData = []byte{0, 0, 0, 0} // missing actual vendor data. - _, err = vendParseOption(shortData) - require.Error(t, err) - - shortData = []byte{0, 0, - 0, 4, // declared length - 0} // data starts here, length of 1 - _, err = vendParseOption(shortData) - require.Error(t, err) -} diff --git a/dhcpv6/option_vendorclass.go b/dhcpv6/option_vendorclass.go index b920fa72..b7204e7d 100644 --- a/dhcpv6/option_vendorclass.go +++ b/dhcpv6/option_vendorclass.go @@ -1,10 +1,11 @@ package dhcpv6 import ( - "encoding/binary" "errors" "fmt" "strings" + + "github.com/u-root/u-root/pkg/uio" ) // OptVendorClass represents a DHCPv6 Vendor Class option @@ -20,17 +21,15 @@ func (op *OptVendorClass) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptVendorClass) ToBytes() []byte { - buf := make([]byte, 8) - binary.BigEndian.PutUint16(buf[0:2], uint16(OptionVendorClass)) - binary.BigEndian.PutUint16(buf[2:4], uint16(op.Length())) - binary.BigEndian.PutUint32(buf[4:8], uint32(op.EnterpriseNumber)) - u16 := make([]byte, 2) + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(OptionVendorClass)) + buf.Write16(uint16(op.Length())) + buf.Write32(uint32(op.EnterpriseNumber)) for _, data := range op.Data { - binary.BigEndian.PutUint16(u16, uint16(len(data))) - buf = append(buf, u16...) - buf = append(buf, data...) + buf.Write16(uint16(len(data))) + buf.WriteBytes(data) } - return buf + return buf.Data() } // Length returns the option length @@ -54,28 +53,15 @@ func (op *OptVendorClass) String() string { // ParseOptVendorClass builds an OptVendorClass structure from a sequence of // bytes. The input data does not include option code and length bytes. func ParseOptVendorClass(data []byte) (*OptVendorClass, error) { - opt := OptVendorClass{} - if len(data) < 4 { - return nil, fmt.Errorf("Invalid vendor opts data length. Expected at least 4 bytes, got %v", len(data)) - } - opt.EnterpriseNumber = binary.BigEndian.Uint32(data[:4]) - data = data[4:] - for { - if len(data) == 0 { - break - } - if len(data) < 2 { - return nil, errors.New("ParseOptVendorClass: short data: missing length field") - } - vcLen := int(binary.BigEndian.Uint16(data[:2])) - if len(data) < vcLen+2 { - return nil, fmt.Errorf("ParseOptVendorClass: short data: less than %d bytes", vcLen+2) - } - opt.Data = append(opt.Data, data[2:vcLen+2]) - data = data[2+vcLen:] + var opt OptVendorClass + buf := uio.NewBigEndianBuffer(data) + opt.EnterpriseNumber = buf.Read32() + for buf.Has(2) { + len := buf.Read16() + opt.Data = append(opt.Data, buf.CopyN(int(len))) } if len(opt.Data) < 1 { return nil, errors.New("ParseOptVendorClass: at least one vendor class data is required") } - return &opt, nil + return &opt, buf.FinError() } diff --git a/dhcpv6/options.go b/dhcpv6/options.go index 23ad5891..59742de8 100644 --- a/dhcpv6/options.go +++ b/dhcpv6/options.go @@ -1,8 +1,9 @@ package dhcpv6 import ( - "encoding/binary" "fmt" + + "github.com/u-root/u-root/pkg/uio" ) // Option is an interface that all DHCPv6 options adhere to. @@ -23,15 +24,11 @@ func (og *OptionGeneric) Code() OptionCode { } func (og *OptionGeneric) ToBytes() []byte { - var ret []byte - codeBytes := make([]byte, 2) - binary.BigEndian.PutUint16(codeBytes, uint16(og.OptionCode)) - ret = append(ret, codeBytes...) - lengthBytes := make([]byte, 2) - binary.BigEndian.PutUint16(lengthBytes, uint16(len(og.OptionData))) - ret = append(ret, lengthBytes...) - ret = append(ret, og.OptionData...) - return ret + buf := uio.NewBigEndianBuffer(nil) + buf.Write16(uint16(og.OptionCode)) + buf.Write16(uint16(len(og.OptionData))) + buf.WriteBytes(og.OptionData) + return buf.Data() } func (og *OptionGeneric) String() string { @@ -42,24 +39,14 @@ func (og *OptionGeneric) Length() int { return len(og.OptionData) } -func ParseOption(dataStart []byte) (Option, error) { +// ParseOption parses data according to the given code. +func ParseOption(code OptionCode, optData []byte) (Option, error) { // Parse a sequence of bytes as a single DHCPv6 option. // Returns the option structure, or an error if any. - if len(dataStart) < 4 { - return nil, fmt.Errorf("Invalid DHCPv6 option: less than 4 bytes") - } - code := OptionCode(binary.BigEndian.Uint16(dataStart[:2])) - length := int(binary.BigEndian.Uint16(dataStart[2:4])) - if len(dataStart) < length+4 { - return nil, fmt.Errorf("Invalid option length for option %v. Declared %v, actual %v", - code, length, len(dataStart)-4, - ) - } var ( err error opt Option ) - optData := dataStart[4 : 4+length] switch code { case OptionClientID: opt, err = ParseOptClientId(optData) @@ -107,10 +94,6 @@ func ParseOption(dataStart []byte) (Option, error) { if err != nil { return nil, err } - if length != opt.Length() { - return nil, fmt.Errorf("Error: declared length is different from actual length for option %d: %d != %d", - code, opt.Length(), length) - } return opt, nil } @@ -167,6 +150,15 @@ func (o *Options) Update(option Option) { o.Add(option) } +// ToBytes marshals all options to bytes. +func (o Options) ToBytes() []byte { + var buf []byte + for _, opt := range o { + buf = append(buf, opt.ToBytes()...) + } + return buf +} + // FromBytes reads data into o and returns an error if the options are not a // valid serialized representation of DHCPv6 options per RFC 3315. func (o *Options) FromBytes(data []byte) error { @@ -174,37 +166,31 @@ func (o *Options) FromBytes(data []byte) error { } // OptionParser is a function signature for option parsing -type OptionParser func(data []byte) (Option, error) +type OptionParser func(code OptionCode, data []byte) (Option, error) // FromBytesWithParser parses Options from byte sequences using the parsing // function that is passed in as a paremeter func (o *Options) FromBytesWithParser(data []byte, parser OptionParser) error { - // Parse a sequence of bytes until the end and build a list of options from - // it. Returns an error if any invalid option or length is found. *o = make(Options, 0, 10) if len(data) == 0 { // no options, no party return nil } - if len(data) < 4 { - // cannot be shorter than option code (2 bytes) + length (2 bytes) - return fmt.Errorf("Invalid options: shorter than 4 bytes") - } - idx := 0 - for { - if idx == len(data) { - break - } - if idx > len(data) { - // this should never happen - return fmt.Errorf("Error: reading past the end of options") - } - opt, err := parser(data[idx:]) + + buf := uio.NewBigEndianBuffer(data) + for buf.Has(4) { + code := OptionCode(buf.Read16()) + length := int(buf.Read16()) + + // Consume, but do not Copy. Each parser will make a copy of + // pertinent data. + optData := buf.Consume(length) + + opt, err := parser(code, optData) if err != nil { return err } *o = append(*o, opt) - idx += opt.Length() + 4 // 4 bytes for type + length } - return nil + return buf.FinError() } From da69dad309583925ff4f8d0454bd0fb5bb6a1402 Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 20:13:51 +0000 Subject: [PATCH 17/43] dhcpv6: move option code and length marshaling to Options.ToBytes. --- dhcpv6/dhcpv6_test.go | 7 ++-- dhcpv6/dhcpv6message.go | 4 +-- dhcpv6/dhcpv6relay.go | 4 +-- dhcpv6/option_archtype.go | 2 -- dhcpv6/option_archtype_test.go | 7 +--- dhcpv6/option_bootfileurl.go | 8 +---- dhcpv6/option_bootfileurl_test.go | 6 ++-- dhcpv6/option_clientid.go | 8 +---- dhcpv6/option_clientid_test.go | 8 +---- dhcpv6/option_dnsrecursivenameserver.go | 2 -- dhcpv6/option_dnsrecursivenameserver_test.go | 6 +--- dhcpv6/option_domainsearchlist.go | 7 +--- dhcpv6/option_domainsearchlist_test.go | 2 -- dhcpv6/option_elapsedtime.go | 2 -- dhcpv6/option_elapsedtime_test.go | 2 +- dhcpv6/option_iaaddress.go | 4 +-- dhcpv6/option_iaaddress_test.go | 7 +--- dhcpv6/option_iaprefix.go | 6 +--- dhcpv6/option_iaprefix_test.go | 34 +++++++++----------- dhcpv6/option_interfaceid.go | 8 +---- dhcpv6/option_interfaceid_test.go | 6 ++-- dhcpv6/option_nii.go | 2 -- dhcpv6/option_nii_test.go | 26 +++++++-------- dhcpv6/option_nontemporaryaddress.go | 2 -- dhcpv6/option_nontemporaryaddress_test.go | 2 -- dhcpv6/option_prefixdelegation.go | 2 -- dhcpv6/option_prefixdelegation_test.go | 18 +++++------ dhcpv6/option_relaymsg.go | 8 +---- dhcpv6/option_remoteid.go | 2 -- dhcpv6/option_remoteid_test.go | 3 +- dhcpv6/option_requestedoption.go | 2 -- dhcpv6/option_serverid.go | 8 +---- dhcpv6/option_serverid_test.go | 8 +---- dhcpv6/option_statuscode.go | 2 -- dhcpv6/option_statuscode_test.go | 2 -- dhcpv6/option_userclass.go | 2 -- dhcpv6/option_userclass_test.go | 4 --- dhcpv6/option_vendor_opts.go | 2 -- dhcpv6/option_vendor_opts_test.go | 8 ++--- dhcpv6/option_vendorclass.go | 2 -- dhcpv6/option_vendorclass_test.go | 2 -- dhcpv6/options.go | 16 ++++----- 42 files changed, 71 insertions(+), 192 deletions(-) diff --git a/dhcpv6/dhcpv6_test.go b/dhcpv6/dhcpv6_test.go index d5a29aaf..81d7ad19 100644 --- a/dhcpv6/dhcpv6_test.go +++ b/dhcpv6/dhcpv6_test.go @@ -140,10 +140,9 @@ func TestAddOption(t *testing.T) { func TestToBytes(t *testing.T) { d := DHCPv6Message{} d.SetMessage(MessageTypeSolicit) - xid := TransactionID{0xa, 0xb, 0xc} - d.SetTransactionID(xid) - opt := OptionGeneric{OptionCode: 0, OptionData: []byte{}} - d.AddOption(&opt) + d.SetTransactionID(TransactionID{0xa, 0xb, 0xc}) + d.AddOption(&OptionGeneric{OptionCode: 0, OptionData: []byte{}}) + bytes := d.ToBytes() expected := []byte{01, 0xa, 0xb, 0xc, 0x00, 0x00, 0x00, 0x00} require.Equal(t, expected, bytes) diff --git a/dhcpv6/dhcpv6message.go b/dhcpv6/dhcpv6message.go index 078f72ab..43d9f503 100644 --- a/dhcpv6/dhcpv6message.go +++ b/dhcpv6/dhcpv6message.go @@ -314,9 +314,7 @@ func (d *DHCPv6Message) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) buf.Write8(uint8(d.messageType)) buf.WriteBytes(d.transactionID[:]) - for _, opt := range d.options { - buf.WriteBytes(opt.ToBytes()) - } + buf.WriteBytes(d.options.ToBytes()) return buf.Data() } diff --git a/dhcpv6/dhcpv6relay.go b/dhcpv6/dhcpv6relay.go index e2024f45..337bda6a 100644 --- a/dhcpv6/dhcpv6relay.go +++ b/dhcpv6/dhcpv6relay.go @@ -59,9 +59,7 @@ func (r *DHCPv6Relay) ToBytes() []byte { buf.Write8(byte(r.hopCount)) buf.WriteBytes(r.linkAddr.To16()) buf.WriteBytes(r.peerAddr.To16()) - for _, opt := range r.options { - buf.WriteBytes(opt.ToBytes()) - } + buf.WriteBytes(r.options.ToBytes()) return buf.Data() } diff --git a/dhcpv6/option_archtype.go b/dhcpv6/option_archtype.go index b3d36a4f..afb22b15 100644 --- a/dhcpv6/option_archtype.go +++ b/dhcpv6/option_archtype.go @@ -23,8 +23,6 @@ func (op *OptClientArchType) Code() OptionCode { // ToBytes marshals the client arch type as defined by RFC 5970. func (op *OptClientArchType) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionClientArchType)) - buf.Write16(uint16(op.Length())) for _, at := range op.ArchTypes { buf.Write16(uint16(at)) } diff --git a/dhcpv6/option_archtype_test.go b/dhcpv6/option_archtype_test.go index abf872dd..cf9f4328 100644 --- a/dhcpv6/option_archtype_test.go +++ b/dhcpv6/option_archtype_test.go @@ -26,14 +26,9 @@ func TestOptClientArchTypeParseAndToBytes(t *testing.T) { data := []byte{ 0, 8, // EFI_XSCALE } - expected := []byte{ - 0, 61, // OptionClientArchType - 0, 2, // length - 0, 8, // EFI_XSCALE - } opt, err := ParseOptClientArchType(data) require.NoError(t, err) - require.Equal(t, expected, opt.ToBytes()) + require.Equal(t, data, opt.ToBytes()) } func TestOptClientArchType(t *testing.T) { diff --git a/dhcpv6/option_bootfileurl.go b/dhcpv6/option_bootfileurl.go index e0ad63e0..d34f5ec0 100644 --- a/dhcpv6/option_bootfileurl.go +++ b/dhcpv6/option_bootfileurl.go @@ -2,8 +2,6 @@ package dhcpv6 import ( "fmt" - - "github.com/u-root/u-root/pkg/uio" ) // OptBootFileURL implements the OptionBootfileURL option @@ -21,11 +19,7 @@ func (op *OptBootFileURL) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptBootFileURL) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionBootfileURL)) - buf.Write16(uint16(len(op.BootFileURL))) - buf.WriteBytes(op.BootFileURL) - return buf.Data() + return op.BootFileURL } // Length returns the option length in bytes diff --git a/dhcpv6/option_bootfileurl_test.go b/dhcpv6/option_bootfileurl_test.go index f93dc47d..97d31632 100644 --- a/dhcpv6/option_bootfileurl_test.go +++ b/dhcpv6/option_bootfileurl_test.go @@ -24,13 +24,11 @@ func TestOptBootFileURL(t *testing.T) { func TestOptBootFileURLToBytes(t *testing.T) { urlString := []byte("https://insomniac.slackware.it") - expected := []byte{00, 59, 00, byte(len(urlString))} - expected = append(expected, urlString...) opt := OptBootFileURL{ BootFileURL: urlString, } toBytes := opt.ToBytes() - if !bytes.Equal(toBytes, expected) { - t.Fatalf("Invalid ToBytes result. Expected %v, got %v", expected, toBytes) + if !bytes.Equal(toBytes, urlString) { + t.Fatalf("Invalid ToBytes result. Expected %v, got %v", urlString, toBytes) } } diff --git a/dhcpv6/option_clientid.go b/dhcpv6/option_clientid.go index 92ceb249..d0d31d67 100644 --- a/dhcpv6/option_clientid.go +++ b/dhcpv6/option_clientid.go @@ -2,8 +2,6 @@ package dhcpv6 import ( "fmt" - - "github.com/u-root/u-root/pkg/uio" ) // OptClientId represents a Client ID option @@ -20,11 +18,7 @@ func (op *OptClientId) Code() OptionCode { // ToBytes marshals the Client ID option as defined by RFC 3315, Section 22.2. func (op *OptClientId) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionClientID)) - buf.Write16(uint16(op.Length())) - buf.WriteBytes(op.Cid.ToBytes()) - return buf.Data() + return op.Cid.ToBytes() } func (op *OptClientId) Length() int { diff --git a/dhcpv6/option_clientid_test.go b/dhcpv6/option_clientid_test.go index 5e95d1a7..b147e578 100644 --- a/dhcpv6/option_clientid_test.go +++ b/dhcpv6/option_clientid_test.go @@ -30,8 +30,6 @@ func TestOptClientIdToBytes(t *testing.T) { }, } expected := []byte{ - 0, 1, // OptionClientID - 0, 10, // length 0, 3, // DUID_LL 0, 1, // hwtype ethernet 5, 4, 3, 2, 1, 0, // hw addr @@ -45,13 +43,9 @@ func TestOptClientIdDecodeEncode(t *testing.T) { 0, 1, // hwtype ethernet 5, 4, 3, 2, 1, 0, // hw addr } - expected := append([]byte{ - 0, 1, // OptionClientID - 0, 10, // length - }, data...) opt, err := ParseOptClientId(data) require.NoError(t, err) - require.Equal(t, expected, opt.ToBytes()) + require.Equal(t, data, opt.ToBytes()) } func TestOptionClientId(t *testing.T) { diff --git a/dhcpv6/option_dnsrecursivenameserver.go b/dhcpv6/option_dnsrecursivenameserver.go index 9018c4dc..cd78c8c2 100644 --- a/dhcpv6/option_dnsrecursivenameserver.go +++ b/dhcpv6/option_dnsrecursivenameserver.go @@ -23,8 +23,6 @@ func (op *OptDNSRecursiveNameServer) Code() OptionCode { // ToBytes returns the option serialized to bytes. func (op *OptDNSRecursiveNameServer) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionDNSRecursiveNameServer)) - buf.Write16(uint16(op.Length())) for _, ns := range op.NameServers { buf.WriteBytes(ns.To16()) } diff --git a/dhcpv6/option_dnsrecursivenameserver_test.go b/dhcpv6/option_dnsrecursivenameserver_test.go index 1a567974..436cf2f3 100644 --- a/dhcpv6/option_dnsrecursivenameserver_test.go +++ b/dhcpv6/option_dnsrecursivenameserver_test.go @@ -26,11 +26,7 @@ func TestOptDNSRecursiveNameServerToBytes(t *testing.T) { ns1 := net.ParseIP("2a03:2880:fffe:c:face:b00c:0:35") ns2 := net.ParseIP("2001:4860:4860::8888") nameservers := []net.IP{ns1, ns2} - expected := []byte{ - 0, 23, // OptionDNSRecursiveNameServer - 0, 32, // length - } - expected = append(expected, []byte(ns1)...) + expected := append([]byte{}, []byte(ns1)...) expected = append(expected, []byte(ns2)...) opt := OptDNSRecursiveNameServer{NameServers: nameservers} require.Equal(t, expected, opt.ToBytes()) diff --git a/dhcpv6/option_domainsearchlist.go b/dhcpv6/option_domainsearchlist.go index 404a1095..21d7c230 100644 --- a/dhcpv6/option_domainsearchlist.go +++ b/dhcpv6/option_domainsearchlist.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/insomniacslk/dhcp/rfc1035label" - "github.com/u-root/u-root/pkg/uio" ) // OptDomainSearchList list implements a OptionDomainSearchList option @@ -21,11 +20,7 @@ func (op *OptDomainSearchList) Code() OptionCode { // ToBytes marshals this option to bytes. func (op *OptDomainSearchList) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionDomainSearchList)) - buf.Write16(uint16(op.Length())) - buf.WriteBytes(op.DomainSearchList.ToBytes()) - return buf.Data() + return op.DomainSearchList.ToBytes() } func (op *OptDomainSearchList) Length() int { diff --git a/dhcpv6/option_domainsearchlist_test.go b/dhcpv6/option_domainsearchlist_test.go index 0b4b6b09..67c053a8 100644 --- a/dhcpv6/option_domainsearchlist_test.go +++ b/dhcpv6/option_domainsearchlist_test.go @@ -24,8 +24,6 @@ func TestParseOptDomainSearchList(t *testing.T) { func TestOptDomainSearchListToBytes(t *testing.T) { expected := []byte{ - 0, 24, // OptionDomainSearchList - 0, 33, // length 7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'c', 'o', 'm', 0, 6, 's', 'u', 'b', 'n', 'e', 't', 7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'o', 'r', 'g', 0, } diff --git a/dhcpv6/option_elapsedtime.go b/dhcpv6/option_elapsedtime.go index cca5a5d1..862cf287 100644 --- a/dhcpv6/option_elapsedtime.go +++ b/dhcpv6/option_elapsedtime.go @@ -21,8 +21,6 @@ func (op *OptElapsedTime) Code() OptionCode { // ToBytes marshals this option to bytes. func (op *OptElapsedTime) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionElapsedTime)) - buf.Write16(2) buf.Write16(uint16(op.ElapsedTime)) return buf.Data() } diff --git a/dhcpv6/option_elapsedtime_test.go b/dhcpv6/option_elapsedtime_test.go index d0d8e3f8..a7ca85c6 100644 --- a/dhcpv6/option_elapsedtime_test.go +++ b/dhcpv6/option_elapsedtime_test.go @@ -22,7 +22,7 @@ func TestOptElapsedTime(t *testing.T) { func TestOptElapsedTimeToBytes(t *testing.T) { opt := OptElapsedTime{} - expected := []byte{0, 8, 0, 2, 0, 0} + expected := []byte{0, 0} if toBytes := opt.ToBytes(); !bytes.Equal(expected, toBytes) { t.Fatalf("Invalid ToBytes output. Expected %v, got %v", expected, toBytes) } diff --git a/dhcpv6/option_iaaddress.go b/dhcpv6/option_iaaddress.go index 096e50ca..11c8a005 100644 --- a/dhcpv6/option_iaaddress.go +++ b/dhcpv6/option_iaaddress.go @@ -25,9 +25,7 @@ func (op *OptIAAddress) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptIAAddress) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(make([]byte, 0, 28)) - buf.Write16(uint16(OptionIAAddr)) - buf.Write16(uint16(op.Length())) + buf := uio.NewBigEndianBuffer(nil) buf.WriteBytes(op.IPv6Addr.To16()) buf.Write32(op.PreferredLifetime) buf.Write32(op.ValidLifetime) diff --git a/dhcpv6/option_iaaddress_test.go b/dhcpv6/option_iaaddress_test.go index dc6298d7..6a16e7fb 100644 --- a/dhcpv6/option_iaaddress_test.go +++ b/dhcpv6/option_iaaddress_test.go @@ -44,13 +44,8 @@ func TestOptIAAddressParseInvalidBrokenOptions(t *testing.T) { } func TestOptIAAddressToBytes(t *testing.T) { - expected := []byte{ - 0, 5, // OptionIAAddr - 0, 30, // length - } ipBytes := []byte{0x24, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} - expected = append(expected, ipBytes...) - expected = append(expected, []byte{ + expected := append(ipBytes, []byte{ 0xa, 0xb, 0xc, 0xd, // preferred lifetime 0xe, 0xf, 0x1, 0x2, // valid lifetime 0, 8, 0, 2, 0xaa, 0xbb, // options diff --git a/dhcpv6/option_iaprefix.go b/dhcpv6/option_iaprefix.go index cad1a0c1..58cdadce 100644 --- a/dhcpv6/option_iaprefix.go +++ b/dhcpv6/option_iaprefix.go @@ -26,15 +26,11 @@ func (op *OptIAPrefix) Code() OptionCode { // ToBytes marshals this option according to RFC 3633, Section 10. func (op *OptIAPrefix) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionIAPrefix)) - buf.Write16(uint16(op.Length())) buf.Write32(op.PreferredLifetime) buf.Write32(op.ValidLifetime) buf.Write8(op.prefixLength) buf.WriteBytes(op.ipv6Prefix.To16()) - for _, opt := range op.Options { - buf.WriteBytes(opt.ToBytes()) - } + buf.WriteBytes(op.Options.ToBytes()) return buf.Data() } diff --git a/dhcpv6/option_iaprefix_test.go b/dhcpv6/option_iaprefix_test.go index 2c4dea45..48b410d1 100644 --- a/dhcpv6/option_iaprefix_test.go +++ b/dhcpv6/option_iaprefix_test.go @@ -10,11 +10,11 @@ import ( func TestOptIAPrefix(t *testing.T) { buf := []byte{ - 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime - 0xee, 0xff, 0x00, 0x11, // validLifetime + 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime + 0xee, 0xff, 0x00, 0x11, // validLifetime 36, // prefixLength 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // ipv6Prefix - 0, 8, 0, 2, 0xaa, 0xbb, // options + 0, 8, 0, 2, 0xaa, 0xbb, // options } opt, err := ParseOptIAPrefix(buf) if err != nil { @@ -39,24 +39,22 @@ func TestOptIAPrefix(t *testing.T) { func TestOptIAPrefixToBytes(t *testing.T) { buf := []byte{ - 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime - 0xee, 0xff, 0x00, 0x11, // validLifetime + 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime + 0xee, 0xff, 0x00, 0x11, // validLifetime 36, // prefixLength 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ipv6Prefix - 0, 8, 0, 2, 0xaa, 0xbb, // options + 0, 8, 0, 2, 0xaa, 0xbb, // options } - expected := []byte{00, 26, 00, byte(len(buf))} - expected = append(expected, buf...) opt := OptIAPrefix{ PreferredLifetime: 0xaabbccdd, - ValidLifetime: 0xeeff0011, - prefixLength: 36, - ipv6Prefix: net.IPv6zero, + ValidLifetime: 0xeeff0011, + prefixLength: 36, + ipv6Prefix: net.IPv6zero, } opt.Options = append(opt.Options, &OptElapsedTime{ElapsedTime: 0xaabb}) toBytes := opt.ToBytes() - if !bytes.Equal(toBytes, expected) { - t.Fatalf("Invalid ToBytes result. Expected %v, got %v", expected, toBytes) + if !bytes.Equal(toBytes, buf) { + t.Fatalf("Invalid ToBytes result. Expected %v, got %v", buf, toBytes) } } @@ -64,8 +62,8 @@ func TestOptIAPrefixParseInvalidTooShort(t *testing.T) { buf := []byte{ 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime 0xee, 0xff, 0x00, 0x11, // validLifetime - 36, // prefixLength - 0, 0, 0, 0, 0, 0, 0, // truncated ipv6Prefix + 36, // prefixLength + 0, 0, 0, 0, 0, 0, 0, // truncated ipv6Prefix } if opt, err := ParseOptIAPrefix(buf); err == nil { t.Fatalf("ParseOptIAPrefix: Expected error on truncated option, got %v", opt) @@ -74,9 +72,9 @@ func TestOptIAPrefixParseInvalidTooShort(t *testing.T) { func TestOptIAPrefixString(t *testing.T) { buf := []byte{ - 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime - 0xee, 0xff, 0x00, 0x11, // validLifetime - 36, // prefixLength + 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime + 0xee, 0xff, 0x00, 0x11, // validLifetime + 36, // prefixLength 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ipv6Prefix } opt, err := ParseOptIAPrefix(buf) diff --git a/dhcpv6/option_interfaceid.go b/dhcpv6/option_interfaceid.go index 000be5dd..59371704 100644 --- a/dhcpv6/option_interfaceid.go +++ b/dhcpv6/option_interfaceid.go @@ -2,8 +2,6 @@ package dhcpv6 import ( "fmt" - - "github.com/u-root/u-root/pkg/uio" ) // OptInterfaceId implements the interface-id option as defined by RFC 3315, @@ -20,11 +18,7 @@ func (op *OptInterfaceId) Code() OptionCode { } func (op *OptInterfaceId) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionInterfaceID)) - buf.Write16(uint16(len(op.interfaceId))) - buf.WriteBytes(op.interfaceId) - return buf.Data() + return op.interfaceId } func (op *OptInterfaceId) InterfaceID() []byte { diff --git a/dhcpv6/option_interfaceid_test.go b/dhcpv6/option_interfaceid_test.go index b8c6b42d..ec9e80dd 100644 --- a/dhcpv6/option_interfaceid_test.go +++ b/dhcpv6/option_interfaceid_test.go @@ -23,13 +23,11 @@ func TestOptInterfaceId(t *testing.T) { func TestOptInterfaceIdToBytes(t *testing.T) { interfaceId := []byte("DSLAM01 eth2/1/01/21") - expected := []byte{00, 18, 00, byte(len(interfaceId))} - expected = append(expected, interfaceId...) opt := OptInterfaceId{} opt.SetInterfaceID(interfaceId) toBytes := opt.ToBytes() - if !bytes.Equal(toBytes, expected) { - t.Fatalf("Invalid ToBytes result. Expected %v, got %v", expected, toBytes) + if !bytes.Equal(toBytes, interfaceId) { + t.Fatalf("Invalid ToBytes result. Expected %v, got %v", interfaceId, toBytes) } } diff --git a/dhcpv6/option_nii.go b/dhcpv6/option_nii.go index 723c57a1..ca86c22f 100644 --- a/dhcpv6/option_nii.go +++ b/dhcpv6/option_nii.go @@ -38,8 +38,6 @@ func (op *OptNetworkInterfaceId) Code() OptionCode { func (op *OptNetworkInterfaceId) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionNII)) - buf.Write16(uint16(op.Length())) buf.Write8(op.type_) buf.Write8(op.major) buf.Write8(op.minor) diff --git a/dhcpv6/option_nii_test.go b/dhcpv6/option_nii_test.go index 190c0e35..ba9ed19b 100644 --- a/dhcpv6/option_nii_test.go +++ b/dhcpv6/option_nii_test.go @@ -8,9 +8,9 @@ import ( func TestOptNetworkInterfaceIdParse(t *testing.T) { expected := []byte{ - 1, // type (UNDI) - 3, // major revision - 20, // minor revision + 1, // type (UNDI) + 3, // major revision + 20, // minor revision } opt, err := ParseOptNetworkInterfaceId(expected) require.NoError(t, err, "ParseOptNetworkInterfaceId() should not return an error with correct bytes") @@ -23,11 +23,9 @@ func TestOptNetworkInterfaceIdParse(t *testing.T) { func TestOptNetworkInterfaceIdToBytes(t *testing.T) { expected := []byte{ - 0, 62, // OptNetworkInterfaceId - 0, 3, // length - 1, // type (UNDI) - 3, // major revision - 20, // minor revision + 1, // type (UNDI) + 3, // major revision + 20, // minor revision } opt := OptNetworkInterfaceId{} opt.SetType(1) @@ -38,9 +36,9 @@ func TestOptNetworkInterfaceIdToBytes(t *testing.T) { func TestOptNetworkInterfaceIdTooShort(t *testing.T) { buf := []byte{ - 0, 62, // OptNetworkInterfaceId - 0, 3, // length - 1, // type (UNDI) + 0, 62, // OptNetworkInterfaceId + 0, 3, // length + 1, // type (UNDI) // missing major/minor revision bytes } _, err := ParseOptNetworkInterfaceId(buf) @@ -49,9 +47,9 @@ func TestOptNetworkInterfaceIdTooShort(t *testing.T) { func TestOptNetworkInterfaceIdString(t *testing.T) { buf := []byte{ - 1, // type (UNDI) - 3, // major revision - 20, // minor revision + 1, // type (UNDI) + 3, // major revision + 20, // minor revision } opt, err := ParseOptNetworkInterfaceId(buf) require.NoError(t, err) diff --git a/dhcpv6/option_nontemporaryaddress.go b/dhcpv6/option_nontemporaryaddress.go index 7e8bbaf5..85154387 100644 --- a/dhcpv6/option_nontemporaryaddress.go +++ b/dhcpv6/option_nontemporaryaddress.go @@ -25,8 +25,6 @@ func (op *OptIANA) Code() OptionCode { // ToBytes serializes IANA to DHCPv6 bytes. func (op *OptIANA) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionIANA)) - buf.Write16(uint16(op.Length())) buf.WriteBytes(op.IaId[:]) buf.Write32(op.T1) buf.Write32(op.T2) diff --git a/dhcpv6/option_nontemporaryaddress_test.go b/dhcpv6/option_nontemporaryaddress_test.go index a42601df..40aae532 100644 --- a/dhcpv6/option_nontemporaryaddress_test.go +++ b/dhcpv6/option_nontemporaryaddress_test.go @@ -99,8 +99,6 @@ func TestOptIANAToBytes(t *testing.T) { }, } expected := []byte{ - 0, 3, // OptionIANA - 0, 18, // length 1, 2, 3, 4, // IA ID 0, 0, 0x30, 0x39, // T1 = 12345 0, 0, 0xd4, 0x31, // T2 = 54321 diff --git a/dhcpv6/option_prefixdelegation.go b/dhcpv6/option_prefixdelegation.go index ee468768..eb5deb7a 100644 --- a/dhcpv6/option_prefixdelegation.go +++ b/dhcpv6/option_prefixdelegation.go @@ -23,8 +23,6 @@ func (op *OptIAForPrefixDelegation) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptIAForPrefixDelegation) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionIAPD)) - buf.Write16(uint16(op.Length())) buf.WriteBytes(op.IaId[:]) buf.Write32(op.T1) buf.Write32(op.T2) diff --git a/dhcpv6/option_prefixdelegation_test.go b/dhcpv6/option_prefixdelegation_test.go index 93044fef..377ca3dd 100644 --- a/dhcpv6/option_prefixdelegation_test.go +++ b/dhcpv6/option_prefixdelegation_test.go @@ -15,7 +15,7 @@ func TestOptIAForPrefixDelegationParseOptIAForPrefixDelegation(t *testing.T) { 0, 26, 0, 25, // 26 = IAPrefix Option, 25 = length 0xaa, 0xbb, 0xcc, 0xdd, // IAPrefix preferredLifetime 0xee, 0xff, 0x00, 0x11, // IAPrefix validLifetime - 36, // IAPrefix prefixLength + 36, // IAPrefix prefixLength 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // IAPrefix ipv6Prefix } opt, err := ParseOptIAForPrefixDelegation(data) @@ -45,7 +45,7 @@ func TestOptIAForPrefixDelegationParseOptIAForPrefixDelegationInvalidOptions(t * 0, 26, 0, 25, // 26 = IAPrefix Option, 25 = length 0xaa, 0xbb, 0xcc, 0xdd, // IAPrefix preferredLifetime 0xee, 0xff, 0x00, 0x11, // IAPrefix validLifetime - 36, // IAPrefix prefixLength + 36, // IAPrefix prefixLength 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // IAPrefix ipv6Prefix missing last byte } _, err := ParseOptIAForPrefixDelegation(data) @@ -54,8 +54,8 @@ func TestOptIAForPrefixDelegationParseOptIAForPrefixDelegationInvalidOptions(t * func TestOptIAForPrefixDelegationGetOneOption(t *testing.T) { buf := []byte{ - 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime - 0xee, 0xff, 0x00, 0x11, // validLifetime + 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime + 0xee, 0xff, 0x00, 0x11, // validLifetime 36, // prefixLength 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // ipv6Prefix } @@ -70,8 +70,8 @@ func TestOptIAForPrefixDelegationGetOneOption(t *testing.T) { func TestOptIAForPrefixDelegationGetOneOptionMissingOpt(t *testing.T) { buf := []byte{ - 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime - 0xee, 0xff, 0x00, 0x11, // validLifetime + 0xaa, 0xbb, 0xcc, 0xdd, // preferredLifetime + 0xee, 0xff, 0x00, 0x11, // validLifetime 36, // prefixLength 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // ipv6Prefix } @@ -119,15 +119,13 @@ func TestOptIAForPrefixDelegationToBytes(t *testing.T) { opt.Options = append(opt.Options, &oaddr) expected := []byte{ - 0, 25, // OptionIAPD - 0, 41, // length 1, 2, 3, 4, // IA ID 0, 0, 0x30, 0x39, // T1 = 12345 0, 0, 0xd4, 0x31, // T2 = 54321 0, 26, 0, 25, // 26 = IAPrefix Option, 25 = length 0xaa, 0xbb, 0xcc, 0xdd, // IAPrefix preferredLifetime 0xee, 0xff, 0x00, 0x11, // IAPrefix validLifetime - 36, // IAPrefix prefixLength + 36, // IAPrefix prefixLength 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // IAPrefix ipv6Prefix } require.Equal(t, expected, opt.ToBytes()) @@ -141,7 +139,7 @@ func TestOptIAForPrefixDelegationString(t *testing.T) { 0, 26, 0, 25, // 26 = IAPrefix Option, 25 = length 0xaa, 0xbb, 0xcc, 0xdd, // IAPrefix preferredLifetime 0xee, 0xff, 0x00, 0x11, // IAPrefix validLifetime - 36, // IAPrefix prefixLength + 36, // IAPrefix prefixLength 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // IAPrefix ipv6Prefix } opt, err := ParseOptIAForPrefixDelegation(data) diff --git a/dhcpv6/option_relaymsg.go b/dhcpv6/option_relaymsg.go index 09589f65..c262ddef 100644 --- a/dhcpv6/option_relaymsg.go +++ b/dhcpv6/option_relaymsg.go @@ -5,8 +5,6 @@ package dhcpv6 import ( "fmt" - - "github.com/u-root/u-root/pkg/uio" ) type OptRelayMsg struct { @@ -18,11 +16,7 @@ func (op *OptRelayMsg) Code() OptionCode { } func (op *OptRelayMsg) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionRelayMsg)) - buf.Write16(uint16(op.Length())) - buf.WriteBytes(op.relayMessage.ToBytes()) - return buf.Data() + return op.relayMessage.ToBytes() } func (op *OptRelayMsg) RelayMessage() DHCPv6 { diff --git a/dhcpv6/option_remoteid.go b/dhcpv6/option_remoteid.go index 6b1831d9..84a1a57e 100644 --- a/dhcpv6/option_remoteid.go +++ b/dhcpv6/option_remoteid.go @@ -21,8 +21,6 @@ func (op *OptRemoteId) Code() OptionCode { // ToBytes serializes this option to a byte stream. func (op *OptRemoteId) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionRemoteID)) - buf.Write16(uint16(op.Length())) buf.Write32(uint32(op.enterpriseNumber)) buf.WriteBytes(op.remoteId) return buf.Data() diff --git a/dhcpv6/option_remoteid_test.go b/dhcpv6/option_remoteid_test.go index bc13d43b..51566e3e 100644 --- a/dhcpv6/option_remoteid_test.go +++ b/dhcpv6/option_remoteid_test.go @@ -28,8 +28,7 @@ func TestOptRemoteId(t *testing.T) { func TestOptRemoteIdToBytes(t *testing.T) { remoteId := []byte("DSLAM01 eth2/1/01/21") - expected := []byte{00, 37, 00, byte(len(remoteId) + 4), 00, 00, 00, 00} - expected = append(expected, remoteId...) + expected := append([]byte{0, 0, 0, 0}, remoteId...) opt := OptRemoteId{ remoteId: remoteId, } diff --git a/dhcpv6/option_requestedoption.go b/dhcpv6/option_requestedoption.go index 7f345f4a..d72e2ed5 100644 --- a/dhcpv6/option_requestedoption.go +++ b/dhcpv6/option_requestedoption.go @@ -21,8 +21,6 @@ func (op *OptRequestedOption) Code() OptionCode { func (op *OptRequestedOption) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionORO)) - buf.Write16(uint16(op.Length())) for _, ro := range op.requestedOptions { buf.Write16(uint16(ro)) } diff --git a/dhcpv6/option_serverid.go b/dhcpv6/option_serverid.go index 4b1a828f..7202428e 100644 --- a/dhcpv6/option_serverid.go +++ b/dhcpv6/option_serverid.go @@ -2,8 +2,6 @@ package dhcpv6 import ( "fmt" - - "github.com/u-root/u-root/pkg/uio" ) // OptServerId represents a Server ID option @@ -20,11 +18,7 @@ func (op *OptServerId) Code() OptionCode { // ToBytes serializes this option. func (op *OptServerId) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionServerID)) - buf.Write16(uint16(op.Length())) - buf.WriteBytes(op.Sid.ToBytes()) - return buf.Data() + return op.Sid.ToBytes() } func (op *OptServerId) Length() int { diff --git a/dhcpv6/option_serverid_test.go b/dhcpv6/option_serverid_test.go index 72b1e33d..2cd37a39 100644 --- a/dhcpv6/option_serverid_test.go +++ b/dhcpv6/option_serverid_test.go @@ -30,8 +30,6 @@ func TestOptServerIdToBytes(t *testing.T) { }, } expected := []byte{ - 0, 2, // OptionServerID - 0, 10, // length 0, 3, // DUID_LL 0, 1, // hwtype ethernet 5, 4, 3, 2, 1, 0, // hw addr @@ -45,13 +43,9 @@ func TestOptServerIdDecodeEncode(t *testing.T) { 0, 1, // hwtype ethernet 5, 4, 3, 2, 1, 0, // hw addr } - expected := append([]byte{ - 0, 2, // OptionServerID - 0, 10, // length - }, data...) opt, err := ParseOptServerId(data) require.NoError(t, err) - require.Equal(t, expected, opt.ToBytes()) + require.Equal(t, data, opt.ToBytes()) } func TestOptionServerId(t *testing.T) { diff --git a/dhcpv6/option_statuscode.go b/dhcpv6/option_statuscode.go index a368a091..dad4ff67 100644 --- a/dhcpv6/option_statuscode.go +++ b/dhcpv6/option_statuscode.go @@ -24,8 +24,6 @@ func (op *OptStatusCode) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptStatusCode) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionStatusCode)) - buf.Write16(uint16(op.Length())) buf.Write16(uint16(op.StatusCode)) buf.WriteBytes(op.StatusMessage) return buf.Data() diff --git a/dhcpv6/option_statuscode_test.go b/dhcpv6/option_statuscode_test.go index a2cce0fa..cf43ab78 100644 --- a/dhcpv6/option_statuscode_test.go +++ b/dhcpv6/option_statuscode_test.go @@ -20,8 +20,6 @@ func TestParseOptStatusCode(t *testing.T) { func TestOptStatusCodeToBytes(t *testing.T) { expected := []byte{ - 0, 13, // OptionStatusCode - 0, 9, // length 0, 0, // StatusSuccess 's', 'u', 'c', 'c', 'e', 's', 's', } diff --git a/dhcpv6/option_userclass.go b/dhcpv6/option_userclass.go index 15f35127..75e1d3b1 100644 --- a/dhcpv6/option_userclass.go +++ b/dhcpv6/option_userclass.go @@ -23,8 +23,6 @@ func (op *OptUserClass) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptUserClass) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionUserClass)) - buf.Write16(uint16(op.Length())) for _, uc := range op.UserClasses { buf.Write16(uint16(len(uc))) buf.WriteBytes(uc) diff --git a/dhcpv6/option_userclass_test.go b/dhcpv6/option_userclass_test.go index 8a033199..16fae72f 100644 --- a/dhcpv6/option_userclass_test.go +++ b/dhcpv6/option_userclass_test.go @@ -40,8 +40,6 @@ func TestOptUserClassToBytes(t *testing.T) { } data := opt.ToBytes() expected := []byte{ - 0, 15, // OptionUserClass - 0, 11, // length 0, 9, 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', } require.Equal(t, expected, data) @@ -56,8 +54,6 @@ func TestOptUserClassToBytesMultiple(t *testing.T) { } data := opt.ToBytes() expected := []byte{ - 0, 15, // OptionUserClass - 0, 17, // length 0, 9, 'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't', 0, 4, 't', 'e', 's', 't', } diff --git a/dhcpv6/option_vendor_opts.go b/dhcpv6/option_vendor_opts.go index 027e7c34..3deeab9f 100644 --- a/dhcpv6/option_vendor_opts.go +++ b/dhcpv6/option_vendor_opts.go @@ -23,8 +23,6 @@ func (op *OptVendorOpts) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptVendorOpts) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionVendorOpts)) - buf.Write16(uint16(op.Length())) buf.Write32(uint32(op.EnterpriseNumber)) buf.WriteData(op.VendorOpts.ToBytes()) return buf.Data() diff --git a/dhcpv6/option_vendor_opts_test.go b/dhcpv6/option_vendor_opts_test.go index cce46504..043995d6 100644 --- a/dhcpv6/option_vendor_opts_test.go +++ b/dhcpv6/option_vendor_opts_test.go @@ -33,13 +33,11 @@ func TestOptVendorOptsToBytes(t *testing.T) { var opts []Option opts = append(opts, &OptionGeneric{OptionCode: 1, OptionData: optData}) - var expected []byte - expected = append(expected, []byte{0, 17, // VendorOption Code 17 - 0, byte(len(optData) + 8), // Length of optionData + 4 (code & length of sub-option) + 4 for EnterpriseNumber Length + expected := append([]byte{ 0, 0, 0, 0, // EnterpriseNumber 0, 1, // Sub-Option code from vendor - 0, byte(len(optData))}...) // Length of optionData only - expected = append(expected, optData...) + 0, byte(len(optData)), // Length of optionData only + }, optData...) opt := OptVendorOpts{ EnterpriseNumber: 0000, diff --git a/dhcpv6/option_vendorclass.go b/dhcpv6/option_vendorclass.go index b7204e7d..67fa15a2 100644 --- a/dhcpv6/option_vendorclass.go +++ b/dhcpv6/option_vendorclass.go @@ -22,8 +22,6 @@ func (op *OptVendorClass) Code() OptionCode { // ToBytes serializes the option and returns it as a sequence of bytes func (op *OptVendorClass) ToBytes() []byte { buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(OptionVendorClass)) - buf.Write16(uint16(op.Length())) buf.Write32(uint32(op.EnterpriseNumber)) for _, data := range op.Data { buf.Write16(uint16(len(data))) diff --git a/dhcpv6/option_vendorclass_test.go b/dhcpv6/option_vendorclass_test.go index 7774b252..685b8b08 100644 --- a/dhcpv6/option_vendorclass_test.go +++ b/dhcpv6/option_vendorclass_test.go @@ -31,8 +31,6 @@ func TestOptVendorClassToBytes(t *testing.T) { } data := opt.ToBytes() expected := []byte{ - 0, 16, // OptionVendorClass - 0, 22, // length 0xaa, 0xbb, 0xcc, 0xdd, // EnterpriseNumber 0, 10, 'H', 'T', 'T', 'P', 'C', 'l', 'i', 'e', 'n', 't', 0, 4, 't', 'e', 's', 't', diff --git a/dhcpv6/options.go b/dhcpv6/options.go index 59742de8..6c403f58 100644 --- a/dhcpv6/options.go +++ b/dhcpv6/options.go @@ -24,11 +24,7 @@ func (og *OptionGeneric) Code() OptionCode { } func (og *OptionGeneric) ToBytes() []byte { - buf := uio.NewBigEndianBuffer(nil) - buf.Write16(uint16(og.OptionCode)) - buf.Write16(uint16(len(og.OptionData))) - buf.WriteBytes(og.OptionData) - return buf.Data() + return og.OptionData } func (og *OptionGeneric) String() string { @@ -152,11 +148,15 @@ func (o *Options) Update(option Option) { // ToBytes marshals all options to bytes. func (o Options) ToBytes() []byte { - var buf []byte + buf := uio.NewBigEndianBuffer(nil) for _, opt := range o { - buf = append(buf, opt.ToBytes()...) + buf.Write16(uint16(opt.Code())) + + val := opt.ToBytes() + buf.Write16(uint16(len(val))) + buf.WriteBytes(val) } - return buf + return buf.Data() } // FromBytes reads data into o and returns an error if the options are not a From 64f29461718b0dac77d8156ceceacce086fe14b2 Mon Sep 17 00:00:00 2001 From: Christopher Koch Date: Sun, 20 Jan 2019 20:28:24 +0000 Subject: [PATCH 18/43] dhcpv6: remove unnecessary Length function --- dhcpv6/dhcpv6.go | 1 - dhcpv6/dhcpv6message.go | 8 -------- dhcpv6/dhcpv6relay.go | 8 -------- dhcpv6/option_archtype.go | 4 ---- dhcpv6/option_archtype_test.go | 1 - dhcpv6/option_bootfileurl.go | 5 ----- dhcpv6/option_bootfileurl_test.go | 3 --- dhcpv6/option_clientid.go | 4 ---- dhcpv6/option_clientid_test.go | 1 - dhcpv6/option_dnsrecursivenameserver.go | 5 ----- dhcpv6/option_dnsrecursivenameserver_test.go | 1 - dhcpv6/option_domainsearchlist.go | 8 -------- dhcpv6/option_domainsearchlist_test.go | 1 - dhcpv6/option_elapsedtime.go | 4 ---- dhcpv6/option_elapsedtime_test.go | 3 --- dhcpv6/option_iaaddress.go | 9 --------- dhcpv6/option_iaaddress_test.go | 1 - dhcpv6/option_iaprefix.go | 9 --------- dhcpv6/option_iaprefix_test.go | 3 --- dhcpv6/option_interfaceid.go | 4 ---- dhcpv6/option_interfaceid_test.go | 3 --- dhcpv6/option_nii.go | 4 ---- dhcpv6/option_nii_test.go | 3 --- dhcpv6/option_nontemporaryaddress.go | 8 -------- dhcpv6/option_nontemporaryaddress_test.go | 1 - dhcpv6/option_prefixdelegation.go | 9 --------- dhcpv6/option_prefixdelegation_test.go | 1 - dhcpv6/option_relaymsg.go | 4 ---- dhcpv6/option_remoteid.go | 4 ---- dhcpv6/option_remoteid_test.go | 3 --- dhcpv6/option_requestedoption.go | 4 ---- dhcpv6/option_serverid.go | 4 ---- dhcpv6/option_serverid_test.go | 1 - dhcpv6/option_statuscode.go | 5 ----- dhcpv6/option_userclass.go | 9 --------- dhcpv6/option_vendor_opts.go | 9 --------- dhcpv6/option_vendor_opts_test.go | 1 - dhcpv6/option_vendorclass.go | 9 --------- dhcpv6/options.go | 5 ----- 39 files changed, 170 deletions(-) diff --git a/dhcpv6/dhcpv6.go b/dhcpv6/dhcpv6.go index 25fdcd03..7eaf621d 100644 --- a/dhcpv6/dhcpv6.go +++ b/dhcpv6/dhcpv6.go @@ -16,7 +16,6 @@ type DHCPv6 interface { Options() []Option String() string Summary() string - Length() int IsRelay() bool GetOption(code OptionCode) []Option GetOneOption(code OptionCode) Option diff --git a/dhcpv6/dhcpv6message.go b/dhcpv6/dhcpv6message.go index 43d9f503..a1e439a5 100644 --- a/dhcpv6/dhcpv6message.go +++ b/dhcpv6/dhcpv6message.go @@ -318,14 +318,6 @@ func (d *DHCPv6Message) ToBytes() []byte { return buf.Data() } -func (d *DHCPv6Message) Length() int { - mLen := 4 - for _, opt := range d.options { - mLen += opt.Length() + 4 // +4 for opt code and opt len - } - return mLen -} - func (d *DHCPv6Message) Options() []Option { return d.options } diff --git a/dhcpv6/dhcpv6relay.go b/dhcpv6/dhcpv6relay.go index 337bda6a..4a690b9b 100644 --- a/dhcpv6/dhcpv6relay.go +++ b/dhcpv6/dhcpv6relay.go @@ -92,14 +92,6 @@ func (r *DHCPv6Relay) SetPeerAddr(peerAddr net.IP) { r.peerAddr = peerAddr } -func (r *DHCPv6Relay) Length() int { - mLen := RelayHeaderSize - for _, opt := range r.options { - mLen += opt.Length() + 4 // +4 for opt code and opt len - } - return mLen -} - func (r *DHCPv6Relay) Options() []Option { return r.options } diff --git a/dhcpv6/option_archtype.go b/dhcpv6/option_archtype.go index afb22b15..83ebf0ec 100644 --- a/dhcpv6/option_archtype.go +++ b/dhcpv6/option_archtype.go @@ -29,10 +29,6 @@ func (op *OptClientArchType) ToBytes() []byte { return buf.Data() } -func (op *OptClientArchType) Length() int { - return 2 * len(op.ArchTypes) -} - func (op *OptClientArchType) String() string { atStrings := make([]string, 0) for _, at := range op.ArchTypes { diff --git a/dhcpv6/option_archtype_test.go b/dhcpv6/option_archtype_test.go index cf9f4328..b01db082 100644 --- a/dhcpv6/option_archtype_test.go +++ b/dhcpv6/option_archtype_test.go @@ -35,7 +35,6 @@ func TestOptClientArchType(t *testing.T) { opt := OptClientArchType{ ArchTypes: []iana.Arch{iana.EFI_ITANIUM}, } - require.Equal(t, 2, opt.Length()) require.Equal(t, OptionClientArchType, opt.Code()) require.Contains(t, opt.String(), "archtype=EFI Itanium", "String() should contain the correct ArchType output") } diff --git a/dhcpv6/option_bootfileurl.go b/dhcpv6/option_bootfileurl.go index d34f5ec0..48c49bc3 100644 --- a/dhcpv6/option_bootfileurl.go +++ b/dhcpv6/option_bootfileurl.go @@ -22,11 +22,6 @@ func (op *OptBootFileURL) ToBytes() []byte { return op.BootFileURL } -// Length returns the option length in bytes -func (op *OptBootFileURL) Length() int { - return len(op.BootFileURL) -} - func (op *OptBootFileURL) String() string { return fmt.Sprintf("OptBootFileURL{BootFileUrl=%s}", op.BootFileURL) } diff --git a/dhcpv6/option_bootfileurl_test.go b/dhcpv6/option_bootfileurl_test.go index 97d31632..7d43003f 100644 --- a/dhcpv6/option_bootfileurl_test.go +++ b/dhcpv6/option_bootfileurl_test.go @@ -13,9 +13,6 @@ func TestOptBootFileURL(t *testing.T) { if err != nil { t.Fatal(err) } - if optLen := opt.Length(); optLen != len(expected) { - t.Fatalf("Invalid length. Expected %v, got %v", len(expected), optLen) - } if url := opt.BootFileURL; !bytes.Equal(url, expected) { t.Fatalf("Invalid boot file URL. Expected %v, got %v", expected, url) } diff --git a/dhcpv6/option_clientid.go b/dhcpv6/option_clientid.go index d0d31d67..200d1a68 100644 --- a/dhcpv6/option_clientid.go +++ b/dhcpv6/option_clientid.go @@ -21,10 +21,6 @@ func (op *OptClientId) ToBytes() []byte { return op.Cid.ToBytes() } -func (op *OptClientId) Length() int { - return op.Cid.Length() -} - func (op *OptClientId) String() string { return fmt.Sprintf("OptClientId{cid=%v}", op.Cid.String()) } diff --git a/dhcpv6/option_clientid_test.go b/dhcpv6/option_clientid_test.go index b147e578..69a60d1c 100644 --- a/dhcpv6/option_clientid_test.go +++ b/dhcpv6/option_clientid_test.go @@ -56,7 +56,6 @@ func TestOptionClientId(t *testing.T) { LinkLayerAddr: net.HardwareAddr([]byte{0xde, 0xad, 0, 0, 0xbe, 0xef}), }, } - require.Equal(t, 10, opt.Length()) require.Equal(t, OptionClientID, opt.Code()) require.Contains( t, diff --git a/dhcpv6/option_dnsrecursivenameserver.go b/dhcpv6/option_dnsrecursivenameserver.go index cd78c8c2..9aaeb3bf 100644 --- a/dhcpv6/option_dnsrecursivenameserver.go +++ b/dhcpv6/option_dnsrecursivenameserver.go @@ -29,11 +29,6 @@ func (op *OptDNSRecursiveNameServer) ToBytes() []byte { return buf.Data() } -// Length returns the option length -func (op *OptDNSRecursiveNameServer) Length() int { - return len(op.NameServers) * net.IPv6len -} - func (op *OptDNSRecursiveNameServer) String() string { return fmt.Sprintf("OptDNSRecursiveNameServer{nameservers=%v}", op.NameServers) } diff --git a/dhcpv6/option_dnsrecursivenameserver_test.go b/dhcpv6/option_dnsrecursivenameserver_test.go index 436cf2f3..c45e9dec 100644 --- a/dhcpv6/option_dnsrecursivenameserver_test.go +++ b/dhcpv6/option_dnsrecursivenameserver_test.go @@ -18,7 +18,6 @@ func TestParseOptDNSRecursiveNameServer(t *testing.T) { require.NoError(t, err) require.Equal(t, expected, opt.NameServers) require.Equal(t, OptionDNSRecursiveNameServer, opt.Code()) - require.Equal(t, 16, opt.Length()) require.Contains(t, opt.String(), "nameservers=[2a03:2880:fffe:c:face:b00c:0:35]", "String() should contain the correct nameservers output") } diff --git a/dhcpv6/option_domainsearchlist.go b/dhcpv6/option_domainsearchlist.go index 21d7c230..6bbe4e36 100644 --- a/dhcpv6/option_domainsearchlist.go +++ b/dhcpv6/option_domainsearchlist.go @@ -23,14 +23,6 @@ func (op *OptDomainSearchList) ToBytes() []byte { return op.DomainSearchList.ToBytes() } -func (op *OptDomainSearchList) Length() int { - var length int - for _, label := range op.DomainSearchList.Labels { - length += len(label) + 2 // add the first and the last length bytes - } - return length -} - func (op *OptDomainSearchList) String() string { return fmt.Sprintf("OptDomainSearchList{searchlist=%v}", op.DomainSearchList.Labels) } diff --git a/dhcpv6/option_domainsearchlist_test.go b/dhcpv6/option_domainsearchlist_test.go index 67c053a8..b4d01958 100644 --- a/dhcpv6/option_domainsearchlist_test.go +++ b/dhcpv6/option_domainsearchlist_test.go @@ -16,7 +16,6 @@ func TestParseOptDomainSearchList(t *testing.T) { require.NoError(t, err) require.Equal(t, OptionDomainSearchList, opt.Code()) require.Equal(t, 2, len(opt.DomainSearchList.Labels)) - require.Equal(t, len(data), opt.DomainSearchList.Length()) require.Equal(t, "example.com", opt.DomainSearchList.Labels[0]) require.Equal(t, "subnet.example.org", opt.DomainSearchList.Labels[1]) require.Contains(t, opt.String(), "searchlist=[example.com subnet.example.org]", "String() should contain the correct domain search output") diff --git a/dhcpv6/option_elapsedtime.go b/dhcpv6/option_elapsedtime.go index 862cf287..2d658430 100644 --- a/dhcpv6/option_elapsedtime.go +++ b/dhcpv6/option_elapsedtime.go @@ -25,10 +25,6 @@ func (op *OptElapsedTime) ToBytes() []byte { return buf.Data() } -func (op *OptElapsedTime) Length() int { - return 2 -} - func (op *OptElapsedTime) String() string { return fmt.Sprintf("OptElapsedTime{elapsedtime=%v}", op.ElapsedTime) } diff --git a/dhcpv6/option_elapsedtime_test.go b/dhcpv6/option_elapsedtime_test.go index a7ca85c6..3442281a 100644 --- a/dhcpv6/option_elapsedtime_test.go +++ b/dhcpv6/option_elapsedtime_test.go @@ -12,9 +12,6 @@ func TestOptElapsedTime(t *testing.T) { if err != nil { t.Fatal(err) } - if optLen := opt.Length(); optLen != 2 { - t.Fatalf("Invalid length. Expected 2, got %v", optLen) - } if elapsedTime := opt.ElapsedTime; elapsedTime != 0xaabb { t.Fatalf("Invalid elapsed time. Expected 0xaabb, got %v", elapsedTime) } diff --git a/dhcpv6/option_iaaddress.go b/dhcpv6/option_iaaddress.go index 11c8a005..882e627a 100644 --- a/dhcpv6/option_iaaddress.go +++ b/dhcpv6/option_iaaddress.go @@ -33,15 +33,6 @@ func (op *OptIAAddress) ToBytes() []byte { return buf.Data() } -// Length returns the option length -func (op *OptIAAddress) Length() int { - opLen := 24 - for _, opt := range op.Options { - opLen += 4 + opt.Length() - } - return opLen -} - func (op *OptIAAddress) String() string { return fmt.Sprintf("OptIAAddress{ipv6addr=%v, preferredlifetime=%v, validlifetime=%v, options=%v}", op.IPv6Addr, op.PreferredLifetime, op.ValidLifetime, op.Options) diff --git a/dhcpv6/option_iaaddress_test.go b/dhcpv6/option_iaaddress_test.go index 6a16e7fb..511a9076 100644 --- a/dhcpv6/option_iaaddress_test.go +++ b/dhcpv6/option_iaaddress_test.go @@ -16,7 +16,6 @@ func TestOptIAAddressParse(t *testing.T) { }...) opt, err := ParseOptIAAddress(data) require.NoError(t, err) - require.Equal(t, 30, opt.Length()) require.Equal(t, net.IP(ipaddr), opt.IPv6Addr) require.Equal(t, uint32(0x0a0b0c0d), opt.PreferredLifetime) require.Equal(t, uint32(0x0e0f0102), opt.ValidLifetime) diff --git a/dhcpv6/option_iaprefix.go b/dhcpv6/option_iaprefix.go index 58cdadce..7260d2c8 100644 --- a/dhcpv6/option_iaprefix.go +++ b/dhcpv6/option_iaprefix.go @@ -52,15 +52,6 @@ func (op *OptIAPrefix) SetIPv6Prefix(p net.IP) { op.ipv6Prefix = p } -// 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) 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) diff --git a/dhcpv6/option_iaprefix_test.go b/dhcpv6/option_iaprefix_test.go index 48b410d1..e48594d4 100644 --- a/dhcpv6/option_iaprefix_test.go +++ b/dhcpv6/option_iaprefix_test.go @@ -32,9 +32,6 @@ func TestOptIAPrefix(t *testing.T) { if ip := opt.IPv6Prefix(); !bytes.Equal(ip, net.IPv6loopback) { t.Fatalf("Invalid Prefix Length. Expected %v, got %v", net.IPv6loopback, ip) } - if opt.Length() != len(buf) { - t.Fatalf("Invalid Option Length. Expected %v, got %v", len(buf), opt.Length()) - } } func TestOptIAPrefixToBytes(t *testing.T) { diff --git a/dhcpv6/option_interfaceid.go b/dhcpv6/option_interfaceid.go index 59371704..5ed2fbac 100644 --- a/dhcpv6/option_interfaceid.go +++ b/dhcpv6/option_interfaceid.go @@ -29,10 +29,6 @@ func (op *OptInterfaceId) SetInterfaceID(interfaceId []byte) { op.interfaceId = append([]byte(nil), interfaceId...) } -func (op *OptInterfaceId) Length() int { - return len(op.interfaceId) -} - func (op *OptInterfaceId) String() string { return fmt.Sprintf("OptInterfaceId{interfaceid=%v}", op.interfaceId) } diff --git a/dhcpv6/option_interfaceid_test.go b/dhcpv6/option_interfaceid_test.go index ec9e80dd..df2a762e 100644 --- a/dhcpv6/option_interfaceid_test.go +++ b/dhcpv6/option_interfaceid_test.go @@ -13,9 +13,6 @@ func TestOptInterfaceId(t *testing.T) { if err != nil { t.Fatal(err) } - if optLen := opt.Length(); optLen != len(expected) { - t.Fatalf("Invalid length. Expected %v, got %v", len(expected), optLen) - } if url := opt.InterfaceID(); !bytes.Equal(url, expected) { t.Fatalf("Invalid Interface ID. Expected %v, got %v", expected, url) } diff --git a/dhcpv6/option_nii.go b/dhcpv6/option_nii.go index ca86c22f..bc47e8ce 100644 --- a/dhcpv6/option_nii.go +++ b/dhcpv6/option_nii.go @@ -68,10 +68,6 @@ func (op *OptNetworkInterfaceId) SetMinor(minor uint8) { op.minor = minor } -func (op *OptNetworkInterfaceId) Length() int { - return 3 -} - func (op *OptNetworkInterfaceId) String() string { typeName, ok := niiToStringMap[op.type_] if !ok { diff --git a/dhcpv6/option_nii_test.go b/dhcpv6/option_nii_test.go index ba9ed19b..a355122f 100644 --- a/dhcpv6/option_nii_test.go +++ b/dhcpv6/option_nii_test.go @@ -14,7 +14,6 @@ func TestOptNetworkInterfaceIdParse(t *testing.T) { } opt, err := ParseOptNetworkInterfaceId(expected) require.NoError(t, err, "ParseOptNetworkInterfaceId() should not return an error with correct bytes") - require.Equal(t, 3, opt.Length(), "Length() should return 3") require.Equal(t, OptionNII, opt.Code(), OptionNII, "Code() should return 62 for OptNetworkInterfaceId") require.Equal(t, uint8(1), opt.Type(), "Type() should return 1 for UNDI") require.Equal(t, uint8(3), opt.Major(), "Major() should return 1 for UNDI") @@ -36,8 +35,6 @@ func TestOptNetworkInterfaceIdToBytes(t *testing.T) { func TestOptNetworkInterfaceIdTooShort(t *testing.T) { buf := []byte{ - 0, 62, // OptNetworkInterfaceId - 0, 3, // length 1, // type (UNDI) // missing major/minor revision bytes } diff --git a/dhcpv6/option_nontemporaryaddress.go b/dhcpv6/option_nontemporaryaddress.go index 85154387..031f22c2 100644 --- a/dhcpv6/option_nontemporaryaddress.go +++ b/dhcpv6/option_nontemporaryaddress.go @@ -32,14 +32,6 @@ func (op *OptIANA) ToBytes() []byte { return buf.Data() } -func (op *OptIANA) Length() int { - l := 12 - for _, opt := range op.Options { - l += 4 + opt.Length() - } - return l -} - func (op *OptIANA) String() string { return fmt.Sprintf("OptIANA{IAID=%v, t1=%v, t2=%v, options=%v}", op.IaId, op.T1, op.T2, op.Options) diff --git a/dhcpv6/option_nontemporaryaddress_test.go b/dhcpv6/option_nontemporaryaddress_test.go index 40aae532..afe69171 100644 --- a/dhcpv6/option_nontemporaryaddress_test.go +++ b/dhcpv6/option_nontemporaryaddress_test.go @@ -16,7 +16,6 @@ func TestOptIANAParseOptIANA(t *testing.T) { } opt, err := ParseOptIANA(data) require.NoError(t, err) - require.Equal(t, len(data), opt.Length()) require.Equal(t, OptionIANA, opt.Code()) } diff --git a/dhcpv6/option_prefixdelegation.go b/dhcpv6/option_prefixdelegation.go index eb5deb7a..d366673f 100644 --- a/dhcpv6/option_prefixdelegation.go +++ b/dhcpv6/option_prefixdelegation.go @@ -30,15 +30,6 @@ func (op *OptIAForPrefixDelegation) ToBytes() []byte { return buf.Data() } -// Length returns the option length -func (op *OptIAForPrefixDelegation) Length() int { - 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}", diff --git a/dhcpv6/option_prefixdelegation_test.go b/dhcpv6/option_prefixdelegation_test.go index 377ca3dd..802a3a68 100644 --- a/dhcpv6/option_prefixdelegation_test.go +++ b/dhcpv6/option_prefixdelegation_test.go @@ -20,7 +20,6 @@ func TestOptIAForPrefixDelegationParseOptIAForPrefixDelegation(t *testing.T) { } opt, err := ParseOptIAForPrefixDelegation(data) require.NoError(t, err) - require.Equal(t, len(data), opt.Length()) require.Equal(t, OptionIAPD, opt.Code()) require.Equal(t, [4]byte{1, 0, 0, 0}, opt.IaId) require.Equal(t, uint32(1), opt.T1) diff --git a/dhcpv6/option_relaymsg.go b/dhcpv6/option_relaymsg.go index c262ddef..3d3d139a 100644 --- a/dhcpv6/option_relaymsg.go +++ b/dhcpv6/option_relaymsg.go @@ -27,10 +27,6 @@ func (op *OptRelayMsg) SetRelayMessage(relayMessage DHCPv6) { op.relayMessage = relayMessage } -func (op *OptRelayMsg) Length() int { - return op.relayMessage.Length() -} - func (op *OptRelayMsg) String() string { return fmt.Sprintf("OptRelayMsg{relaymsg=%v}", op.relayMessage) } diff --git a/dhcpv6/option_remoteid.go b/dhcpv6/option_remoteid.go index 84a1a57e..5b7d633e 100644 --- a/dhcpv6/option_remoteid.go +++ b/dhcpv6/option_remoteid.go @@ -42,10 +42,6 @@ func (op *OptRemoteId) SetRemoteID(remoteId []byte) { op.remoteId = append([]byte(nil), remoteId...) } -func (op *OptRemoteId) Length() int { - return 4 + len(op.remoteId) -} - func (op *OptRemoteId) String() string { return fmt.Sprintf("OptRemoteId{enterprisenum=%v, remoteid=%v}", op.enterpriseNumber, op.remoteId, diff --git a/dhcpv6/option_remoteid_test.go b/dhcpv6/option_remoteid_test.go index 51566e3e..b8b90f47 100644 --- a/dhcpv6/option_remoteid_test.go +++ b/dhcpv6/option_remoteid_test.go @@ -15,9 +15,6 @@ func TestOptRemoteId(t *testing.T) { if err != nil { t.Fatal(err) } - if optLen := opt.Length(); optLen != len(expected) { - t.Fatalf("Invalid length. Expected %v, got %v", len(expected), optLen) - } if en := opt.EnterpriseNumber(); en != 0xaabbccdd { t.Fatalf("Invalid Enterprise Number. Expected 0xaabbccdd, got %v", en) } diff --git a/dhcpv6/option_requestedoption.go b/dhcpv6/option_requestedoption.go index d72e2ed5..54ff5bf5 100644 --- a/dhcpv6/option_requestedoption.go +++ b/dhcpv6/option_requestedoption.go @@ -44,10 +44,6 @@ func (op *OptRequestedOption) AddRequestedOption(opt OptionCode) { op.requestedOptions = append(op.requestedOptions, opt) } -func (op *OptRequestedOption) Length() int { - return len(op.requestedOptions) * 2 -} - func (op *OptRequestedOption) String() string { names := make([]string, 0, len(op.requestedOptions)) for _, code := range op.requestedOptions { diff --git a/dhcpv6/option_serverid.go b/dhcpv6/option_serverid.go index 7202428e..2a602091 100644 --- a/dhcpv6/option_serverid.go +++ b/dhcpv6/option_serverid.go @@ -21,10 +21,6 @@ func (op *OptServerId) ToBytes() []byte { return op.Sid.ToBytes() } -func (op *OptServerId) Length() int { - return op.Sid.Length() -} - func (op *OptServerId) String() string { return fmt.Sprintf("OptServerId{sid=%v}", op.Sid.String()) } diff --git a/dhcpv6/option_serverid_test.go b/dhcpv6/option_serverid_test.go index 2cd37a39..23c00f5f 100644 --- a/dhcpv6/option_serverid_test.go +++ b/dhcpv6/option_serverid_test.go @@ -56,7 +56,6 @@ func TestOptionServerId(t *testing.T) { LinkLayerAddr: net.HardwareAddr([]byte{0xde, 0xad, 0, 0, 0xbe, 0xef}), }, } - require.Equal(t, 10, opt.Length()) require.Equal(t, OptionServerID, opt.Code()) require.Contains( t, diff --git a/dhcpv6/option_statuscode.go b/dhcpv6/option_statuscode.go index dad4ff67..db0df3ec 100644 --- a/dhcpv6/option_statuscode.go +++ b/dhcpv6/option_statuscode.go @@ -29,11 +29,6 @@ func (op *OptStatusCode) ToBytes() []byte { return buf.Data() } -// Length returns the option length -func (op *OptStatusCode) Length() int { - return 2 + len(op.StatusMessage) -} - func (op *OptStatusCode) String() string { return fmt.Sprintf("OptStatusCode{code=%s (%d), message=%v}", op.StatusCode.String(), op.StatusCode, diff --git a/dhcpv6/option_userclass.go b/dhcpv6/option_userclass.go index 75e1d3b1..b12b6b9c 100644 --- a/dhcpv6/option_userclass.go +++ b/dhcpv6/option_userclass.go @@ -30,15 +30,6 @@ func (op *OptUserClass) ToBytes() []byte { return buf.Data() } -// Length returns the option length -func (op *OptUserClass) Length() int { - ret := 0 - for _, uc := range op.UserClasses { - ret += 2 + len(uc) - } - return ret -} - func (op *OptUserClass) String() string { ucStrings := make([]string, 0, len(op.UserClasses)) for _, uc := range op.UserClasses { diff --git a/dhcpv6/option_vendor_opts.go b/dhcpv6/option_vendor_opts.go index 3deeab9f..a1ae400c 100644 --- a/dhcpv6/option_vendor_opts.go +++ b/dhcpv6/option_vendor_opts.go @@ -28,15 +28,6 @@ func (op *OptVendorOpts) ToBytes() []byte { return buf.Data() } -// Length returns the option length -func (op *OptVendorOpts) Length() int { - l := 4 // 4 bytes for Enterprise Number - for _, opt := range op.VendorOpts { - l += 4 + opt.Length() // 4 bytes for Code and Length from Vendor - } - return l -} - // String returns a string representation of the VendorOpts data func (op *OptVendorOpts) String() string { return fmt.Sprintf("OptVendorOpts{enterprisenum=%v, vendorOpts=%v}", diff --git a/dhcpv6/option_vendor_opts_test.go b/dhcpv6/option_vendor_opts_test.go index 043995d6..f6c2b2a6 100644 --- a/dhcpv6/option_vendor_opts_test.go +++ b/dhcpv6/option_vendor_opts_test.go @@ -19,7 +19,6 @@ func TestOptVendorOpts(t *testing.T) { expectedOpts.VendorOpts = append(vendorOpts, &OptionGeneric{OptionCode: 1, OptionData: optData}) opt, err := ParseOptVendorOpts(expected) require.NoError(t, err) - require.Equal(t, len(expected), opt.Length()) require.Equal(t, uint32(0xaabbccdd), opt.EnterpriseNumber) require.Equal(t, expectedOpts.VendorOpts, opt.VendorOpts) diff --git a/dhcpv6/option_vendorclass.go b/dhcpv6/option_vendorclass.go index 67fa15a2..ef850870 100644 --- a/dhcpv6/option_vendorclass.go +++ b/dhcpv6/option_vendorclass.go @@ -30,15 +30,6 @@ func (op *OptVendorClass) ToBytes() []byte { return buf.Data() } -// Length returns the option length -func (op *OptVendorClass) Length() int { - ret := 0 - for _, data := range op.Data { - ret += 2 + len(data) - } - return 4 + ret -} - // String returns a string representation of the VendorClass data func (op *OptVendorClass) String() string { vcStrings := make([]string, 0) diff --git a/dhcpv6/options.go b/dhcpv6/options.go index 6c403f58..47ccdcae 100644 --- a/dhcpv6/options.go +++ b/dhcpv6/options.go @@ -10,7 +10,6 @@ import ( type Option interface { Code() OptionCode ToBytes() []byte - Length() int String() string } @@ -31,10 +30,6 @@ func (og *OptionGeneric) String() string { return fmt.Sprintf("%s -> %v", og.OptionCode, og.OptionData) } -func (og *OptionGeneric) Length() int { - return len(og.OptionData) -} - // ParseOption parses data according to the given code. func ParseOption(code OptionCode, optData []byte) (Option, error) { // Parse a sequence of bytes as a single DHCPv6 option. From 82434691f0602844a2156a4d2037d43c51900b73 Mon Sep 17 00:00:00 2001 From: Andrea Barberio Date: Sun, 27 Jan 2019 23:48:44 +0000 Subject: [PATCH 19/43] dhcpv6: moved client into dhcpv6/client6 --- dhcpv6/async/client.go | 11 +++--- dhcpv6/async/client_test.go | 7 ++-- dhcpv6/{ => client6}/client.go | 58 +++++++++++++++-------------- dhcpv6/{ => client6}/client_test.go | 2 +- dhcpv6/{ => server6}/server.go | 8 ++-- dhcpv6/{ => server6}/server_test.go | 14 ++++--- netboot/netboot.go | 9 +++-- 7 files changed, 59 insertions(+), 50 deletions(-) rename dhcpv6/{ => client6}/client.go (73%) rename dhcpv6/{ => client6}/client_test.go (93%) rename dhcpv6/{ => server6}/server.go (95%) rename dhcpv6/{ => server6}/server_test.go (78%) diff --git a/dhcpv6/async/client.go b/dhcpv6/async/client.go index 7a8b9ec2..4c733838 100644 --- a/dhcpv6/async/client.go +++ b/dhcpv6/async/client.go @@ -7,8 +7,9 @@ import ( "sync" "time" - "github.com/fanliao/go-promise" + promise "github.com/fanliao/go-promise" "github.com/insomniacslk/dhcp/dhcpv6" + "github.com/insomniacslk/dhcp/dhcpv6/client6" ) // Client implements an asynchronous DHCPv6 client @@ -32,8 +33,8 @@ type Client struct { // NewClient creates an asynchronous client func NewClient() *Client { return &Client{ - ReadTimeout: dhcpv6.DefaultReadTimeout, - WriteTimeout: dhcpv6.DefaultWriteTimeout, + ReadTimeout: client6.DefaultReadTimeout, + WriteTimeout: client6.DefaultWriteTimeout, } } @@ -164,7 +165,7 @@ func (c *Client) receive(_ dhcpv6.DHCPv6) { c.connection.SetReadDeadline(time.Now().Add(c.ReadTimeout)) for { - buffer := make([]byte, dhcpv6.MaxUDPReceivedPacketSize) + buffer := make([]byte, client6.MaxUDPReceivedPacketSize) n, _, _, _, err := c.connection.ReadMsgUDP(buffer, oobdata) if err != nil { if err, ok := err.(net.Error); !ok || !err.Timeout() { @@ -196,7 +197,7 @@ func (c *Client) receive(_ dhcpv6.DHCPv6) { func (c *Client) remoteAddr() (*net.UDPAddr, error) { if c.RemoteAddr == nil { - return &net.UDPAddr{IP: dhcpv6.AllDHCPRelayAgentsAndServers, Port: dhcpv6.DefaultServerPort}, nil + return &net.UDPAddr{IP: client6.AllDHCPRelayAgentsAndServers, Port: dhcpv6.DefaultServerPort}, nil } if addr, ok := c.RemoteAddr.(*net.UDPAddr); ok { diff --git a/dhcpv6/async/client_test.go b/dhcpv6/async/client_test.go index 25a71a8f..a49623e7 100644 --- a/dhcpv6/async/client_test.go +++ b/dhcpv6/async/client_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/insomniacslk/dhcp/dhcpv6" + "github.com/insomniacslk/dhcp/dhcpv6/client6" "github.com/insomniacslk/dhcp/iana" "github.com/stretchr/testify/require" ) @@ -37,7 +38,7 @@ func serve(ctx context.Context, addr *net.UDPAddr, response dhcpv6.DHCPv6) error go func() { defer conn.Close() oobdata := []byte{} - buffer := make([]byte, dhcpv6.MaxUDPReceivedPacketSize) + buffer := make([]byte, client6.MaxUDPReceivedPacketSize) for { select { case <-ctx.Done(): @@ -66,8 +67,8 @@ func serve(ctx context.Context, addr *net.UDPAddr, response dhcpv6.DHCPv6) error func TestNewClient(t *testing.T) { c := NewClient() require.NotNil(t, c) - require.Equal(t, c.ReadTimeout, dhcpv6.DefaultReadTimeout) - require.Equal(t, c.ReadTimeout, dhcpv6.DefaultWriteTimeout) + require.Equal(t, c.ReadTimeout, client6.DefaultReadTimeout) + require.Equal(t, c.ReadTimeout, client6.DefaultWriteTimeout) } func TestOpenInvalidAddrFailes(t *testing.T) { diff --git a/dhcpv6/client.go b/dhcpv6/client6/client.go similarity index 73% rename from dhcpv6/client.go rename to dhcpv6/client6/client.go index a31c4264..4075bde8 100644 --- a/dhcpv6/client.go +++ b/dhcpv6/client6/client.go @@ -1,10 +1,12 @@ -package dhcpv6 +package client6 import ( "errors" "fmt" "net" "time" + + "github.com/insomniacslk/dhcp/dhcpv6" ) // Client constants @@ -41,8 +43,8 @@ func NewClient() *Client { // Reply). The modifiers will be applied to the Solicit and Request packets. // A common use is to make sure that the Solicit packet has the right options, // see modifiers.go -func (c *Client) Exchange(ifname string, modifiers ...Modifier) ([]DHCPv6, error) { - conversation := make([]DHCPv6, 0) +func (c *Client) Exchange(ifname string, modifiers ...dhcpv6.Modifier) ([]dhcpv6.DHCPv6, error) { + conversation := make([]dhcpv6.DHCPv6, 0) var err error // Solicit @@ -57,7 +59,7 @@ func (c *Client) Exchange(ifname string, modifiers ...Modifier) ([]DHCPv6, error // Decapsulate advertise if it's relayed before passing it to Request if advertise.IsRelay() { - advertiseRelay := advertise.(*DHCPv6Relay) + advertiseRelay := advertise.(*dhcpv6.DHCPv6Relay) advertise, err = advertiseRelay.GetInnerMessage() if err != nil { return conversation, err @@ -74,30 +76,30 @@ func (c *Client) Exchange(ifname string, modifiers ...Modifier) ([]DHCPv6, error return conversation, nil } -func (c *Client) sendReceive(ifname string, packet DHCPv6, expectedType MessageType) (DHCPv6, error) { +func (c *Client) sendReceive(ifname string, packet dhcpv6.DHCPv6, expectedType dhcpv6.MessageType) (dhcpv6.DHCPv6, error) { if packet == nil { return nil, fmt.Errorf("Packet to send cannot be nil") } - if expectedType == MessageTypeNone { + if expectedType == dhcpv6.MessageTypeNone { // infer the expected type from the packet being sent - if packet.Type() == MessageTypeSolicit { - expectedType = MessageTypeAdvertise - } else if packet.Type() == MessageTypeRequest { - expectedType = MessageTypeReply - } else if packet.Type() == MessageTypeRelayForward { - expectedType = MessageTypeRelayReply - } else if packet.Type() == MessageTypeLeaseQuery { - expectedType = MessageTypeLeaseQueryReply + if packet.Type() == dhcpv6.MessageTypeSolicit { + expectedType = dhcpv6.MessageTypeAdvertise + } else if packet.Type() == dhcpv6.MessageTypeRequest { + expectedType = dhcpv6.MessageTypeReply + } else if packet.Type() == dhcpv6.MessageTypeRelayForward { + expectedType = dhcpv6.MessageTypeRelayReply + } else if packet.Type() == dhcpv6.MessageTypeLeaseQuery { + expectedType = dhcpv6.MessageTypeLeaseQueryReply } // and probably more } // if no LocalAddr is specified, get the interface's link-local address var laddr net.UDPAddr if c.LocalAddr == nil { - llAddr, err := GetLinkLocalAddr(ifname) + llAddr, err := dhcpv6.GetLinkLocalAddr(ifname) if err != nil { return nil, err } - laddr = net.UDPAddr{IP: llAddr, Port: DefaultClientPort, Zone: ifname} + laddr = net.UDPAddr{IP: llAddr, Port: dhcpv6.DefaultClientPort, Zone: ifname} } else { if addr, ok := c.LocalAddr.(*net.UDPAddr); ok { laddr = *addr @@ -109,7 +111,7 @@ func (c *Client) sendReceive(ifname string, packet DHCPv6, expectedType MessageT // if no RemoteAddr is specified, use AllDHCPRelayAgentsAndServers var raddr net.UDPAddr if c.RemoteAddr == nil { - raddr = net.UDPAddr{IP: AllDHCPRelayAgentsAndServers, Port: DefaultServerPort} + raddr = net.UDPAddr{IP: AllDHCPRelayAgentsAndServers, Port: dhcpv6.DefaultServerPort} } else { if addr, ok := c.RemoteAddr.(*net.UDPAddr); ok { raddr = *addr @@ -147,11 +149,11 @@ func (c *Client) sendReceive(ifname string, packet DHCPv6, expectedType MessageT oobdata := []byte{} // ignoring oob data conn.SetReadDeadline(time.Now().Add(c.ReadTimeout)) var ( - adv DHCPv6 + adv dhcpv6.DHCPv6 isMessage bool ) defer conn.Close() - msg, ok := packet.(*DHCPv6Message) + msg, ok := packet.(*dhcpv6.DHCPv6Message) if ok { isMessage = true } @@ -161,12 +163,12 @@ func (c *Client) sendReceive(ifname string, packet DHCPv6, expectedType MessageT if err != nil { return nil, err } - adv, err = FromBytes(buf[:n]) + adv, err = dhcpv6.FromBytes(buf[:n]) if err != nil { // skip non-DHCP packets continue } - if recvMsg, ok := adv.(*DHCPv6Message); ok && isMessage { + if recvMsg, ok := adv.(*dhcpv6.DHCPv6Message); ok && isMessage { // if a regular message, check the transaction ID first // XXX should this unpack relay messages and check the XID of the // inner packet too? @@ -175,7 +177,7 @@ func (c *Client) sendReceive(ifname string, packet DHCPv6, expectedType MessageT continue } } - if expectedType == MessageTypeNone { + if expectedType == dhcpv6.MessageTypeNone { // just take whatever arrived break } else if adv.Type() == expectedType { @@ -188,29 +190,29 @@ func (c *Client) sendReceive(ifname string, packet DHCPv6, expectedType MessageT // Solicit sends a Solicit, returns the Solicit, an Advertise (if not nil), and // an error if any. The modifiers will be applied to the Solicit before sending // it, see modifiers.go -func (c *Client) Solicit(ifname string, modifiers ...Modifier) (DHCPv6, DHCPv6, error) { - solicit, err := NewSolicitForInterface(ifname) +func (c *Client) Solicit(ifname string, modifiers ...dhcpv6.Modifier) (dhcpv6.DHCPv6, dhcpv6.DHCPv6, error) { + solicit, err := dhcpv6.NewSolicitForInterface(ifname) if err != nil { return nil, nil, err } for _, mod := range modifiers { solicit = mod(solicit) } - advertise, err := c.sendReceive(ifname, solicit, MessageTypeNone) + advertise, err := c.sendReceive(ifname, solicit, dhcpv6.MessageTypeNone) return solicit, advertise, err } // Request sends a Request built from an Advertise. It returns the Request, a // Reply (if not nil), and an error if any. The modifiers will be applied to // the Request before sending it, see modifiers.go -func (c *Client) Request(ifname string, advertise DHCPv6, modifiers ...Modifier) (DHCPv6, DHCPv6, error) { - request, err := NewRequestFromAdvertise(advertise) +func (c *Client) Request(ifname string, advertise dhcpv6.DHCPv6, modifiers ...dhcpv6.Modifier) (dhcpv6.DHCPv6, dhcpv6.DHCPv6, error) { + request, err := dhcpv6.NewRequestFromAdvertise(advertise) if err != nil { return nil, nil, err } for _, mod := range modifiers { request = mod(request) } - reply, err := c.sendReceive(ifname, request, MessageTypeNone) + reply, err := c.sendReceive(ifname, request, dhcpv6.MessageTypeNone) return request, reply, err } diff --git a/dhcpv6/client_test.go b/dhcpv6/client6/client_test.go similarity index 93% rename from dhcpv6/client_test.go rename to dhcpv6/client6/client_test.go index d2efa1f0..1e05a629 100644 --- a/dhcpv6/client_test.go +++ b/dhcpv6/client6/client_test.go @@ -1,4 +1,4 @@ -package dhcpv6 +package client6 import ( "testing" diff --git a/dhcpv6/server.go b/dhcpv6/server6/server.go similarity index 95% rename from dhcpv6/server.go rename to dhcpv6/server6/server.go index daefdd09..5c84f97f 100644 --- a/dhcpv6/server.go +++ b/dhcpv6/server6/server.go @@ -1,4 +1,4 @@ -package dhcpv6 +package server6 import ( "fmt" @@ -6,6 +6,8 @@ import ( "net" "sync" "time" + + "github.com/insomniacslk/dhcp/dhcpv6" ) /* @@ -56,7 +58,7 @@ func main() { // Handler is a type that defines the handler function to be called every time a // valid DHCPv6 message is received -type Handler func(conn net.PacketConn, peer net.Addr, m DHCPv6) +type Handler func(conn net.PacketConn, peer net.Addr, m dhcpv6.DHCPv6) // Server represents a DHCPv6 server object type Server struct { @@ -129,7 +131,7 @@ func (s *Server) ActivateAndServe() error { continue } log.Printf("Handling request from %v", peer) - m, err := FromBytes(rbuf[:n]) + m, err := dhcpv6.FromBytes(rbuf[:n]) if err != nil { log.Printf("Error parsing DHCPv6 request: %v", err) continue diff --git a/dhcpv6/server_test.go b/dhcpv6/server6/server_test.go similarity index 78% rename from dhcpv6/server_test.go rename to dhcpv6/server6/server_test.go index 436e808d..2365b966 100644 --- a/dhcpv6/server_test.go +++ b/dhcpv6/server6/server_test.go @@ -1,4 +1,4 @@ -package dhcpv6 +package server6 import ( "log" @@ -6,13 +6,15 @@ import ( "testing" "time" + "github.com/insomniacslk/dhcp/dhcpv6" + "github.com/insomniacslk/dhcp/dhcpv6/client6" "github.com/insomniacslk/dhcp/interfaces" "github.com/stretchr/testify/require" ) // utility function to set up a client and a server instance and run it in // background. The caller needs to call Server.Close() once finished. -func setUpClientAndServer(handler Handler) (*Client, *Server) { +func setUpClientAndServer(handler Handler) (*client6.Client, *Server) { laddr := net.UDPAddr{ IP: net.ParseIP("::1"), Port: 0, @@ -20,7 +22,7 @@ func setUpClientAndServer(handler Handler) (*Client, *Server) { s := NewServer(laddr, handler) go s.ActivateAndServe() - c := NewClient() + c := client6.NewClient() c.LocalAddr = &net.UDPAddr{ IP: net.ParseIP("::1"), } @@ -44,7 +46,7 @@ func TestNewServer(t *testing.T) { IP: net.ParseIP("::1"), Port: 0, } - handler := func(conn net.PacketConn, peer net.Addr, m DHCPv6) {} + handler := func(conn net.PacketConn, peer net.Addr, m dhcpv6.DHCPv6) {} s := NewServer(laddr, handler) defer s.Close() @@ -55,8 +57,8 @@ func TestNewServer(t *testing.T) { } func TestServerActivateAndServe(t *testing.T) { - handler := func(conn net.PacketConn, peer net.Addr, m DHCPv6) { - adv, err := NewAdvertiseFromSolicit(m) + handler := func(conn net.PacketConn, peer net.Addr, m dhcpv6.DHCPv6) { + adv, err := dhcpv6.NewAdvertiseFromSolicit(m) if err != nil { log.Printf("NewAdvertiseFromSolicit failed: %v", err) return diff --git a/netboot/netboot.go b/netboot/netboot.go index ea0e77d9..b340046c 100644 --- a/netboot/netboot.go +++ b/netboot/netboot.go @@ -8,6 +8,7 @@ import ( "github.com/insomniacslk/dhcp/dhcpv4" "github.com/insomniacslk/dhcp/dhcpv6" + "github.com/insomniacslk/dhcp/dhcpv6/client6" ) var sleeper = func(d time.Duration) { @@ -26,7 +27,7 @@ func RequestNetbootv6(ifname string, timeout time.Duration, retries int, modifie for i := 0; i <= retries; i++ { log.Printf("sending request, attempt #%d", i+1) - client := dhcpv6.NewClient() + client := client6.NewClient() client.ReadTimeout = timeout conversation, err = client.Exchange(ifname, modifiers...) if err != nil { @@ -131,13 +132,13 @@ func ConversationToNetconf(conversation []dhcpv6.DHCPv6) (*NetConf, string, erro // DHCPv4 4-way conversation and returns them, or an error if any. func ConversationToNetconfv4(conversation []*dhcpv4.DHCPv4) (*NetConf, string, error) { var reply *dhcpv4.DHCPv4 - var bootFileUrl string + var bootFileURL string for _, m := range conversation { // look for a BootReply packet of type Offer containing the bootfile URL. // Normally both packets with Message Type OFFER or ACK do contain // the bootfile URL. if m.OpCode == dhcpv4.OpcodeBootReply && m.MessageType() == dhcpv4.MessageTypeOffer { - bootFileUrl = m.BootFileName + bootFileURL = m.BootFileName reply = m break } @@ -149,5 +150,5 @@ func ConversationToNetconfv4(conversation []*dhcpv4.DHCPv4) (*NetConf, string, e if err != nil { return nil, "", fmt.Errorf("could not get netconf: %v", err) } - return netconf, bootFileUrl, nil + return netconf, bootFileURL, nil } From 51ac989e85d13beda9cb304fb85e0aff18e9cd98 Mon Sep 17 00:00:00 2001 From: Andrea Barberio Date: Mon, 28 Jan 2019 00:53:04 +0000 Subject: [PATCH 20/43] dhcpv4: moved client into dhcpv4/client4 --- dhcpv4/async/client.go | 9 ++++---- dhcpv4/async/client_test.go | 7 ++++--- dhcpv4/bsdp/bsdp.go | 3 ++- dhcpv4/bsdp/bsdp_test.go | 15 +++++++------- dhcpv4/bsdp/client.go | 13 ++++++------ dhcpv4/{ => client4}/client.go | 27 ++++++++++++------------ dhcpv4/{ => client4}/defaults.go | 2 +- dhcpv4/{ => server4}/server.go | 8 +++++--- dhcpv4/{ => server4}/server_test.go | 32 +++++++++++++++-------------- netboot/netboot.go | 3 ++- 10 files changed, 65 insertions(+), 54 deletions(-) rename dhcpv4/{ => client4}/client.go (92%) rename dhcpv4/{ => client4}/defaults.go (73%) rename dhcpv4/{ => server4}/server.go (95%) rename dhcpv4/{ => server4}/server_test.go (76%) diff --git a/dhcpv4/async/client.go b/dhcpv4/async/client.go index 617c7115..4c2d3c18 100644 --- a/dhcpv4/async/client.go +++ b/dhcpv4/async/client.go @@ -7,8 +7,9 @@ import ( "sync" "time" - "github.com/fanliao/go-promise" + promise "github.com/fanliao/go-promise" "github.com/insomniacslk/dhcp/dhcpv4" + "github.com/insomniacslk/dhcp/dhcpv4/client4" ) // Default ports @@ -41,8 +42,8 @@ type Client struct { // NewClient creates an asynchronous client func NewClient() *Client { return &Client{ - ReadTimeout: dhcpv4.DefaultReadTimeout, - WriteTimeout: dhcpv4.DefaultWriteTimeout, + ReadTimeout: client4.DefaultReadTimeout, + WriteTimeout: client4.DefaultWriteTimeout, } } @@ -159,7 +160,7 @@ func (c *Client) receive(_ *dhcpv4.DHCPv4) { c.connection.SetReadDeadline(time.Now().Add(c.ReadTimeout)) for { - buffer := make([]byte, dhcpv4.MaxUDPReceivedPacketSize) + buffer := make([]byte, client4.MaxUDPReceivedPacketSize) n, _, _, _, err := c.connection.ReadMsgUDP(buffer, oobdata) if err != nil { if err, ok := err.(net.Error); !ok || !err.Timeout() { diff --git a/dhcpv4/async/client_test.go b/dhcpv4/async/client_test.go index 7fa0e9e7..b134afe7 100644 --- a/dhcpv4/async/client_test.go +++ b/dhcpv4/async/client_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/insomniacslk/dhcp/dhcpv4" + "github.com/insomniacslk/dhcp/dhcpv4/client4" "github.com/stretchr/testify/require" ) @@ -19,7 +20,7 @@ func serve(ctx context.Context, addr *net.UDPAddr, response *dhcpv4.DHCPv4) erro go func() { defer conn.Close() oobdata := []byte{} - buffer := make([]byte, dhcpv4.MaxUDPReceivedPacketSize) + buffer := make([]byte, client4.MaxUDPReceivedPacketSize) for { select { case <-ctx.Done(): @@ -48,8 +49,8 @@ func serve(ctx context.Context, addr *net.UDPAddr, response *dhcpv4.DHCPv4) erro func TestNewClient(t *testing.T) { c := NewClient() require.NotNil(t, c) - require.Equal(t, c.ReadTimeout, dhcpv4.DefaultReadTimeout) - require.Equal(t, c.ReadTimeout, dhcpv4.DefaultWriteTimeout) + require.Equal(t, c.ReadTimeout, client4.DefaultReadTimeout) + require.Equal(t, c.ReadTimeout, client4.DefaultWriteTimeout) } func TestOpenInvalidAddrFailes(t *testing.T) { diff --git a/dhcpv4/bsdp/bsdp.go b/dhcpv4/bsdp/bsdp.go index c9f7c26d..df44af91 100644 --- a/dhcpv4/bsdp/bsdp.go +++ b/dhcpv4/bsdp/bsdp.go @@ -6,6 +6,7 @@ import ( "net" "github.com/insomniacslk/dhcp/dhcpv4" + "github.com/insomniacslk/dhcp/dhcpv4/client4" ) // MaxDHCPMessageSize is the size set in DHCP option 57 (DHCP Maximum Message Size). @@ -39,7 +40,7 @@ func ParseBootImageListFromAck(ack *dhcpv4.DHCPv4) ([]BootImage, error) { } func needsReplyPort(replyPort uint16) bool { - return replyPort != 0 && replyPort != dhcpv4.ClientPort + return replyPort != 0 && replyPort != client4.ClientPort } // MessageTypeFromPacket extracts the BSDP message type (LIST, SELECT) from the diff --git a/dhcpv4/bsdp/bsdp_test.go b/dhcpv4/bsdp/bsdp_test.go index 05cd85c0..d5e400b3 100644 --- a/dhcpv4/bsdp/bsdp_test.go +++ b/dhcpv4/bsdp/bsdp_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/insomniacslk/dhcp/dhcpv4" + "github.com/insomniacslk/dhcp/dhcpv4/client4" "github.com/insomniacslk/dhcp/iana" "github.com/stretchr/testify/require" ) @@ -57,7 +58,7 @@ func TestParseBootImageListFromAckNoVendorOption(t *testing.T) { func TestNeedsReplyPort(t *testing.T) { require.True(t, needsReplyPort(123)) require.False(t, needsReplyPort(0)) - require.False(t, needsReplyPort(dhcpv4.ClientPort)) + require.False(t, needsReplyPort(client4.ClientPort)) } func TestNewInformList_NoReplyPort(t *testing.T) { @@ -214,13 +215,13 @@ func TestInformSelectForAck_ReplyPort(t *testing.T) { } func TestNewReplyForInformList_NoDefaultImage(t *testing.T) { - inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, dhcpv4.ClientPort) + inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, client4.ClientPort) _, err := NewReplyForInformList(inform, ReplyConfig{}) require.Error(t, err) } func TestNewReplyForInformList_NoImages(t *testing.T) { - inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, dhcpv4.ClientPort) + inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, client4.ClientPort) fakeImage := BootImage{ ID: BootImageID{ImageType: BootImageTypeMacOSX}, } @@ -238,7 +239,7 @@ func TestNewReplyForInformList_NoImages(t *testing.T) { } func TestNewReplyForInformList(t *testing.T) { - inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, dhcpv4.ClientPort) + inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, client4.ClientPort) images := []BootImage{ BootImage{ ID: BootImageID{ @@ -292,13 +293,13 @@ func TestNewReplyForInformList(t *testing.T) { } func TestNewReplyForInformSelect_NoSelectedImage(t *testing.T) { - inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, dhcpv4.ClientPort) + inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, client4.ClientPort) _, err := NewReplyForInformSelect(inform, ReplyConfig{}) require.Error(t, err) } func TestNewReplyForInformSelect_NoImages(t *testing.T) { - inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, dhcpv4.ClientPort) + inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, client4.ClientPort) fakeImage := BootImage{ ID: BootImageID{ImageType: BootImageTypeMacOSX}, } @@ -316,7 +317,7 @@ func TestNewReplyForInformSelect_NoImages(t *testing.T) { } func TestNewReplyForInformSelect(t *testing.T) { - inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, dhcpv4.ClientPort) + inform, _ := NewInformList(net.HardwareAddr{1, 2, 3, 4, 5, 6}, net.IP{1, 2, 3, 4}, client4.ClientPort) images := []BootImage{ BootImage{ ID: BootImageID{ diff --git a/dhcpv4/bsdp/client.go b/dhcpv4/bsdp/client.go index e8ca2ca8..173291e5 100644 --- a/dhcpv4/bsdp/client.go +++ b/dhcpv4/bsdp/client.go @@ -4,18 +4,19 @@ import ( "errors" "github.com/insomniacslk/dhcp/dhcpv4" + "github.com/insomniacslk/dhcp/dhcpv4/client4" ) // Client represents a BSDP client that can perform BSDP exchanges via the // broadcast address. type Client struct { - dhcpv4.Client + client4.Client } // NewClient constructs a new client with default read and write timeouts from // dhcpv4.Client. func NewClient() *Client { - return &Client{Client: dhcpv4.Client{}} + return &Client{Client: client4.Client{}} } // Exchange runs a full BSDP exchange (Inform[list], Ack, Inform[select], @@ -24,17 +25,17 @@ func (c *Client) Exchange(ifname string) ([]*Packet, error) { conversation := make([]*Packet, 0) // Get our file descriptor for the broadcast socket. - sendFd, err := dhcpv4.MakeBroadcastSocket(ifname) + sendFd, err := client4.MakeBroadcastSocket(ifname) if err != nil { return conversation, err } - recvFd, err := dhcpv4.MakeListeningSocket(ifname) + recvFd, err := client4.MakeListeningSocket(ifname) if err != nil { return conversation, err } // INFORM[LIST] - informList, err := NewInformListForInterface(ifname, dhcpv4.ClientPort) + informList, err := NewInformListForInterface(ifname, client4.ClientPort) if err != nil { return conversation, err } @@ -59,7 +60,7 @@ func (c *Client) Exchange(ifname string) ([]*Packet, error) { } // INFORM[SELECT] - informSelect, err := InformSelectForAck(PacketFor(ackForList), dhcpv4.ClientPort, bootImages[0]) + informSelect, err := InformSelectForAck(PacketFor(ackForList), client4.ClientPort, bootImages[0]) if err != nil { return conversation, err } diff --git a/dhcpv4/client.go b/dhcpv4/client4/client.go similarity index 92% rename from dhcpv4/client.go rename to dhcpv4/client4/client.go index ad80b345..fca9c09c 100644 --- a/dhcpv4/client.go +++ b/dhcpv4/client4/client.go @@ -1,4 +1,4 @@ -package dhcpv4 +package client4 import ( "encoding/binary" @@ -9,6 +9,7 @@ import ( "reflect" "time" + "github.com/insomniacslk/dhcp/dhcpv4" "golang.org/x/net/ipv4" "golang.org/x/sys/unix" ) @@ -88,7 +89,7 @@ func makeRawSocket(ifname string) (int, error) { if err != nil { return fd, err } - err = BindToInterface(fd, ifname) + err = dhcpv4.BindToInterface(fd, ifname) if err != nil { return fd, err } @@ -179,8 +180,8 @@ func (c *Client) getRemoteUDPAddr() (*net.UDPAddr, error) { // ordered as Discovery, Offer, Request and Acknowledge. In case of errors, an // error is returned, and the list of DHCPv4 objects will be shorted than 4, // containing all the sent and received DHCPv4 messages. -func (c *Client) Exchange(ifname string, modifiers ...Modifier) ([]*DHCPv4, error) { - conversation := make([]*DHCPv4, 0) +func (c *Client) Exchange(ifname string, modifiers ...dhcpv4.Modifier) ([]*dhcpv4.DHCPv4, error) { + conversation := make([]*dhcpv4.DHCPv4, 0) raddr, err := c.getRemoteUDPAddr() if err != nil { return nil, err @@ -220,28 +221,28 @@ func (c *Client) Exchange(ifname string, modifiers ...Modifier) ([]*DHCPv4, erro }() // Discover - discover, err := NewDiscoveryForInterface(ifname, modifiers...) + discover, err := dhcpv4.NewDiscoveryForInterface(ifname, modifiers...) if err != nil { return conversation, err } conversation = append(conversation, discover) // Offer - offer, err := c.SendReceive(sfd, rfd, discover, MessageTypeOffer) + offer, err := c.SendReceive(sfd, rfd, discover, dhcpv4.MessageTypeOffer) if err != nil { return conversation, err } conversation = append(conversation, offer) // Request - request, err := NewRequestFromOffer(offer, modifiers...) + request, err := dhcpv4.NewRequestFromOffer(offer, modifiers...) if err != nil { return conversation, err } conversation = append(conversation, request) // Ack - ack, err := c.SendReceive(sfd, rfd, request, MessageTypeAck) + ack, err := c.SendReceive(sfd, rfd, request, dhcpv4.MessageTypeAck) if err != nil { return conversation, err } @@ -253,7 +254,7 @@ func (c *Client) Exchange(ifname string, modifiers ...Modifier) ([]*DHCPv4, erro // SendReceive sends a packet (with some write timeout) and waits for a // response up to some read timeout value. If the message type is not // MessageTypeNone, it will wait for a specific message type -func (c *Client) SendReceive(sendFd, recvFd int, packet *DHCPv4, messageType MessageType) (*DHCPv4, error) { +func (c *Client) SendReceive(sendFd, recvFd int, packet *dhcpv4.DHCPv4, messageType dhcpv4.MessageType) (*dhcpv4.DHCPv4, error) { raddr, err := c.getRemoteUDPAddr() if err != nil { return nil, err @@ -271,7 +272,7 @@ func (c *Client) SendReceive(sendFd, recvFd int, packet *DHCPv4, messageType Mes // a certain amount of time. var ( destination [net.IPv4len]byte - response *DHCPv4 + response *dhcpv4.DHCPv4 ) copy(destination[:], raddr.IP.To4()) remoteAddr := unix.SockaddrInet4{Port: laddr.Port, Addr: destination} @@ -322,7 +323,7 @@ func (c *Client) SendReceive(sendFd, recvFd int, packet *DHCPv4, messageType Mes pLen := int(binary.BigEndian.Uint16(udph[4:6])) payload := buf[iph.Len+8 : iph.Len+8+pLen] - response, innerErr = FromBytes(payload) + response, innerErr = dhcpv4.FromBytes(payload) if innerErr != nil { errs <- innerErr return @@ -332,12 +333,12 @@ func (c *Client) SendReceive(sendFd, recvFd int, packet *DHCPv4, messageType Mes continue } // wait for a response message - if response.OpCode != OpcodeBootReply { + if response.OpCode != dhcpv4.OpcodeBootReply { continue } // if we are not requested to wait for a specific message type, // return what we have - if messageType == MessageTypeNone { + if messageType == dhcpv4.MessageTypeNone { break } // break if it's a reply of the desired type, continue otherwise diff --git a/dhcpv4/defaults.go b/dhcpv4/client4/defaults.go similarity index 73% rename from dhcpv4/defaults.go rename to dhcpv4/client4/defaults.go index 4faec2cc..f2e31f31 100644 --- a/dhcpv4/defaults.go +++ b/dhcpv4/client4/defaults.go @@ -1,4 +1,4 @@ -package dhcpv4 +package client4 const ( ServerPort = 67 diff --git a/dhcpv4/server.go b/dhcpv4/server4/server.go similarity index 95% rename from dhcpv4/server.go rename to dhcpv4/server4/server.go index eed82cfc..5ef4479d 100644 --- a/dhcpv4/server.go +++ b/dhcpv4/server4/server.go @@ -1,4 +1,4 @@ -package dhcpv4 +package server4 import ( "fmt" @@ -6,6 +6,8 @@ import ( "net" "sync" "time" + + "github.com/insomniacslk/dhcp/dhcpv4" ) /* @@ -56,7 +58,7 @@ func main() { // Handler is a type that defines the handler function to be called every time a // valid DHCPv4 message is received -type Handler func(conn net.PacketConn, peer net.Addr, m *DHCPv4) +type Handler func(conn net.PacketConn, peer net.Addr, m *dhcpv4.DHCPv4) // Server represents a DHCPv4 server object type Server struct { @@ -129,7 +131,7 @@ func (s *Server) ActivateAndServe() error { continue } log.Printf("Handling request from %v", peer) - m, err := FromBytes(rbuf[:n]) + m, err := dhcpv4.FromBytes(rbuf[:n]) if err != nil { log.Printf("Error parsing DHCPv4 request: %v", err) continue diff --git a/dhcpv4/server_test.go b/dhcpv4/server4/server_test.go similarity index 76% rename from dhcpv4/server_test.go rename to dhcpv4/server4/server_test.go index 3cfd4e1d..f6ce18e4 100644 --- a/dhcpv4/server_test.go +++ b/dhcpv4/server4/server_test.go @@ -1,6 +1,6 @@ // +build integration -package dhcpv4 +package server4 import ( "log" @@ -9,6 +9,8 @@ import ( "testing" "time" + "github.com/insomniacslk/dhcp/dhcpv4" + "github.com/insomniacslk/dhcp/dhcpv4/client4" "github.com/insomniacslk/dhcp/interfaces" "github.com/stretchr/testify/require" ) @@ -27,26 +29,26 @@ func randPort() int { } // DORAHandler is a server handler suitable for DORA transactions -func DORAHandler(conn net.PacketConn, peer net.Addr, m *DHCPv4) { +func DORAHandler(conn net.PacketConn, peer net.Addr, m *dhcpv4.DHCPv4) { if m == nil { log.Printf("Packet is nil!") return } - if m.OpCode != OpcodeBootRequest { + if m.OpCode != dhcpv4.OpcodeBootRequest { log.Printf("Not a BootRequest!") return } - reply, err := NewReplyFromRequest(m) + reply, err := dhcpv4.NewReplyFromRequest(m) if err != nil { log.Printf("NewReplyFromRequest failed: %v", err) return } - reply.UpdateOption(OptServerIdentifier(net.IP{1, 2, 3, 4})) + reply.UpdateOption(dhcpv4.OptServerIdentifier(net.IP{1, 2, 3, 4})) switch mt := m.MessageType(); mt { - case MessageTypeDiscover: - reply.UpdateOption(OptMessageType(MessageTypeOffer)) - case MessageTypeRequest: - reply.UpdateOption(OptMessageType(MessageTypeAck)) + case dhcpv4.MessageTypeDiscover: + reply.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeOffer)) + case dhcpv4.MessageTypeRequest: + reply.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeAck)) default: log.Printf("Unhandled message type: %v", mt) return @@ -59,7 +61,7 @@ func DORAHandler(conn net.PacketConn, peer net.Addr, m *DHCPv4) { // utility function to set up a client and a server instance and run it in // background. The caller needs to call Server.Close() once finished. -func setUpClientAndServer(handler Handler) (*Client, *Server) { +func setUpClientAndServer(handler Handler) (*client4.Client, *Server) { // strong assumption, I know loAddr := net.ParseIP("127.0.0.1") laddr := net.UDPAddr{ @@ -69,7 +71,7 @@ func setUpClientAndServer(handler Handler) (*Client, *Server) { s := NewServer(laddr, handler) go s.ActivateAndServe() - c := NewClient() + c := client4.NewClient() // FIXME this doesn't deal well with raw sockets, the actual 0 will be used // in the UDP header as source port c.LocalAddr = &net.UDPAddr{IP: loAddr, Port: randPort()} @@ -108,12 +110,12 @@ func TestServerActivateAndServe(t *testing.T) { require.NoError(t, err) require.NotEqual(t, 0, len(ifaces)) - xid := TransactionID{0xaa, 0xbb, 0xcc, 0xdd} + xid := dhcpv4.TransactionID{0xaa, 0xbb, 0xcc, 0xdd} hwaddr := net.HardwareAddr{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf} - modifiers := []Modifier{ - WithTransactionID(xid), - WithHwAddr(hwaddr), + modifiers := []dhcpv4.Modifier{ + dhcpv4.WithTransactionID(xid), + dhcpv4.WithHwAddr(hwaddr), } conv, err := c.Exchange(ifaces[0].Name, modifiers...) diff --git a/netboot/netboot.go b/netboot/netboot.go index b340046c..15990b13 100644 --- a/netboot/netboot.go +++ b/netboot/netboot.go @@ -7,6 +7,7 @@ import ( "time" "github.com/insomniacslk/dhcp/dhcpv4" + "github.com/insomniacslk/dhcp/dhcpv4/client4" "github.com/insomniacslk/dhcp/dhcpv6" "github.com/insomniacslk/dhcp/dhcpv6/client6" ) @@ -58,7 +59,7 @@ func RequestNetbootv4(ifname string, timeout time.Duration, retries int, modifie modifiers = append(modifiers, dhcpv4.WithNetboot) for i := 0; i <= retries; i++ { log.Printf("sending request, attempt #%d", i+1) - client := dhcpv4.NewClient() + client := client4.NewClient() client.ReadTimeout = timeout conversation, err = client.Exchange(ifname, modifiers...) if err != nil { From 89df4777a1687cf4d796afc91b30fa0beee7506d Mon Sep 17 00:00:00 2001 From: Andrea Barberio Date: Mon, 28 Jan 2019 10:47:25 +0000 Subject: [PATCH 21/43] Created examples directory and adjusted README --- .gitignore | 3 + README.md | 198 +---------------------------- dhcpv6/server6/server.go | 46 ------- examples/client6/README.md | 5 + examples/client6/main.go | 42 ++++++ examples/packetcrafting6/README.md | 26 ++++ examples/packetcrafting6/main.go | 72 +++++++++++ examples/server6/README.md | 10 ++ examples/server6/main.go | 27 ++++ examples/server6/server6 | Bin 0 -> 2842321 bytes 10 files changed, 192 insertions(+), 237 deletions(-) create mode 100644 examples/client6/README.md create mode 100644 examples/client6/main.go create mode 100644 examples/packetcrafting6/README.md create mode 100644 examples/packetcrafting6/main.go create mode 100644 examples/server6/README.md create mode 100644 examples/server6/main.go create mode 100755 examples/server6/server6 diff --git a/.gitignore b/.gitignore index a01ee289..432360e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ .*.swp +examples/client6/client6 +examples/client4/client4 +examples/packetcrafting6/packetcrafting6 diff --git a/README.md b/README.md index 6a2095ef..93206771 100644 --- a/README.md +++ b/README.md @@ -31,199 +31,15 @@ go get -u github.com/insomniacslk/dhcp/dhcpv{4,6} The sections below will illustrate how to use the `dhcpv6` and `dhcpv4` packages. -See more example code at https://github.com/insomniacslk/exdhcp - - -## DHCPv6 client - -To run a DHCPv6 transaction on the interface "eth0": - -```go -package main - -import ( - "log" - - "github.com/insomniacslk/dhcp/dhcpv6" -) - - -func main() { - // NewClient sets up a new DHCPv6 client with default values - // for read and write timeouts, for destination address and listening - // address - client := dhcpv6.NewClient() - - // Exchange runs a Solicit-Advertise-Request-Reply transaction on the - // specified network interface, and returns a list of DHCPv6 packets - // (a "conversation") and an error if any. Notice that Exchange may - // return a non-empty packet list even if there is an error. This is - // intended, because the transaction may fail at any point, and we - // still want to know what packets were exchanged until then. - // A default Solicit packet will be used during the "conversation", - // which can be manipulated by using modifiers. - conversation, err := client.Exchange("eth0") - - // Summary() prints a verbose representation of the exchanged packets. - for _, packet := range conversation { - log.Print(packet.Summary()) - } - // error handling is done *after* printing, so we still print the - // exchanged packets if any, as explained above. - if err != nil { - log.Fatal(err) - } -} -``` - - -## DHCPv6 packet crafting and manipulation - -```go -package main - -import ( - "log" - "net" - - "github.com/insomniacslk/dhcp/dhcpv6" - "github.com/insomniacslk/dhcp/iana" -) - -func main() { - // In this example we create and manipulate a DHCPv6 solicit packet - // and encapsulate it in a relay packet. To to this, we use - // `dhcpv6.DHCPv6Message` and `dhcpv6.DHCPv6Relay`, two structures - // that implement the `dhcpv6.DHCPv6` interface. - // Then print the wire-format representation of the packet. - - // Create the DHCPv6 Solicit first, using the interface "eth0" - // to get the MAC address - msg, err := dhcpv6.NewSolicitForInterface("eth0") - if err != nil { - log.Fatal(err) - } - - // In this example I want to redact the MAC address of my - // network interface, so instead of replacing it manually, - // I will show how to use modifiers for the purpose. - // A Modifier is simply a function that can be applied on - // a DHCPv6 object to manipulate it. Here we use it to - // replace the MAC address with a dummy one. - // Modifiers can be passed to many functions, for example - // to constructors, `Exchange()`, `Solicit()`, etc. Check - // the source code to know where to use them. - // Existing modifiers are implemented in dhcpv6/modifiers.go . - mac, err := net.ParseMAC("00:fa:ce:b0:0c:00") - if err != nil { - log.Fatal(err) - } - duid := dhcpv6.Duid{ - Type: dhcpv6.DUID_LLT, - HwType: iana.HwTypeEthernet, - Time: dhcpv6.GetTime(), - LinkLayerAddr: mac, - } - // As suggested above, an alternative is to call - // dhcpv6.NewSolicitForInterface("eth0", dhcpv6.WithCLientID(duid)) - msg = dhcpv6.WithClientID(duid)(msg) - - // Now encapsulate the message in a DHCPv6 relay. - // As per RFC3315, the link-address and peer-address have - // to be set by the relay agent. We use dummy values here. - linkAddr := net.ParseIP("2001:0db8::1") - peerAddr := net.ParseIP("2001:0db8::2") - relay, err := dhcpv6.EncapsulateRelay(msg, dhcpv6.MessageTypeRelayForward, linkAddr, peerAddr) - if err != nil { - log.Fatal(err) - } - - // Print a verbose representation of the relay packet, that will also - // show a short representation of the inner Solicit message. - // To print a detailed summary of the inner packet, extract it - // first from the relay using `relay.GetInnerMessage()`. - log.Print(relay.Summary()) - - // And finally, print the bytes that would be sent on the wire - log.Print(relay.ToBytes()) +* [dhcpv6 client](examples/client6/) +* [dhcpv6 server](examples/server6/) +* [dhcpv6 packet crafting](examples/packetcrafting6) +* TODO dhcpv4 client +* TODO dhcpv4 server +* TODO dhcpv4 packet crafting - // Note: there are many more functions in the library, check them - // out in the source code. For example, if you want to decode a - // byte stream into a DHCPv6 message or relay, you can use - // `dhcpv6.FromBytes`. -} -``` - -The output (slightly modified for readability) is -``` -$ go run main.go -2018/11/08 13:56:31 DHCPv6Relay - messageType=RELAY-FORW - hopcount=0 - linkaddr=2001:db8::1 - peeraddr=2001:db8::2 - options=[OptRelayMsg{relaymsg=DHCPv6Message(messageType=SOLICIT transactionID=0x9e0242, 4 options)}] - -2018/11/08 13:56:31 [12 0 32 1 13 184 0 0 0 0 0 0 0 0 0 0 0 1 32 1 13 184 - 0 0 0 0 0 0 0 0 0 0 0 2 0 9 0 52 1 158 2 66 0 1 0 14 - 0 1 0 1 35 118 253 15 0 250 206 176 12 0 0 6 0 4 0 23 - 0 24 0 8 0 2 0 0 0 3 0 12 250 206 176 12 0 0 14 16 0 - 0 21 24] -``` - -## DHCPv6 server - -A DHCPv6 server requires the user to implement a request handler. Basically the -user has to provide the logic to answer to each packet. The library offers a few -facilities to forge response packets, e.g. `NewAdvertiseFromSolicit`, -`NewReplyFromDHCPv6Message` and so on. Look at the source code to see what's -available. - -An example server that will print (but not reply to) the client's request is -shown below: - -```go -package main - -import ( - "log" - "net" - - "github.com/insomniacslk/dhcp/dhcpv6" -) - -func handler(conn net.PacketConn, peer net.Addr, m dhcpv6.DHCPv6) { - // this function will just print the received DHCPv6 message, without replying - log.Print(m.Summary()) -} -func main() { - laddr := net.UDPAddr{ - IP: net.ParseIP("::1"), - Port: dhcpv6.DefaultServerPort, - } - server := dhcpv6.NewServer(laddr, handler) - - defer server.Close() - if err := server.ActivateAndServe(); err != nil { - log.Panic(err) - } -} -``` - -## DHCPv4 client - -TODO - - -## DHCPv4 packet parsing - -TODO - - -## DHCPv4 server - -TODO +See more example code at https://github.com/insomniacslk/exdhcp # Public projects that use it diff --git a/dhcpv6/server6/server.go b/dhcpv6/server6/server.go index 5c84f97f..6a6d0b7a 100644 --- a/dhcpv6/server6/server.go +++ b/dhcpv6/server6/server.go @@ -10,52 +10,6 @@ import ( "github.com/insomniacslk/dhcp/dhcpv6" ) -/* - To use the DHCPv6 server code you have to call NewServer with two arguments: - - a handler function, that will be called every time a valid DHCPv6 packet is - received, and - - an address to listen on. - - The handler is a function that takes as input a packet connection, that can be - used to reply to the client; a peer address, that identifies the client sending - the request, and the DHCPv6 packet itself. Just implement your custom logic in - the handler. - - The address to listen on is used to know IP address, port and optionally the - scope to create and UDP6 socket to listen on for DHCPv6 traffic. - - Example program: - - -package main - -import ( - "log" - "net" - - "github.com/insomniacslk/dhcp/dhcpv6" -) - -func handler(conn net.PacketConn, peer net.Addr, m dhcpv6.DHCPv6) { - // this function will just print the received DHCPv6 message, without replying - log.Print(m.Summary()) -} - -func main() { - laddr := net.UDPAddr{ - IP: net.ParseIP("::1"), - Port: dhcpv6.DefaultServerPort, - } - server := dhcpv6.NewServer(laddr, handler) - - defer server.Close() - if err := server.ActivateAndServe(); err != nil { - log.Panic(err) - } -} - -*/ - // Handler is a type that defines the handler function to be called every time a // valid DHCPv6 message is received type Handler func(conn net.PacketConn, peer net.Addr, m dhcpv6.DHCPv6) diff --git a/examples/client6/README.md b/examples/client6/README.md new file mode 100644 index 00000000..5fa7bfad --- /dev/null +++ b/examples/client6/README.md @@ -0,0 +1,5 @@ +# DHCPv6 client + +A minimal DHCPv6 client can be implemented in a few lines of code, by using the default +client parameters. The example in [main.go](./main.go) lets you specify the +interface to send packets through, and defaults to `eth0`. diff --git a/examples/client6/main.go b/examples/client6/main.go new file mode 100644 index 00000000..41cf6927 --- /dev/null +++ b/examples/client6/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "flag" + "log" + + "github.com/insomniacslk/dhcp/dhcpv6/client6" +) + +var ( + iface = flag.String("i", "eth0", "Interface to configure via DHCPv6") +) + +func main() { + flag.Parse() + log.Printf("Starting DHCPv6 client on interface %s", *iface) + + // NewClient sets up a new DHCPv6 client with default values + // for read and write timeouts, for destination address and listening + // address + client := client6.NewClient() + + // Exchange runs a Solicit-Advertise-Request-Reply transaction on the + // specified network interface, and returns a list of DHCPv6 packets + // (a "conversation") and an error if any. Notice that Exchange may + // return a non-empty packet list even if there is an error. This is + // intended, because the transaction may fail at any point, and we + // still want to know what packets were exchanged until then. + // A default Solicit packet will be used during the "conversation", + // which can be manipulated by using modifiers. + conversation, err := client.Exchange(*iface) + + // Summary() prints a verbose representation of the exchanged packets. + for _, packet := range conversation { + log.Print(packet.Summary()) + } + // error handling is done *after* printing, so we still print the + // exchanged packets if any, as explained above. + if err != nil { + log.Fatal(err) + } +} diff --git a/examples/packetcrafting6/README.md b/examples/packetcrafting6/README.md new file mode 100644 index 00000000..cf1a370c --- /dev/null +++ b/examples/packetcrafting6/README.md @@ -0,0 +1,26 @@ +# DHCPv6 packet crafting + +It is easy to parse, create and manipulate DHCPv6 packets. The `DHCPv6` +interface is the central way to move packets around. Two concrete +implementations, `DHCPv6Message` and `DHCPv6Relay` take care of the +details. The example in [main.go](./main.go) shows how to craft a DHCP6 +Solicit message with a custom DUID_LLT, encapsulate it in a Relay message, +and print its details. + + +The output (slightly modified for readability) is +``` +$ go run main.go +2018/11/08 13:56:31 DHCPv6Relay + messageType=RELAY-FORW + hopcount=0 + linkaddr=2001:db8::1 + peeraddr=2001:db8::2 + options=[OptRelayMsg{relaymsg=DHCPv6Message(messageType=SOLICIT transactionID=0x9e0242, 4 options)}] + +2018/11/08 13:56:31 [12 0 32 1 13 184 0 0 0 0 0 0 0 0 0 0 0 1 32 1 13 184 + 0 0 0 0 0 0 0 0 0 0 0 2 0 9 0 52 1 158 2 66 0 1 0 14 + 0 1 0 1 35 118 253 15 0 250 206 176 12 0 0 6 0 4 0 23 + 0 24 0 8 0 2 0 0 0 3 0 12 250 206 176 12 0 0 14 16 0 + 0 21 24] +``` diff --git a/examples/packetcrafting6/main.go b/examples/packetcrafting6/main.go new file mode 100644 index 00000000..afba3a0c --- /dev/null +++ b/examples/packetcrafting6/main.go @@ -0,0 +1,72 @@ +package main + +import ( + "log" + "net" + + "github.com/insomniacslk/dhcp/dhcpv6" + "github.com/insomniacslk/dhcp/iana" +) + +func main() { + // In this example we create and manipulate a DHCPv6 solicit packet + // and encapsulate it in a relay packet. To to this, we use + // `dhcpv6.DHCPv6Message` and `dhcpv6.DHCPv6Relay`, two structures + // that implement the `dhcpv6.DHCPv6` interface. + // Then print the wire-format representation of the packet. + + // Create the DHCPv6 Solicit first, using the interface "eth0" + // to get the MAC address + msg, err := dhcpv6.NewSolicitForInterface("eth0") + if err != nil { + log.Fatal(err) + } + + // In this example I want to redact the MAC address of my + // network interface, so instead of replacing it manually, + // I will show how to use modifiers for the purpose. + // A Modifier is simply a function that can be applied on + // a DHCPv6 object to manipulate it. Here we use it to + // replace the MAC address with a dummy one. + // Modifiers can be passed to many functions, for example + // to constructors, `Exchange()`, `Solicit()`, etc. Check + // the source code to know where to use them. + // Existing modifiers are implemented in dhcpv6/modifiers.go . + mac, err := net.ParseMAC("00:fa:ce:b0:0c:00") + if err != nil { + log.Fatal(err) + } + duid := dhcpv6.Duid{ + Type: dhcpv6.DUID_LLT, + HwType: iana.HWTypeEthernet, + Time: dhcpv6.GetTime(), + LinkLayerAddr: mac, + } + // As suggested above, an alternative is to call + // dhcpv6.NewSolicitForInterface("eth0", dhcpv6.WithCLientID(duid)) + msg = dhcpv6.WithClientID(duid)(msg) + + // Now encapsulate the message in a DHCPv6 relay. + // As per RFC3315, the link-address and peer-address have + // to be set by the relay agent. We use dummy values here. + linkAddr := net.ParseIP("2001:0db8::1") + peerAddr := net.ParseIP("2001:0db8::2") + relay, err := dhcpv6.EncapsulateRelay(msg, dhcpv6.MessageTypeRelayForward, linkAddr, peerAddr) + if err != nil { + log.Fatal(err) + } + + // Print a verbose representation of the relay packet, that will also + // show a short representation of the inner Solicit message. + // To print a detailed summary of the inner packet, extract it + // first from the relay using `relay.GetInnerMessage()`. + log.Print(relay.Summary()) + + // And finally, print the bytes that would be sent on the wire + log.Print(relay.ToBytes()) + + // Note: there are many more functions in the library, check them + // out in the source code. For example, if you want to decode a + // byte stream into a DHCPv6 message or relay, you can use + // `dhcpv6.FromBytes`. +} diff --git a/examples/server6/README.md b/examples/server6/README.md new file mode 100644 index 00000000..490fa727 --- /dev/null +++ b/examples/server6/README.md @@ -0,0 +1,10 @@ +# DHCPv6 server + +A DHCPv6 server requires the user to implement a request handler. Basically the +user has to provide the logic to answer to each packet. The library offers a few +facilities to forge response packets, e.g. `NewAdvertiseFromSolicit`, +`NewReplyFromDHCPv6Message` and so on. Look at the source code to see what's +available. + +An example server that will print (but not reply to) the client's request is +shown in [main.go](./main.go) diff --git a/examples/server6/main.go b/examples/server6/main.go new file mode 100644 index 00000000..174f798b --- /dev/null +++ b/examples/server6/main.go @@ -0,0 +1,27 @@ +package main + +import ( + "log" + "net" + + "github.com/insomniacslk/dhcp/dhcpv6" + "github.com/insomniacslk/dhcp/dhcpv6/server6" +) + +func handler(conn net.PacketConn, peer net.Addr, m dhcpv6.DHCPv6) { + // this function will just print the received DHCPv6 message, without replying + log.Print(m.Summary()) +} + +func main() { + laddr := net.UDPAddr{ + IP: net.ParseIP("::1"), + Port: dhcpv6.DefaultServerPort, + } + server := server6.NewServer(laddr, handler) + + defer server.Close() + if err := server.ActivateAndServe(); err != nil { + log.Panic(err) + } +} diff --git a/examples/server6/server6 b/examples/server6/server6 new file mode 100755 index 0000000000000000000000000000000000000000..16f61533f6a5b10972f942a70c59505288e98213 GIT binary patch literal 2842321 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 FUy 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

3mDJ@$JV0`H8H@8Fy`pWaS-&AZU>=W~2$c}|?o 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±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

q7$T2)15QMh8-x!OUK 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 z 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%0AM@1h~{8m@IDRtN((xw!BJU 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

??xD>#0xT7tr%Ej6Z~?l31GYxiX$hiV0}m>-BcI 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≀b$^q6V< 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%0DNjvHYl~8dK(o&iqm2ML*lFrfnSu~o? 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

Bh3_w%DbOa4F1H@rds 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.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 z zfTv0t^fK;=Xl4JVQAbr)VXhRcvA-`?7MSHHh_c8uoZ$OlbY-oq?OF?P>v@u3o+@cj z--mYzM#Ui-cr<-A>`H-qNK%1i{{nW%QyH00HS*{x=lXN0w2QMDS|gx`92W8i2gJ4$ zjew7LI?;E=XgUXQ2L$gvNrOrQci=?vGcq@8=uIe{v15*vq#;4v=I~;TSL_({^1n3f zs2U4sg@E-*D(bQu7?kHa^%pgxt&^!UWPf`J9AK(QA-Q6D5sG~VnFoy(d+JI78Fj-k( zjz3wHMP}Z~z86MUwi|B+QKjJBAgSQ8u6UhC>zdb~qv@(32L)>W5yh$k@-9zRWIoWS zqpO8dUYn+F-o?^c3Iz(NtBCbfi-8Hc17Ny$Z-fP7$vnbG=3tRlUQD zou^@~+h$w2w7bjnXg-Ti+ztum?4y(n!B*dRxrx86=dTq)tI}Ae2NzKB>F9Y<_dZEI z49p1g?hBgy53Ss2CI@hb1aG&aL%Oluz}@Lou^XBFPxZYic8{>!i+3iLSXr7UfVWB- zRCxIFpu(qW)X@|c%pt+r`_5tb87gKlmAenk~z zr9j;-sVK=|0LTkYmoPx)ZyI&KbQ!uU|E6g~0Vm zDk^hxF)aI4{q=o*O~v@fHj*?TVBbj^1YP=cP}iB?ud9zrrzp$&B^6ZmE>I6SL%fU3 z^%}U?y9ZPs=#A}xel{SuA4w|sWeyqm?8ZL;kLmMY6Ajw=OjECK4mfjEhmS02SR@>F zsfv1oS#7Kc4zsLiml4!vpunV#i13RZJy_f3V!96WUP3_0do)Raoqge zio<9?6#86JQH-Nui%G$)NUPSQaH#no(1T7>j!8)>dazTV$2n(7QzP@ZR;Ab}2UN|N zdEozmMj6p$t)!xn7aZS0AvD?VCK*(Bb|5%bob5MRp`-q%bn|p_S1PX+=yomC@pLOa zM?42b=bq#1R_r-1ie!J*<-ONT844H|uGsAp_*uJ6=B zqyI-WqBE3(swEYT*iq1^<6LQJWX{k^6+7yH*>j4!$p4MA=7~x-N-C;(o#hc|hJf61 zOM}Lr7w9bW&KuQt|KmyyigFtzEl@HCy*wqaLIYZ-$ zy(4Tnb1{6xc$wh6A!)E}w%HII#~#t3gJ)3RR!c07mBLL>~*2wSgI!_sad|c9?w)=e<)HbJaN7dFtT_b2apC3|~8;ntT`KSImoS$25LRBZxZgsX( zrC?nlX;9OfLNR~kf1s&=4hq;#7lah$AOPt5o@bHy$*TXvvrd9vFsKy78zc>?TizFR zY*fRJ>R16C6tJlm7OM-;^H)hAAoHZg-Gq1Xst+E!R|@0_k_Ppi`E^iVy2y9KsQP-S zD+TRcNsCZ95E%da0|7hNxRtkPSkT;6AvbV%tqFy~jQ>DaA2uU!!;*@!91MW%zev1` z%yk-hbno(;FzVNvJy7?eVx6aL4ElGiMjp+-0o;t>eJE*AY2Z%1Sd>O)zl;5*`%jeS z=h`$Z$nM3(n&Vf&_2_$whW~!e6?jHKCtVT(XP*Q7IZu6L#$56rsE@aSqW$JNc#l3~v zS-{5J{qdFty^4(YxP8Kw}`rj+ckD;;7qoaxm&;G1XN)dji zq~dvY2bB2zWfGpq+^F>^cEA^(Ry84@)ruL$|Xi?p|(4O;5=lMR}7c_0uD zyxec8LKppyDCQ}2-^hxsgf5<9?;(Q_f|lD~;VU+h&-@;ZAxV#>Ln3DSl_UD0?F#8} zYbG0XJ~Cd%eo~7o_QNQ`Dn-aot{PF;M&QFX2&=wQ;sF`^%1zsrQ_sUH1ou=)CC0o) zJs*(3-!R#rwa9qJlwalJk6?_TuN2gVt4Gwn;VN+z(EE`=%OG=|MjxSNX3RLSE19

ao|2sD0;kqCL>hMh4m= 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