diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/route.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index a770df2493d2..32d396196df8 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1441,7 +1441,7 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw, | |||
1441 | dev_hold(rt->u.dst.dev); | 1441 | dev_hold(rt->u.dst.dev); |
1442 | if (rt->idev) | 1442 | if (rt->idev) |
1443 | in_dev_hold(rt->idev); | 1443 | in_dev_hold(rt->idev); |
1444 | rt->u.dst.obsolete = 0; | 1444 | rt->u.dst.obsolete = -1; |
1445 | rt->u.dst.lastuse = jiffies; | 1445 | rt->u.dst.lastuse = jiffies; |
1446 | rt->u.dst.path = &rt->u.dst; | 1446 | rt->u.dst.path = &rt->u.dst; |
1447 | rt->u.dst.neighbour = NULL; | 1447 | rt->u.dst.neighbour = NULL; |
@@ -1506,7 +1506,7 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) | |||
1506 | struct dst_entry *ret = dst; | 1506 | struct dst_entry *ret = dst; |
1507 | 1507 | ||
1508 | if (rt) { | 1508 | if (rt) { |
1509 | if (dst->obsolete) { | 1509 | if (dst->obsolete > 0) { |
1510 | ip_rt_put(rt); | 1510 | ip_rt_put(rt); |
1511 | ret = NULL; | 1511 | ret = NULL; |
1512 | } else if ((rt->rt_flags & RTCF_REDIRECTED) || | 1512 | } else if ((rt->rt_flags & RTCF_REDIRECTED) || |
@@ -1726,7 +1726,9 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu) | |||
1726 | 1726 | ||
1727 | static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) | 1727 | static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) |
1728 | { | 1728 | { |
1729 | return NULL; | 1729 | if (rt_is_expired((struct rtable *)dst)) |
1730 | return NULL; | ||
1731 | return dst; | ||
1730 | } | 1732 | } |
1731 | 1733 | ||
1732 | static void ipv4_dst_destroy(struct dst_entry *dst) | 1734 | static void ipv4_dst_destroy(struct dst_entry *dst) |
@@ -1888,7 +1890,8 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
1888 | if (!rth) | 1890 | if (!rth) |
1889 | goto e_nobufs; | 1891 | goto e_nobufs; |
1890 | 1892 | ||
1891 | rth->u.dst.output= ip_rt_bug; | 1893 | rth->u.dst.output = ip_rt_bug; |
1894 | rth->u.dst.obsolete = -1; | ||
1892 | 1895 | ||
1893 | atomic_set(&rth->u.dst.__refcnt, 1); | 1896 | atomic_set(&rth->u.dst.__refcnt, 1); |
1894 | rth->u.dst.flags= DST_HOST; | 1897 | rth->u.dst.flags= DST_HOST; |
@@ -2054,6 +2057,7 @@ static int __mkroute_input(struct sk_buff *skb, | |||
2054 | rth->fl.oif = 0; | 2057 | rth->fl.oif = 0; |
2055 | rth->rt_spec_dst= spec_dst; | 2058 | rth->rt_spec_dst= spec_dst; |
2056 | 2059 | ||
2060 | rth->u.dst.obsolete = -1; | ||
2057 | rth->u.dst.input = ip_forward; | 2061 | rth->u.dst.input = ip_forward; |
2058 | rth->u.dst.output = ip_output; | 2062 | rth->u.dst.output = ip_output; |
2059 | rth->rt_genid = rt_genid(dev_net(rth->u.dst.dev)); | 2063 | rth->rt_genid = rt_genid(dev_net(rth->u.dst.dev)); |
@@ -2218,6 +2222,7 @@ local_input: | |||
2218 | goto e_nobufs; | 2222 | goto e_nobufs; |
2219 | 2223 | ||
2220 | rth->u.dst.output= ip_rt_bug; | 2224 | rth->u.dst.output= ip_rt_bug; |
2225 | rth->u.dst.obsolete = -1; | ||
2221 | rth->rt_genid = rt_genid(net); | 2226 | rth->rt_genid = rt_genid(net); |
2222 | 2227 | ||
2223 | atomic_set(&rth->u.dst.__refcnt, 1); | 2228 | atomic_set(&rth->u.dst.__refcnt, 1); |
@@ -2444,6 +2449,7 @@ static int __mkroute_output(struct rtable **result, | |||
2444 | rth->rt_spec_dst= fl->fl4_src; | 2449 | rth->rt_spec_dst= fl->fl4_src; |
2445 | 2450 | ||
2446 | rth->u.dst.output=ip_output; | 2451 | rth->u.dst.output=ip_output; |
2452 | rth->u.dst.obsolete = -1; | ||
2447 | rth->rt_genid = rt_genid(dev_net(dev_out)); | 2453 | rth->rt_genid = rt_genid(dev_net(dev_out)); |
2448 | 2454 | ||
2449 | RT_CACHE_STAT_INC(out_slow_tot); | 2455 | RT_CACHE_STAT_INC(out_slow_tot); |