Signed-off-by: Nelio Laranjeiro <nelio.laranje...@6wind.com>
---
 drivers/net/mlx5/mlx5.c      |  2 ++
 drivers/net/mlx5/mlx5.h      |  2 ++
 drivers/net/mlx5/mlx5_defs.h |  5 +++-
 drivers/net/mlx5/mlx5_mac.c  | 52 ++++++++++++++++++++++++++++++++++++
 4 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index 68783c3ac..887924d07 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -277,6 +277,7 @@ const struct eth_dev_ops mlx5_dev_ops = {
        .mac_addr_remove = mlx5_mac_addr_remove,
        .mac_addr_add = mlx5_mac_addr_add,
        .mac_addr_set = mlx5_mac_addr_set,
+       .set_mc_addr_list = mlx5_set_mc_addr_list,
        .mtu_set = mlx5_dev_set_mtu,
        .vlan_strip_queue_set = mlx5_vlan_strip_queue_set,
        .vlan_offload_set = mlx5_vlan_offload_set,
@@ -329,6 +330,7 @@ const struct eth_dev_ops mlx5_dev_ops_isolate = {
        .mac_addr_remove = mlx5_mac_addr_remove,
        .mac_addr_add = mlx5_mac_addr_add,
        .mac_addr_set = mlx5_mac_addr_set,
+       .set_mc_addr_list = mlx5_set_mc_addr_list,
        .mtu_set = mlx5_dev_set_mtu,
        .vlan_strip_queue_set = mlx5_vlan_strip_queue_set,
        .vlan_offload_set = mlx5_vlan_offload_set,
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 6ad41390a..64f025d22 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -203,6 +203,8 @@ void mlx5_mac_addr_remove(struct rte_eth_dev *dev, uint32_t 
index);
 int mlx5_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac,
                      uint32_t index, uint32_t vmdq);
 int mlx5_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr);
+int mlx5_set_mc_addr_list(struct rte_eth_dev *dev,
+                         struct ether_addr *mc_addr_set, uint32_t nb_mc_addr);
 
 /* mlx5_rss.c */
 
diff --git a/drivers/net/mlx5/mlx5_defs.h b/drivers/net/mlx5/mlx5_defs.h
index e3aa03bef..5973742a7 100644
--- a/drivers/net/mlx5/mlx5_defs.h
+++ b/drivers/net/mlx5/mlx5_defs.h
@@ -15,8 +15,11 @@
 
 /* Maximum number of simultaneous unicast MAC addresses. */
 #define MLX5_MAX_UC_MAC_ADDRESSES 128
+/* Maximum number of simultaneous Multicast MAC addresses. */
+#define MLX5_MAX_MC_MAC_ADDRESSES 128
 /* Maximum number of simultaneous MAC addresses. */
-#define MLX5_MAX_MAC_ADDRESSES MLX5_MAX_UC_MAC_ADDRESSES
+#define MLX5_MAX_MAC_ADDRESSES \
+       (MLX5_MAX_UC_MAC_ADDRESSES + MLX5_MAX_MC_MAC_ADDRESSES)
 
 /* Maximum number of simultaneous VLAN filters. */
 #define MLX5_MAX_VLAN_IDS 128
diff --git a/drivers/net/mlx5/mlx5_mac.c b/drivers/net/mlx5/mlx5_mac.c
index 9470520b1..deeed9598 100644
--- a/drivers/net/mlx5/mlx5_mac.c
+++ b/drivers/net/mlx5/mlx5_mac.c
@@ -209,3 +209,55 @@ mlx5_mac_addr_set(struct rte_eth_dev *dev, struct 
ether_addr *mac_addr)
                dev->data->port_id);
        return mlx5_mac_addr_add(dev, mac_addr, 0, 0);
 }
+
+/**
+ * DPDK callback to set Multicast Addresses list.
+ *
+ * @param dev
+ *   Pointer to Ethernet device structure.
+ * @param mac_addr_set
+ *   Multicast MAC address pointer array.
+ * @param nb_mac_addr
+ *   Number of entries in the array.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+int
+mlx5_set_mc_addr_list(struct rte_eth_dev *dev,
+                     struct ether_addr *mc_addr_set, uint32_t nb_mc_addr)
+{
+       uint32_t i;
+       int ret;
+       int idx;
+
+       for (i = MLX5_MAX_UC_MAC_ADDRESSES;
+            i != MLX5_MAX_UC_MAC_ADDRESSES + MLX5_MAX_MC_MAC_ADDRESSES;
+            ++i)
+               if (!is_zero_ether_addr(&dev->data->mac_addrs[i])) {
+                       ret = mlx5_internal_mac_addr_remove(dev, i);
+                       if (ret < 0)
+                               return ret;
+               }
+       for (idx = MLX5_MAX_UC_MAC_ADDRESSES, i = 0;
+            i != nb_mc_addr;
+            ++i) {
+               if (!is_multicast_ether_addr(mc_addr_set)) {
+                       rte_errno = EINVAL;
+                       goto rollback;
+               }
+               ret = mlx5_internal_mac_addr_add(dev, mc_addr_set++, idx++);
+               if (ret < 0)
+                       return ret;
+       }
+       if (!dev->data->promiscuous)
+               return mlx5_traffic_restart(dev);
+       return 0;
+rollback:
+       ret = rte_errno; /* Save rte_errno before cleanup. */
+       for (i = MLX5_MAX_UC_MAC_ADDRESSES; i != MLX5_MAX_MC_MAC_ADDRESSES; ++i)
+               if (!is_zero_ether_addr(&dev->data->mac_addrs[i]))
+                       mlx5_internal_mac_addr_remove(dev, i);
+       rte_errno = ret; /* Restore rte_errno. */
+       return -rte_errno;
+}
-- 
2.17.0

Reply via email to