sd-dhcp6-client: allow multiple clients on host
authorTom Gundersen <teg@jklm.no>
Mon, 16 Nov 2015 18:05:27 +0000 (19:05 +0100)
committerTom Gundersen <teg@jklm.no>
Tue, 17 Nov 2015 12:26:51 +0000 (13:26 +0100)
We need to enable SO_REUSEADDR in order for several sockets to be allowed
to bind to the same port (even on different links).

src/libsystemd-network/dhcp6-network.c

index 318ee9c..ec601cb 100644 (file)
@@ -45,16 +45,13 @@ int dhcp6_network_bind_udp_socket(int index, struct in6_addr *local_address) {
         int r, off = 0, on = 1;
 
         if (local_address)
-                memcpy(&src.in6.sin6_addr, local_address,
-                       sizeof(src.in6.sin6_addr));
+                src.in6.sin6_addr = *local_address;
 
-        s = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
-                   IPPROTO_UDP);
+        s = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, IPPROTO_UDP);
         if (s < 0)
                 return -errno;
 
-        r = setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO, &pktinfo,
-                       sizeof(pktinfo));
+        r = setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO, &pktinfo, sizeof(pktinfo));
         if (r < 0)
                 return -errno;
 
@@ -66,6 +63,10 @@ int dhcp6_network_bind_udp_socket(int index, struct in6_addr *local_address) {
         if (r < 0)
                 return -errno;
 
+        r = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+        if (r < 0)
+                return -errno;
+
         r = bind(s, &src.sa, sizeof(src.in6));
         if (r < 0)
                 return -errno;