89 lines
3.7 KiB
Diff
89 lines
3.7 KiB
Diff
From edf6489ea43ec9c27d54dbe9e94adcdc43b70e04 Mon Sep 17 00:00:00 2001
|
|
From: "Wei Hu (Xavier)" <xavier.huwei@huawei.com>
|
|
Date: Fri, 17 Apr 2020 16:19:17 +0800
|
|
Subject: net/bonding: fix MAC address when switching active port
|
|
|
|
Currently, based on a active-backup bond device, when the link status of
|
|
the primary port changes from up to down, one slave port changes to the
|
|
primary port, but the new primary port's MAC address cannot change to
|
|
the bond device's MAC address. And we can't continue receive packets
|
|
whose destination MAC addresses are the same as the bond devices's MAC
|
|
address.
|
|
|
|
The current bonding PMD driver call mac_address_slaves_update function
|
|
to modify the MAC address of all slaves devices: the primary port using
|
|
bond device's MAC address, and other slaves devices using the respective
|
|
MAC address. We found that one error using primary_port instead of
|
|
current_primary_port in mac_address_slaves_update function.
|
|
|
|
On the other hand, The current bonding PMD driver sets slave devices's
|
|
MAC address according to the variable named current_primary_port. The
|
|
variable named current_primary_port changes in the following scenario:
|
|
1. Add the slave devices to bond, the first slave port will be regarded
|
|
as the current_primary_port. If changing the order of adding the
|
|
slave devices, the value of the variable named current_primary_port
|
|
will be different.
|
|
2. The upper application specifies primary_port via calling the
|
|
rte_eth_bond_primary_set API function.
|
|
3. Delete the primary slave device.
|
|
4. The link status of the primary port changes from up to down.
|
|
|
|
We have tested the above 4 cases and found that there are problems that
|
|
the new primary port's MAC address didn't change to the bond device's
|
|
MAC address when running case 3 and 4. When current_primary_port
|
|
changes, the new primary port's MAC address should change at the same
|
|
time. We also need to call mac_address_slaves_update function to update
|
|
MAC addresses in case
|
|
3 and 4.
|
|
|
|
Bugzilla ID: 256
|
|
Fixes: 2efb58cbab6e ("bond: new link bonding library")
|
|
Cc: stable@dpdk.org
|
|
|
|
Signed-off-by: Chunsong Feng <fengchunsong@huawei.com>
|
|
Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
|
|
---
|
|
drivers/net/bonding/rte_eth_bond_api.c | 1 +
|
|
drivers/net/bonding/rte_eth_bond_pmd.c | 3 ++-
|
|
2 files changed, 3 insertions(+), 1 deletion(-)
|
|
|
|
(limited to 'drivers/net/bonding')
|
|
|
|
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
|
|
index d77dc40963..97c667e007 100644
|
|
--- a/drivers/net/bonding/rte_eth_bond_api.c
|
|
+++ b/drivers/net/bonding/rte_eth_bond_api.c
|
|
@@ -698,6 +698,7 @@ __eth_bond_slave_remove_lock_free(uint16_t bonded_port_id,
|
|
internals->current_primary_port = internals->slaves[0].port_id;
|
|
else
|
|
internals->primary_port = 0;
|
|
+ mac_address_slaves_update(bonded_eth_dev);
|
|
}
|
|
|
|
if (internals->active_slave_count < 1) {
|
|
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
|
|
index 044a1cfbc3..6f361c7b2c 100644
|
|
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
|
|
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
|
|
@@ -1533,7 +1533,7 @@ mac_address_slaves_update(struct rte_eth_dev *bonded_eth_dev)
|
|
if (internals->slaves[i].port_id ==
|
|
internals->current_primary_port) {
|
|
if (rte_eth_dev_default_mac_addr_set(
|
|
- internals->primary_port,
|
|
+ internals->current_primary_port,
|
|
bonded_eth_dev->data->mac_addrs)) {
|
|
RTE_BOND_LOG(ERR, "Failed to update port Id %d MAC address",
|
|
internals->current_primary_port);
|
|
@@ -2873,6 +2873,7 @@ bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type,
|
|
internals->active_slaves[0]);
|
|
else
|
|
internals->current_primary_port = internals->primary_port;
|
|
+ mac_address_slaves_update(bonded_eth_dev);
|
|
}
|
|
}
|
|
|
|
--
|
|
cgit v1.2.1
|
|
|
|
|