diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-06-25 06:32:01 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-06-25 06:32:01 -0400 |
| commit | da7878d75b8520c9ae00d27dfbbce546a7bfdfbb (patch) | |
| tree | 547fd497a80818a60ac36831377d5df97868173c /net/ipv6/route.c | |
| parent | 0e50a4c6ab94ffe7e5515b86b5df9e5abc8c6b13 (diff) | |
| parent | 543cf4cb3fe6f6cae3651ba918b9c56200b257d0 (diff) | |
Merge branch 'linus' into x86/pebs
Diffstat (limited to 'net/ipv6/route.c')
| -rw-r--r-- | net/ipv6/route.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 12bba0880345..d1f3e19b06c7 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -109,7 +109,7 @@ static struct dst_ops ip6_dst_ops_template = { | |||
| 109 | .negative_advice = ip6_negative_advice, | 109 | .negative_advice = ip6_negative_advice, |
| 110 | .link_failure = ip6_link_failure, | 110 | .link_failure = ip6_link_failure, |
| 111 | .update_pmtu = ip6_rt_update_pmtu, | 111 | .update_pmtu = ip6_rt_update_pmtu, |
| 112 | .local_out = ip6_local_out, | 112 | .local_out = __ip6_local_out, |
| 113 | .entry_size = sizeof(struct rt6_info), | 113 | .entry_size = sizeof(struct rt6_info), |
| 114 | .entries = ATOMIC_INIT(0), | 114 | .entries = ATOMIC_INIT(0), |
| 115 | }; | 115 | }; |
| @@ -446,7 +446,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len, | |||
| 446 | struct route_info *rinfo = (struct route_info *) opt; | 446 | struct route_info *rinfo = (struct route_info *) opt; |
| 447 | struct in6_addr prefix_buf, *prefix; | 447 | struct in6_addr prefix_buf, *prefix; |
| 448 | unsigned int pref; | 448 | unsigned int pref; |
| 449 | u32 lifetime; | 449 | unsigned long lifetime; |
| 450 | struct rt6_info *rt; | 450 | struct rt6_info *rt; |
| 451 | 451 | ||
| 452 | if (len < sizeof(struct route_info)) { | 452 | if (len < sizeof(struct route_info)) { |
| @@ -472,13 +472,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len, | |||
| 472 | if (pref == ICMPV6_ROUTER_PREF_INVALID) | 472 | if (pref == ICMPV6_ROUTER_PREF_INVALID) |
| 473 | pref = ICMPV6_ROUTER_PREF_MEDIUM; | 473 | pref = ICMPV6_ROUTER_PREF_MEDIUM; |
| 474 | 474 | ||
| 475 | lifetime = ntohl(rinfo->lifetime); | 475 | lifetime = addrconf_timeout_fixup(ntohl(rinfo->lifetime), HZ); |
| 476 | if (lifetime == 0xffffffff) { | ||
| 477 | /* infinity */ | ||
| 478 | } else if (lifetime > 0x7fffffff/HZ) { | ||
| 479 | /* Avoid arithmetic overflow */ | ||
| 480 | lifetime = 0x7fffffff/HZ - 1; | ||
| 481 | } | ||
| 482 | 476 | ||
| 483 | if (rinfo->length == 3) | 477 | if (rinfo->length == 3) |
| 484 | prefix = (struct in6_addr *)rinfo->prefix; | 478 | prefix = (struct in6_addr *)rinfo->prefix; |
| @@ -506,7 +500,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len, | |||
| 506 | (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); | 500 | (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); |
| 507 | 501 | ||
| 508 | if (rt) { | 502 | if (rt) { |
| 509 | if (lifetime == 0xffffffff) { | 503 | if (!addrconf_finite_timeout(lifetime)) { |
| 510 | rt->rt6i_flags &= ~RTF_EXPIRES; | 504 | rt->rt6i_flags &= ~RTF_EXPIRES; |
| 511 | } else { | 505 | } else { |
| 512 | rt->rt6i_expires = jiffies + HZ * lifetime; | 506 | rt->rt6i_expires = jiffies + HZ * lifetime; |
| @@ -1106,7 +1100,9 @@ int ip6_route_add(struct fib6_config *cfg) | |||
| 1106 | } | 1100 | } |
| 1107 | 1101 | ||
| 1108 | rt->u.dst.obsolete = -1; | 1102 | rt->u.dst.obsolete = -1; |
| 1109 | rt->rt6i_expires = jiffies + clock_t_to_jiffies(cfg->fc_expires); | 1103 | rt->rt6i_expires = (cfg->fc_flags & RTF_EXPIRES) ? |
| 1104 | jiffies + clock_t_to_jiffies(cfg->fc_expires) : | ||
| 1105 | 0; | ||
| 1110 | 1106 | ||
| 1111 | if (cfg->fc_protocol == RTPROT_UNSPEC) | 1107 | if (cfg->fc_protocol == RTPROT_UNSPEC) |
| 1112 | cfg->fc_protocol = RTPROT_BOOT; | 1108 | cfg->fc_protocol = RTPROT_BOOT; |
| @@ -2200,7 +2196,13 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt, | |||
| 2200 | 2196 | ||
| 2201 | NLA_PUT_U32(skb, RTA_PRIORITY, rt->rt6i_metric); | 2197 | NLA_PUT_U32(skb, RTA_PRIORITY, rt->rt6i_metric); |
| 2202 | 2198 | ||
| 2203 | expires = rt->rt6i_expires ? rt->rt6i_expires - jiffies : 0; | 2199 | if (!(rt->rt6i_flags & RTF_EXPIRES)) |
| 2200 | expires = 0; | ||
| 2201 | else if (rt->rt6i_expires - jiffies < INT_MAX) | ||
| 2202 | expires = rt->rt6i_expires - jiffies; | ||
| 2203 | else | ||
| 2204 | expires = INT_MAX; | ||
| 2205 | |||
| 2204 | if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0, | 2206 | if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0, |
| 2205 | expires, rt->u.dst.error) < 0) | 2207 | expires, rt->u.dst.error) < 0) |
| 2206 | goto nla_put_failure; | 2208 | goto nla_put_failure; |
