diff options
author | Pablo Mazzini <pmazzini@gmail.com> | 2019-03-14 17:42:31 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-14 17:42:31 +0000 |
commit | f83bae4fe73f44baf884f75775679f0fd7d80026 (patch) | |
tree | 904a75f62d2b6f1c65874a958413bbe97ea803ef | |
parent | b57e89f69a4367faa3b6a0e41063bf144145d762 (diff) |
client: simulate relay (#259)
-rw-r--r-- | dhcpv6/client6/client.go | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/dhcpv6/client6/client.go b/dhcpv6/client6/client.go index 3ede17e..b1f8e11 100644 --- a/dhcpv6/client6/client.go +++ b/dhcpv6/client6/client.go @@ -25,10 +25,11 @@ var ( // Client implements a DHCPv6 client type Client struct { - ReadTimeout time.Duration - WriteTimeout time.Duration - LocalAddr net.Addr - RemoteAddr net.Addr + ReadTimeout time.Duration + WriteTimeout time.Duration + LocalAddr net.Addr + RemoteAddr net.Addr + SimulateRelay bool } // NewClient returns a Client with default settings @@ -80,18 +81,6 @@ func (c *Client) sendReceive(ifname string, packet dhcpv6.DHCPv6, expectedType d if packet == nil { return nil, fmt.Errorf("Packet to send cannot be nil") } - if expectedType == dhcpv6.MessageTypeNone { - // infer the expected type from the packet being sent - 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 { @@ -107,6 +96,25 @@ func (c *Client) sendReceive(ifname string, packet dhcpv6.DHCPv6, expectedType d return nil, fmt.Errorf("Invalid local address: not a net.UDPAddr: %v", c.LocalAddr) } } + if c.SimulateRelay { + var err error + packet, err = dhcpv6.EncapsulateRelay(packet, dhcpv6.MessageTypeRelayForward, net.IPv6zero, laddr.IP) + if err != nil { + return nil, err + } + } + if expectedType == dhcpv6.MessageTypeNone { + // infer the expected type from the packet being sent + 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 RemoteAddr is specified, use AllDHCPRelayAgentsAndServers var raddr net.UDPAddr |