net: ipv4: Consolidate ipv4_mtu and ip_dst_mtu_maybe_forward
authorVadim Fedorenko <vfedorenko@novek.ru>
Tue, 20 Jul 2021 20:06:28 +0000 (23:06 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 21 Jul 2021 15:22:03 +0000 (08:22 -0700)
Consolidate IPv4 MTU code the same way it is done in IPv6 to have code
aligned in both address families

Signed-off-by: Vadim Fedorenko <vfedorenko@novek.ru>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip.h
net/ipv4/route.c

index d9683be..9192444 100644 (file)
@@ -436,18 +436,32 @@ static inline bool ip_sk_ignore_df(const struct sock *sk)
 static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,
                                                    bool forwarding)
 {
+       const struct rtable *rt = container_of(dst, struct rtable, dst);
        struct net *net = dev_net(dst->dev);
        unsigned int mtu;
 
        if (net->ipv4.sysctl_ip_fwd_use_pmtu ||
            ip_mtu_locked(dst) ||
-           !forwarding)
-               return dst_mtu(dst);
+           !forwarding) {
+               mtu = rt->rt_pmtu;
+               if (mtu && time_before(jiffies, rt->dst.expires))
+                       goto out;
+       }
 
        /* 'forwarding = true' case should always honour route mtu */
        mtu = dst_metric_raw(dst, RTAX_MTU);
-       if (!mtu)
-               mtu = min(READ_ONCE(dst->dev->mtu), IP_MAX_MTU);
+       if (mtu)
+               goto out;
+
+       mtu = READ_ONCE(dst->dev->mtu);
+
+       if (unlikely(ip_mtu_locked(dst))) {
+               if (rt->rt_uses_gateway && mtu > 576)
+                       mtu = 576;
+       }
+
+out:
+       mtu = min_t(unsigned int, mtu, IP_MAX_MTU);
 
        return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
 }
index 99c0694..04754d5 100644 (file)
@@ -1299,26 +1299,7 @@ static unsigned int ipv4_default_advmss(const struct dst_entry *dst)
 
 INDIRECT_CALLABLE_SCOPE unsigned int ipv4_mtu(const struct dst_entry *dst)
 {
-       const struct rtable *rt = (const struct rtable *)dst;
-       unsigned int mtu = rt->rt_pmtu;
-
-       if (!mtu || time_after_eq(jiffies, rt->dst.expires))
-               mtu = dst_metric_raw(dst, RTAX_MTU);
-
-       if (mtu)
-               goto out;
-
-       mtu = READ_ONCE(dst->dev->mtu);
-
-       if (unlikely(ip_mtu_locked(dst))) {
-               if (rt->rt_uses_gateway && mtu > 576)
-                       mtu = 576;
-       }
-
-out:
-       mtu = min_t(unsigned int, mtu, IP_MAX_MTU);
-
-       return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
+       return ip_dst_mtu_maybe_forward(dst, false);
 }
 EXPORT_INDIRECT_CALLABLE(ipv4_mtu);