diff options
author | Christopher Koch <chrisko@google.com> | 2019-04-06 15:50:01 -0700 |
---|---|---|
committer | insomniac <insomniacslk@users.noreply.github.com> | 2019-04-07 23:42:56 +0100 |
commit | b88ad4b870e4c440db756d101fe448f47a487dd8 (patch) | |
tree | a5f6ba6e1faac7ef3507a4596ac5b7b618e3e862 /dhcpv6/nclient6 | |
parent | 73a6b7ffe80ca04462acde3883dbd811f3ab5461 (diff) |
nclient6: small fixes
- RapidCommit solicits wait for Reply messages, not Advertise.
- Default recipient should be all relay agents and servers, not just
servers.
- Make New() and NewWithConn() interface same as in nclient4.
Signed-off-by: Christopher Koch <chrisko@google.com>
Diffstat (limited to 'dhcpv6/nclient6')
-rw-r--r-- | dhcpv6/nclient6/client.go | 37 | ||||
-rw-r--r-- | dhcpv6/nclient6/client_test.go | 4 |
2 files changed, 35 insertions, 6 deletions
diff --git a/dhcpv6/nclient6/client.go b/dhcpv6/nclient6/client.go index dc5dd33..8b338db 100644 --- a/dhcpv6/nclient6/client.go +++ b/dhcpv6/nclient6/client.go @@ -90,15 +90,30 @@ func NewIPv6UDPConn(iface string, port int) (net.PacketConn, error) { }) } -// New creates a new DHCP client that sends and receives packets on the given -// interface. -func New(ifaceHWAddr net.HardwareAddr, opts ...ClientOpt) (*Client, error) { +// New returns a new DHCPv6 client for the given network interface. +func New(iface string, opts ...ClientOpt) (*Client, error) { + c, err := NewIPv6UDPConn(iface, dhcpv6.DefaultClientPort) + if err != nil { + return nil, err + } + + i, err := net.InterfaceByName(iface) + if err != nil { + return nil, err + } + return NewWithConn(c, i.HardwareAddr, opts...) +} + +// NewWithConn creates a new DHCP client that sends and receives packets on the +// given interface. +func NewWithConn(conn net.PacketConn, ifaceHWAddr net.HardwareAddr, opts ...ClientOpt) (*Client, error) { c := &Client{ ifaceHWAddr: ifaceHWAddr, timeout: 5 * time.Second, retry: 3, - serverAddr: AllDHCPServers, + serverAddr: AllDHCPRelayAgentsAndServers, bufferCap: 5, + conn: conn, done: make(chan struct{}), pending: make(map[dhcpv6.TransactionID]*pendingCh), @@ -239,6 +254,20 @@ func IsMessageType(t dhcpv6.MessageType) Matcher { } } +// RapidSolicit sends a solicitation message with the RapidCommit option and +// returns the first valid reply received. +func (c *Client) RapidSolicit(ctx context.Context, modifiers ...dhcpv6.Modifier) (*dhcpv6.Message, error) { + solicit, err := dhcpv6.NewSolicit(c.ifaceHWAddr, append(modifiers, dhcpv6.WithRapidCommit)...) + if err != nil { + return nil, err + } + msg, err := c.SendAndRead(ctx, c.serverAddr, solicit, IsMessageType(dhcpv6.MessageTypeReply)) + if err != nil { + return nil, err + } + return msg, nil +} + // Solicit sends a solicitation message and returns the first valid // advertisement received. func (c *Client) Solicit(ctx context.Context, modifiers ...dhcpv6.Modifier) (*dhcpv6.Message, error) { diff --git a/dhcpv6/nclient6/client_test.go b/dhcpv6/nclient6/client_test.go index cba4ef8..49b914e 100644 --- a/dhcpv6/nclient6/client_test.go +++ b/dhcpv6/nclient6/client_test.go @@ -55,9 +55,9 @@ func serveAndClient(ctx context.Context, responses [][]*dhcpv6.Message, opt ...C panic(err) } - o := []ClientOpt{WithConn(clientRawConn), WithRetry(1), WithTimeout(2 * time.Second)} + o := []ClientOpt{WithRetry(1), WithTimeout(2 * time.Second)} o = append(o, opt...) - mc, err := New(net.HardwareAddr{0xa, 0xb, 0xc, 0xd, 0xe, 0xf}, o...) + mc, err := NewWithConn(clientRawConn, net.HardwareAddr{0xa, 0xb, 0xc, 0xd, 0xe, 0xf}, o...) if err != nil { panic(err) } |