changeset 3408:df62940aacb7 draft dhcpcd-6.10.1

Fix delegation activating interfaces.
author Roy Marples <roy@marples.name>
date Wed, 20 Jan 2016 19:08:12 +0000
parents e07f5afe8038
children 6838b85e6c6a
files dhcp6.c dhcpcd.c dhcpcd.h
diffstat 3 files changed, 76 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/dhcp6.c	Wed Jan 20 17:41:12 2016 +0000
+++ b/dhcp6.c	Wed Jan 20 19:08:12 2016 +0000
@@ -2482,14 +2482,20 @@
 			for (k = 0; k < i; j++)
 				if (strcmp(sla->ifname, ia->sla[j].ifname) == 0)
 					break;
-			if (j >= i &&
-			    ((ifd = if_find(ifp->ctx->ifaces,
-			        sla->ifname)) == NULL ||
-			    !ifd->active))
-				logger(ifp->ctx, LOG_ERR,
-				    "%s: interface does not exist"
-				    " for delegation",
-				    sla->ifname);
+			if (j >= i) {
+				ifd = if_find(ifp->ctx->ifaces, sla->ifname);
+				if (ifd == NULL)
+					logger(ifp->ctx, LOG_ERR,
+					    "%s: interface does not exist"
+					    " for delegation",
+					    sla->ifname);
+				else if (!ifd->active) {
+					logger(ifp->ctx, LOG_INFO,
+					    "%s: activating for delegation",
+					    sla->ifname);
+					dhcpcd_activateinterface(ifd);
+				}
+			}
 		}
 	}
 
--- a/dhcpcd.c	Wed Jan 20 17:41:12 2016 +0000
+++ b/dhcpcd.c	Wed Jan 20 19:08:12 2016 +0000
@@ -670,6 +670,41 @@
 	dhcpcd_handlecarrier(ifp->ctx, carrier, ifp->flags, ifp->name);
 }
 
+static void
+dhcpcd_initstate1(struct interface *ifp, int argc, char **argv,
+    unsigned long long options)
+{
+	struct if_options *ifo;
+
+	configure_interface(ifp, argc, argv, options);
+	ifo = ifp->options;
+
+	if (ifo->options & DHCPCD_IPV4 && ipv4_init(ifp->ctx) == -1) {
+		logger(ifp->ctx, LOG_ERR, "ipv4_init: %m");
+		ifo->options &= ~DHCPCD_IPV4;
+	}
+	if (ifo->options & DHCPCD_IPV6 && ipv6_init(ifp->ctx) == NULL) {
+		logger(ifp->ctx, LOG_ERR, "ipv6_init: %m");
+		ifo->options &= ~DHCPCD_IPV6RS;
+	}
+
+	/* Add our link-local address before upping the interface
+	 * so our RFC7217 address beats the hwaddr based one.
+	 * This needs to happen before PREINIT incase a hook script
+	 * inadvertently ups the interface. */
+	if (ifo->options & DHCPCD_IPV6 && ipv6_start(ifp) == -1) {
+		logger(ifp->ctx, LOG_ERR, "%s: ipv6_start: %m", ifp->name);
+		ifo->options &= ~DHCPCD_IPV6;
+	}
+}
+
+static void
+dhcpcd_initstate(struct interface *ifp, unsigned long long options)
+{
+
+	dhcpcd_initstate1(ifp, ifp->ctx->argc, ifp->ctx->argv, options);
+}
+
 void
 dhcpcd_handlecarrier(struct dhcpcd_ctx *ctx, int carrier, unsigned int flags,
     const char *ifname)
@@ -947,55 +982,6 @@
 }
 
 static void
-handle_link(void *arg)
-{
-	struct dhcpcd_ctx *ctx;
-
-	ctx = arg;
-	if (if_managelink(ctx) == -1) {
-		logger(ctx, LOG_ERR, "if_managelink: %m");
-		eloop_event_delete(ctx->eloop, ctx->link_fd);
-		close(ctx->link_fd);
-		ctx->link_fd = -1;
-	}
-}
-
-static void
-dhcpcd_initstate1(struct interface *ifp, int argc, char **argv,
-    unsigned long long options)
-{
-	struct if_options *ifo;
-
-	configure_interface(ifp, argc, argv, options);
-	ifo = ifp->options;
-
-	if (ifo->options & DHCPCD_IPV4 && ipv4_init(ifp->ctx) == -1) {
-		logger(ifp->ctx, LOG_ERR, "ipv4_init: %m");
-		ifo->options &= ~DHCPCD_IPV4;
-	}
-	if (ifo->options & DHCPCD_IPV6 && ipv6_init(ifp->ctx) == NULL) {
-		logger(ifp->ctx, LOG_ERR, "ipv6_init: %m");
-		ifo->options &= ~DHCPCD_IPV6RS;
-	}
-
-	/* Add our link-local address before upping the interface
-	 * so our RFC7217 address beats the hwaddr based one.
-	 * This needs to happen before PREINIT incase a hook script
-	 * inadvertently ups the interface. */
-	if (ifo->options & DHCPCD_IPV6 && ipv6_start(ifp) == -1) {
-		logger(ifp->ctx, LOG_ERR, "%s: ipv6_start: %m", ifp->name);
-		ifo->options &= ~DHCPCD_IPV6;
-	}
-}
-
-void
-dhcpcd_initstate(struct interface *ifp, unsigned long long options)
-{
-
-	dhcpcd_initstate1(ifp, ifp->ctx->argc, ifp->ctx->argv, options);
-}
-
-static void
 run_preinit(struct interface *ifp)
 {
 
@@ -1010,6 +996,32 @@
 		    ifp->carrier == LINK_UP ? "CARRIER" : "NOCARRIER");
 }
 
+void
+dhcpcd_activateinterface(struct interface *ifp)
+{
+
+	if (!ifp->active) {
+		ifp->active = 1;
+		dhcpcd_initstate(ifp, 0);
+		run_preinit(ifp);
+		dhcpcd_prestartinterface(ifp);
+	}
+}
+
+static void
+handle_link(void *arg)
+{
+	struct dhcpcd_ctx *ctx;
+
+	ctx = arg;
+	if (if_managelink(ctx) == -1) {
+		logger(ctx, LOG_ERR, "if_managelink: %m");
+		eloop_event_delete(ctx->eloop, ctx->link_fd);
+		close(ctx->link_fd);
+		ctx->link_fd = -1;
+	}
+}
+
 int
 dhcpcd_handleinterface(void *arg, int action, const char *ifname)
 {
--- a/dhcpcd.h	Wed Jan 20 17:41:12 2016 +0000
+++ b/dhcpcd.h	Wed Jan 20 19:08:12 2016 +0000
@@ -202,6 +202,6 @@
 int dhcpcd_selectprofile(struct interface *, const char *);
 
 void dhcpcd_startinterface(void *);
-void dhcpcd_initstate(struct interface *, unsigned long long);
+void dhcpcd_activateinterface(struct interface *);
 
 #endif