From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 64D6DA0542 for ; Mon, 6 Jun 2022 16:31:14 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6B25C40150; Mon, 6 Jun 2022 16:31:13 +0200 (CEST) Received: from m12-16.163.com (m12-16.163.com [220.181.12.16]) by mails.dpdk.org (Postfix) with ESMTP id 8AF9140150 for ; Mon, 6 Jun 2022 16:31:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id:MIME-Version; bh=7iaIa Xgjv0Hs7vCTSttyMVj8XO8Frxfek0dCMbymolo=; b=Y4QWQgveeKy0heOdsTzaZ pXjP3Zehb51hr2mI3ruyYI/5cpI4lguk8Lu/iwRU5NJw9XkAoyRZJR4Hv1Y8nahP X3K1Nkoc+UFO6bAgc+8181ntuQwkAKLGybGRfCZ94x9LLfXR6gU/UqsthedYMMIA Q2oYrkhb5sAk8MWdI4hP04= Received: from DESKTOP-ONA2IA7.localdomain (unknown [125.121.192.74]) by smtp12 (Coremail) with SMTP id EMCowABHVQudD55i0uVbAA--.4985S4; Mon, 06 Jun 2022 22:31:04 +0800 (CST) From: Gaoxiang Liu To: liugaoxiang@huawei.com Cc: Gaoxiang Liu , stable@dpdk.org Subject: [PATCH v2] net/bonding: failover of LACP with mode 4 takes long time Date: Mon, 6 Jun 2022 22:30:50 +0800 Message-Id: <20220606143051.295-1-gaoxiangliu0@163.com> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: EMCowABHVQudD55i0uVbAA--.4985S4 X-Coremail-Antispam: 1Uf129KBjvJXoWxJFWDurW3Cr45uFy3ZF1DWrg_yoW5Aw18pF srCa4YgFn7ArWDW3WxXa1xCrs8Cr1Ivw1UGryrA3s0kanYvryrur1xtFyv9FyFk3s5Crs8 ArW5Kw1qvF4kGrJanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JU-6pkUUUUU= X-Originating-IP: [125.121.192.74] X-CM-SenderInfo: xjdr5xxdqjzxjxq6il2tof0z/xtbB0QAYOlzIBM8UyAABsx X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org 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: stable@dpdk.org Signed-off-by: Gaoxiang Liu --- v2: * Fixed compile issues. --- drivers/net/bonding/rte_eth_bond_8023ad.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c index b3cddd8a20..38a23b0d62 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); } @@ -1172,21 +1170,20 @@ void bond_mode_8023ad_mac_address_update(struct rte_eth_dev *bond_dev) { struct bond_dev_private *internals = bond_dev->data->dev_private; - struct rte_ether_addr slave_addr; struct port *slave, *agg_slave; uint16_t slave_id, i, j; 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