Message ID | eac941652b86fddf8909df9b3bf0d97bc9444793.1743208264.git.gnault@redhat.com (mailing list archive) |
---|---|
State | New |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] tunnels: Accept PACKET_HOST in skb_tunnel_check_pmtu(). | expand |
On Sat, 29 Mar 2025 01:33:44 +0100 Guillaume Nault <gnault@redhat.com> wrote: > 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. No valid reason, right. That (bogus) check just came from the specific functionality I meant to implement back then: PMTU discovery for paths where we forward packets (PACKET_OTHERHOST or PACKET_OUTGOING). But we should handle packets that are (in some sense) going to us (PACKET_HOST) in the same way. > 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> Thanks for fixing this!
Guillaume Nault <gnault@redhat.com> writes: > 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> > --- Thanks, Guillaume. Reviewed-by: Aaron Conole <aconole@redhat.com> I did manage to test this with two hosts over the weekend, and it appears to work for at least one forwarding case that I encountered. Tested-by: Aaron Conole <aconole@redhat.com>
diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c index a3676155be78..364ea798511e 100644 --- a/net/ipv4/ip_tunnel_core.c +++ b/net/ipv4/ip_tunnel_core.c @@ -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)) diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c index 704c858cf209..61fea7baae5d 100644 --- a/net/openvswitch/actions.c +++ b/net/openvswitch/actions.c @@ -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));
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> --- net/ipv4/ip_tunnel_core.c | 2 +- net/openvswitch/actions.c | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-)