summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorPablo Mazzini <pmazzini@gmail.com>2019-03-14 17:42:31 +0000
committerGitHub <noreply@github.com>2019-03-14 17:42:31 +0000
commitf83bae4fe73f44baf884f75775679f0fd7d80026 (patch)
tree904a75f62d2b6f1c65874a958413bbe97ea803ef
parentb57e89f69a4367faa3b6a0e41063bf144145d762 (diff)
client: simulate relay (#259)
-rw-r--r--dhcpv6/client6/client.go40
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