summaryrefslogtreecommitdiffhomepage
path: root/pkg/dhcp
diff options
context:
space:
mode:
authorAmanda Tait <atait@google.com>2019-02-20 12:53:07 -0800
committerShentubot <shentubot@google.com>2019-02-20 12:54:13 -0800
commitea070b9d5f4be0b25b028e90ab4518ef2e4df16b (patch)
tree809aa3394d3b276cb5b37b4d72adf0f32e9248e1 /pkg/dhcp
parent3e3a1ef9d61fccf6d0d9a52f4e885a6e07a07609 (diff)
Implement Broadcast support
This change adds support for the SO_BROADCAST socket option in gVisor Netstack. This support includes getsockopt()/setsockopt() functionality for both UDP and TCP endpoints (the latter being a NOOP), dispatching broadcast messages up and down the stack, and route finding/creation for broadcast packets. Finally, a suite of tests have been implemented, exercising this functionality through the Linux syscall API. PiperOrigin-RevId: 234850781 Change-Id: If3e666666917d39f55083741c78314a06defb26c
Diffstat (limited to 'pkg/dhcp')
-rw-r--r--pkg/dhcp/client.go3
-rw-r--r--pkg/dhcp/dhcp_test.go3
-rw-r--r--pkg/dhcp/server.go3
3 files changed, 9 insertions, 0 deletions
diff --git a/pkg/dhcp/client.go b/pkg/dhcp/client.go
index 3330c4998..6d48eec7e 100644
--- a/pkg/dhcp/client.go
+++ b/pkg/dhcp/client.go
@@ -141,6 +141,9 @@ func (c *Client) Request(ctx context.Context, requestedAddr tcpip.Address) (cfg
}, nil); err != nil {
return Config{}, fmt.Errorf("dhcp: connect failed: %v", err)
}
+ if err := ep.SetSockOpt(tcpip.BroadcastOption(1)); err != nil {
+ return Config{}, fmt.Errorf("dhcp: setsockopt SO_BROADCAST: %v", err)
+ }
epin, err := c.stack.NewEndpoint(udp.ProtocolNumber, ipv4.ProtocolNumber, &wq)
if err != nil {
diff --git a/pkg/dhcp/dhcp_test.go b/pkg/dhcp/dhcp_test.go
index a21dce6bc..026064394 100644
--- a/pkg/dhcp/dhcp_test.go
+++ b/pkg/dhcp/dhcp_test.go
@@ -287,6 +287,9 @@ func TestTwoServers(t *testing.T) {
if err = ep.Bind(tcpip.FullAddress{Port: ServerPort}, nil); err != nil {
t.Fatalf("dhcp: server bind: %v", err)
}
+ if err = ep.SetSockOpt(tcpip.BroadcastOption(1)); err != nil {
+ t.Fatalf("dhcp: setsockopt: %v", err)
+ }
serverCtx, cancel := context.WithCancel(context.Background())
defer cancel()
diff --git a/pkg/dhcp/server.go b/pkg/dhcp/server.go
index 3e06ab4c7..c72c3b70d 100644
--- a/pkg/dhcp/server.go
+++ b/pkg/dhcp/server.go
@@ -123,6 +123,9 @@ func newEPConnServer(ctx context.Context, stack *stack.Stack, addrs []tcpip.Addr
if err := ep.Bind(tcpip.FullAddress{Port: ServerPort}, nil); err != nil {
return nil, fmt.Errorf("dhcp: server bind: %v", err)
}
+ if err := ep.SetSockOpt(tcpip.BroadcastOption(1)); err != nil {
+ return nil, fmt.Errorf("dhcp: server setsockopt: %v", err)
+ }
c := newEPConn(ctx, wq, ep)
return NewServer(ctx, c, addrs, cfg)
}