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 | ||
