| From foo@baz Fri Apr 11 08:46:36 PDT 2014 |
| From: Heiner Kallweit <heiner.kallweit@web.de> |
| Date: Wed, 12 Mar 2014 22:13:19 +0100 |
| Subject: ipv6: Avoid unnecessary temporary addresses being generated |
| |
| From: Heiner Kallweit <heiner.kallweit@web.de> |
| |
| [ 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv6/addrconf.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/net/ipv6/addrconf.c |
| +++ b/net/ipv6/addrconf.c |
| @@ -1111,8 +1111,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; |