Message ID | 20200114210035.65042-1-edumazet@google.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net] macvlan: use skb_reset_mac_header() in macvlan_queue_xmit() | expand |
On Tue, Jan 14, 2020 at 10:01 PM Eric Dumazet <edumazet@google.com> wrote: > > 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>
From: Eric Dumazet <edumazet@google.com> Date: Tue, 14 Jan 2020 13:00:35 -0800 > 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> Applied and queued up for -stable, thanks Eric.
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 747c0542a53c763676d491c91a5b704f0eb9848e..c5bf61565726b15aa1ea63590d7d8627b0c20d4a 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; }
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> --- drivers/net/macvlan.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)