]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bareudp: allow redirecting bareudp packets to eth devices
authorGuillaume Nault <gnault@redhat.com>
Fri, 25 Jun 2021 13:33:01 +0000 (15:33 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Oct 2024 13:07:41 +0000 (15:07 +0200)
[ Upstream commit 99c8719b79814cab3fd43519591dcc41c978a48c ]

Even though bareudp transports L3 data (typically IP or MPLS), it needs
to reset the mac_header pointer, so that other parts of the stack don't
mistakenly access the outer header after the packet has been
decapsulated.

This allows to push an Ethernet header to bareudp packets and redirect
them to an Ethernet device:

  $ tc filter add dev bareudp0 ingress matchall      \
      action vlan push_eth dst_mac 00:00:5e:00:53:01 \
                           src_mac 00:00:5e:00:53:00 \
      action mirred egress redirect dev eth0

Without this patch, push_eth refuses to add an ethernet header because
the skb appears to already have a MAC header.

Signed-off-by: Guillaume Nault <gnault@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Stable-dep-of: 45fa29c85117 ("bareudp: Pull inner IP header in bareudp_udp_encap_recv().")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/bareudp.c

index d9917120b8facdd8ae41894606fc293f08f08c61..1b774232b0df0175a9e58622ee1cfef4d5d65ba5 100644 (file)
@@ -139,6 +139,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
        skb->dev = bareudp->dev;
        oiph = skb_network_header(skb);
        skb_reset_network_header(skb);
+       skb_reset_mac_header(skb);
 
        if (!ipv6_mod_enabled() || family == AF_INET)
                err = IP_ECN_decapsulate(oiph, skb);