From patchwork Sat May 14 02:00:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 111143 X-Patchwork-Delegate: andrew.rybchenko@oktetlabs.ru Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4A18EA00C3; Sat, 14 May 2022 04:02:09 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2CFC942837; Sat, 14 May 2022 04:01:59 +0200 (CEST) Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by mails.dpdk.org (Postfix) with ESMTP id 22C0C410EE for ; Sat, 14 May 2022 04:01:55 +0200 (CEST) Received: from kwepemi500012.china.huawei.com (unknown [172.30.72.53]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4L0TFy6BmSzGpWT; Sat, 14 May 2022 09:59:02 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by kwepemi500012.china.huawei.com (7.221.188.12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Sat, 14 May 2022 10:01:53 +0800 From: "Min Hu (Connor)" To: CC: , , , Subject: [PATCH V3 1/2] ethdev: fix one address occupies two indexes in MAC addrs Date: Sat, 14 May 2022 10:00:48 +0800 Message-ID: <20220514020049.57294-2-humin29@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220514020049.57294-1-humin29@huawei.com> References: <20210922033630.41130-1-humin29@huawei.com> <20220514020049.57294-1-humin29@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.56] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To kwepemi500012.china.huawei.com (7.221.188.12) X-CFilter-Loop: Reflected X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Huisong Li The dev->data->mac_addrs[0] will be changed to a new MAC address when applications modify the default MAC address by rte_eth_dev_default_mac_addr_set(). However, if the new default one has been added as a non-default MAC address by rte_eth_dev_mac_addr_add(), the the rte_eth_dev_default_mac_addr_set() doesn't remove it from the mac_addrs list. As a result, one MAC address occupies two indexes in the list. Like: add(MAC1) add(MAC2) add(MAC3) add(MAC4) set_default(MAC3) default=MAC3, filters=MAC1, MAC2, MAC3, MAC4 In addition, some PMDs, such as i40e, ice, hns3 and so on, do remove the old default MAC when set default MAC. If user continues to do set_default(MAC5), and the mac_addrs list is default=MAC5, filters=(MAC1, MAC2, MAC3, MAC4). At this moment, user can still view MAC3 from the list, but packets with MAC3 aren't actually received by the PMD. Fixes: 854d8ad4ef68 ("ethdev: add default mac address modifier") Cc: stable@dpdk.org Signed-off-by: Huisong Li Signed-off-by: Min Hu --- lib/ethdev/rte_ethdev.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index 29a3d80466..ab4a16487f 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -4248,7 +4248,10 @@ rte_eth_dev_mac_addr_remove(uint16_t port_id, struct rte_ether_addr *addr) int rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr) { + uint64_t mac_pool_sel_bk = 0; struct rte_eth_dev *dev; + uint32_t pool; + int index; int ret; RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); @@ -4266,16 +4269,48 @@ rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr) RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mac_addr_set, -ENOTSUP); + /* + * If the address has been added as a non-default MAC address by + * rte_eth_dev_mac_addr_add API, it should be removed from + * dev->data->mac_addrs[]. + */ + index = eth_dev_get_mac_addr_index(port_id, addr); + if (index > 0) { + /* remove address in NIC data structure */ + mac_pool_sel_bk = dev->data->mac_pool_sel[index]; + ret = rte_eth_dev_mac_addr_remove(port_id, addr); + if (ret < 0) { + RTE_ETHDEV_LOG(ERR, + "Delete MAC address from the MAC list of ethdev port %u.\n", + port_id); + return ret; + } + /* reset pool bitmap */ + dev->data->mac_pool_sel[index] = 0; + } + ret = (*dev->dev_ops->mac_addr_set)(dev, addr); if (ret < 0) - return ret; + goto back; /* Update default address in NIC data structure */ rte_ether_addr_copy(addr, &dev->data->mac_addrs[0]); return 0; -} +back: + if (index > 0) { + pool = 0; + do { + if (mac_pool_sel_bk & UINT64_C(1)) + rte_eth_dev_mac_addr_add(port_id, addr, pool); + mac_pool_sel_bk >>= 1; + pool++; + } while (mac_pool_sel_bk); + } + + return ret; +} /* * Returns index into MAC address array of addr. Use 00:00:00:00:00:00 to find From patchwork Wed Jun 1 06:39:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 112193 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B9F58A054F; Wed, 1 Jun 2022 08:41:11 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5B3D140694; Wed, 1 Jun 2022 08:41:11 +0200 (CEST) Received: from szxga08-in.huawei.com (szxga08-in.huawei.com [45.249.212.255]) by mails.dpdk.org (Postfix) with ESMTP id 1F83440689 for ; Wed, 1 Jun 2022 08:41:10 +0200 (CEST) Received: from kwepemi500012.china.huawei.com (unknown [172.30.72.53]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4LCfdD5h3Xz1K96T for ; Wed, 1 Jun 2022 14:39:28 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by kwepemi500012.china.huawei.com (7.221.188.12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Wed, 1 Jun 2022 14:41:07 +0800 From: "Min Hu (Connor)" To: Subject: [PATCH v4 2/2] ethdev: document default and non-default MAC address Date: Wed, 1 Jun 2022 14:39:49 +0800 Message-ID: <20220601063949.43202-3-humin29@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20220601063949.43202-1-humin29@huawei.com> References: <20220514020049.57294-1-humin29@huawei.com> <20220601063949.43202-1-humin29@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.56] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To kwepemi500012.china.huawei.com (7.221.188.12) X-CFilter-Loop: Reflected X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Huisong Li The rte_eth_dev_data::mac_addrs is a MAC address array. The index zero of this array is as the default address index, and other indexes can't be the same as the address corresponding to index 0. If we break it, may cause following problems: 1) waste of MAC address spaces. 2) a fake MAC address in the MAC list, isn't in hardware MAC entries. 3) a MAC address is assigned to diffent pool. Signed-off-by: Huisong Li Signed-off-by: Min Hu --- lib/ethdev/ethdev_driver.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h index 69d9dc21d8..d49e9138c6 100644 --- a/lib/ethdev/ethdev_driver.h +++ b/lib/ethdev/ethdev_driver.h @@ -115,7 +115,12 @@ struct rte_eth_dev_data { uint64_t rx_mbuf_alloc_failed; /**< Rx ring mbuf allocation failures */ - /** Device Ethernet link address. @see rte_eth_dev_release_port() */ + /** + * Device Ethernet link address. The index zero of the array is as the + * index of the default address, and other indexes can't be the same + * as the address corresponding to index 0. + * @see rte_eth_dev_release_port() + */ struct rte_ether_addr *mac_addrs; /** Bitmap associating MAC addresses to pools */ uint64_t mac_pool_sel[RTE_ETH_NUM_RECEIVE_MAC_ADDR];