]> www.infradead.org Git - users/hch/misc.git/commitdiff
tunnels: Accept PACKET_HOST in skb_tunnel_check_pmtu().
authorGuillaume Nault <gnault@redhat.com>
Sat, 29 Mar 2025 00:33:44 +0000 (01:33 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 3 Apr 2025 00:22:39 +0000 (17:22 -0700)
Because skb_tunnel_check_pmtu() doesn't handle PACKET_HOST packets,
commit 30a92c9e3d6b ("openvswitch: Set the skbuff pkt_type for proper
pmtud support.") forced skb->pkt_type to PACKET_OUTGOING for
openvswitch packets that are sent using the OVS_ACTION_ATTR_OUTPUT
action. This allowed such packets to invoke the
iptunnel_pmtud_check_icmp() or iptunnel_pmtud_check_icmpv6() helpers
and thus trigger PMTU update on the input device.

However, this also broke other parts of PMTU discovery. Since these
packets don't have the PACKET_HOST type anymore, they won't trigger the
sending of ICMP Fragmentation Needed or Packet Too Big messages to
remote hosts when oversized (see the skb_in->pkt_type condition in
__icmp_send() for example).

These two skb->pkt_type checks are therefore incompatible as one
requires skb->pkt_type to be PACKET_HOST, while the other requires it
to be anything but PACKET_HOST.

It makes sense to not trigger ICMP messages for non-PACKET_HOST packets
as these messages should be generated only for incoming l2-unicast
packets. However there doesn't seem to be any reason for
skb_tunnel_check_pmtu() to ignore PACKET_HOST packets.

Allow both cases to work by allowing skb_tunnel_check_pmtu() to work on
PACKET_HOST packets and not overriding skb->pkt_type in openvswitch
anymore.

Fixes: 30a92c9e3d6b ("openvswitch: Set the skbuff pkt_type for proper pmtud support.")
Fixes: 4cb47a8644cc ("tunnels: PMTU discovery support for directly bridged IP packets")
Signed-off-by: Guillaume Nault <gnault@redhat.com>
Reviewed-by: Stefano Brivio <sbrivio@redhat.com>
Reviewed-by: Aaron Conole <aconole@redhat.com>
Tested-by: Aaron Conole <aconole@redhat.com>
Link: https://patch.msgid.link/eac941652b86fddf8909df9b3bf0d97bc9444793.1743208264.git.gnault@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/ip_tunnel_core.c
net/openvswitch/actions.c

index a3676155be78b9be045abc8075fd2808a2b45790..364ea798511ea5556bafb9fdd341b93ec7fe4714 100644 (file)
@@ -416,7 +416,7 @@ int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst,
 
        skb_dst_update_pmtu_no_confirm(skb, mtu);
 
-       if (!reply || skb->pkt_type == PACKET_HOST)
+       if (!reply)
                return 0;
 
        if (skb->protocol == htons(ETH_P_IP))
index 704c858cf2093b341af8ef4246dcf5682a2b73bd..61fea7baae5d5cda97201d4e810ea181d64e7e50 100644 (file)
@@ -947,12 +947,6 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,
                                pskb_trim(skb, ovs_mac_header_len(key));
                }
 
-               /* Need to set the pkt_type to involve the routing layer.  The
-                * packet movement through the OVS datapath doesn't generally
-                * use routing, but this is needed for tunnel cases.
-                */
-               skb->pkt_type = PACKET_OUTGOING;
-
                if (likely(!mru ||
                           (skb->len <= mru + vport->dev->hard_header_len))) {
                        ovs_vport_send(vport, skb, ovs_key_mac_proto(key));