aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
authorHeiner Kallweit <heiner.kallweit@web.de>2014-03-12 22:13:19 +0100
committerBen Hutchings <ben@decadent.org.uk>2014-04-30 16:23:17 +0100
commit49ff127930d7c4a3e4b3f163af77e8ad0cda63b0 (patch)
tree99d963eda5b5b1479dfb369cfe72fbb79c3e8864 /net/ipv6
parentd46880faad42eea3c68a525fec579bcf104d2f55 (diff)
downloadkernel_samsung_smdk4412-49ff127930d7c4a3e4b3f163af77e8ad0cda63b0.zip
kernel_samsung_smdk4412-49ff127930d7c4a3e4b3f163af77e8ad0cda63b0.tar.gz
kernel_samsung_smdk4412-49ff127930d7c4a3e4b3f163af77e8ad0cda63b0.tar.bz2
ipv6: Avoid unnecessary temporary addresses being generated
[ Upstream commit ecab67015ef6e3f3635551dcc9971cf363cc1cd5 ] tmp_prefered_lft is an offset to ifp->tstamp, not now. Therefore age needs to be added to the condition. Age calculation in ipv6_create_tempaddr is different from the one in addrconf_verify and doesn't consider ADDRCONF_TIMER_FUZZ_MINUS. This can cause age in ipv6_create_tempaddr to be less than the one in addrconf_verify and therefore unnecessary temporary address to be generated. Use age calculation as in addrconf_modify to avoid this. Signed-off-by: Heiner Kallweit <heiner.kallweit@web.de> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'net/ipv6')
-rw-r--r--net/ipv6/addrconf.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 5d41293..b9edff0 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -900,8 +900,11 @@ retry:
* Lifetime is greater than REGEN_ADVANCE time units. In particular,
* an implementation must not create a temporary address with a zero
* Preferred Lifetime.
+ * Use age calculation as in addrconf_verify to avoid unnecessary
+ * temporary addresses being generated.
*/
- if (tmp_prefered_lft <= regen_advance) {
+ age = (now - tmp_tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
+ if (tmp_prefered_lft <= regen_advance + age) {
in6_ifa_put(ifp);
in6_dev_put(idev);
ret = -1;