OSDN Git Service

bonding: don't queue up extraneous rlb updates
authorDebabrata Banerjee <dbanerje@akamai.com>
Mon, 14 May 2018 18:48:07 +0000 (14:48 -0400)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 May 2018 16:15:10 +0000 (12:15 -0400)
arps for incomplete entries can't be sent anyway.

Signed-off-by: Debabrata Banerjee <dbanerje@akamai.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/bond_alb.c

index a8f6098..9f7031e 100644 (file)
@@ -421,7 +421,8 @@ static void rlb_clear_slave(struct bonding *bond, struct slave *slave)
                        if (assigned_slave) {
                                rx_hash_table[index].slave = assigned_slave;
                                if (!ether_addr_equal_64bits(rx_hash_table[index].mac_dst,
-                                                            mac_bcast)) {
+                                                            mac_bcast) &&
+                                   !is_zero_ether_addr(rx_hash_table[index].mac_dst)) {
                                        bond_info->rx_hashtbl[index].ntt = 1;
                                        bond_info->rx_ntt = 1;
                                        /* A slave has been removed from the
@@ -524,7 +525,8 @@ static void rlb_req_update_slave_clients(struct bonding *bond, struct slave *sla
                client_info = &(bond_info->rx_hashtbl[hash_index]);
 
                if ((client_info->slave == slave) &&
-                   !ether_addr_equal_64bits(client_info->mac_dst, mac_bcast)) {
+                   !ether_addr_equal_64bits(client_info->mac_dst, mac_bcast) &&
+                   !is_zero_ether_addr(client_info->mac_dst)) {
                        client_info->ntt = 1;
                        ntt = 1;
                }
@@ -565,7 +567,8 @@ static void rlb_req_update_subnet_clients(struct bonding *bond, __be32 src_ip)
                if ((client_info->ip_src == src_ip) &&
                    !ether_addr_equal_64bits(client_info->slave->dev->dev_addr,
                                             bond->dev->dev_addr) &&
-                   !ether_addr_equal_64bits(client_info->mac_dst, mac_bcast)) {
+                   !ether_addr_equal_64bits(client_info->mac_dst, mac_bcast) &&
+                   !is_zero_ether_addr(client_info->mac_dst)) {
                        client_info->ntt = 1;
                        bond_info->rx_ntt = 1;
                }
@@ -641,7 +644,8 @@ static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bon
                ether_addr_copy(client_info->mac_src, arp->mac_src);
                client_info->slave = assigned_slave;
 
-               if (!ether_addr_equal_64bits(client_info->mac_dst, mac_bcast)) {
+               if (!ether_addr_equal_64bits(client_info->mac_dst, mac_bcast) &&
+                   !is_zero_ether_addr(client_info->mac_dst)) {
                        client_info->ntt = 1;
                        bond->alb_info.rx_ntt = 1;
                } else {
@@ -733,8 +737,10 @@ static void rlb_rebalance(struct bonding *bond)
                assigned_slave = __rlb_next_rx_slave(bond);
                if (assigned_slave && (client_info->slave != assigned_slave)) {
                        client_info->slave = assigned_slave;
-                       client_info->ntt = 1;
-                       ntt = 1;
+                       if (!is_zero_ether_addr(client_info->mac_dst)) {
+                               client_info->ntt = 1;
+                               ntt = 1;
+                       }
                }
        }