diff options
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r-- | net/ipv6/addrconf.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index ad235690684c..344e972426df 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -1103,8 +1103,11 @@ retry: | |||
1103 | * Lifetime is greater than REGEN_ADVANCE time units. In particular, | 1103 | * Lifetime is greater than REGEN_ADVANCE time units. In particular, |
1104 | * an implementation must not create a temporary address with a zero | 1104 | * an implementation must not create a temporary address with a zero |
1105 | * Preferred Lifetime. | 1105 | * Preferred Lifetime. |
1106 | * Use age calculation as in addrconf_verify to avoid unnecessary | ||
1107 | * temporary addresses being generated. | ||
1106 | */ | 1108 | */ |
1107 | if (tmp_prefered_lft <= regen_advance) { | 1109 | age = (now - tmp_tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ; |
1110 | if (tmp_prefered_lft <= regen_advance + age) { | ||
1108 | in6_ifa_put(ifp); | 1111 | in6_ifa_put(ifp); |
1109 | in6_dev_put(idev); | 1112 | in6_dev_put(idev); |
1110 | ret = -1; | 1113 | ret = -1; |
@@ -2783,6 +2786,8 @@ static void addrconf_gre_config(struct net_device *dev) | |||
2783 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); | 2786 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); |
2784 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) | 2787 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) |
2785 | addrconf_add_linklocal(idev, &addr); | 2788 | addrconf_add_linklocal(idev, &addr); |
2789 | else | ||
2790 | addrconf_prefix_route(&addr, 64, dev, 0, 0); | ||
2786 | } | 2791 | } |
2787 | #endif | 2792 | #endif |
2788 | 2793 | ||