ethdev: add API to retrieve multiple MAC addresses
authorKonstantin Ananyev <konstantin.ananyev@intel.com>
Wed, 13 Oct 2021 13:37:03 +0000 (14:37 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 13 Oct 2021 20:14:59 +0000 (22:14 +0200)
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 <konstantin.ananyev@intel.com>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
Tested-by: Feifei Wang <feifei.wang2@arm.com>
app/test-pmd/config.c
doc/guides/rel_notes/release_21_11.rst
lib/ethdev/rte_ethdev.c
lib/ethdev/rte_ethdev.h
lib/ethdev/version.map

index 9c66329..7221644 100644 (file)
@@ -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);
        }
 }
index a86f67d..fd2f8eb 100644 (file)
@@ -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
index 178f5b8..d3f7689 100644 (file)
@@ -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)
 {
index f4c92b3..934066f 100644 (file)
@@ -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.
  *
index 61011b1..ca81f5d 100644 (file)
@@ -250,6 +250,7 @@ EXPERIMENTAL {
        rte_mtr_meter_policy_validate;
 
        # added in 21.11
+       rte_eth_macaddrs_get;
        rte_eth_rx_metadata_negotiate;
 };