diff --git a/dhcp6/options.go b/dhcp6/options.go index 662fe37..e4b1e41 100644 --- a/dhcp6/options.go +++ b/dhcp6/options.go @@ -155,8 +155,8 @@ func (o Options) humanReadableIaNa(opt Option) []string { return ret } -// AddOption adds an option to Options -func (o Options) AddOption(option *Option) { +// Add adds an option to Options +func (o Options) Add(option *Option) { _, present := o[option.ID]; if !present { o[option.ID] = make([]*Option, 0) } diff --git a/dhcp6/packet_builder.go b/dhcp6/packet_builder.go index 20c3427..d93d31f 100644 --- a/dhcp6/packet_builder.go +++ b/dhcp6/packet_builder.go @@ -58,19 +58,19 @@ func (b *PacketBuilder) BuildResponse(in *Packet, serverDUID []byte, configurati func (b *PacketBuilder) makeMsgAdvertise(transactionID [3]byte, serverDUID, clientID []byte, clientArchType uint16, associations []*IdentityAssociation, bootFileURL, preference []byte, dnsServers []net.IP) *Packet { retOptions := make(Options) - retOptions.AddOption(MakeOption(OptClientID, clientID)) + retOptions.Add(MakeOption(OptClientID, clientID)) for _, association := range(associations) { - retOptions.AddOption(MakeIaNaOption(association.InterfaceID, b.calculateT1(), b.calculateT2(), + retOptions.Add(MakeIaNaOption(association.InterfaceID, b.calculateT1(), b.calculateT2(), MakeIaAddrOption(association.IPAddress, b.PreferredLifetime, b.ValidLifetime))) } - retOptions.AddOption(MakeOption(OptServerID, serverDUID)) + retOptions.Add(MakeOption(OptServerID, serverDUID)) if 0x10 == clientArchType { // HTTPClient - retOptions.AddOption(MakeOption(OptVendorClass, []byte {0, 0, 0, 0, 0, 10, 72, 84, 84, 80, 67, 108, 105, 101, 110, 116})) // HTTPClient + retOptions.Add(MakeOption(OptVendorClass, []byte {0, 0, 0, 0, 0, 10, 72, 84, 84, 80, 67, 108, 105, 101, 110, 116})) // HTTPClient } - retOptions.AddOption(MakeOption(OptBootfileURL, bootFileURL)) + retOptions.Add(MakeOption(OptBootfileURL, bootFileURL)) if preference != nil { - retOptions.AddOption(MakeOption(OptPreference, preference))} - if len(dnsServers) > 0 { retOptions.AddOption(MakeDNSServersOption(dnsServers)) } + retOptions.Add(MakeOption(OptPreference, preference))} + if len(dnsServers) > 0 { retOptions.Add(MakeDNSServersOption(dnsServers)) } return &Packet{Type: MsgAdvertise, TransactionID: transactionID, Options: retOptions} } @@ -78,21 +78,21 @@ func (b *PacketBuilder) makeMsgAdvertise(transactionID [3]byte, serverDUID, clie func (b *PacketBuilder) makeMsgReply(transactionID [3]byte, serverDUID, clientID []byte, clientArchType uint16, associations []*IdentityAssociation, iasWithoutAddresses [][]byte, bootFileURL []byte, dnsServers []net.IP, err error) *Packet { retOptions := make(Options) - retOptions.AddOption(MakeOption(OptClientID, clientID)) + retOptions.Add(MakeOption(OptClientID, clientID)) for _, association := range(associations) { - retOptions.AddOption(MakeIaNaOption(association.InterfaceID, b.calculateT1(), b.calculateT2(), + retOptions.Add(MakeIaNaOption(association.InterfaceID, b.calculateT1(), b.calculateT2(), MakeIaAddrOption(association.IPAddress, b.PreferredLifetime, b.ValidLifetime))) } for _, ia := range(iasWithoutAddresses) { - retOptions.AddOption(MakeIaNaOption(ia, b.calculateT1(), b.calculateT2(), + retOptions.Add(MakeIaNaOption(ia, b.calculateT1(), b.calculateT2(), MakeStatusOption(2, err.Error()))) } - retOptions.AddOption(MakeOption(OptServerID, serverDUID)) + retOptions.Add(MakeOption(OptServerID, serverDUID)) if 0x10 == clientArchType { // HTTPClient - retOptions.AddOption(MakeOption(OptVendorClass, []byte {0, 0, 0, 0, 0, 10, 72, 84, 84, 80, 67, 108, 105, 101, 110, 116})) // HTTPClient + retOptions.Add(MakeOption(OptVendorClass, []byte {0, 0, 0, 0, 0, 10, 72, 84, 84, 80, 67, 108, 105, 101, 110, 116})) // HTTPClient } - retOptions.AddOption(MakeOption(OptBootfileURL, bootFileURL)) - if len(dnsServers) > 0 { retOptions.AddOption(MakeDNSServersOption(dnsServers)) } + retOptions.Add(MakeOption(OptBootfileURL, bootFileURL)) + if len(dnsServers) > 0 { retOptions.Add(MakeDNSServersOption(dnsServers)) } return &Packet{Type: MsgReply, TransactionID: transactionID, Options: retOptions} } @@ -100,13 +100,13 @@ func (b *PacketBuilder) makeMsgReply(transactionID [3]byte, serverDUID, clientID func (b *PacketBuilder) makeMsgInformationRequestReply(transactionID [3]byte, serverDUID, clientID []byte, clientArchType uint16, bootFileURL []byte, dnsServers []net.IP) *Packet { retOptions := make(Options) - retOptions.AddOption(MakeOption(OptClientID, clientID)) - retOptions.AddOption(MakeOption(OptServerID, serverDUID)) + retOptions.Add(MakeOption(OptClientID, clientID)) + retOptions.Add(MakeOption(OptServerID, serverDUID)) if 0x10 == clientArchType { // HTTPClient - retOptions.AddOption(MakeOption(OptVendorClass, []byte {0, 0, 0, 0, 0, 10, 72, 84, 84, 80, 67, 108, 105, 101, 110, 116})) // HTTPClient + retOptions.Add(MakeOption(OptVendorClass, []byte {0, 0, 0, 0, 0, 10, 72, 84, 84, 80, 67, 108, 105, 101, 110, 116})) // HTTPClient } - retOptions.AddOption(MakeOption(OptBootfileURL, bootFileURL)) - if len(dnsServers) > 0 { retOptions.AddOption(MakeDNSServersOption(dnsServers)) } + retOptions.Add(MakeOption(OptBootfileURL, bootFileURL)) + if len(dnsServers) > 0 { retOptions.Add(MakeDNSServersOption(dnsServers)) } return &Packet{Type: MsgReply, TransactionID: transactionID, Options: retOptions} } @@ -114,20 +114,20 @@ func (b *PacketBuilder) makeMsgInformationRequestReply(transactionID [3]byte, se func (b *PacketBuilder) makeMsgReleaseReply(transactionID [3]byte, serverDUID, clientID []byte) *Packet { retOptions := make(Options) - retOptions.AddOption(MakeOption(OptClientID, clientID)) - retOptions.AddOption(MakeOption(OptServerID, serverDUID)) + retOptions.Add(MakeOption(OptClientID, clientID)) + retOptions.Add(MakeOption(OptServerID, serverDUID)) v := make([]byte, 19, 19) copy(v[2:], []byte("Release received.")) - retOptions.AddOption(MakeOption(OptStatusCode, v)) + retOptions.Add(MakeOption(OptStatusCode, v)) return &Packet{Type: MsgReply, TransactionID: transactionID, Options: retOptions} } func (b *PacketBuilder) makeMsgAdvertiseWithNoAddrsAvailable(transactionID [3]byte, serverDUID, clientID []byte, err error) *Packet { retOptions := make(Options) - retOptions.AddOption(MakeOption(OptClientID, clientID)) - retOptions.AddOption(MakeOption(OptServerID, serverDUID)) - retOptions.AddOption(MakeStatusOption(2, err.Error())) // NoAddrAvailable + retOptions.Add(MakeOption(OptClientID, clientID)) + retOptions.Add(MakeOption(OptServerID, serverDUID)) + retOptions.Add(MakeStatusOption(2, err.Error())) // NoAddrAvailable return &Packet{Type: MsgAdvertise, TransactionID: transactionID, Options: retOptions} } diff --git a/dhcp6/packet_test.go b/dhcp6/packet_test.go index fdc46d2..1f7342f 100644 --- a/dhcp6/packet_test.go +++ b/dhcp6/packet_test.go @@ -8,7 +8,7 @@ import ( func TestShouldDiscardSolicitWithoutBootfileUrlOption(t *testing.T) { clientID := []byte("clientid") options := make(Options) - options.AddOption(&Option{ID: OptClientID, Length: uint16(len(clientID)), Value: clientID}) + options.Add(&Option{ID: OptClientID, Length: uint16(len(clientID)), Value: clientID}) solicit := &Packet{Type: MsgSolicit, TransactionID: [3]byte{'1', '2', '3'}, Options: options} if err := shouldDiscardSolicit(solicit); err == nil { @@ -18,7 +18,7 @@ func TestShouldDiscardSolicitWithoutBootfileUrlOption(t *testing.T) { func TestShouldDiscardSolicitWithoutClientIdOption(t *testing.T) { options := make(Options) - options.AddOption(MakeOptionRequestOptions([]uint16{OptBootfileURL})) + options.Add(MakeOptionRequestOptions([]uint16{OptBootfileURL})) solicit := &Packet{Type: MsgSolicit, TransactionID: [3]byte{'1', '2', '3'}, Options: options} if err := shouldDiscardSolicit(solicit); err == nil { @@ -30,9 +30,9 @@ func TestShouldDiscardSolicitWithServerIdOption(t *testing.T) { serverID := []byte("serverid") clientID := []byte("clientid") options := make(Options) - options.AddOption(MakeOptionRequestOptions([]uint16{OptBootfileURL})) - options.AddOption(&Option{ID: OptClientID, Length: uint16(len(clientID)), Value: clientID}) - options.AddOption(&Option{ID: OptServerID, Length: uint16(len(serverID)), Value: serverID}) + options.Add(MakeOptionRequestOptions([]uint16{OptBootfileURL})) + options.Add(&Option{ID: OptClientID, Length: uint16(len(clientID)), Value: clientID}) + options.Add(&Option{ID: OptServerID, Length: uint16(len(serverID)), Value: serverID}) solicit := &Packet{Type: MsgSolicit, TransactionID: [3]byte{'1', '2', '3'}, Options: options} if err := shouldDiscardSolicit(solicit); err == nil { @@ -44,8 +44,8 @@ func TestShouldDiscardRequestWithoutBootfileUrlOption(t *testing.T) { serverID := []byte("serverid") clientID := []byte("clientid") options := make(Options) - options.AddOption(&Option{ID: OptClientID, Length: uint16(len(clientID)), Value: clientID}) - options.AddOption(&Option{ID: OptServerID, Length: uint16(len(serverID)), Value: serverID}) + options.Add(&Option{ID: OptClientID, Length: uint16(len(clientID)), Value: clientID}) + options.Add(&Option{ID: OptServerID, Length: uint16(len(serverID)), Value: serverID}) request := &Packet{Type: MsgRequest, TransactionID: [3]byte{'1', '2', '3'}, Options: options} if err := shouldDiscardRequest(request, serverID); err == nil { @@ -56,8 +56,8 @@ func TestShouldDiscardRequestWithoutBootfileUrlOption(t *testing.T) { func TestShouldDiscardRequestWithoutClientIdOption(t *testing.T) { serverID := []byte("serverid") options := make(Options) - options.AddOption(MakeOptionRequestOptions([]uint16{OptBootfileURL})) - options.AddOption(&Option{ID: OptServerID, Length: uint16(len(serverID)), Value: serverID}) + options.Add(MakeOptionRequestOptions([]uint16{OptBootfileURL})) + options.Add(&Option{ID: OptServerID, Length: uint16(len(serverID)), Value: serverID}) request := &Packet{Type: MsgRequest, TransactionID: [3]byte{'1', '2', '3'}, Options: options} if err := shouldDiscardRequest(request, serverID); err == nil { @@ -68,8 +68,8 @@ func TestShouldDiscardRequestWithoutClientIdOption(t *testing.T) { func TestShouldDiscardRequestWithoutServerIdOption(t *testing.T) { clientID := []byte("clientid") options := make(Options) - options.AddOption(MakeOptionRequestOptions([]uint16{OptBootfileURL})) - options.AddOption(&Option{ID: OptClientID, Length: uint16(len(clientID)), Value: clientID}) + options.Add(MakeOptionRequestOptions([]uint16{OptBootfileURL})) + options.Add(&Option{ID: OptClientID, Length: uint16(len(clientID)), Value: clientID}) request := &Packet{Type: MsgRequest, TransactionID: [3]byte{'1', '2', '3'}, Options: options} if err := shouldDiscardRequest(request, []byte("serverid")); err == nil { @@ -81,9 +81,9 @@ func TestShouldDiscardRequestWithWrongServerId(t *testing.T) { clientID := []byte("clientid") serverID := []byte("serverid") options := make(Options) - options.AddOption(MakeOptionRequestOptions([]uint16{OptBootfileURL})) - options.AddOption(&Option{ID: OptClientID, Length: uint16(len(clientID)), Value: clientID}) - options.AddOption(&Option{ID: OptServerID, Length: uint16(len(serverID)), Value: serverID}) + options.Add(MakeOptionRequestOptions([]uint16{OptBootfileURL})) + options.Add(&Option{ID: OptClientID, Length: uint16(len(clientID)), Value: clientID}) + options.Add(&Option{ID: OptServerID, Length: uint16(len(serverID)), Value: serverID}) request := &Packet{Type: MsgRequest, TransactionID: [3]byte{'1', '2', '3'}, Options: options} if err := shouldDiscardRequest(request, []byte("wrongid")); err == nil {