Commit 6480a3b6 authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Jakub Kicinski

net/mlx5e: Prepare IPsec packet reformat code for tunnel mode

Refactor setup_pkt_reformat() function to accommodate future extension
to support tunnel mode.
Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
Reviewed-by: default avatarSridhar Samudrala <sridhar.samudrala@intel.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 006adbc6
...@@ -297,6 +297,7 @@ void mlx5e_ipsec_build_accel_xfrm_attrs(struct mlx5e_ipsec_sa_entry *sa_entry, ...@@ -297,6 +297,7 @@ void mlx5e_ipsec_build_accel_xfrm_attrs(struct mlx5e_ipsec_sa_entry *sa_entry,
attrs->upspec.sport = ntohs(x->sel.sport); attrs->upspec.sport = ntohs(x->sel.sport);
attrs->upspec.sport_mask = ntohs(x->sel.sport_mask); attrs->upspec.sport_mask = ntohs(x->sel.sport_mask);
attrs->upspec.proto = x->sel.proto; attrs->upspec.proto = x->sel.proto;
attrs->mode = x->props.mode;
mlx5e_ipsec_init_limits(sa_entry, attrs); mlx5e_ipsec_init_limits(sa_entry, attrs);
} }
......
...@@ -77,7 +77,7 @@ struct mlx5_replay_esn { ...@@ -77,7 +77,7 @@ struct mlx5_replay_esn {
struct mlx5_accel_esp_xfrm_attrs { struct mlx5_accel_esp_xfrm_attrs {
u32 spi; u32 spi;
u32 flags; u32 mode;
struct aes_gcm_keymat aes_gcm; struct aes_gcm_keymat aes_gcm;
union { union {
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "lib/fs_chains.h" #include "lib/fs_chains.h"
#define NUM_IPSEC_FTE BIT(15) #define NUM_IPSEC_FTE BIT(15)
#define MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_SIZE 16
struct mlx5e_ipsec_fc { struct mlx5e_ipsec_fc {
struct mlx5_fc *cnt; struct mlx5_fc *cnt;
...@@ -836,40 +837,80 @@ static int setup_modify_header(struct mlx5_core_dev *mdev, u32 val, u8 dir, ...@@ -836,40 +837,80 @@ static int setup_modify_header(struct mlx5_core_dev *mdev, u32 val, u8 dir,
return 0; return 0;
} }
static int setup_pkt_reformat(struct mlx5_core_dev *mdev, static int
struct mlx5_accel_esp_xfrm_attrs *attrs, setup_pkt_transport_reformat(struct mlx5_accel_esp_xfrm_attrs *attrs,
struct mlx5_flow_act *flow_act) struct mlx5_pkt_reformat_params *reformat_params)
{ {
enum mlx5_flow_namespace_type ns_type = MLX5_FLOW_NAMESPACE_EGRESS; u8 *reformatbf;
struct mlx5_pkt_reformat_params reformat_params = {};
struct mlx5_pkt_reformat *pkt_reformat;
u8 reformatbf[16] = {};
__be32 spi; __be32 spi;
if (attrs->dir == XFRM_DEV_OFFLOAD_IN) { switch (attrs->dir) {
reformat_params.type = MLX5_REFORMAT_TYPE_DEL_ESP_TRANSPORT; case XFRM_DEV_OFFLOAD_IN:
ns_type = MLX5_FLOW_NAMESPACE_KERNEL; reformat_params->type = MLX5_REFORMAT_TYPE_DEL_ESP_TRANSPORT;
goto cmd; break;
} case XFRM_DEV_OFFLOAD_OUT:
if (attrs->family == AF_INET) if (attrs->family == AF_INET)
reformat_params.type = reformat_params->type =
MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV4; MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV4;
else else
reformat_params.type = reformat_params->type =
MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV6; MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV6;
reformatbf = kzalloc(MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_SIZE,
GFP_KERNEL);
if (!reformatbf)
return -ENOMEM;
/* convert to network format */ /* convert to network format */
spi = htonl(attrs->spi); spi = htonl(attrs->spi);
memcpy(reformatbf, &spi, 4); memcpy(reformatbf, &spi, sizeof(spi));
reformat_params->param_0 = attrs->authsize;
reformat_params->size =
MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_SIZE;
reformat_params->data = reformatbf;
break;
default:
return -EINVAL;
}
return 0;
}
static int setup_pkt_reformat(struct mlx5_core_dev *mdev,
struct mlx5_accel_esp_xfrm_attrs *attrs,
struct mlx5_flow_act *flow_act)
{
struct mlx5_pkt_reformat_params reformat_params = {};
struct mlx5_pkt_reformat *pkt_reformat;
enum mlx5_flow_namespace_type ns_type;
int ret;
switch (attrs->dir) {
case XFRM_DEV_OFFLOAD_IN:
ns_type = MLX5_FLOW_NAMESPACE_KERNEL;
break;
case XFRM_DEV_OFFLOAD_OUT:
ns_type = MLX5_FLOW_NAMESPACE_EGRESS;
break;
default:
return -EINVAL;
}
switch (attrs->mode) {
case XFRM_MODE_TRANSPORT:
ret = setup_pkt_transport_reformat(attrs, &reformat_params);
break;
default:
ret = -EINVAL;
}
reformat_params.param_0 = attrs->authsize; if (ret)
reformat_params.size = sizeof(reformatbf); return ret;
reformat_params.data = &reformatbf;
cmd:
pkt_reformat = pkt_reformat =
mlx5_packet_reformat_alloc(mdev, &reformat_params, ns_type); mlx5_packet_reformat_alloc(mdev, &reformat_params, ns_type);
kfree(reformat_params.data);
if (IS_ERR(pkt_reformat)) if (IS_ERR(pkt_reformat))
return PTR_ERR(pkt_reformat); return PTR_ERR(pkt_reformat);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment