net/mlx5e: MACsec, fix RX data path 16 RX security channel limit
authorRaed Salem <raeds@nvidia.com>
Thu, 27 Oct 2022 12:47:17 +0000 (15:47 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Thu, 24 Nov 2022 08:03:21 +0000 (00:03 -0800)
Currently the data path metadata flow id mask wrongly limits the
number of different RX security channels (SC) to 16, whereas in
adding RX SC the limit is "2^16 - 1" this cause an overlap in
metadata flow id once more than 16 RX SCs is added, this corrupts
MACsec RX offloaded flow handling.

Fix by using the correct mask, while at it improve code to use this
mask when adding the Rx rule and improve visibility of such errors
by adding debug massage.

Fixes: b7c9400cbc48 ("net/mlx5e: Implement MACsec Rx data path using MACsec skb_metadata_dst")
Signed-off-by: Raed Salem <raeds@nvidia.com>
Reviewed-by: Emeel Hakim <ehakim@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec_fs.c

index 3dc6c987b8da72c13f62cc300ff720fd1878cab3..96fa553ef93a881e2cd5a25c391c2c6749748e3e 100644 (file)
@@ -736,9 +736,14 @@ static int mlx5e_macsec_add_rxsc(struct macsec_context *ctx)
 
        sc_xarray_element->rx_sc = rx_sc;
        err = xa_alloc(&macsec->sc_xarray, &sc_xarray_element->fs_id, sc_xarray_element,
-                      XA_LIMIT(1, USHRT_MAX), GFP_KERNEL);
-       if (err)
+                      XA_LIMIT(1, MLX5_MACEC_RX_FS_ID_MAX), GFP_KERNEL);
+       if (err) {
+               if (err == -EBUSY)
+                       netdev_err(ctx->netdev,
+                                  "MACsec offload: unable to create entry for RX SC (%d Rx SCs already allocated)\n",
+                                  MLX5_MACEC_RX_FS_ID_MAX);
                goto destroy_sc_xarray_elemenet;
+       }
 
        rx_sc->md_dst = metadata_dst_alloc(0, METADATA_MACSEC, GFP_KERNEL);
        if (!rx_sc->md_dst) {
@@ -1748,7 +1753,7 @@ void mlx5e_macsec_offload_handle_rx_skb(struct net_device *netdev,
        if (!macsec)
                return;
 
-       fs_id = MLX5_MACSEC_METADATA_HANDLE(macsec_meta_data);
+       fs_id = MLX5_MACSEC_RX_METADAT_HANDLE(macsec_meta_data);
 
        rcu_read_lock();
        sc_xarray_element = xa_load(&macsec->sc_xarray, fs_id);
index d580b4a91253c80c612b5093d68cfc4487743044..347380a2cd9c7fca2b903eec872f8c1978b512fb 100644 (file)
 #include <net/macsec.h>
 #include <net/dst_metadata.h>
 
-/* Bit31 - 30: MACsec marker, Bit3-0: MACsec id */
+/* Bit31 - 30: MACsec marker, Bit15-0: MACsec id */
+#define MLX5_MACEC_RX_FS_ID_MAX USHRT_MAX /* Must be power of two */
+#define MLX5_MACSEC_RX_FS_ID_MASK MLX5_MACEC_RX_FS_ID_MAX
 #define MLX5_MACSEC_METADATA_MARKER(metadata)  ((((metadata) >> 30) & 0x3)  == 0x1)
-#define MLX5_MACSEC_METADATA_HANDLE(metadata)  ((metadata) & GENMASK(3, 0))
+#define MLX5_MACSEC_RX_METADAT_HANDLE(metadata)  ((metadata) & MLX5_MACSEC_RX_FS_ID_MASK)
 
 struct mlx5e_priv;
 struct mlx5e_macsec;
index 96cec6d826c2da4d4e08cc9375498a357b2ad86e..f87a1c4021bc1cf4e7e2f72a16059bc7793b40ac 100644 (file)
@@ -1146,10 +1146,10 @@ macsec_fs_rx_add_rule(struct mlx5e_macsec_fs *macsec_fs,
        ft_crypto = &rx_tables->ft_crypto;
 
        /* Set bit[31 - 30] macsec marker - 0x01 */
-       /* Set bit[3-0] fs id */
+       /* Set bit[15-0] fs id */
        MLX5_SET(set_action_in, action, action_type, MLX5_ACTION_TYPE_SET);
        MLX5_SET(set_action_in, action, field, MLX5_ACTION_IN_FIELD_METADATA_REG_B);
-       MLX5_SET(set_action_in, action, data, fs_id | BIT(30));
+       MLX5_SET(set_action_in, action, data, MLX5_MACSEC_RX_METADAT_HANDLE(fs_id) | BIT(30));
        MLX5_SET(set_action_in, action, offset, 0);
        MLX5_SET(set_action_in, action, length, 32);