From: Roy Marples Date: Sun, 14 Aug 2016 08:30:13 +0000 (+0000) Subject: If not running in master mode, allow dhcpcd to bind directly to the interface X-Git-Tag: v6.11.3~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9da55ded4c836c6d91c7d4b2304b49c049449fdd;p=thirdparty%2Fdhcpcd.git If not running in master mode, allow dhcpcd to bind directly to the interface for DHCPv6. This allows more than once dhcpcd instance to work with DHCPv6. --- diff --git a/dhcp6.c b/dhcp6.c index 7863a30a..45fd5e3f 100644 --- a/dhcp6.c +++ b/dhcp6.c @@ -3174,6 +3174,29 @@ dhcp6_open(struct dhcpcd_ctx *dctx) logger(dctx, LOG_WARNING, "setsockopt: SO_REUSEPORT: %m"); #endif +#ifdef SO_BINDTODEVICE + /* If we're not running in master mode, we can bind directly to the + * interface. This allows separate daemons to work on separate + * interfaces. */ + if (!(dctx->options & DHCPCD_MASTER)) { + const struct interface *ifp; + struct ifreq ifr; + + TAILQ_FOREACH(ifp, dctx->ifaces, next) { + if (ifp->active) + break; + } + if (ifp != NULL) { + memset(&ifr, 0, sizeof(ifr)); + strlcpy(ifr.ifr_name, ifp->name, sizeof(ifr.ifr_name)); + if (setsockopt(ctx->dhcp_fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, + sizeof(ifr)) == -1) + logger(dctx, LOG_WARNING, + "setsockopt: SO_BINDTODEVICE: %m"); + } + } +#endif + if (bind(ctx->dhcp_fd, (struct sockaddr *)&sa, sizeof(sa)) == -1) goto errexit;