From d616b2c44096cd024f346139d40207902a36b54d Mon Sep 17 00:00:00 2001 From: John Fastabend Date: Thu, 3 Jun 2010 09:30:11 +0000 Subject: [PATCH] --- yaml --- r: 200377 b: refs/heads/master c: 597a264b1a9c7e36d1728f677c66c5c1f7e3b837 h: refs/heads/master i: 200375: 6dececa72360d0625bd099eeb699b270a6c10e1a v: v3 --- [refs] | 2 +- trunk/include/linux/skbuff.h | 5 ++++- trunk/net/8021q/vlan_core.c | 4 ++-- trunk/net/core/dev.c | 17 ++++++++++++++--- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index a099ceb48305..5e310862843a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 00d9d6a185de89edc0649ca4ead58f0283dfcbac +refs/heads/master: 597a264b1a9c7e36d1728f677c66c5c1f7e3b837 diff --git a/trunk/include/linux/skbuff.h b/trunk/include/linux/skbuff.h index bf243fc54959..f89e7fd59a4c 100644 --- a/trunk/include/linux/skbuff.h +++ b/trunk/include/linux/skbuff.h @@ -380,7 +380,10 @@ struct sk_buff { kmemcheck_bitfield_begin(flags2); __u16 queue_mapping:16; #ifdef CONFIG_IPV6_NDISC_NODETYPE - __u8 ndisc_nodetype:2; + __u8 ndisc_nodetype:2, + deliver_no_wcard:1; +#else + __u8 deliver_no_wcard:1; #endif kmemcheck_bitfield_end(flags2); diff --git a/trunk/net/8021q/vlan_core.c b/trunk/net/8021q/vlan_core.c index bd537fc10254..50f58f5f1c34 100644 --- a/trunk/net/8021q/vlan_core.c +++ b/trunk/net/8021q/vlan_core.c @@ -12,7 +12,7 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, return NET_RX_DROP; if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) - goto drop; + skb->deliver_no_wcard = 1; skb->skb_iif = skb->dev->ifindex; __vlan_hwaccel_put_tag(skb, vlan_tci); @@ -84,7 +84,7 @@ vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp, struct sk_buff *p; if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) - goto drop; + skb->deliver_no_wcard = 1; skb->skb_iif = skb->dev->ifindex; __vlan_hwaccel_put_tag(skb, vlan_tci); diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 14a85682af38..2b3bf53bc687 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -2810,13 +2810,24 @@ static int __netif_receive_skb(struct sk_buff *skb) if (!skb->skb_iif) skb->skb_iif = skb->dev->ifindex; + /* + * bonding note: skbs received on inactive slaves should only + * be delivered to pkt handlers that are exact matches. Also + * the deliver_no_wcard flag will be set. If packet handlers + * are sensitive to duplicate packets these skbs will need to + * be dropped at the handler. The vlan accel path may have + * already set the deliver_no_wcard flag. + */ null_or_orig = NULL; orig_dev = skb->dev; master = ACCESS_ONCE(orig_dev->master); - if (master) { - if (skb_bond_should_drop(skb, master)) + if (skb->deliver_no_wcard) + null_or_orig = orig_dev; + else if (master) { + if (skb_bond_should_drop(skb, master)) { + skb->deliver_no_wcard = 1; null_or_orig = orig_dev; /* deliver only exact match */ - else + } else skb->dev = master; }