net/mlx5: implement multicast add list devop
authorNélio Laranjeiro <nelio.laranjeiro@6wind.com>
Mon, 23 Apr 2018 11:09:28 +0000 (13:09 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 27 Apr 2018 16:34:43 +0000 (17:34 +0100)
Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
drivers/net/mlx5/mlx5.c
drivers/net/mlx5/mlx5.h
drivers/net/mlx5/mlx5_defs.h
drivers/net/mlx5/mlx5_mac.c

index 68783c3..887924d 100644 (file)
@@ -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,
index 6ad4139..64f025d 100644 (file)
@@ -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 */
 
index e3aa03b..5973742 100644 (file)
 
 /* 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
index e9334ea..672a476 100644 (file)
@@ -201,3 +201,32 @@ 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.
+ *
+ * @see rte_eth_dev_set_mc_addr_list()
+ */
+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;
+
+       if (nb_mc_addr >= MLX5_MAX_MC_MAC_ADDRESSES) {
+               rte_errno = ENOSPC;
+               return -rte_errno;
+       }
+       for (i = MLX5_MAX_UC_MAC_ADDRESSES; i != MLX5_MAX_MAC_ADDRESSES; ++i)
+               mlx5_internal_mac_addr_remove(dev, i);
+       i = MLX5_MAX_UC_MAC_ADDRESSES;
+       while (nb_mc_addr--) {
+               ret = mlx5_internal_mac_addr_add(dev, mc_addr_set++, i++);
+               if (ret)
+                       return ret;
+       }
+       if (!dev->data->promiscuous)
+               return mlx5_traffic_restart(dev);
+       return 0;
+}