diff options
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 14a85682af38..2b3bf53bc687 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2810,13 +2810,24 @@ static int __netif_receive_skb(struct sk_buff *skb) | |||
2810 | if (!skb->skb_iif) | 2810 | if (!skb->skb_iif) |
2811 | skb->skb_iif = skb->dev->ifindex; | 2811 | skb->skb_iif = skb->dev->ifindex; |
2812 | 2812 | ||
2813 | /* | ||
2814 | * bonding note: skbs received on inactive slaves should only | ||
2815 | * be delivered to pkt handlers that are exact matches. Also | ||
2816 | * the deliver_no_wcard flag will be set. If packet handlers | ||
2817 | * are sensitive to duplicate packets these skbs will need to | ||
2818 | * be dropped at the handler. The vlan accel path may have | ||
2819 | * already set the deliver_no_wcard flag. | ||
2820 | */ | ||
2813 | null_or_orig = NULL; | 2821 | null_or_orig = NULL; |
2814 | orig_dev = skb->dev; | 2822 | orig_dev = skb->dev; |
2815 | master = ACCESS_ONCE(orig_dev->master); | 2823 | master = ACCESS_ONCE(orig_dev->master); |
2816 | if (master) { | 2824 | if (skb->deliver_no_wcard) |
2817 | if (skb_bond_should_drop(skb, master)) | 2825 | null_or_orig = orig_dev; |
2826 | else if (master) { | ||
2827 | if (skb_bond_should_drop(skb, master)) { | ||
2828 | skb->deliver_no_wcard = 1; | ||
2818 | null_or_orig = orig_dev; /* deliver only exact match */ | 2829 | null_or_orig = orig_dev; /* deliver only exact match */ |
2819 | else | 2830 | } else |
2820 | skb->dev = master; | 2831 | skb->dev = master; |
2821 | } | 2832 | } |
2822 | 2833 | ||