net/mlx5e: MACsec, fix RX data path 16 RX security channel limit
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>
This commit is contained in:
parent
406e6db7fc
commit
813115c466
@ -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);
|
||||
|
@ -10,9 +10,11 @@
|
||||
#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;
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user