Salut,
This is the first part of my series of patches concerning IPv6 route
advertisements. It simply moves the variable deciding whether or not
to accept IPv6 route advertisements on a specific interface to be
specific to that interface.
A second patch is going to separate the setting of when to accept
a default route (which is why there are more bits left on the
autoconf integer. However, it would have been really cool had there
still been 2 bits of space left on if_flags.)
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.
Any opinions?
Tonnerre
? tooldir.NetBSD-4.0-sparc64
? tooldir.NetBSD-4.0_wrstuden_fixsa_t1-sparc64
? sys/arch/amd64/conf/JULES
Index: etc/rc.d/network
===================================================================
RCS file: /cvsroot/src/etc/rc.d/network,v
retrieving revision 1.57.2.1
diff -u -r1.57.2.1 network
--- etc/rc.d/network 18 May 2009 19:30:48 -0000 1.57.2.1
+++ etc/rc.d/network 12 Jul 2009 19:57:48 -0000
@@ -127,7 +127,7 @@
/sbin/route -q add -inet6 ::0.0.0.0 -prefixlen 96 ::1 -reject
/sbin/sysctl -qw net.inet6.ip6.forwarding=0
- /sbin/sysctl -qw net.inet6.ip6.accept_rtadv=0
+ /sbin/sysctl -qw net.inet6.ip6.accept_rtadv.default=0
case $ip6mode in
router)
@@ -144,7 +144,11 @@
autohost)
echo 'IPv6 mode: autoconfigured host'
- /sbin/sysctl -qw net.inet6.ip6.accept_rtadv=1
+ /sbin/sysctl -qw net.inet6.ip6.accept_rtadv.default=1
+
+ for int in `/sbin/ifconfig -l`; do
+ /sbin/sysctl -qw
net.inet6.ip6.accept_rtadv."$int"=1
+ done
;;
host)
Index: sys/net/if.h
===================================================================
RCS file: /cvsroot/src/sys/net/if.h,v
retrieving revision 1.140
diff -u -r1.140 if.h
--- sys/net/if.h 24 Oct 2008 17:07:33 -0000 1.140
+++ sys/net/if.h 12 Jul 2009 19:59:05 -0000
@@ -275,6 +275,7 @@
struct pfil_head if_pfil; /* filtering point */
uint64_t if_capabilities; /* interface capabilities */
uint64_t if_capenable; /* capabilities enabled */
+ int if_autoconf; /* IPv6 autoconfiguration */
union {
void * carp_s; /* carp structure (used by !carp ifs) */
struct ifnet *carp_d;/* ptr to carpdev (used by carp ifs) */
@@ -290,6 +291,7 @@
void *if_afdata[AF_MAX];
struct mowner *if_mowner; /* who owns mbufs for this interface */
+ struct sysctllog *if_clog;
void *if_agrprivate; /* used only when #if NAGR > 0 */
Index: sys/netinet6/in6_ifattach.c
===================================================================
RCS file: /cvsroot/src/sys/netinet6/in6_ifattach.c,v
retrieving revision 1.80
diff -u -r1.80 in6_ifattach.c
--- sys/netinet6/in6_ifattach.c 24 Apr 2008 11:38:38 -0000 1.80
+++ sys/netinet6/in6_ifattach.c 12 Jul 2009 19:59:06 -0000
@@ -42,6 +42,7 @@
#include <sys/syslog.h>
#include <sys/md5.h>
#include <sys/socketvar.h>
+#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
@@ -833,6 +834,19 @@
ifp->if_xname);
}
}
+
+ /*
+ * attach the IPv6 address autoconfiguration ioctl.
+ */
+ ifp->if_autoconf = ip6_accept_rtadv;
+
+ sysctl_createv(&ifp->if_clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+ CTLTYPE_INT, ifp->if_xname,
+ SYSCTL_DESCR("Accept router advertisements"),
+ NULL, 0, &ifp->if_autoconf, 0,
+ CTL_NET, PF_INET6, IPPROTO_IPV6, IPV6CTL_ACCEPT_RTADV,
+ ifp->if_index + 1, CTL_EOL);
}
/*
Index: sys/netinet6/ip6_input.c
===================================================================
RCS file: /cvsroot/src/sys/netinet6/ip6_input.c,v
retrieving revision 1.122.4.1
diff -u -r1.122.4.1 ip6_input.c
--- sys/netinet6/ip6_input.c 3 May 2009 13:22:22 -0000 1.122.4.1
+++ sys/netinet6/ip6_input.c 12 Jul 2009 19:59:09 -0000
@@ -1765,12 +1765,19 @@
IPV6CTL_SOURCECHECK_LOGINT, CTL_EOL);
#endif
sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT,
+ CTLTYPE_NODE, "accept_rtadv",
+ SYSCTL_DESCR("Accept router advertisements"),
+ NULL, 0, NULL, 0,
+ CTL_NET, PF_INET6, IPPROTO_IPV6,
+ IPV6CTL_ACCEPT_RTADV, CTL_EOL);
+ sysctl_createv(clog, 0, NULL, NULL,
CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
- CTLTYPE_INT, "accept_rtadv",
+ CTLTYPE_INT, "default",
SYSCTL_DESCR("Accept router advertisements"),
NULL, 0, &ip6_accept_rtadv, 0,
CTL_NET, PF_INET6, IPPROTO_IPV6,
- IPV6CTL_ACCEPT_RTADV, CTL_EOL);
+ IPV6CTL_ACCEPT_RTADV, 0, CTL_EOL);
sysctl_createv(clog, 0, NULL, NULL,
CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
CTLTYPE_INT, "keepfaith",
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 12 Jul 2009 19:59:16 -0000
@@ -121,7 +121,7 @@
union nd_opts ndopts;
/* If I'm not a router, ignore it. */
- if (ip6_accept_rtadv != 0 || !ip6_forwarding)
+ if (ifp->if_autoconf != 0 || !ip6_forwarding)
goto freeit;
/* Sanity checks */
@@ -209,7 +209,7 @@
* the system-wide variable allows the acceptance, and
* per-interface variable allows RAs on the receiving interface.
*/
- if (ip6_accept_rtadv == 0)
+ if (ifp->if_autoconf == 0)
goto freeit;
if (!(ndi->flags & ND6_IFF_ACCEPT_RTADV))
goto freeit;
@@ -488,6 +488,8 @@
/*
* Flush all the routing table entries that use the router
* as a next hop.
+ *
+ * XXX: Check interface specific flags
*/
if (!ip6_forwarding && ip6_accept_rtadv) /* XXX: better condition? */
rt6_flush(&dr->rtaddr, dr->ifp);
@@ -618,6 +620,8 @@
* host. Although the remaining part of this function is not effective
* if the node is not an autoconfigured host, we explicitly exclude
* such cases here for safety.
+ *
+ * XXX: Check interface specific flags
*/
if (ip6_forwarding || !ip6_accept_rtadv) {
nd6log((LOG_WARNING,
Attachment:
pgpADCrjOrL7J.pgp
Description: PGP signature