Salut, On Sun, Jul 12, 2009 at 10:49:52PM +0200, Tonnerre LOMBARD wrote: > Either way, here's it. If your mailer doesn't like PGP signed > attachments, go to > http://www.netbsd.org/~tonnerre/patches/src/2009/netinet6-rtadv-per-interface.patch > to find a copy of said patch. Updated patch, now using the preexisting flags. Seems to work so far on my workstation. Tonnerre
Index: sys/netinet6/nd6.c =================================================================== RCS file: /cvsroot/src/sys/netinet6/nd6.c,v retrieving revision 1.130 diff -u -r1.130 nd6.c --- sys/netinet6/nd6.c 24 Oct 2008 17:07:33 -0000 1.130 +++ sys/netinet6/nd6.c 13 Jul 2009 22:00:27 -0000 @@ -176,7 +176,8 @@ * we won't accept RAs by default even if we set ND6_IFF_ACCEPT_RTADV * here. */ - nd->flags = (ND6_IFF_PERFORMNUD | ND6_IFF_ACCEPT_RTADV); + nd->flags = (ND6_IFF_PERFORMNUD | + ip6_accept_rtadv ? ND6_IFF_ACCEPT_RTADV : 0); /* XXX: we cannot call nd6_setmtu since ifp is not fully initialized */ nd6_setmtu0(ifp, nd); @@ -710,6 +711,7 @@ void nd6_purge(struct ifnet *ifp) { + struct nd_ifinfo *ndi = ND_IFINFO(ifp); struct llinfo_nd6 *ln, *nln; struct nd_defrouter *dr, *ndr; struct nd_prefix *pr, *npr; @@ -764,7 +766,8 @@ if (nd6_defifindex == ifp->if_index) nd6_setdefaultiface(0); - if (!ip6_forwarding && ip6_accept_rtadv) { /* XXX: too restrictive? */ + /* XXX: too restrictive? */ + if (!ip6_forwarding && (ndi->flags & ND6_IFF_ACCEPT_RTADV)) { /* refresh default router list */ defrouter_select(); } @@ -1643,6 +1646,7 @@ int code /* type dependent information */ ) { + struct nd_ifinfo *ndi = ND_IFINFO(ifp); struct rtentry *rt = NULL; struct llinfo_nd6 *ln = NULL; int is_newentry; @@ -1851,7 +1855,8 @@ * for those are not autoconfigured hosts, we explicitly avoid such * cases for safety. */ - if (do_update && ln->ln_router && !ip6_forwarding && ip6_accept_rtadv) + if (do_update && ln->ln_router && !ip6_forwarding && + (ndi->flags & ND6_IFF_ACCEPT_RTADV)) defrouter_select(); return rt; Index: sys/netinet6/nd6_rtr.c =================================================================== RCS file: /cvsroot/src/sys/netinet6/nd6_rtr.c,v retrieving revision 1.76 diff -u -r1.76 nd6_rtr.c --- sys/netinet6/nd6_rtr.c 24 Oct 2008 21:30:34 -0000 1.76 +++ sys/netinet6/nd6_rtr.c 13 Jul 2009 22:00:45 -0000 @@ -113,6 +113,7 @@ nd6_rs_input(struct mbuf *m, int off, int icmp6len) { struct ifnet *ifp = m->m_pkthdr.rcvif; + struct nd_ifinfo *ndi = ND_IFINFO(ifp); struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); struct nd_router_solicit *nd_rs; struct in6_addr saddr6 = ip6->ip6_src; @@ -121,7 +122,7 @@ union nd_opts ndopts; /* If I'm not a router, ignore it. */ - if (ip6_accept_rtadv != 0 || !ip6_forwarding) + if ((ndi->flags & ND6_IFF_ACCEPT_RTADV) || !ip6_forwarding) goto freeit; /* Sanity checks */ @@ -209,8 +210,6 @@ * the system-wide variable allows the acceptance, and * per-interface variable allows RAs on the receiving interface. */ - if (ip6_accept_rtadv == 0) - goto freeit; if (!(ndi->flags & ND6_IFF_ACCEPT_RTADV)) goto freeit; @@ -482,6 +481,7 @@ void defrtrlist_del(struct nd_defrouter *dr) { + struct nd_ifinfo *ndi = ND_IFINFO(dr->ifp); struct nd_defrouter *deldr = NULL; struct nd_prefix *pr; @@ -489,7 +489,8 @@ * Flush all the routing table entries that use the router * as a next hop. */ - if (!ip6_forwarding && ip6_accept_rtadv) /* XXX: better condition? */ + /* XXX: better condition? */ + if (!ip6_forwarding && (ndi->flags & ND6_IFF_ACCEPT_RTADV)) rt6_flush(&dr->rtaddr, dr->ifp); if (dr->installed) { @@ -608,6 +609,7 @@ void defrouter_select(void) { + struct nd_ifinfo *ndi; int s = splsoftnet(); struct nd_defrouter *dr, *selected_dr = NULL, *installed_dr = NULL; struct rtentry *rt = NULL; @@ -619,7 +621,7 @@ * if the node is not an autoconfigured host, we explicitly exclude * such cases here for safety. */ - if (ip6_forwarding || !ip6_accept_rtadv) { + if (ip6_forwarding) { nd6log((LOG_WARNING, "defrouter_select: called unexpectedly (forwarding=%d, " "accept_rtadv=%d)\n", ip6_forwarding, ip6_accept_rtadv)); @@ -643,6 +645,10 @@ */ for (dr = TAILQ_FIRST(&nd_defrouter); dr; dr = TAILQ_NEXT(dr, dr_entry)) { + ndi = ND_IFINFO(dr->ifp); + if ((ndi->flags & ND6_IFF_ACCEPT_RTADV)) + continue; + if (selected_dr == NULL && (rt = nd6_lookup(&dr->rtaddr, 0, dr->ifp)) != NULL && (ln = (struct llinfo_nd6 *)rt->rt_llinfo) != NULL &&
Attachment:
pgpPf5FCvbR9m.pgp
Description: PGP signature