| From 3dc653aa623e63647035c1683f5ec61816da79ef Mon Sep 17 00:00:00 2001 |
| From: Eric Dumazet <edumazet@google.com> |
| Date: Tue, 14 Jan 2020 13:00:35 -0800 |
| Subject: [PATCH] macvlan: use skb_reset_mac_header() in macvlan_queue_xmit() |
| |
| commit 1712b2fff8c682d145c7889d2290696647d82dab upstream. |
| |
| 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: Eric Dumazet <edumazet@google.com> |
| Reported-by: Jurgen Van Ham <juvanham@gmail.com> |
| Tested-by: Matteo Croce <mcroce@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c |
| index e5ac95dff56d..50f253160d7e 100644 |
| --- a/drivers/net/macvlan.c |
| +++ b/drivers/net/macvlan.c |
| @@ -259,7 +259,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; |
| @@ -513,10 +513,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; |
| } |
| -- |
| 2.7.4 |
| |