From: Konstantin Ananyev Date: Wed, 13 Oct 2021 13:37:03 +0000 (+0100) Subject: ethdev: add API to retrieve multiple MAC addresses X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=27a300e6aff2ff6421204489e66c2f8d92c72471;p=dpdk.git ethdev: add API to retrieve multiple MAC addresses Introduce rte_eth_macaddrs_get() to allow user to retrieve all ethernet addresses assigned to given port. Change testpmd to use this new function and avoid referencing directly rte_eth_devices[]. Signed-off-by: Konstantin Ananyev Reviewed-by: Andrew Rybchenko Reviewed-by: Ferruh Yigit Tested-by: Feifei Wang --- diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 9c66329e96..7221644230 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -5215,20 +5215,20 @@ show_macs(portid_t port_id) { char buf[RTE_ETHER_ADDR_FMT_SIZE]; struct rte_eth_dev_info dev_info; - struct rte_ether_addr *addr; - uint32_t i, num_macs = 0; - struct rte_eth_dev *dev; - - dev = &rte_eth_devices[port_id]; + int32_t i, rc, num_macs = 0; if (eth_dev_info_get_print_err(port_id, &dev_info)) return; - for (i = 0; i < dev_info.max_mac_addrs; i++) { - addr = &dev->data->mac_addrs[i]; + struct rte_ether_addr addr[dev_info.max_mac_addrs]; + rc = rte_eth_macaddrs_get(port_id, addr, dev_info.max_mac_addrs); + if (rc < 0) + return; + + for (i = 0; i < rc; i++) { /* skip zero address */ - if (rte_is_zero_ether_addr(addr)) + if (rte_is_zero_ether_addr(&addr[i])) continue; num_macs++; @@ -5236,14 +5236,13 @@ show_macs(portid_t port_id) printf("Number of MAC address added: %d\n", num_macs); - for (i = 0; i < dev_info.max_mac_addrs; i++) { - addr = &dev->data->mac_addrs[i]; + for (i = 0; i < rc; i++) { /* skip zero address */ - if (rte_is_zero_ether_addr(addr)) + if (rte_is_zero_ether_addr(&addr[i])) continue; - rte_ether_format_addr(buf, RTE_ETHER_ADDR_FMT_SIZE, addr); + rte_ether_format_addr(buf, RTE_ETHER_ADDR_FMT_SIZE, &addr[i]); printf(" %s\n", buf); } } diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index a86f67d2a4..fd2f8eb424 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -75,6 +75,11 @@ New Features operations. * Added multi-process support. +* **Added support to get all MAC addresses of a device.** + + Added ``rte_eth_macaddrs_get`` to allow user to retrieve all Ethernet + addresses assigned to given ethernet port. + * **Added new RSS offload types for IPv4/L4 checksum in RSS flow.** Added macros ETH_RSS_IPV4_CHKSUM and ETH_RSS_L4_CHKSUM, now IPv4 and diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index 178f5b88b7..d3f7689ca6 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -3544,6 +3544,31 @@ ptype_unknown: return ret; } +int +rte_eth_macaddrs_get(uint16_t port_id, struct rte_ether_addr *ma, + unsigned int num) +{ + int32_t ret; + struct rte_eth_dev *dev; + struct rte_eth_dev_info dev_info; + + if (ma == NULL) { + RTE_ETHDEV_LOG(ERR, "%s: invalid parameters\n", __func__); + return -EINVAL; + } + + /* will check for us that port_id is a valid one */ + ret = rte_eth_dev_info_get(port_id, &dev_info); + if (ret != 0) + return ret; + + dev = &rte_eth_devices[port_id]; + num = RTE_MIN(dev_info.max_mac_addrs, num); + memcpy(ma, dev->data->mac_addrs, num * sizeof(ma[0])); + + return num; +} + int rte_eth_macaddr_get(uint16_t port_id, struct rte_ether_addr *mac_addr) { diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h index f4c92b3b5e..934066f6b9 100644 --- a/lib/ethdev/rte_ethdev.h +++ b/lib/ethdev/rte_ethdev.h @@ -3007,6 +3007,30 @@ int rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id, */ int rte_eth_macaddr_get(uint16_t port_id, struct rte_ether_addr *mac_addr); +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Retrieve the Ethernet addresses of an Ethernet device. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param ma + * A pointer to an array of structures of type *ether_addr* to be filled with + * the Ethernet addresses of the Ethernet device. + * @param num + * Number of elements in the @p ma array. + * Note that rte_eth_dev_info::max_mac_addrs can be used to retrieve + * max number of Ethernet addresses for given port. + * @return + * - number of retrieved addresses if successful + * - (-ENODEV) if *port_id* invalid. + * - (-EINVAL) if bad parameter. + */ +__rte_experimental +int rte_eth_macaddrs_get(uint16_t port_id, struct rte_ether_addr *ma, + unsigned int num); + /** * Retrieve the contextual information of an Ethernet device. * diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index 61011b110a..ca81f5d237 100644 --- a/lib/ethdev/version.map +++ b/lib/ethdev/version.map @@ -250,6 +250,7 @@ EXPERIMENTAL { rte_mtr_meter_policy_validate; # added in 21.11 + rte_eth_macaddrs_get; rte_eth_rx_metadata_negotiate; };