mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-22 17:01:14 +00:00
net: ipv4: don't let PMTU updates increase route MTU
[ Upstream commit28d35bcdd3
] When an MTU update with PMTU smaller than net.ipv4.route.min_pmtu is received, we must clamp its value. However, we can receive a PMTU exception with PMTU < old_mtu < ip_rt_min_pmtu, which would lead to an increase in PMTU. To fix this, take the smallest of the old MTU and ip_rt_min_pmtu. Before this patch, in case of an update, the exception's MTU would always change. Now, an exception can have only its lock flag updated, but not the MTU, so we need to add a check on locking to the following "is this exception getting updated, or close to expiring?" test. Fixes:d52e5a7e7c
("ipv4: lock mtu in fnhe when received PMTU < net.ipv4.route.min_pmtu") Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> Reviewed-by: Stefano Brivio <sbrivio@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
4ba7450cf4
commit
956b657b57
1 changed files with 4 additions and 3 deletions
|
@ -1014,21 +1014,22 @@ out: kfree_skb(skb);
|
|||
static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
|
||||
{
|
||||
struct dst_entry *dst = &rt->dst;
|
||||
u32 old_mtu = ipv4_mtu(dst);
|
||||
struct fib_result res;
|
||||
bool lock = false;
|
||||
|
||||
if (ip_mtu_locked(dst))
|
||||
return;
|
||||
|
||||
if (ipv4_mtu(dst) < mtu)
|
||||
if (old_mtu < mtu)
|
||||
return;
|
||||
|
||||
if (mtu < ip_rt_min_pmtu) {
|
||||
lock = true;
|
||||
mtu = ip_rt_min_pmtu;
|
||||
mtu = min(old_mtu, ip_rt_min_pmtu);
|
||||
}
|
||||
|
||||
if (rt->rt_pmtu == mtu &&
|
||||
if (rt->rt_pmtu == mtu && !lock &&
|
||||
time_before(jiffies, dst->expires - ip_rt_mtu_expires / 2))
|
||||
return;
|
||||
|
||||
|
|
Loading…
Reference in a new issue