Rules for multicast MAC addresses are intended to filter multicast traffic
and are managed through multicast MAC add/remove APIs. In mlx5_dev_spawn
function, devices (PF, VFs, and SFs) retrieve the netdev-configured MAC
addresses via netlink and store them in the PMD device data, which
includes multicast MAC addresses.

To update multicast MAC address rules, create them within
mlx5_traffic_enable.

Fixes: 2d0665a7f771 ("net/mlx5: align PF and VF/SF MAC address handling")
Cc: sta...@dpdk.org

Signed-off-by: Gavin Li <gav...@nvidia.com>
---
 drivers/net/mlx5/linux/mlx5_os.c | 3 +++
 drivers/net/mlx5/mlx5.h          | 1 +
 drivers/net/mlx5/mlx5_trigger.c  | 5 ++++-
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c
index 696a3e12c7..b8d75a97e7 100644
--- a/drivers/net/mlx5/linux/mlx5_os.c
+++ b/drivers/net/mlx5/linux/mlx5_os.c
@@ -3216,6 +3216,7 @@ mlx5_os_mac_addr_remove(struct rte_eth_dev *dev, uint32_t 
index)
                mlx5_nl_mac_addr_remove(priv->nl_socket_route,
                                        mlx5_ifindex(dev), priv->mac_own,
                                        &dev->data->mac_addrs[index], index);
+       BITFIELD_RESET(priv->mac_pmd, index);
 }
 
 /**
@@ -3243,6 +3244,8 @@ mlx5_os_mac_addr_add(struct rte_eth_dev *dev, struct 
rte_ether_addr *mac,
                ret = mlx5_nl_mac_addr_add(priv->nl_socket_route,
                                           mlx5_ifindex(dev), priv->mac_own,
                                           mac, index);
+       if (!ret)
+               BITFIELD_SET(priv->mac_pmd, index);
        return ret;
 }
 
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index c08894cd03..50ed46540c 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -1976,6 +1976,7 @@ struct mlx5_priv {
        struct rte_pci_device *pci_dev; /* Backend PCI device. */
        struct rte_ether_addr mac[MLX5_MAX_MAC_ADDRESSES]; /* MAC addresses. */
        BITFIELD_DECLARE(mac_own, uint64_t, MLX5_MAX_MAC_ADDRESSES);
+       BITFIELD_DECLARE(mac_pmd, uint64_t, MLX5_MAX_MAC_ADDRESSES);
        /* Bit-field of MAC addresses owned by the PMD. */
        uint16_t vlan_filter[MLX5_MAX_VLAN_IDS]; /* VLAN filters table. */
        unsigned int vlan_filter_n; /* Number of configured VLAN filters. */
diff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c
index 6c6f228afd..cbc91be3b1 100644
--- a/drivers/net/mlx5/mlx5_trigger.c
+++ b/drivers/net/mlx5/mlx5_trigger.c
@@ -1813,7 +1813,10 @@ mlx5_traffic_enable(struct rte_eth_dev *dev)
        for (i = 0; i != MLX5_MAX_MAC_ADDRESSES; ++i) {
                struct rte_ether_addr *mac = &dev->data->mac_addrs[i];
 
-               if (!memcmp(mac, &cmp, sizeof(*mac)) || 
rte_is_multicast_ether_addr(mac))
+               /* Add flows for unicast and multicast mac addresses added by 
API. */
+               if (!memcmp(mac, &cmp, sizeof(*mac)) ||
+                   !BITFIELD_ISSET(priv->mac_pmd, i) ||
+                   (dev->data->all_multicast && 
rte_is_multicast_ether_addr(mac)))
                        continue;
                memcpy(&unicast.hdr.dst_addr.addr_bytes,
                       mac->addr_bytes,
-- 
2.34.1

Reply via email to