Merge git://github.com/Paragon-Software-Group/linux-ntfs3
[linux-2.6-microblaze.git] / include / net / ip.h
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);
 }