diff options
author | Hannes Frederic Sowa <hannes@stressinduktion.org> | 2013-06-23 18:39:01 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-06-25 16:23:03 -0700 |
commit | b7b1bfce0bb68bd8f6e62a28295922785cc63781 (patch) | |
tree | 212102b875b453496d86f8c448892bd90eb58c92 /include | |
parent | 51151a16a60f0a886a0b1e4a0697001198af50c4 (diff) | |
download | linux-b7b1bfce0bb68bd8f6e62a28295922785cc63781.tar.gz linux-b7b1bfce0bb68bd8f6e62a28295922785cc63781.tar.bz2 linux-b7b1bfce0bb68bd8f6e62a28295922785cc63781.zip |
ipv6: split duplicate address detection and router solicitation timer
This patch splits the timers for duplicate address detection and router
solicitations apart. The router solicitations timer goes into inet6_dev
and the dad timer stays in inet6_ifaddr.
The reason behind this patch is to reduce the number of unneeded router
solicitations send out by the host if additional link-local addresses
are created. Currently we send out RS for every link-local address on
an interface.
If the RS timer fires we pick a source address with ipv6_get_lladdr. This
change could hurt people adding additional link-local addresses and
specifying these addresses in the radvd clients section because we
no longer guarantee that we use every ll address as source address in
router solicitations.
Cc: Flavio Leitner <fleitner@redhat.com>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: David Stevens <dlstevens@us.ibm.com>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Reviewed-by: Flavio Leitner <fbl@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/net/if_inet6.h | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/include/net/if_inet6.h b/include/net/if_inet6.h index e07feb456d19..e4c5a2d2ba34 100644 --- a/include/net/if_inet6.h +++ b/include/net/if_inet6.h @@ -50,7 +50,7 @@ struct inet6_ifaddr { int state; - __u8 probes; + __u8 dad_probes; __u8 flags; __u16 scope; @@ -58,7 +58,7 @@ struct inet6_ifaddr { unsigned long cstamp; /* created timestamp */ unsigned long tstamp; /* updated timestamp */ - struct timer_list timer; + struct timer_list dad_timer; struct inet6_dev *idev; struct rt6_info *rt; @@ -195,6 +195,10 @@ struct inet6_dev { struct neigh_parms *nd_parms; struct ipv6_devconf cnf; struct ipv6_devstat stats; + + struct timer_list rs_timer; + __u8 rs_probes; + unsigned long tstamp; /* ipv6InterfaceTable update timestamp */ struct rcu_head rcu; }; |