Skip to content

Commit 762a55a

Browse files
Chris MiSaeed Mahameed
authored andcommitted
net/mlx5e: Disable IPsec offload support if not FW steering
IPsec FDB offload can only work with FW steering as of now, disable the cap upon non FW steering. And since the IPSec cap is dynamic now based on steering mode. Cleanup the resources if they exist instead of checking the IPsec cap again. Fixes: edd8b29 ("Merge branch 'mlx5-ipsec-packet-offload-support-in-eswitch-mode'") Signed-off-by: Chris Mi <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]>
1 parent 4e25b66 commit 762a55a

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -935,9 +935,11 @@ void mlx5e_ipsec_cleanup(struct mlx5e_priv *priv)
935935
return;
936936

937937
mlx5e_accel_ipsec_fs_cleanup(ipsec);
938-
if (mlx5_ipsec_device_caps(priv->mdev) & MLX5_IPSEC_CAP_TUNNEL)
938+
if (ipsec->netevent_nb.notifier_call) {
939939
unregister_netevent_notifier(&ipsec->netevent_nb);
940-
if (mlx5_ipsec_device_caps(priv->mdev) & MLX5_IPSEC_CAP_PACKET_OFFLOAD)
940+
ipsec->netevent_nb.notifier_call = NULL;
941+
}
942+
if (ipsec->aso)
941943
mlx5e_ipsec_aso_cleanup(ipsec);
942944
destroy_workqueue(ipsec->wq);
943945
kfree(ipsec);
@@ -1046,6 +1048,12 @@ static int mlx5e_xfrm_validate_policy(struct mlx5_core_dev *mdev,
10461048
}
10471049
}
10481050

1051+
if (x->xdo.type == XFRM_DEV_OFFLOAD_PACKET &&
1052+
!(mlx5_ipsec_device_caps(mdev) & MLX5_IPSEC_CAP_PACKET_OFFLOAD)) {
1053+
NL_SET_ERR_MSG_MOD(extack, "Packet offload is not supported");
1054+
return -EINVAL;
1055+
}
1056+
10491057
return 0;
10501058
}
10511059

@@ -1141,14 +1149,6 @@ static const struct xfrmdev_ops mlx5e_ipsec_xfrmdev_ops = {
11411149
.xdo_dev_state_free = mlx5e_xfrm_free_state,
11421150
.xdo_dev_offload_ok = mlx5e_ipsec_offload_ok,
11431151
.xdo_dev_state_advance_esn = mlx5e_xfrm_advance_esn_state,
1144-
};
1145-
1146-
static const struct xfrmdev_ops mlx5e_ipsec_packet_xfrmdev_ops = {
1147-
.xdo_dev_state_add = mlx5e_xfrm_add_state,
1148-
.xdo_dev_state_delete = mlx5e_xfrm_del_state,
1149-
.xdo_dev_state_free = mlx5e_xfrm_free_state,
1150-
.xdo_dev_offload_ok = mlx5e_ipsec_offload_ok,
1151-
.xdo_dev_state_advance_esn = mlx5e_xfrm_advance_esn_state,
11521152

11531153
.xdo_dev_state_update_curlft = mlx5e_xfrm_update_curlft,
11541154
.xdo_dev_policy_add = mlx5e_xfrm_add_policy,
@@ -1166,11 +1166,7 @@ void mlx5e_ipsec_build_netdev(struct mlx5e_priv *priv)
11661166

11671167
mlx5_core_info(mdev, "mlx5e: IPSec ESP acceleration enabled\n");
11681168

1169-
if (mlx5_ipsec_device_caps(mdev) & MLX5_IPSEC_CAP_PACKET_OFFLOAD)
1170-
netdev->xfrmdev_ops = &mlx5e_ipsec_packet_xfrmdev_ops;
1171-
else
1172-
netdev->xfrmdev_ops = &mlx5e_ipsec_xfrmdev_ops;
1173-
1169+
netdev->xfrmdev_ops = &mlx5e_ipsec_xfrmdev_ops;
11741170
netdev->features |= NETIF_F_HW_ESP;
11751171
netdev->hw_enc_features |= NETIF_F_HW_ESP;
11761172

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include "ipsec.h"
77
#include "lib/crypto.h"
88
#include "lib/ipsec_fs_roce.h"
9+
#include "fs_core.h"
10+
#include "eswitch.h"
911

1012
enum {
1113
MLX5_IPSEC_ASO_REMOVE_FLOW_PKT_CNT_OFFSET,
@@ -38,7 +40,10 @@ u32 mlx5_ipsec_device_caps(struct mlx5_core_dev *mdev)
3840
MLX5_CAP_ETH(mdev, insert_trailer) && MLX5_CAP_ETH(mdev, swp))
3941
caps |= MLX5_IPSEC_CAP_CRYPTO;
4042

41-
if (MLX5_CAP_IPSEC(mdev, ipsec_full_offload)) {
43+
if (MLX5_CAP_IPSEC(mdev, ipsec_full_offload) &&
44+
(mdev->priv.steering->mode == MLX5_FLOW_STEERING_MODE_DMFS ||
45+
(mdev->priv.steering->mode == MLX5_FLOW_STEERING_MODE_SMFS &&
46+
is_mdev_legacy_mode(mdev)))) {
4247
if (MLX5_CAP_FLOWTABLE_NIC_TX(mdev,
4348
reformat_add_esp_trasport) &&
4449
MLX5_CAP_FLOWTABLE_NIC_RX(mdev,
@@ -559,6 +564,7 @@ void mlx5e_ipsec_aso_cleanup(struct mlx5e_ipsec *ipsec)
559564
dma_unmap_single(pdev, aso->dma_addr, sizeof(aso->ctx),
560565
DMA_BIDIRECTIONAL);
561566
kfree(aso);
567+
ipsec->aso = NULL;
562568
}
563569

564570
static void mlx5e_ipsec_aso_copy(struct mlx5_wqe_aso_ctrl_seg *ctrl,

0 commit comments

Comments
 (0)