net/mlx5e: Prepare IPsec packet reformat code for tunnel mode
authorLeon Romanovsky <leonro@nvidia.com>
Thu, 13 Apr 2023 12:29:22 +0000 (15:29 +0300)
committerJakub Kicinski <kuba@kernel.org>
Tue, 18 Apr 2023 01:55:25 +0000 (18:55 -0700)
Refactor setup_pkt_reformat() function to accommodate future extension
to support tunnel mode.

Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Reviewed-by: Sridhar Samudrala <sridhar.samudrala@intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c

index def01bf..359da27 100644 (file)
@@ -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_mask = ntohs(x->sel.sport_mask);
        attrs->upspec.proto = x->sel.proto;
+       attrs->mode = x->props.mode;
 
        mlx5e_ipsec_init_limits(sa_entry, attrs);
 }
index bb89e18..ae52542 100644 (file)
@@ -77,7 +77,7 @@ struct mlx5_replay_esn {
 
 struct mlx5_accel_esp_xfrm_attrs {
        u32   spi;
-       u32   flags;
+       u32   mode;
        struct aes_gcm_keymat aes_gcm;
 
        union {
index 060be02..6a1ed41 100644 (file)
@@ -10,6 +10,7 @@
 #include "lib/fs_chains.h"
 
 #define NUM_IPSEC_FTE BIT(15)
+#define MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_SIZE 16
 
 struct mlx5e_ipsec_fc {
        struct mlx5_fc *cnt;
@@ -836,40 +837,80 @@ static int setup_modify_header(struct mlx5_core_dev *mdev, u32 val, u8 dir,
        return 0;
 }
 
+static int
+setup_pkt_transport_reformat(struct mlx5_accel_esp_xfrm_attrs *attrs,
+                            struct mlx5_pkt_reformat_params *reformat_params)
+{
+       u8 *reformatbf;
+       __be32 spi;
+
+       switch (attrs->dir) {
+       case XFRM_DEV_OFFLOAD_IN:
+               reformat_params->type = MLX5_REFORMAT_TYPE_DEL_ESP_TRANSPORT;
+               break;
+       case XFRM_DEV_OFFLOAD_OUT:
+               if (attrs->family == AF_INET)
+                       reformat_params->type =
+                               MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV4;
+               else
+                       reformat_params->type =
+                               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 */
+               spi = htonl(attrs->spi);
+               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)
 {
-       enum mlx5_flow_namespace_type ns_type = MLX5_FLOW_NAMESPACE_EGRESS;
        struct mlx5_pkt_reformat_params reformat_params = {};
        struct mlx5_pkt_reformat *pkt_reformat;
-       u8 reformatbf[16] = {};
-       __be32 spi;
+       enum mlx5_flow_namespace_type ns_type;
+       int ret;
 
-       if (attrs->dir == XFRM_DEV_OFFLOAD_IN) {
-               reformat_params.type = MLX5_REFORMAT_TYPE_DEL_ESP_TRANSPORT;
+       switch (attrs->dir) {
+       case XFRM_DEV_OFFLOAD_IN:
                ns_type = MLX5_FLOW_NAMESPACE_KERNEL;
-               goto cmd;
+               break;
+       case XFRM_DEV_OFFLOAD_OUT:
+               ns_type = MLX5_FLOW_NAMESPACE_EGRESS;
+               break;
+       default:
+               return -EINVAL;
        }
 
-       if (attrs->family == AF_INET)
-               reformat_params.type =
-                       MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV4;
-       else
-               reformat_params.type =
-                       MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV6;
-
-       /* convert to network format */
-       spi = htonl(attrs->spi);
-       memcpy(reformatbf, &spi, 4);
+       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;
-       reformat_params.size = sizeof(reformatbf);
-       reformat_params.data = &reformatbf;
+       if (ret)
+               return ret;
 
-cmd:
        pkt_reformat =
                mlx5_packet_reformat_alloc(mdev, &reformat_params, ns_type);
+       kfree(reformat_params.data);
        if (IS_ERR(pkt_reformat))
                return PTR_ERR(pkt_reformat);