From: Roy Marples Date: Sat, 14 Mar 2015 11:06:19 +0000 (+0000) Subject: Improve pseudo interface handling. X-Git-Tag: v6.8.0~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c04f00c97531e4d0d98d21ada0e026dc2c2028d6;p=thirdparty%2Fdhcpcd.git Improve pseudo interface handling. --- diff --git a/dhcp6.c b/dhcp6.c index d3fe602c..093a97dc 100644 --- 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); } diff --git a/dhcpcd.c b/dhcpcd.c index 26b64361..8ec00788 100644 --- 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)) diff --git a/dhcpcd.h b/dhcpcd.h index d289d601..dd1a9f4b 100644 --- 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 diff --git a/ipv6nd.c b/ipv6nd.c index 8e3a92fd..a6ffc43b 100644 --- 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;