When the primary port of bond slaves with bond mode 4 linked down,
the system id of the other slave ports channged.
It may cause some switches to renegotiate,
and the process takes a few seconds. It is not acceptable for any
Telcos.
We need sub-second switchover time like in linux.

Set the mac of the bond port to the slave port's system to solve the
problem.

Bugzilla ID: 551
Fixes: 46fb43683679 ("bond: add mode 4")
Cc: sta...@dpdk.org

Signed-off-by: Gaoxiang Liu <liugaoxi...@huawei.com>
---
 drivers/net/bonding/rte_eth_bond_8023ad.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c 
b/drivers/net/bonding/rte_eth_bond_8023ad.c
index b3cddd8a20..b393148238 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.c
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c
@@ -866,7 +866,6 @@ bond_mode_8023ad_periodic_cb(void *arg)
        struct bond_dev_private *internals = bond_dev->data->dev_private;
        struct port *port;
        struct rte_eth_link link_info;
-       struct rte_ether_addr slave_addr;
        struct rte_mbuf *lacp_pkt = NULL;
        uint16_t slave_id;
        uint16_t i;
@@ -893,7 +892,6 @@ bond_mode_8023ad_periodic_cb(void *arg)
                        key = 0;
                }
 
-               rte_eth_macaddr_get(slave_id, &slave_addr);
                port = &bond_mode_8023ad_ports[slave_id];
 
                key = rte_cpu_to_be_16(key);
@@ -905,8 +903,8 @@ bond_mode_8023ad_periodic_cb(void *arg)
                        SM_FLAG_SET(port, NTT);
                }
 
-               if (!rte_is_same_ether_addr(&port->actor.system, &slave_addr)) {
-                       rte_ether_addr_copy(&slave_addr, &port->actor.system);
+               if (!rte_is_same_ether_addr(&internals->mode4.mac_addr, 
&port->actor.system)) {
+                       rte_ether_addr_copy(&internals->mode4.mac_addr, 
&port->actor.system);
                        if (port->aggregator_port_id == slave_id)
                                SM_FLAG_SET(port, NTT);
                }
@@ -1178,15 +1176,15 @@ bond_mode_8023ad_mac_address_update(struct rte_eth_dev 
*bond_dev)
 
        bond_mode_8023ad_stop(bond_dev);
 
+       rte_eth_macadd_get(internals->port_id, &internals->mode4.mac_addr);
        for (i = 0; i < internals->active_slave_count; i++) {
                slave_id = internals->active_slaves[i];
                slave = &bond_mode_8023ad_ports[slave_id];
-               rte_eth_macaddr_get(slave_id, &slave_addr);
 
-               if (rte_is_same_ether_addr(&slave_addr, &slave->actor.system))
+               if (rte_is_same_ether_addr(&internals->mode4.mac_addr, 
&slave->actor.system))
                        continue;
 
-               rte_ether_addr_copy(&slave_addr, &slave->actor.system);
+               rte_ether_addr_copy(&internals->mode4.mac_addr, 
&slave->actor.system);
                /* Do nothing if this port is not an aggregator. In other case
                 * Set NTT flag on every port that use this aggregator. */
                if (slave->aggregator_port_id != slave_id)
-- 
2.32.0

Reply via email to