aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
authorNeil Horman <nhorman@tuxdriver.com>2012-01-04 05:49:15 -0500
committerDavid S. Miller <davem@davemloft.net>2012-01-04 15:53:20 -0500
commite6bff995f8fe78f74cbe8f14bf6a31f3560b9ce4 (patch)
tree6f3dd815508bd265c9d272bea1a1e0300e09bef3 /net/ipv6
parent02a9098ede0dc7e28c16a03fa7fba86a05219478 (diff)
ipv6: Check RA for sllao when configuring optimistic ipv6 address (v2)
Recently Dave noticed that a test we did in ipv6_add_addr to see if we next hop route for the interface we're adding an addres to was wrong (see commit 7ffbcecbeed91e5874e9a1cfc4c0cbb07dac3069). for one, it never triggers, and two, it was completely wrong to begin with. This test was meant to cover this section of RFC 4429: 3.3 Modifications to RFC 2462 Stateless Address Autoconfiguration * (modifies section 5.5) A host MAY choose to configure a new address as an Optimistic Address. A host that does not know the SLLAO of its router SHOULD NOT configure a new address as Optimistic. A router SHOULD NOT configure an Optimistic Address. This patch should bring us into proper compliance with the above clause. Since we only add a SLAAC address after we've received a RA which may or may not contain a source link layer address option, we can pass a pointer to that option to addrconf_prefix_rcv (which may be null if the option is not present), and only set the optimistic flag if the option was found in the RA. Change notes: (v2) modified the new parameter to addrconf_prefix_rcv to be a bool rather than a pointer to make its use more clear as per request from davem. Signed-off-by: Neil Horman <nhorman@tuxdriver.com> CC: "David S. Miller" <davem@davemloft.net> CC: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r--net/ipv6/addrconf.c4
-rw-r--r--net/ipv6/ndisc.c4
2 files changed, 5 insertions, 3 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 647e6cba237d..3513cceba50a 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -1803,7 +1803,7 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev)
1803 return idev; 1803 return idev;
1804} 1804}
1805 1805
1806void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len) 1806void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao)
1807{ 1807{
1808 struct prefix_info *pinfo; 1808 struct prefix_info *pinfo;
1809 __u32 valid_lft; 1809 __u32 valid_lft;
@@ -1934,7 +1934,7 @@ ok:
1934 1934
1935#ifdef CONFIG_IPV6_OPTIMISTIC_DAD 1935#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
1936 if (in6_dev->cnf.optimistic_dad && 1936 if (in6_dev->cnf.optimistic_dad &&
1937 !net->ipv6.devconf_all->forwarding) 1937 !net->ipv6.devconf_all->forwarding && sllao)
1938 addr_flags = IFA_F_OPTIMISTIC; 1938 addr_flags = IFA_F_OPTIMISTIC;
1939#endif 1939#endif
1940 1940
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 3b1fe4b3f3c6..d8f02ef88e59 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -1368,7 +1368,9 @@ skip_routeinfo:
1368 for (p = ndopts.nd_opts_pi; 1368 for (p = ndopts.nd_opts_pi;
1369 p; 1369 p;
1370 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) { 1370 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1371 addrconf_prefix_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3); 1371 addrconf_prefix_rcv(skb->dev, (u8 *)p,
1372 (p->nd_opt_len) << 3,
1373 ndopts.nd_opts_src_lladdr != NULL);
1372 } 1374 }
1373 } 1375 }
1374 1376