net: introduce rx_handler results and logic around that
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / net / bonding / bond_main.c
index 04119b1..27c413a 100644 (file)
@@ -1480,20 +1480,23 @@ static bool bond_should_deliver_exact_match(struct sk_buff *skb,
        return false;
 }
 
-static struct sk_buff *bond_handle_frame(struct sk_buff *skb)
+static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb)
 {
+       struct sk_buff *skb = *pskb;
        struct slave *slave;
        struct net_device *bond_dev;
        struct bonding *bond;
 
-       skb = skb_share_check(skb, GFP_ATOMIC);
-       if (unlikely(!skb))
-               return NULL;
-
        slave = bond_slave_get_rcu(skb->dev);
        bond_dev = ACCESS_ONCE(slave->dev->master);
        if (unlikely(!bond_dev))
-               return skb;
+               return RX_HANDLER_PASS;
+
+       skb = skb_share_check(skb, GFP_ATOMIC);
+       if (unlikely(!skb))
+               return RX_HANDLER_CONSUMED;
+
+       *pskb = skb;
 
        bond = netdev_priv(bond_dev);
 
@@ -1501,8 +1504,7 @@ static struct sk_buff *bond_handle_frame(struct sk_buff *skb)
                slave->dev->last_rx = jiffies;
 
        if (bond_should_deliver_exact_match(skb, slave, bond)) {
-               skb->deliver_no_wcard = 1;
-               return skb;
+               return RX_HANDLER_EXACT;
        }
 
        skb->dev = bond_dev;
@@ -1514,12 +1516,12 @@ static struct sk_buff *bond_handle_frame(struct sk_buff *skb)
                if (unlikely(skb_cow_head(skb,
                                          skb->data - skb_mac_header(skb)))) {
                        kfree_skb(skb);
-                       return NULL;
+                       return RX_HANDLER_CONSUMED;
                }
                memcpy(eth_hdr(skb)->h_dest, bond_dev->dev_addr, ETH_ALEN);
        }
 
-       return skb;
+       return RX_HANDLER_ANOTHER;
 }
 
 /* enslave device <slave> to bond device <master> */