ipv4: Kill ip_rt_frag_needed().
authorDavid S. Miller <davem@davemloft.net>
Sun, 10 Jun 2012 07:04:12 +0000 (00:04 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Jun 2012 09:08:59 +0000 (02:08 -0700)
There is zero point to this function.

It's only real substance is to perform an extremely outdated BSD4.2
ICMP check, which we can safely remove.  If you really have a MTU
limited link being routed by a BSD4.2 derived system, here's a nickel
go buy yourself a real router.

The other actions of ip_rt_frag_needed(), checking and conditionally
updating the peer, are done by the per-protocol handlers of the ICMP
event.

TCP, UDP, et al. have a handler which will receive this event and
transmit it back into the associated route via dst_ops->update_pmtu().

This simplification is important, because it eliminates the one place
where we do not have a proper route context in which to make an
inetpeer lookup.

Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/route.h
net/ipv4/icmp.c
net/ipv4/route.c
net/rxrpc/ar-error.c

index 6340c37677fcb7beba5e3d3d01a9d9b955fd8004..cc693a5bb20d1a8e48683e3295dc4963f08ba4c5 100644 (file)
@@ -215,8 +215,6 @@ static inline int ip_route_input_noref(struct sk_buff *skb, __be32 dst, __be32 s
        return ip_route_input_common(skb, dst, src, tos, devin, true);
 }
 
-extern unsigned short  ip_rt_frag_needed(struct net *net, const struct iphdr *iph,
-                                         unsigned short new_mtu, struct net_device *dev);
 extern void            ip_rt_send_redirect(struct sk_buff *skb);
 
 extern unsigned int            inet_addr_type(struct net *net, __be32 addr);
index 0c78ef1e5dde947fac653bd7fe57f872d0bffa9b..e1caa1abe5d15355cc8fef33461cbafaabffcfb7 100644 (file)
@@ -673,9 +673,7 @@ static void icmp_unreach(struct sk_buff *skb)
                                LIMIT_NETDEBUG(KERN_INFO pr_fmt("%pI4: fragmentation needed and DF set\n"),
                                               &iph->daddr);
                        } else {
-                               info = ip_rt_frag_needed(net, iph,
-                                                        ntohs(icmph->un.frag.mtu),
-                                                        skb->dev);
+                               info = ntohs(icmph->un.frag.mtu);
                                if (!info)
                                        goto out;
                        }
index 03e5b614370e5f9bbaa3b3d118cad862df9b2ede..4f5834c4a667fbfebe428363dc0a71e904dbc3d8 100644 (file)
@@ -1664,67 +1664,6 @@ out:     kfree_skb(skb);
        return 0;
 }
 
-/*
- *     The last two values are not from the RFC but
- *     are needed for AMPRnet AX.25 paths.
- */
-
-static const unsigned short mtu_plateau[] =
-{32000, 17914, 8166, 4352, 2002, 1492, 576, 296, 216, 128 };
-
-static inline unsigned short guess_mtu(unsigned short old_mtu)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(mtu_plateau); i++)
-               if (old_mtu > mtu_plateau[i])
-                       return mtu_plateau[i];
-       return 68;
-}
-
-unsigned short ip_rt_frag_needed(struct net *net, const struct iphdr *iph,
-                                unsigned short new_mtu,
-                                struct net_device *dev)
-{
-       unsigned short old_mtu = ntohs(iph->tot_len);
-       unsigned short est_mtu = 0;
-       struct inet_peer *peer;
-
-       peer = inet_getpeer_v4(net->ipv4.peers, iph->daddr, 1);
-       if (peer) {
-               unsigned short mtu = new_mtu;
-
-               if (new_mtu < 68 || new_mtu >= old_mtu) {
-                       /* BSD 4.2 derived systems incorrectly adjust
-                        * tot_len by the IP header length, and report
-                        * a zero MTU in the ICMP message.
-                        */
-                       if (mtu == 0 &&
-                           old_mtu >= 68 + (iph->ihl << 2))
-                               old_mtu -= iph->ihl << 2;
-                       mtu = guess_mtu(old_mtu);
-               }
-
-               if (mtu < ip_rt_min_pmtu)
-                       mtu = ip_rt_min_pmtu;
-               if (!peer->pmtu_expires || mtu < peer->pmtu_learned) {
-                       unsigned long pmtu_expires;
-
-                       pmtu_expires = jiffies + ip_rt_mtu_expires;
-                       if (!pmtu_expires)
-                               pmtu_expires = 1UL;
-
-                       est_mtu = mtu;
-                       peer->pmtu_learned = mtu;
-                       peer->pmtu_expires = pmtu_expires;
-                       atomic_inc(&__rt_peer_genid);
-               }
-
-               inet_putpeer(peer);
-       }
-       return est_mtu ? : new_mtu;
-}
-
 static void check_peer_pmtu(struct dst_entry *dst, struct inet_peer *peer)
 {
        unsigned long expires = ACCESS_ONCE(peer->pmtu_expires);
index 5d6b572a67049319af1c8def161911eaf557a142..a9206087b4d7a87ced5cef6c77b69fc2bb86a11c 100644 (file)
@@ -81,10 +81,6 @@ void rxrpc_UDP_error_report(struct sock *sk)
                        _net("I/F MTU %u", mtu);
                }
 
-               /* ip_rt_frag_needed() may have eaten the info */
-               if (mtu == 0)
-                       mtu = ntohs(icmp_hdr(skb)->un.frag.mtu);
-
                if (mtu == 0) {
                        /* they didn't give us a size, estimate one */
                        if (mtu > 1500) {