dhcp: Bind server port when a specific server address is specified
authorTobias Brunner <tobias@strongswan.org>
Tue, 10 Apr 2018 15:04:10 +0000 (17:04 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 18 May 2018 16:04:01 +0000 (18:04 +0200)
commitbecf027cd9b0af162247015a9fff6c00e59fd6ce
tree4735c8244275b63bef064e5bd47ccf381a674bbe
parente8b5c7b94ecca6d16748b210fd62b64826a5d2f7
dhcp: Bind server port when a specific server address is specified

DHCP servers will respond to port 67 if giaddr is non-zero, which we set
if we are not broadcasting.  While such messages are received fine via
RAW socket the kernel will respond with an ICMP port unreachable if no
socket is bound to that port.  Instead of opening a dummy socket on port
67 just to avoid the ICMPs we can also just operate with a single
socket, bind it to port 67 and send our requests from that port.

Since SO_REUSEADDR behaves on Linux like SO_REUSEPORT does on other
systems we can bind that port even if a DHCP server is running on the
same host as the daemon (this might have to be adapted to make this work
on other systems, but due to the raw socket the plugin is not that portable
anyway).
src/libcharon/plugins/dhcp/dhcp_socket.c
testing/tests/ikev2/dhcp-dynamic/hosts/moon/etc/iptables.rules
testing/tests/ikev2/dhcp-static-client-id/hosts/moon/etc/iptables.rules
testing/tests/ikev2/dhcp-static-mac/hosts/moon/etc/iptables.rules
testing/tests/swanctl/dhcp-dynamic/hosts/moon/etc/iptables.rules