freebsd-dev/sbin/ifconfig
Hiroki Sato e7fa8d0ada - Accept Router Advertisement messages even when net.inet6.ip6.forwarding=1.
- A new per-interface knob IFF_ND6_NO_RADR and sysctl IPV6CTL_NO_RADR.
  This controls if accepting a route in an RA message as the default route.
  The default value for each interface can be set by net.inet6.ip6.no_radr.
  The system wide default value is 0.

- A new sysctl: net.inet6.ip6.norbit_raif.  This controls if setting R-bit in
  NA on RA accepting interfaces.  The default is 0 (R-bit is set based on
  net.inet6.ip6.forwarding).

Background:

 IPv6 host/router model suggests a router sends an RA and a host accepts it for
 router discovery.  Because of that, KAME implementation does not allow
 accepting RAs when net.inet6.ip6.forwarding=1.  Accepting RAs on a router can
 make the routing table confused since it can change the default router
 unintentionally.

 However, in practice there are cases where we cannot distinguish a host from
 a router clearly.  For example, a customer edge router often works as a host
 against the ISP, and as a router against the LAN at the same time.  Another
 example is a complex network configurations like an L2TP tunnel for IPv6
 connection to Internet over an Ethernet link with another native IPv6 subnet.
 In this case, the physical interface for the native IPv6 subnet works as a
 host, and the pseudo-interface for L2TP works as the default IP forwarding
 route.

Problem:

 Disabling processing RA messages when net.inet6.ip6.forwarding=1 and
 accepting them when net.inet6.ip6.forward=0 cause the following practical
 issues:

 - A router cannot perform SLAAC.  It becomes a problem if a box has
   multiple interfaces and you want to use SLAAC on some of them, for
   example.  A customer edge router for IPv6 Internet access service
   using an IPv6-over-IPv6 tunnel sometimes needs SLAAC on the
   physical interface for administration purpose; updating firmware
   and so on (link-local addresses can be used there, but GUAs by
   SLAAC are often used for scalability).

 - When a host has multiple IPv6 interfaces and it receives multiple RAs on
   them, controlling the default route is difficult.  Router preferences
   defined in RFC 4191 works only when the routers on the links are
   under your control.

Details of Implementation Changes:

 Router Advertisement messages will be accepted even when
 net.inet6.ip6.forwarding=1.  More precisely, the conditions are as
 follow:

 (ACCEPT_RTADV && !NO_RADR && !ip6.forwarding)
	=> Normal RA processing on that interface. (as IPv6 host)

 (ACCEPT_RTADV && (NO_RADR || ip6.forwarding))
	=> Accept RA but add the router to the defroute list with
	   rtlifetime=0 unconditionally.  This effectively prevents
	   from setting the received router address as the box's
	   default route.

 (!ACCEPT_RTADV)
	=> No RA processing on that interface.

 ACCEPT_RTADV and NO_RADR are per-interface knob.  In short, all interface
 are classified as "RA-accepting" or not.  An RA-accepting interface always
 processes RA messages regardless of ip6.forwarding.  The difference caused by
 NO_RADR or ip6.forwarding is whether the RA source address is considered as
 the default router or not.

 R-bit in NA on the RA accepting interfaces is set based on
 net.inet6.ip6.forwarding.  While RFC 6204 W-1 rule (for CPE case) suggests
 a router should disable the R-bit completely even when the box has
 net.inet6.ip6.forwarding=1, I believe there is no technical reason with
 doing so.  This behavior can be set by a new sysctl net.inet6.ip6.norbit_raif
 (the default is 0).

Usage:

 # ifconfig fxp0 inet6 accept_rtadv
	=> accept RA on fxp0
 # ifconfig fxp0 inet6 accept_rtadv no_radr
	=> accept RA on fxp0 but ignore default route information in it.
 # sysctl net.inet6.ip6.norbit_no_radr=1
	=> R-bit in NAs on RA accepting interfaces will always be set to 0.
2011-06-06 02:14:23 +00:00
..
af_atalk.c - Use size_t instead of int when appropriate; 2009-06-23 23:49:52 +00:00
af_inet6.c - Accept Router Advertisement messages even when net.inet6.ip6.forwarding=1. 2011-06-06 02:14:23 +00:00
af_inet.c Conditionally compile in the af_inet and af_inet6, af_nd6 modules. 2011-05-31 14:40:21 +00:00
af_ipx.c
af_link.c Ethernet vlan(4) interfaces have valid Ethernet link layer addresses but 2010-08-06 15:09:21 +00:00
af_nd6.c - Accept Router Advertisement messages even when net.inet6.ip6.forwarding=1. 2011-06-06 02:14:23 +00:00
ifbridge.c
ifcarp.c Shortening a passphrase caused wrong authentication key to be used. 2010-02-04 11:43:22 +00:00
ifclone.c - Use size_t instead of int when appropriate; 2009-06-23 23:49:52 +00:00
ifconfig.8 Conditionally compile in the af_inet and af_inet6, af_nd6 modules. 2011-05-31 14:40:21 +00:00
ifconfig.c Conditionally compile in the af_inet and af_inet6, af_nd6 modules. 2011-05-31 14:40:21 +00:00
ifconfig.h - Use size_t instead of int when appropriate; 2009-06-23 23:49:52 +00:00
ifgif.c Use printb() instead of rolling its own routine to display 2009-09-07 15:52:15 +00:00
ifgre.c - Use size_t instead of int when appropriate; 2009-06-23 23:49:52 +00:00
ifgroup.c Default to AF_LOCAL instead of AF_INET sockets for non-family-specific 2009-03-15 22:33:18 +00:00
ifieee80211.c Revert r220907 and r220915. 2011-04-22 00:44:27 +00:00
iflagg.c Do no spam the ifconfig output for the aggregated interface with 'laggdev laggX'. 2009-04-30 14:31:52 +00:00
ifmac.c - Use size_t instead of int when appropriate; 2009-06-23 23:49:52 +00:00
ifmedia.c When setting media always and not just in case of switching to IFM_AUTO 2011-05-15 12:51:00 +00:00
ifpfsync.c
ifvlan.c Add TSO support on VLAN in fconfig(8). 2010-02-20 23:01:09 +00:00
Makefile Conditionally compile in the af_inet and af_inet6, af_nd6 modules. 2011-05-31 14:40:21 +00:00
regdomain.c ifconfig(8) is documented to take a ISO 3166-1 country code to set the 2009-12-15 20:44:12 +00:00
regdomain.h Regulatory fixups: 2009-02-07 01:12:51 +00:00