]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Fix activating a stopped interface.
authorRoy Marples <roy@marples.name>
Thu, 4 Feb 2016 21:51:10 +0000 (21:51 +0000)
committerRoy Marples <roy@marples.name>
Thu, 4 Feb 2016 21:51:10 +0000 (21:51 +0000)
dhcp6.c
dhcpcd.c

diff --git a/dhcp6.c b/dhcp6.c
index 7dd5a1924b6ac9f0ff3274d97363e295a3ba31d9..9cacb6355273844520c856234560a28db5a39173 100644 (file)
--- a/dhcp6.c
+++ b/dhcp6.c
@@ -3130,16 +3130,44 @@ errexit:
        return -1;
 }
 
+static void
+dhcp6_activateinterfaces(struct interface *ifp)
+{
+       struct interface *ifd;
+       size_t i, j;
+       struct if_ia *ia;
+       struct if_sla *sla;
+
+       for (i = 0; i < ifp->options->ia_len; i++) {
+               ia = &ifp->options->ia[i];
+               for (j = 0; j < ia->sla_len; j++) {
+                       sla = &ia->sla[j];
+                       ifd = if_find(ifp->ctx->ifaces, sla->ifname);
+                       if (ifd == NULL) {
+                               logger(ifp->ctx, LOG_WARNING,
+                                   "%s: cannot delegate to %s: %m",
+                                   ifp->name, sla->ifname);
+                               continue;
+                       }
+                       if (!ifd->active) {
+                               logger(ifp->ctx, LOG_INFO,
+                                   "%s: activating for delegation",
+                                   sla->ifname);
+                               dhcpcd_activateinterface(ifd,
+                                   DHCPCD_IPV6 | DHCPCD_DHCP6);
+                       }
+               }
+       }
+}
+
 static void
 dhcp6_start1(void *arg)
 {
-       struct interface *ifp = arg, *ifd;
+       struct interface *ifp = arg;
        struct if_options *ifo = ifp->options;
        struct dhcp6_state *state;
-       size_t i, j;
+       size_t i;
        const struct dhcp_compat *dhc;
-       struct if_ia *ia;
-       struct if_sla *sla;
 
        state = D6_STATE(ifp);
        /* If no DHCPv6 options are configured,
@@ -3171,28 +3199,7 @@ dhcp6_start1(void *arg)
                dhcp6_startinit(ifp);
        }
 
-       /* Activate any interfaces we need to */
-       /* Ensure we have all interfaces */
-       for (i = 0; i < ifo->ia_len; i++) {
-               ia = &ifo->ia[i];
-               for (j = 0; j < ia->sla_len; j++) {
-                       sla = &ia->sla[j];
-                       ifd = if_find(ifp->ctx->ifaces, sla->ifname);
-                       if (ifd == NULL) {
-                               logger(ifp->ctx, LOG_WARNING,
-                                   "%s: cannot delegate to %s: %m",
-                                   ifp->name, sla->ifname);
-                               continue;
-                       }
-                       if (!ifd->active) {
-                               logger(ifp->ctx, LOG_INFO,
-                                   "%s: activating for delegation",
-                                   sla->ifname);
-                               dhcpcd_activateinterface(ifd,
-                                   DHCPCD_IPV6 | DHCPCD_DHCP6);
-                       }
-               }
-       }
+       dhcp6_activateinterfaces(ifp);
 }
 
 int
@@ -3219,6 +3226,7 @@ dhcp6_start(struct interface *ifp, enum DH6S init_state)
                }
                /* We're already running DHCP6 */
                /* XXX: What if the managed flag vanishes from all RA? */
+               dhcp6_activateinterfaces(ifp);
                return 0;
        }
 
index 28e4d0a0314a0d46ff2a54121e3c6b2264a248bb..6b227bfe35a2536944f6d4258ae2d7c14cc1a152 100644 (file)
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -425,6 +425,7 @@ stop_interface(struct interface *ifp)
 
        /* De-activate the interface */
        ifp->active = IF_INACTIVE;
+       ifp->options->options &= ~DHCPCD_STOPPING;
 
 stop:
        if (!(ctx->options & (DHCPCD_MASTER | DHCPCD_TEST)))