From patchwork Tue Feb 25 09:29:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wei Hu (Xavier)" X-Patchwork-Id: 66033 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4B917A0524; Tue, 25 Feb 2020 10:29:47 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8D2671BFD1; Tue, 25 Feb 2020 10:29:40 +0100 (CET) Received: from incedge.chinasoftinc.com (unknown [114.113.233.8]) by dpdk.org (Postfix) with ESMTP id 1F8EC1BFB5 for ; Tue, 25 Feb 2020 10:29:36 +0100 (CET) X-ASG-Debug-ID: 1582622944-0a3dd113ab17cf0004-TfluYd Received: from mail.chinasoftinc.com (inccas002.ito.icss [10.168.0.52]) by incedge.chinasoftinc.com with ESMTP id 69dfd7mzFP3oUeNP (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 25 Feb 2020 17:29:12 +0800 (CST) X-Barracuda-Envelope-From: huwei013@chinasoftinc.com X-Barracuda-RBL-Trusted-Forwarder: 10.168.0.52 X-ASG-Whitelist: Client Received: from localhost.localdomain (114.119.4.74) by INCCAS002.ito.icss (10.168.0.60) with Microsoft SMTP Server id 14.3.439.0; Tue, 25 Feb 2020 17:29:08 +0800 From: "Wei Hu (Xavier)" X-Barracuda-RBL-Trusted-Forwarder: 10.168.0.60 To: Date: Tue, 25 Feb 2020 17:29:03 +0800 X-ASG-Orig-Subj: [PATCH 2/2] net/bonding: fix MAC address when one port resets Message-ID: <20200225092903.38455-3-huwei013@chinasoftinc.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200225092903.38455-1-huwei013@chinasoftinc.com> References: <20200225092903.38455-1-huwei013@chinasoftinc.com> MIME-Version: 1.0 X-Originating-IP: [114.119.4.74] X-Barracuda-Connect: inccas002.ito.icss[10.168.0.52] X-Barracuda-Start-Time: 1582622952 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://spam.chinasoftinc.com:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at chinasoftinc.com X-Barracuda-Scan-Msg-Size: 3111 Subject: [dpdk-dev] [PATCH 2/2] net/bonding: fix MAC address when one port resets X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: "Wei Hu (Xavier)" Currently, based on a active-backup bond device, in the following 2 cases: 1) The primary port resets. The link status of the primary port changes from up to down. 2) When switching the active port, one slave port resets at the same time. one slave port changes to the primary port, but the new primary port's MAC address probably 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. In mac_address_slaves_update function, the rte_eth_dev_default_mac_addr_set API function is called to set the MAC address of the slave devices in turn in the for loop statement. When one port reset, calling rte_eth_dev_default_mac_addr_set API fails because the firmware will not respond to the commands from the driver, and exit the loop, so other slave devices cannot continue to update the MAC address. This patch fixes the issue by avoid exiting the loop when calling rte_eth_dev_default_mac_addr_set fails. Fixes: 2efb58cbab6e ("bond: new link bonding library") Cc: stable@dpdk.org Signed-off-by: Hongbo Zheng Signed-off-by: Wei Hu (Xavier) Signed-off-by: Chunsong Feng Signed-off-by: Xuan Li --- drivers/net/bonding/rte_eth_bond_pmd.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c index ddae3518c..ba3f342e7 100644 --- a/drivers/net/bonding/rte_eth_bond_pmd.c +++ b/drivers/net/bonding/rte_eth_bond_pmd.c @@ -1502,6 +1502,7 @@ int mac_address_slaves_update(struct rte_eth_dev *bonded_eth_dev) { struct bond_dev_private *internals = bonded_eth_dev->data->dev_private; + bool setted; int i; /* Update slave devices MAC addresses */ @@ -1529,6 +1530,7 @@ mac_address_slaves_update(struct rte_eth_dev *bonded_eth_dev) case BONDING_MODE_TLB: case BONDING_MODE_ALB: default: + setted = true; for (i = 0; i < internals->slave_count; i++) { if (internals->slaves[i].port_id == internals->current_primary_port) { @@ -1537,7 +1539,7 @@ mac_address_slaves_update(struct rte_eth_dev *bonded_eth_dev) bonded_eth_dev->data->mac_addrs)) { RTE_BOND_LOG(ERR, "Failed to update port Id %d MAC address", internals->current_primary_port); - return -1; + setted = false; } } else { if (rte_eth_dev_default_mac_addr_set( @@ -1545,10 +1547,12 @@ mac_address_slaves_update(struct rte_eth_dev *bonded_eth_dev) &internals->slaves[i].persisted_mac_addr)) { RTE_BOND_LOG(ERR, "Failed to update port Id %d MAC address", internals->slaves[i].port_id); - return -1; + setted = false; } } } + if (!setted) + return -1; } return 0;