diff options
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c | 82 | 
1 files changed, 51 insertions, 31 deletions
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c index d4ebd8743114..b2cabd6ab86c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c @@ -310,9 +310,9 @@ static void mlx5e_macsec_destroy_object(struct mlx5_core_dev *mdev, u32 macsec_o  	mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out));  } -static void mlx5e_macsec_cleanup_sa(struct mlx5e_macsec *macsec, -				    struct mlx5e_macsec_sa *sa, -				    bool is_tx, struct net_device *netdev, u32 fs_id) +static void mlx5e_macsec_cleanup_sa_fs(struct mlx5e_macsec *macsec, +				       struct mlx5e_macsec_sa *sa, bool is_tx, +				       struct net_device *netdev, u32 fs_id)  {  	int action =  (is_tx) ?  MLX5_ACCEL_MACSEC_ACTION_ENCRYPT :  				 MLX5_ACCEL_MACSEC_ACTION_DECRYPT; @@ -322,20 +322,49 @@ static void mlx5e_macsec_cleanup_sa(struct mlx5e_macsec *macsec,  	mlx5_macsec_fs_del_rule(macsec->mdev->macsec_fs, sa->macsec_rule, action, netdev,  				fs_id); -	mlx5e_macsec_destroy_object(macsec->mdev, sa->macsec_obj_id);  	sa->macsec_rule = NULL;  } +static void mlx5e_macsec_cleanup_sa(struct mlx5e_macsec *macsec, +				    struct mlx5e_macsec_sa *sa, bool is_tx, +				    struct net_device *netdev, u32 fs_id) +{ +	mlx5e_macsec_cleanup_sa_fs(macsec, sa, is_tx, netdev, fs_id); +	mlx5e_macsec_destroy_object(macsec->mdev, sa->macsec_obj_id); +} + +static int mlx5e_macsec_init_sa_fs(struct macsec_context *ctx, +				   struct mlx5e_macsec_sa *sa, bool encrypt, +				   bool is_tx, u32 *fs_id) +{ +	struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev); +	struct mlx5_macsec_fs *macsec_fs = priv->mdev->macsec_fs; +	struct mlx5_macsec_rule_attrs rule_attrs; +	union mlx5_macsec_rule *macsec_rule; + +	rule_attrs.macsec_obj_id = sa->macsec_obj_id; +	rule_attrs.sci = sa->sci; +	rule_attrs.assoc_num = sa->assoc_num; +	rule_attrs.action = (is_tx) ? MLX5_ACCEL_MACSEC_ACTION_ENCRYPT : +				      MLX5_ACCEL_MACSEC_ACTION_DECRYPT; + +	macsec_rule = mlx5_macsec_fs_add_rule(macsec_fs, ctx, &rule_attrs, fs_id); +	if (!macsec_rule) +		return -ENOMEM; + +	sa->macsec_rule = macsec_rule; + +	return 0; +} +  static int mlx5e_macsec_init_sa(struct macsec_context *ctx,  				struct mlx5e_macsec_sa *sa,  				bool encrypt, bool is_tx, u32 *fs_id)  {  	struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);  	struct mlx5e_macsec *macsec = priv->macsec; -	struct mlx5_macsec_rule_attrs rule_attrs;  	struct mlx5_core_dev *mdev = priv->mdev;  	struct mlx5_macsec_obj_attrs obj_attrs; -	union mlx5_macsec_rule *macsec_rule;  	int err;  	obj_attrs.next_pn = sa->next_pn; @@ -357,20 +386,12 @@ static int mlx5e_macsec_init_sa(struct macsec_context *ctx,  	if (err)  		return err; -	rule_attrs.macsec_obj_id = sa->macsec_obj_id; -	rule_attrs.sci = sa->sci; -	rule_attrs.assoc_num = sa->assoc_num; -	rule_attrs.action = (is_tx) ? MLX5_ACCEL_MACSEC_ACTION_ENCRYPT : -				      MLX5_ACCEL_MACSEC_ACTION_DECRYPT; - -	macsec_rule = mlx5_macsec_fs_add_rule(mdev->macsec_fs, ctx, &rule_attrs, fs_id); -	if (!macsec_rule) { -		err = -ENOMEM; -		goto destroy_macsec_object; +	if (sa->active) { +		err = mlx5e_macsec_init_sa_fs(ctx, sa, encrypt, is_tx, fs_id); +		if (err) +			goto destroy_macsec_object;  	} -	sa->macsec_rule = macsec_rule; -  	return 0;  destroy_macsec_object: @@ -526,9 +547,7 @@ static int mlx5e_macsec_add_txsa(struct macsec_context *ctx)  		goto destroy_sa;  	macsec_device->tx_sa[assoc_num] = tx_sa; -	if (!secy->operational || -	    assoc_num != tx_sc->encoding_sa || -	    !tx_sa->active) +	if (!secy->operational)  		goto out;  	err = mlx5e_macsec_init_sa(ctx, tx_sa, tx_sc->encrypt, true, NULL); @@ -595,7 +614,7 @@ static int mlx5e_macsec_upd_txsa(struct macsec_context *ctx)  		goto out;  	if (ctx_tx_sa->active) { -		err = mlx5e_macsec_init_sa(ctx, tx_sa, tx_sc->encrypt, true, NULL); +		err = mlx5e_macsec_init_sa_fs(ctx, tx_sa, tx_sc->encrypt, true, NULL);  		if (err)  			goto out;  	} else { @@ -604,7 +623,7 @@ static int mlx5e_macsec_upd_txsa(struct macsec_context *ctx)  			goto out;  		} -		mlx5e_macsec_cleanup_sa(macsec, tx_sa, true, ctx->secy->netdev, 0); +		mlx5e_macsec_cleanup_sa_fs(macsec, tx_sa, true, ctx->secy->netdev, 0);  	}  out:  	mutex_unlock(&macsec->lock); @@ -1030,8 +1049,9 @@ static int mlx5e_macsec_del_rxsa(struct macsec_context *ctx)  		goto out;  	} -	mlx5e_macsec_cleanup_sa(macsec, rx_sa, false, ctx->secy->netdev, -				rx_sc->sc_xarray_element->fs_id); +	if (rx_sa->active) +		mlx5e_macsec_cleanup_sa(macsec, rx_sa, false, ctx->secy->netdev, +					rx_sc->sc_xarray_element->fs_id);  	mlx5_destroy_encryption_key(macsec->mdev, rx_sa->enc_key_id);  	kfree(rx_sa);  	rx_sc->rx_sa[assoc_num] = NULL; @@ -1112,8 +1132,8 @@ static int macsec_upd_secy_hw_address(struct macsec_context *ctx,  			if (!rx_sa || !rx_sa->macsec_rule)  				continue; -			mlx5e_macsec_cleanup_sa(macsec, rx_sa, false, ctx->secy->netdev, -						rx_sc->sc_xarray_element->fs_id); +			mlx5e_macsec_cleanup_sa_fs(macsec, rx_sa, false, ctx->secy->netdev, +						   rx_sc->sc_xarray_element->fs_id);  		}  	} @@ -1124,8 +1144,8 @@ static int macsec_upd_secy_hw_address(struct macsec_context *ctx,  				continue;  			if (rx_sa->active) { -				err = mlx5e_macsec_init_sa(ctx, rx_sa, true, false, -							   &rx_sc->sc_xarray_element->fs_id); +				err = mlx5e_macsec_init_sa_fs(ctx, rx_sa, true, false, +							      &rx_sc->sc_xarray_element->fs_id);  				if (err)  					goto out;  			} @@ -1178,7 +1198,7 @@ static int mlx5e_macsec_upd_secy(struct macsec_context *ctx)  		if (!tx_sa)  			continue; -		mlx5e_macsec_cleanup_sa(macsec, tx_sa, true, ctx->secy->netdev, 0); +		mlx5e_macsec_cleanup_sa_fs(macsec, tx_sa, true, ctx->secy->netdev, 0);  	}  	for (i = 0; i < MACSEC_NUM_AN; ++i) { @@ -1187,7 +1207,7 @@ static int mlx5e_macsec_upd_secy(struct macsec_context *ctx)  			continue;  		if (tx_sa->assoc_num == tx_sc->encoding_sa && tx_sa->active) { -			err = mlx5e_macsec_init_sa(ctx, tx_sa, tx_sc->encrypt, true, NULL); +			err = mlx5e_macsec_init_sa_fs(ctx, tx_sa, tx_sc->encrypt, true, NULL);  			if (err)  				goto out;  		} | 
