]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: support promiscuous modes on Windows
authorAdham Masarwah <adham@nvidia.com>
Sun, 10 Apr 2022 10:31:06 +0000 (13:31 +0300)
committerRaslan Darawsheh <rasland@nvidia.com>
Thu, 21 Apr 2022 10:47:42 +0000 (12:47 +0200)
Support of the set promiscuous modes by calling the new API
In Mlx5DevX Lib.
Added new glue API for Windows which will be used to communicate
with Windows driver to enable/disable PROMISC or ALLMC.

Signed-off-by: Adham Masarwah <adham@nvidia.com>
Tested-by: Idan Hackmon <idanhac@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
doc/guides/rel_notes/release_22_07.rst
drivers/common/mlx5/windows/mlx5_glue.c
drivers/common/mlx5/windows/mlx5_glue.h
drivers/net/mlx5/windows/mlx5_os.c

index 90123bb80780ca62af0d0ecfbbe5bf28742318b4..cdfe97a49a95664af4de16543caba790d5fcd967 100644 (file)
@@ -60,6 +60,10 @@ New Features
   * Added Tx QoS queue rate limitation support.
   * Added quanta size configuration support.
 
+* **Updated Mellanox mlx5 driver.**
+
+  * Added support for promiscuous mode on Windows.
+
 
 Removed Items
 -------------
index 535487a8d4e5bcc5b62c2da7381ac34fd3680703..73d63ffd98f207f732f895910fb3b45d67110fa8 100644 (file)
@@ -328,6 +328,36 @@ mlx5_glue_devx_init_showdown_event(void *ctx)
        return 0;
 }
 
+static int
+mlx5_glue_devx_set_promisc_vport(void *ctx, uint32_t promisc_type, uint8_t f_enable)
+{
+#ifdef HAVE_DEVX_SET_PROMISC_SUPPORT
+       int devx_promisc_type = MLX5_DEVX_SET_PROMISC_VPORT_PROMISC_MODE;
+       struct mlx5_context *mlx5_ctx;
+       int err;
+
+       if (!ctx) {
+               errno = EINVAL;
+               return errno;
+       }
+       mlx5_ctx = (struct mlx5_context *)ctx;
+       if (promisc_type == MC_PROMISC)
+               devx_promisc_type = MLX5_DEVX_SET_PROMISC_VPORT_ALL_MULTICAST;
+       err = devx_set_promisc_vport(mlx5_ctx->devx_ctx, devx_promisc_type, f_enable);
+       if (err) {
+               errno = err;
+               return errno;
+       }
+       return 0;
+#else
+       (void)promisc_type;
+       (void)f_enable;
+       (void)ctx;
+       DRV_LOG(WARNING, "%s: is not supported", __func__);
+       return -ENOTSUP;
+#endif
+}
+
 alignas(RTE_CACHE_LINE_SIZE)
 const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue){
        .version = MLX5_GLUE_VERSION,
@@ -351,4 +381,5 @@ const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue){
        .devx_query_eqn = mlx5_glue_devx_query_eqn,
        .query_rt_values = mlx5_glue_query_rt_values,
        .devx_init_showdown_event = mlx5_glue_devx_init_showdown_event,
+       .devx_set_promisc_vport = mlx5_glue_devx_set_promisc_vport,
 };
index db8f2e8319be131069bd872ccc48f4abd9aac027..eae8070b3ffaa088533aab6541c6b4c67ffd27cb 100644 (file)
@@ -49,6 +49,11 @@ struct mlx5dv_dr_action_dest_attr {
 };
 #endif
 
+enum {
+       ALL_PROMISC,
+       MC_PROMISC,
+};
+
 /* LIB_GLUE_VERSION must be updated every time this structure is modified. */
 struct mlx5_glue {
        const char *version;
@@ -87,6 +92,7 @@ struct mlx5_glue {
        int (*devx_query_eqn)(void *context, uint32_t cpus, uint32_t *eqn);
        int (*query_rt_values)(void *ctx, void *devx_clock);
        int (*devx_init_showdown_event)(void *ctx);
+       int (*devx_set_promisc_vport)(void *ctx, uint32_t promisc_type, uint8_t f_enable);
 };
 
 extern const struct mlx5_glue *mlx5_glue;
index c7bb81549eb793e687fd927097dc0d5959738c53..77f04cc9318d6092e3ddac80126950be2d7778d8 100644 (file)
@@ -729,7 +729,6 @@ mlx5_os_vf_mac_addr_modify(struct mlx5_priv *priv,
 
 /**
  * Set device promiscuous mode
- * Currently it has no support under Windows.
  *
  * @param dev
  *   Pointer to Ethernet device structure.
@@ -742,10 +741,9 @@ mlx5_os_vf_mac_addr_modify(struct mlx5_priv *priv,
 int
 mlx5_os_set_promisc(struct rte_eth_dev *dev, int enable)
 {
-       (void)dev;
-       (void)enable;
-       DRV_LOG(WARNING, "%s: is not supported", __func__);
-       return -ENOTSUP;
+       struct mlx5_priv *priv = dev->data->dev_private;
+
+       return mlx5_glue->devx_set_promisc_vport(priv->sh->cdev->ctx, ALL_PROMISC, enable);
 }
 
 /**
@@ -762,10 +760,9 @@ mlx5_os_set_promisc(struct rte_eth_dev *dev, int enable)
 int
 mlx5_os_set_allmulti(struct rte_eth_dev *dev, int enable)
 {
-       (void)dev;
-       (void)enable;
-       DRV_LOG(WARNING, "%s: is not supported", __func__);
-       return -ENOTSUP;
+       struct mlx5_priv *priv = dev->data->dev_private;
+
+       return mlx5_glue->devx_set_promisc_vport(priv->sh->cdev->ctx, MC_PROMISC, enable);
 }
 
 /**