diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 2cbae0f9ae1f..6f61e31f51f3 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c @@ -26,7 +26,11 @@ static int br_netif_receive_skb(struct net *net, struct sock *sk, struct sk_buff *skb) { + struct net_device *brdev = BR_INPUT_SKB_CB(skb)->brdev; + + skb->dev = brdev; br_drop_fake_rtable(skb); + return netif_receive_skb(skb); } @@ -57,7 +61,6 @@ static int br_pass_frame_up(struct sk_buff *skb, bool promisc) } indev = skb->dev; - skb->dev = brdev; skb = br_handle_vlan(br, NULL, vg, skb); if (!skb) return NET_RX_DROP; diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c index 84a180927eb7..ab1e180b5049 100644 --- a/net/bridge/br_vlan.c +++ b/net/bridge/br_vlan.c @@ -482,6 +482,7 @@ struct sk_buff *br_handle_vlan(struct net_bridge *br, struct net_bridge_vlan_group *vg, struct sk_buff *skb) { + struct net_device *brdev = BR_INPUT_SKB_CB(skb)->brdev; struct pcpu_sw_netstats *stats; struct net_bridge_vlan *v; u16 vid; @@ -502,7 +503,7 @@ struct sk_buff *br_handle_vlan(struct net_bridge *br, * pass the packet as is. */ if (!v || !br_vlan_should_use(v)) { - if ((br->dev->flags & IFF_PROMISC) && skb->dev == br->dev) { + if ((br->dev->flags & IFF_PROMISC) && brdev == br->dev) { goto out; } else { kfree_skb(skb);