diff options
author | Tore Anderson <tore@fud.no> | 2011-08-28 19:47:33 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-09-16 19:14:41 -0400 |
commit | 026359bc6eddfdc2d2e684bf0b51691649b90f33 (patch) | |
tree | d1fbc10d28a1f1084ca0dd4f4f746aa1d9becaa2 /net/ipv6/addrconf.c | |
parent | c1aabdf379bc2feeb0df7057ed5bad96f492133e (diff) |
ipv6: Send ICMPv6 RSes only when RAs are accepted
This patch improves the logic determining when to send ICMPv6 Router
Solicitations, so that they are 1) always sent when the kernel is
accepting Router Advertisements, and 2) never sent when the kernel is
not accepting RAs. In other words, the operational setting of the
"accept_ra" sysctl is used.
The change also makes the special "Hybrid Router" forwarding mode
("forwarding" sysctl set to 2) operate exactly the same as the standard
Router mode (forwarding=1). The only difference between the two was
that RSes was being sent in the Hybrid Router mode only. The sysctl
documentation describing the special Hybrid Router mode has therefore
been removed.
Rationale for the change:
Currently, the value of forwarding sysctl is the only thing determining
whether or not to send RSes. If it has the value 0 or 2, they are sent,
otherwise they are not. This leads to inconsistent behaviour in the
following cases:
* accept_ra=0, forwarding=0
* accept_ra=0, forwarding=2
* accept_ra=1, forwarding=2
* accept_ra=2, forwarding=1
In the first three cases, the kernel will send RSes, even though it will
not accept any RAs received in reply. In the last case, it will not send
any RSes, even though it will accept and process any RAs received. (Most
routers will send unsolicited RAs periodically, so suppressing RSes in
the last case will merely delay auto-configuration, not prevent it.)
Also, it is my opinion that having the forwarding sysctl control RS
sending behaviour (completely independent of whether RAs are being
accepted or not) is simply not what most users would intuitively expect
to be the case.
Signed-off-by: Tore Anderson <tore@fud.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r-- | net/ipv6/addrconf.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 8f1e5be26d91..3053c685e249 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2996,12 +2996,12 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp) | |||
2996 | 2996 | ||
2997 | ipv6_ifa_notify(RTM_NEWADDR, ifp); | 2997 | ipv6_ifa_notify(RTM_NEWADDR, ifp); |
2998 | 2998 | ||
2999 | /* If added prefix is link local and forwarding is off, | 2999 | /* If added prefix is link local and we are prepared to process |
3000 | start sending router solicitations. | 3000 | router advertisements, start sending router solicitations. |
3001 | */ | 3001 | */ |
3002 | 3002 | ||
3003 | if ((ifp->idev->cnf.forwarding == 0 || | 3003 | if (((ifp->idev->cnf.accept_ra == 1 && !ifp->idev->cnf.forwarding) || |
3004 | ifp->idev->cnf.forwarding == 2) && | 3004 | ifp->idev->cnf.accept_ra == 2) && |
3005 | ifp->idev->cnf.rtr_solicits > 0 && | 3005 | ifp->idev->cnf.rtr_solicits > 0 && |
3006 | (dev->flags&IFF_LOOPBACK) == 0 && | 3006 | (dev->flags&IFF_LOOPBACK) == 0 && |
3007 | (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) { | 3007 | (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) { |