]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/bonding/bond_3ad.c
bonding: don't increase rx_dropped after processing LACPDUs
[mv-sheeva.git] / drivers / net / bonding / bond_3ad.c
index 793b00138275324b808797b40e3f5fd3c6997d3e..3463b469e657d74178e69f394c4a8228b6d0590b 100644 (file)
@@ -2173,9 +2173,10 @@ re_arm:
  * received frames (loopback). Since only the payload is given to this
  * function, it check for loopback.
  */
-static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u16 length)
+static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u16 length)
 {
        struct port *port;
+       int ret = RX_HANDLER_ANOTHER;
 
        if (length >= sizeof(struct lacpdu)) {
 
@@ -2184,11 +2185,12 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u
                if (!port->slave) {
                        pr_warning("%s: Warning: port of slave %s is uninitialized\n",
                                   slave->dev->name, slave->dev->master->name);
-                       return;
+                       return ret;
                }
 
                switch (lacpdu->subtype) {
                case AD_TYPE_LACPDU:
+                       ret = RX_HANDLER_CONSUMED;
                        pr_debug("Received LACPDU on port %d\n",
                                 port->actor_port_number);
                        /* Protect against concurrent state machines */
@@ -2198,6 +2200,7 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u
                        break;
 
                case AD_TYPE_MARKER:
+                       ret = RX_HANDLER_CONSUMED;
                        // No need to convert fields to Little Endian since we don't use the marker's fields.
 
                        switch (((struct bond_marker *)lacpdu)->tlv_type) {
@@ -2219,6 +2222,7 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u
                        }
                }
        }
+       return ret;
 }
 
 /**
@@ -2456,18 +2460,20 @@ out:
        return NETDEV_TX_OK;
 }
 
-void bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond,
+int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond,
                          struct slave *slave)
 {
+       int ret = RX_HANDLER_ANOTHER;
        if (skb->protocol != PKT_TYPE_LACPDU)
-               return;
+               return ret;
 
        if (!pskb_may_pull(skb, sizeof(struct lacpdu)))
-               return;
+               return ret;
 
        read_lock(&bond->lock);
-       bond_3ad_rx_indication((struct lacpdu *) skb->data, slave, skb->len);
+       ret = bond_3ad_rx_indication((struct lacpdu *) skb->data, slave, skb->len);
        read_unlock(&bond->lock);
+       return ret;
 }
 
 /*