]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Improve pseudo interface handling.
authorRoy Marples <roy@marples.name>
Sat, 14 Mar 2015 11:06:19 +0000 (11:06 +0000)
committerRoy Marples <roy@marples.name>
Sat, 14 Mar 2015 11:06:19 +0000 (11:06 +0000)
dhcp6.c
dhcpcd.c
dhcpcd.h
ipv6nd.c

diff --git a/dhcp6.c b/dhcp6.c
index d3fe602ca36b0e0034b2f2b45a076c559bcee171..093a97dcb122d7f1e51baecdb732460adb010015 100644 (file)
--- a/dhcp6.c
+++ b/dhcp6.c
@@ -3146,12 +3146,8 @@ dhcp6_start1(void *arg)
                                        TAILQ_REMOVE(ifs, ifn, next);
                                        TAILQ_INSERT_AFTER(ifp->ctx->ifaces,
                                            ifp, ifn, next);
-                                       dhcpcd_initstate(ifn);
-                                       ifn->options->options |=
-                                           DHCPCD_PFXDLGONLY;
-                                       ifn->options->options &=
-                                           ~(DHCPCD_IPV4 | DHCPCD_IPV6RS |
-                                           DHCPCD_NOPFXDLG);
+                                       dhcpcd_initstate(ifn,
+                                           DHCPCD_PFXDLGONLY);
                                        eloop_timeout_add_sec(ifp->ctx->eloop,
                                            0, dhcpcd_startinterface, ifn);
                                }
index 26b64361cd109727430c4117fef8b2bd7b07b146..8ec00788888d5aefc56e362e6fb910ed044ec992 100644 (file)
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -381,6 +381,10 @@ configure_interface1(struct interface *ifp)
            !(ifp->ctx->options & DHCPCD_TEST))
                ifo->options |= DHCPCD_IPV6RA_OWN;
 
+       /* If we're a psuedo interface, ensure we disable as much as we can */
+       if (ifp->options->options & DHCPCD_PFXDLGONLY)
+               ifp->options->options &= ~(DHCPCD_IPV4 | DHCPCD_IPV6RS);
+
        /* We want to disable kernel interface RA as early as possible. */
        if (ifo->options & DHCPCD_IPV6RS) {
                /* If not doing any DHCP, disable the RDNSS requirement. */
@@ -540,11 +544,13 @@ dhcpcd_selectprofile(struct interface *ifp, const char *profile)
 }
 
 static void
-configure_interface(struct interface *ifp, int argc, char **argv)
+configure_interface(struct interface *ifp, int argc, char **argv,
+    unsigned long long options)
 {
 
        dhcpcd_selectprofile(ifp, NULL);
        add_options(ifp->ctx, ifp->name, ifp->options, argc, argv);
+       ifp->options->options |= options;
        configure_interface1(ifp);
 }
 
@@ -627,7 +633,7 @@ dhcpcd_handlecarrier(struct dhcpcd_ctx *ctx, int carrier, unsigned int flags,
 #endif
                        if (ifp->wireless)
                                if_getssid(ifp);
-                       dhcpcd_initstate(ifp);
+                       dhcpcd_initstate(ifp, 0);
                        script_runreason(ifp, "CARRIER");
                        /* RFC4941 Section 3.5 */
                        if (ifp->options->options & DHCPCD_IPV6RA_OWN)
@@ -747,7 +753,7 @@ dhcpcd_startinterface(void *arg)
 
        if (ifo->options & DHCPCD_IPV6) {
                if (ifo->options & DHCPCD_IPV6RS &&
-                   !(ifo->options & (DHCPCD_INFORM | DHCPCD_PFXDLGONLY)))
+                   !(ifo->options & DHCPCD_INFORM))
                        ipv6nd_startrs(ifp);
 
                if (ifo->options & DHCPCD_DHCP6)
@@ -781,8 +787,6 @@ dhcpcd_startinterface(void *arg)
                                    "%s: dhcp6_start: %m", ifp->name);
                }
        }
-       if (ifo->options & DHCPCD_PFXDLGONLY)
-               return;
 
        if (ifo->options & DHCPCD_IPV4)
                dhcp_start(ifp);
@@ -830,11 +834,12 @@ handle_link(void *arg)
 }
 
 static void
-dhcpcd_initstate1(struct interface *ifp, int argc, char **argv)
+dhcpcd_initstate1(struct interface *ifp, int argc, char **argv,
+    unsigned long long options)
 {
        struct if_options *ifo;
 
-       configure_interface(ifp, argc, argv);
+       configure_interface(ifp, argc, argv, options);
        ifo = ifp->options;
 
        if (ifo->options & DHCPCD_IPV4 && ipv4_init(ifp->ctx) == -1) {
@@ -857,10 +862,10 @@ dhcpcd_initstate1(struct interface *ifp, int argc, char **argv)
 }
 
 void
-dhcpcd_initstate(struct interface *ifp)
+dhcpcd_initstate(struct interface *ifp, unsigned long long options)
 {
 
-       dhcpcd_initstate1(ifp, ifp->ctx->argc, ifp->ctx->argv);
+       dhcpcd_initstate1(ifp, ifp->ctx->argc, ifp->ctx->argv, options);
 }
 
 static void
@@ -932,7 +937,7 @@ dhcpcd_handleinterface(void *arg, int action, const char *ifname)
                        syslog(LOG_DEBUG, "%s: interface added", ifp->name);
                        TAILQ_REMOVE(ifs, ifp, next);
                        TAILQ_INSERT_TAIL(ctx->ifaces, ifp, next);
-                       dhcpcd_initstate(ifp);
+                       dhcpcd_initstate(ifp, 0);
                        run_preinit(ifp);
                        iff = ifp;
                }
@@ -985,7 +990,7 @@ if_reboot(struct interface *ifp, int argc, char **argv)
 
        oldopts = ifp->options->options;
        script_runreason(ifp, "RECONFIGURE");
-       dhcpcd_initstate1(ifp, argc, argv);
+       dhcpcd_initstate1(ifp, argc, argv, 0);
        dhcp_reboot_newopts(ifp, oldopts);
        dhcp6_reboot(ifp);
        dhcpcd_prestartinterface(ifp);
@@ -1031,7 +1036,7 @@ reconf_reboot(struct dhcpcd_ctx *ctx, int action, int argc, char **argv, int oi)
                        if_free(ifp);
                } else {
                        TAILQ_INSERT_TAIL(ctx->ifaces, ifp, next);
-                       dhcpcd_initstate1(ifp, argc, argv);
+                       dhcpcd_initstate1(ifp, argc, argv, 0);
                        run_preinit(ifp);
                        dhcpcd_prestartinterface(ifp);
                }
@@ -1546,7 +1551,7 @@ main(int argc, char **argv)
                                        family = AF_INET;
                        }
                }
-               configure_interface(ifp, ctx.argc, ctx.argv);
+               configure_interface(ifp, ctx.argc, ctx.argv, 0);
                if (ctx.options & DHCPCD_PFXDLGONLY)
                        ifp->options->options |= DHCPCD_PFXDLGONLY;
                if (family == 0 || family == AF_INET) {
@@ -1750,7 +1755,7 @@ main(int argc, char **argv)
        }
 
        TAILQ_FOREACH(ifp, ctx.ifaces, next) {
-               dhcpcd_initstate1(ifp, argc, argv);
+               dhcpcd_initstate1(ifp, argc, argv, 0);
        }
 
        if (ctx.options & DHCPCD_BACKGROUND && dhcpcd_daemonise(&ctx))
index d289d6019e66bae6335d46cf27ebcf7dbc24ecf0..dd1a9f4b9ebb090def709d3866c3e253de82a92c 100644 (file)
--- a/dhcpcd.h
+++ b/dhcpcd.h
@@ -171,6 +171,6 @@ void dhcpcd_dropinterface(struct interface *, const char *);
 int dhcpcd_selectprofile(struct interface *, const char *);
 
 void dhcpcd_startinterface(void *);
-void dhcpcd_initstate(struct interface *);
+void dhcpcd_initstate(struct interface *, unsigned long long);
 
 #endif
index 8e3a92fd52d2cc21ddf087ff9264998cf7e1932f..a6ffc43b521a4b835d0f3aae5963fff3e74818fe 100644 (file)
--- a/ipv6nd.c
+++ b/ipv6nd.c
@@ -1569,8 +1569,12 @@ ipv6nd_handledata(void *arg)
        }
 
        TAILQ_FOREACH(ifp, dhcpcd_ctx->ifaces, next) {
-               if (ifp->index == (unsigned int)pkt.ipi6_ifindex)
+               if (ifp->index == (unsigned int)pkt.ipi6_ifindex) {
+                       if (!(ifp->options->options & DHCPCD_IPV6) ||
+                           ifp->options->options & DHCPCD_PFXDLGONLY)
+                               return;
                        break;
+               }
        }
 
        icp = (struct icmp6_hdr *)ctx->rcvhdr.msg_iov[0].iov_base;