summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAnatole Denis <natolumin@unverle.fr>2019-10-15 10:16:05 +0200
committerAnatole Denis <natolumin@unverle.fr>2019-10-15 11:19:43 +0200
commit486c8612a71ba5e1f251fbbbf08a91e3d8f77bfa (patch)
treec139f883153fe0d47502f94789eea7a5619202f4
parent7cac2b06400c7608c0552462bc34f1856917b12e (diff)
server4: Respect listen address
NewIPv4UDPConn doesn't support listening on a specific address, only on the wildcard address. This extends it to allow listening on an address, and at the same time homogenizes the function signature with the NewIPv6UDPConn server6 equivalent. It modifies NewServer() to pass the full address given to it instead of just the port as well Note that listening on a non-wildcard interface is seldom useful as the socket won't receive broadcasts, so it is useless in a direct-attached server. It can be useful in a server only used behind relays This breaks API compatibility for NewIPv4UDPConn, which as far as I know nobody uses (yet) Signed-off-by: Anatole Denis <natolumin@unverle.fr>
-rw-r--r--dhcpv4/server4/conn.go12
-rw-r--r--dhcpv4/server4/server.go2
-rw-r--r--dhcpv4/server4/server_test.go2
3 files changed, 11 insertions, 5 deletions
diff --git a/dhcpv4/server4/conn.go b/dhcpv4/server4/conn.go
index 0a4c73a..d62a5ac 100644
--- a/dhcpv4/server4/conn.go
+++ b/dhcpv4/server4/conn.go
@@ -14,7 +14,7 @@ import (
// given based on a IPv4 DGRAM socket. The UDP connection allows broadcasting.
//
// The interface must already be configured.
-func NewIPv4UDPConn(iface string, port int) (*net.UDPConn, error) {
+func NewIPv4UDPConn(iface string, addr *net.UDPAddr) (*net.UDPConn, error) {
fd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM, unix.IPPROTO_UDP)
if err != nil {
return nil, fmt.Errorf("cannot get a UDP socket: %v", err)
@@ -37,9 +37,15 @@ func NewIPv4UDPConn(iface string, port int) (*net.UDPConn, error) {
return nil, fmt.Errorf("cannot bind to interface %s: %v", iface, err)
}
}
+
+ if addr == nil {
+ addr = &net.UDPAddr{Port: dhcpv4.ServerPort}
+ }
// Bind to the port.
- if err := unix.Bind(fd, &unix.SockaddrInet4{Port: port}); err != nil {
- return nil, fmt.Errorf("cannot bind to port %d: %v", port, err)
+ saddr := unix.SockaddrInet4{Port: addr.Port}
+ copy(saddr.Addr[:], addr.IP.To4())
+ if err := unix.Bind(fd, &saddr); err != nil {
+ return nil, fmt.Errorf("cannot bind to port %d: %v", addr.Port, err)
}
conn, err := net.FilePacketConn(f)
diff --git a/dhcpv4/server4/server.go b/dhcpv4/server4/server.go
index fe4ef09..8bf7924 100644
--- a/dhcpv4/server4/server.go
+++ b/dhcpv4/server4/server.go
@@ -133,7 +133,7 @@ func NewServer(ifname string, addr *net.UDPAddr, handler Handler, opt ...ServerO
}
if s.conn == nil {
var err error
- conn, err := NewIPv4UDPConn(ifname, addr.Port)
+ conn, err := NewIPv4UDPConn(ifname, addr)
if err != nil {
return nil, err
}
diff --git a/dhcpv4/server4/server_test.go b/dhcpv4/server4/server_test.go
index a596d04..e64be09 100644
--- a/dhcpv4/server4/server_test.go
+++ b/dhcpv4/server4/server_test.go
@@ -81,7 +81,7 @@ func setUpClientAndServer(t *testing.T, iface net.Interface, handler Handler) (*
_ = s.Serve()
}()
- clientConn, err := NewIPv4UDPConn("", caddr.Port)
+ clientConn, err := NewIPv4UDPConn("", &caddr)
if err != nil {
t.Fatal(err)
}