Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bde75682 authored by Eric Dumazet's avatar Eric Dumazet Committed by Greg Kroah-Hartman
Browse files

macvlan: use skb_reset_mac_header() in macvlan_queue_xmit()



[ Upstream commit 1712b2fff8c682d145c7889d2290696647d82dab ]

I missed the fact that macvlan_broadcast() can be used both
in RX and TX.

skb_eth_hdr() makes only sense in TX paths, so we can not
use it blindly in macvlan_broadcast()

Fixes: 96cc4b69581d ("macvlan: do not assume mac_header is set in macvlan_broadcast()")
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reported-by: default avatarJurgen Van Ham <juvanham@gmail.com>
Tested-by: default avatarMatteo Croce <mcroce@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 717e9a52
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -234,7 +234,7 @@ static void macvlan_broadcast(struct sk_buff *skb,
			      struct net_device *src,
			      enum macvlan_mode mode)
{
	const struct ethhdr *eth = skb_eth_hdr(skb);
	const struct ethhdr *eth = eth_hdr(skb);
	const struct macvlan_dev *vlan;
	struct sk_buff *nskb;
	unsigned int i;
@@ -487,10 +487,11 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
	const struct macvlan_dev *dest;

	if (vlan->mode == MACVLAN_MODE_BRIDGE) {
		const struct ethhdr *eth = (void *)skb->data;
		const struct ethhdr *eth = skb_eth_hdr(skb);

		/* send to other bridge ports directly */
		if (is_multicast_ether_addr(eth->h_dest)) {
			skb_reset_mac_header(skb);
			macvlan_broadcast(skb, port, dev, MACVLAN_MODE_BRIDGE);
			goto xmit_world;
		}