提交 d851c12b 编写于 作者: S Steffen Klassert 提交者: David S. Miller

ipv4: Always invalidate or update the route on pmtu events

Some protocols, like IPsec still cache routes. So we need to invalidate
the old route on pmtu events to avoid the reuse of stale routes.
We also need to update the mtu and expire time of the route if we already
use a nh exception route, otherwise we ignore newly learned pmtu values
after the first expiration.

With this patch we always invalidate or update the route on pmtu events.
Signed-off-by: NSteffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 594f88e9
...@@ -904,22 +904,29 @@ out: kfree_skb(skb); ...@@ -904,22 +904,29 @@ out: kfree_skb(skb);
return 0; return 0;
} }
static u32 __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu) static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
{ {
struct dst_entry *dst = &rt->dst;
struct fib_result res; struct fib_result res;
if (mtu < ip_rt_min_pmtu) if (mtu < ip_rt_min_pmtu)
mtu = ip_rt_min_pmtu; mtu = ip_rt_min_pmtu;
if (!rt->rt_pmtu) {
dst->obsolete = DST_OBSOLETE_KILL;
} else {
rt->rt_pmtu = mtu;
dst->expires = max(1UL, jiffies + ip_rt_mtu_expires);
}
rcu_read_lock(); rcu_read_lock();
if (fib_lookup(dev_net(rt->dst.dev), fl4, &res) == 0) { if (fib_lookup(dev_net(dst->dev), fl4, &res) == 0) {
struct fib_nh *nh = &FIB_RES_NH(res); struct fib_nh *nh = &FIB_RES_NH(res);
update_or_create_fnhe(nh, fl4->daddr, 0, mtu, update_or_create_fnhe(nh, fl4->daddr, 0, mtu,
jiffies + ip_rt_mtu_expires); jiffies + ip_rt_mtu_expires);
} }
rcu_read_unlock(); rcu_read_unlock();
return mtu;
} }
static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
...@@ -929,14 +936,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, ...@@ -929,14 +936,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
struct flowi4 fl4; struct flowi4 fl4;
ip_rt_build_flow_key(&fl4, sk, skb); ip_rt_build_flow_key(&fl4, sk, skb);
mtu = __ip_rt_update_pmtu(rt, &fl4, mtu); __ip_rt_update_pmtu(rt, &fl4, mtu);
if (!rt->rt_pmtu) {
dst->obsolete = DST_OBSOLETE_KILL;
} else {
rt->rt_pmtu = mtu;
rt->dst.expires = max(1UL, jiffies + ip_rt_mtu_expires);
}
} }
void ipv4_update_pmtu(struct sk_buff *skb, struct net *net, u32 mtu, void ipv4_update_pmtu(struct sk_buff *skb, struct net *net, u32 mtu,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册