Re: [PATCH 2/5] ipv4: Kill ip_rt_frag_needed().
From: David Miller <davem@davemloft.net>
Date: 2012-06-14 05:59:42
From: David Miller <davem@davemloft.net> Date: Wed, 13 Jun 2012 22:42:03 -0700 (PDT)
From: Steffen Klassert <steffen.klassert@secunet.com> Date: Thu, 14 Jun 2012 07:35:29 +0200quoted
With your patch applied, we stop setting the DF bit after we received a 'need to frag' ICMP message, but we don't fragment. We send the packets out unfragmented. Before we removed ip_rt_frag_needed(), we did the fragmentation according to the pmtu informations we got from the icmp message. Now the router with the low mtu has to do the fragmentation.Ok, then if we want to do the fragmentation locally then we have to consider my initial patch which updates the PMTU in raw_err(). Did you test that? I mean specifically, this patch: http://marc.info/?l=linux-netdev&m=133945597319917&w=2 If it works for you, I will try to extend it to the other datagram cases.
Actually, thinking some more, we could extend my inet->pmtudisc patch to achieve a similar effect. Essentially we'd have a socket local PMTU value for datagram sockets. Would you be OK with that approach? I like the inet->pmtudisc way of solving this problem, because it: 1) Requires no special code to "remember" the flow used for the last socket sendmsg() call. 2) In the events of a malicious attempt to poison the routing cache PMTU information, only one socket will be harmed, rather than the whole system. I tried to look for inspiration in other systems, but all of them lack source based routing and other things we support, so they just use a purely destination address based cache for PMTU information. Other systems also don't have to deal with SO_BINDTODEVICE which influences the route. So we absolutely have to make our PMTU operations with the full context used to emit the packet.