bonding: use the new options to correctly set last_arp_rx
authorVeaceslav Falico <vfalico@redhat.com>
Tue, 18 Feb 2014 06:48:42 +0000 (07:48 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 18 Feb 2014 21:47:15 +0000 (16:47 -0500)
Now that the options are in place - arp_validate can be set to receive all
the traffic or only arp packets to verify if the slave is up, when the
slave isn't validated.

CC: Rob Landley <rob@landley.net>
CC: "David S. Miller" <davem@davemloft.net>
CC: Nikolay Aleksandrov <nikolay@redhat.com>
CC: Ding Tianhong <dingtianhong@huawei.com>
CC: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/bond_main.c

index 257ee7f05645539c6ea7d58d163ad796e7984f2c..3fe81cdbd8fbf8ef591ccd4cd78a2ab5d3142242 100644 (file)
@@ -2255,15 +2255,16 @@ int bond_arp_rcv(const struct sk_buff *skb, struct bonding *bond,
        struct arphdr *arp = (struct arphdr *)skb->data;
        unsigned char *arp_ptr;
        __be32 sip, tip;
-       int alen;
+       int alen, is_arp = skb->protocol == __cpu_to_be16(ETH_P_ARP);
 
-       slave->last_arp_rx = jiffies;
-
-       if (skb->protocol != __cpu_to_be16(ETH_P_ARP))
+       if (!slave_do_arp_validate(bond, slave)) {
+               if ((slave_do_arp_validate_only(bond, slave) && is_arp) ||
+                   !slave_do_arp_validate_only(bond, slave))
+                       slave->last_arp_rx = jiffies;
                return RX_HANDLER_ANOTHER;
-
-       if (!slave_do_arp_validate(bond, slave))
-               goto out_unlock;
+       } else if (!is_arp) {
+               return RX_HANDLER_ANOTHER;
+       }
 
        alen = arp_hdr_len(bond->dev);