|
@@ -2165,6 +2165,7 @@ int netif_receive_skb(struct sk_buff *skb)
|
|
|
{
|
|
|
struct packet_type *ptype, *pt_prev;
|
|
|
struct net_device *orig_dev;
|
|
|
+ struct net_device *null_or_orig;
|
|
|
int ret = NET_RX_DROP;
|
|
|
__be16 type;
|
|
|
|
|
@@ -2178,13 +2179,13 @@ int netif_receive_skb(struct sk_buff *skb)
|
|
|
if (!skb->iif)
|
|
|
skb->iif = skb->dev->ifindex;
|
|
|
|
|
|
+ null_or_orig = NULL;
|
|
|
orig_dev = skb->dev;
|
|
|
if (orig_dev->master) {
|
|
|
- if (skb_bond_should_drop(skb)) {
|
|
|
- kfree_skb(skb);
|
|
|
- return NET_RX_DROP;
|
|
|
- }
|
|
|
- skb->dev = orig_dev->master;
|
|
|
+ if (skb_bond_should_drop(skb))
|
|
|
+ null_or_orig = orig_dev; /* deliver only exact match */
|
|
|
+ else
|
|
|
+ skb->dev = orig_dev->master;
|
|
|
}
|
|
|
|
|
|
__get_cpu_var(netdev_rx_stat).total++;
|
|
@@ -2209,7 +2210,7 @@ int netif_receive_skb(struct sk_buff *skb)
|
|
|
#endif
|
|
|
|
|
|
list_for_each_entry_rcu(ptype, &ptype_all, list) {
|
|
|
- if (!ptype->dev || ptype->dev == skb->dev) {
|
|
|
+ if (ptype->dev == null_or_orig || ptype->dev == skb->dev) {
|
|
|
if (pt_prev)
|
|
|
ret = deliver_skb(skb, pt_prev, orig_dev);
|
|
|
pt_prev = ptype;
|
|
@@ -2234,7 +2235,7 @@ ncls:
|
|
|
list_for_each_entry_rcu(ptype,
|
|
|
&ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) {
|
|
|
if (ptype->type == type &&
|
|
|
- (!ptype->dev || ptype->dev == skb->dev)) {
|
|
|
+ (ptype->dev == null_or_orig || ptype->dev == skb->dev)) {
|
|
|
if (pt_prev)
|
|
|
ret = deliver_skb(skb, pt_prev, orig_dev);
|
|
|
pt_prev = ptype;
|