diff options
author | David S. Miller <davem@davemloft.net> | 2012-06-10 03:04:12 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-06-11 05:08:59 -0400 |
commit | 46517008e1168dc926cf2c47d529efc07eca85c0 (patch) | |
tree | 98e9cf1917c9b8f1c6c2d8121746fd4f8e414f45 /net/ipv4 | |
parent | 97bab73f987e2781129cd6f4b6379bf44d808cc6 (diff) |
ipv4: Kill ip_rt_frag_needed().
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>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/icmp.c | 4 | ||||
-rw-r--r-- | net/ipv4/route.c | 61 |
2 files changed, 1 insertions, 64 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 0c78ef1e5dde..e1caa1abe5d1 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -673,9 +673,7 @@ static void icmp_unreach(struct sk_buff *skb) | |||
673 | LIMIT_NETDEBUG(KERN_INFO pr_fmt("%pI4: fragmentation needed and DF set\n"), | 673 | LIMIT_NETDEBUG(KERN_INFO pr_fmt("%pI4: fragmentation needed and DF set\n"), |
674 | &iph->daddr); | 674 | &iph->daddr); |
675 | } else { | 675 | } else { |
676 | info = ip_rt_frag_needed(net, iph, | 676 | info = ntohs(icmph->un.frag.mtu); |
677 | ntohs(icmph->un.frag.mtu), | ||
678 | skb->dev); | ||
679 | if (!info) | 677 | if (!info) |
680 | goto out; | 678 | goto out; |
681 | } | 679 | } |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 03e5b614370e..4f5834c4a667 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1664,67 +1664,6 @@ out: kfree_skb(skb); | |||
1664 | return 0; | 1664 | return 0; |
1665 | } | 1665 | } |
1666 | 1666 | ||
1667 | /* | ||
1668 | * The last two values are not from the RFC but | ||
1669 | * are needed for AMPRnet AX.25 paths. | ||
1670 | */ | ||
1671 | |||
1672 | static const unsigned short mtu_plateau[] = | ||
1673 | {32000, 17914, 8166, 4352, 2002, 1492, 576, 296, 216, 128 }; | ||
1674 | |||
1675 | static inline unsigned short guess_mtu(unsigned short old_mtu) | ||
1676 | { | ||
1677 | int i; | ||
1678 | |||
1679 | for (i = 0; i < ARRAY_SIZE(mtu_plateau); i++) | ||
1680 | if (old_mtu > mtu_plateau[i]) | ||
1681 | return mtu_plateau[i]; | ||
1682 | return 68; | ||
1683 | } | ||
1684 | |||
1685 | unsigned short ip_rt_frag_needed(struct net *net, const struct iphdr *iph, | ||
1686 | unsigned short new_mtu, | ||
1687 | struct net_device *dev) | ||
1688 | { | ||
1689 | unsigned short old_mtu = ntohs(iph->tot_len); | ||
1690 | unsigned short est_mtu = 0; | ||
1691 | struct inet_peer *peer; | ||
1692 | |||
1693 | peer = inet_getpeer_v4(net->ipv4.peers, iph->daddr, 1); | ||
1694 | if (peer) { | ||
1695 | unsigned short mtu = new_mtu; | ||
1696 | |||
1697 | if (new_mtu < 68 || new_mtu >= old_mtu) { | ||
1698 | /* BSD 4.2 derived systems incorrectly adjust | ||
1699 | * tot_len by the IP header length, and report | ||
1700 | * a zero MTU in the ICMP message. | ||
1701 | */ | ||
1702 | if (mtu == 0 && | ||
1703 | old_mtu >= 68 + (iph->ihl << 2)) | ||
1704 | old_mtu -= iph->ihl << 2; | ||
1705 | mtu = guess_mtu(old_mtu); | ||
1706 | } | ||
1707 | |||
1708 | if (mtu < ip_rt_min_pmtu) | ||
1709 | mtu = ip_rt_min_pmtu; | ||
1710 | if (!peer->pmtu_expires || mtu < peer->pmtu_learned) { | ||
1711 | unsigned long pmtu_expires; | ||
1712 | |||
1713 | pmtu_expires = jiffies + ip_rt_mtu_expires; | ||
1714 | if (!pmtu_expires) | ||
1715 | pmtu_expires = 1UL; | ||
1716 | |||
1717 | est_mtu = mtu; | ||
1718 | peer->pmtu_learned = mtu; | ||
1719 | peer->pmtu_expires = pmtu_expires; | ||
1720 | atomic_inc(&__rt_peer_genid); | ||
1721 | } | ||
1722 | |||
1723 | inet_putpeer(peer); | ||
1724 | } | ||
1725 | return est_mtu ? : new_mtu; | ||
1726 | } | ||
1727 | |||
1728 | static void check_peer_pmtu(struct dst_entry *dst, struct inet_peer *peer) | 1667 | static void check_peer_pmtu(struct dst_entry *dst, struct inet_peer *peer) |
1729 | { | 1668 | { |
1730 | unsigned long expires = ACCESS_ONCE(peer->pmtu_expires); | 1669 | unsigned long expires = ACCESS_ONCE(peer->pmtu_expires); |