On 10/24/2020 5:12 AM, Jakub Kicinski wrote: > On Wed, 21 Oct 2020 17:21:55 +0800 we...@ucloud.cn wrote: >> From: wenxu <we...@ucloud.cn> >> >> The TUNNEL_DONT_FRAGMENT flags specific the tunnel outer ip can do >> fragment or not in the md mode. Without the TUNNEL_DONT_FRAGMENT >> should always do fragment. So it should not care the frag_off in >> inner ip. > Can you describe the use case better? My understanding is that we > should propagate DF in normally functioning networks, and let PMTU > do its job.
Sorry for relying so late. ip_md_tunnel_xmit send packet in the collect_md mode. For OpenVswitch example, ovs set the gre port with flags df_default=false which will not set TUNNEL_DONT_FRAGMENT for tun_flags. And the mtu of virtual machine is 1500 with default. And the tunnel underlay device mtu is 1500 default too. So if the size of packet send from vm + underlay length > underlay device mtu. The packet always be dropped if the ip header of packet set flags with DF. In the collect_md the outer packet can fragment or not should depends on the tun_flags but not inner ip header like vxlan device did. >> Fixes: cfc7381b3002 ("ip_tunnel: add collect_md mode to IPIP tunnel") >> Signed-off-by: wenxu <we...@ucloud.cn> >> --- >> net/ipv4/ip_tunnel.c | 3 --- >> 1 file changed, 3 deletions(-) >> >> diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c >> index 8b04d1d..ee65c92 100644 >> --- a/net/ipv4/ip_tunnel.c >> +++ b/net/ipv4/ip_tunnel.c >> @@ -608,9 +608,6 @@ void ip_md_tunnel_xmit(struct sk_buff *skb, struct >> net_device *dev, >> ttl = ip4_dst_hoplimit(&rt->dst); >> } >> >> - if (!df && skb->protocol == htons(ETH_P_IP)) >> - df = inner_iph->frag_off & htons(IP_DF); >> - >> headroom += LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len; >> if (headroom > dev->needed_headroom) >> dev->needed_headroom = headroom; >