net/mlx5e: IPoIB, Enable loopback packets for IPoIB interfaces
authorErez Shitrit <erezsh@mellanox.com>
Sun, 3 May 2020 10:01:37 +0000 (13:01 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 15 May 2020 22:44:30 +0000 (15:44 -0700)
Enable loopback of unicast and multicast traffic for IPoIB enhanced
mode.
This will allow interfaces with the same pkey to communicate between
them e.g cloned interfaces that located in different namespaces.

Signed-off-by: Erez Shitrit <erezsh@mellanox.com>
Reviewed-by: Alex Vesker <valex@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en_common.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c

index 195162b9b2453326cd51a642ddd7e8886ebe8914..ac385ac93fe5c168239304f3d085dad3d47ebca7 100644 (file)
@@ -1082,7 +1082,8 @@ void mlx5e_destroy_tir(struct mlx5_core_dev *mdev,
                       struct mlx5e_tir *tir);
 int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev);
 void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev);
-int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb);
+int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb,
+                      bool enable_mc_lb);
 
 /* common netdev helpers */
 void mlx5e_create_q_counters(struct mlx5e_priv *priv);
index af3228b3f3033e87288ff02e6698e5a283a4704d..1e42c7ae621b9f14cfe602a8b827f2ea5bff2b49 100644 (file)
@@ -141,10 +141,12 @@ void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
        memset(res, 0, sizeof(*res));
 }
 
-int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb)
+int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb,
+                      bool enable_mc_lb)
 {
        struct mlx5_core_dev *mdev = priv->mdev;
        struct mlx5e_tir *tir;
+       u8 lb_flags = 0;
        int err  = 0;
        u32 tirn = 0;
        int inlen;
@@ -158,8 +160,13 @@ int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb)
        }
 
        if (enable_uc_lb)
-               MLX5_SET(modify_tir_in, in, ctx.self_lb_block,
-                        MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST);
+               lb_flags = MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST;
+
+       if (enable_mc_lb)
+               lb_flags |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST;
+
+       if (lb_flags)
+               MLX5_SET(modify_tir_in, in, ctx.self_lb_block, lb_flags);
 
        MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1);
 
index 0e4ca08ddca9d38e42a2e77f95331f3649022e40..65e2b364443eecb6ba67d8582f74a550161debbe 100644 (file)
@@ -5275,7 +5275,7 @@ static void mlx5e_nic_disable(struct mlx5e_priv *priv)
 
 int mlx5e_update_nic_rx(struct mlx5e_priv *priv)
 {
-       return mlx5e_refresh_tirs(priv, false);
+       return mlx5e_refresh_tirs(priv, false, false);
 }
 
 static const struct mlx5e_profile mlx5e_nic_profile = {
index bbff8d8ded767ce411dca360fe43ef5a3942ef26..46790216ce8637c0940a40e38f640717a8d63ecc 100644 (file)
@@ -234,7 +234,7 @@ static int mlx5e_test_loopback_setup(struct mlx5e_priv *priv,
                        return err;
        }
 
-       err = mlx5e_refresh_tirs(priv, true);
+       err = mlx5e_refresh_tirs(priv, true, false);
        if (err)
                goto out;
 
@@ -263,7 +263,7 @@ static void mlx5e_test_loopback_cleanup(struct mlx5e_priv *priv,
                mlx5_nic_vport_update_local_lb(priv->mdev, false);
 
        dev_remove_pack(&lbtp->pt);
-       mlx5e_refresh_tirs(priv, false);
+       mlx5e_refresh_tirs(priv, false, false);
 }
 
 #define MLX5E_LB_VERIFY_TIMEOUT (msecs_to_jiffies(200))
index 035bd21e5d4e44de32b3ea0d8cac6b8220fd2716..7db70b6ccc07c49a4b54f499cae5144cd5b1ccf2 100644 (file)
@@ -262,6 +262,11 @@ void mlx5i_destroy_underlay_qp(struct mlx5_core_dev *mdev, u32 qpn)
        mlx5_cmd_exec_in(mdev, destroy_qp, in);
 }
 
+int mlx5i_update_nic_rx(struct mlx5e_priv *priv)
+{
+       return mlx5e_refresh_tirs(priv, true, true);
+}
+
 int mlx5i_create_tis(struct mlx5_core_dev *mdev, u32 underlay_qpn, u32 *tisn)
 {
        u32 in[MLX5_ST_SZ_DW(create_tis_in)] = {};
@@ -456,7 +461,7 @@ static const struct mlx5e_profile mlx5i_nic_profile = {
        .cleanup_rx        = mlx5i_cleanup_rx,
        .enable            = NULL, /* mlx5i_enable */
        .disable           = NULL, /* mlx5i_disable */
-       .update_rx         = mlx5e_update_nic_rx,
+       .update_rx         = mlx5i_update_nic_rx,
        .update_stats      = NULL, /* mlx5i_update_stats */
        .update_carrier    = NULL, /* no HW update in IB link */
        .rx_handlers.handle_rx_cqe       = mlx5i_handle_rx_cqe,
index c4aa47018c0ed21fa2b6ac8a5e36265b23e95aae..79071a15c4ca76c2ff2cd0d33a46299e697459ec 100644 (file)
@@ -92,6 +92,8 @@ int mlx5i_init(struct mlx5_core_dev *mdev,
               void *ppriv);
 void mlx5i_cleanup(struct mlx5e_priv *priv);
 
+int mlx5i_update_nic_rx(struct mlx5e_priv *priv);
+
 /* Get child interface nic profile */
 const struct mlx5e_profile *mlx5i_pkey_get_profile(void);
 
index b9af37ad40bfa105782ab0db3fbcb6f229f5a667..f70367018862f2a3cce5471681aab09486aaf8b0 100644 (file)
@@ -347,7 +347,7 @@ static const struct mlx5e_profile mlx5i_pkey_nic_profile = {
        .cleanup_rx        = mlx5i_pkey_cleanup_rx,
        .enable            = NULL,
        .disable           = NULL,
-       .update_rx         = mlx5e_update_nic_rx,
+       .update_rx         = mlx5i_update_nic_rx,
        .update_stats      = NULL,
        .rx_handlers.handle_rx_cqe       = mlx5i_handle_rx_cqe,
        .rx_handlers.handle_rx_cqe_mpwqe = NULL, /* Not supported */