net/mlx5e: Configure IPsec SA tables to support tunnel mode
authorLeon Romanovsky <leonro@nvidia.com>
Thu, 13 Apr 2023 12:29:21 +0000 (15:29 +0300)
committerJakub Kicinski <kuba@kernel.org>
Tue, 18 Apr 2023 01:55:25 +0000 (18:55 -0700)
Create SA flow steering tables both for RX and TX with tunnel reformat
property. This allows to add and delete extra headers needed for tunnel
mode.

Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.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_fs.c

index b47794d..060be02 100644 (file)
@@ -118,7 +118,7 @@ static void ipsec_chains_put_table(struct mlx5_fs_chains *chains, u32 prio)
 
 static struct mlx5_flow_table *ipsec_ft_create(struct mlx5_flow_namespace *ns,
                                               int level, int prio,
-                                              int max_num_groups)
+                                              int max_num_groups, u32 flags)
 {
        struct mlx5_flow_table_attr ft_attr = {};
 
@@ -127,6 +127,7 @@ static struct mlx5_flow_table *ipsec_ft_create(struct mlx5_flow_namespace *ns,
        ft_attr.max_fte = NUM_IPSEC_FTE;
        ft_attr.level = level;
        ft_attr.prio = prio;
+       ft_attr.flags = flags;
 
        return mlx5_create_auto_grouped_flow_table(ns, &ft_attr);
 }
@@ -267,6 +268,7 @@ static int rx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec,
        struct mlx5_flow_destination default_dest;
        struct mlx5_flow_destination dest[2];
        struct mlx5_flow_table *ft;
+       u32 flags = 0;
        int err;
 
        default_dest = mlx5_ttc_get_default_dest(ttc, family2tt(family));
@@ -277,7 +279,7 @@ static int rx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec,
                return err;
 
        ft = ipsec_ft_create(ns, MLX5E_ACCEL_FS_ESP_FT_ERR_LEVEL,
-                            MLX5E_NIC_PRIO, 1);
+                            MLX5E_NIC_PRIO, 1, 0);
        if (IS_ERR(ft)) {
                err = PTR_ERR(ft);
                goto err_fs_ft_status;
@@ -300,8 +302,10 @@ static int rx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec,
                goto err_add;
 
        /* Create FT */
-       ft = ipsec_ft_create(ns, MLX5E_ACCEL_FS_ESP_FT_LEVEL, MLX5E_NIC_PRIO,
-                            2);
+       if (mlx5_ipsec_device_caps(mdev) & MLX5_IPSEC_CAP_TUNNEL)
+               flags = MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
+       ft = ipsec_ft_create(ns, MLX5E_ACCEL_FS_ESP_FT_LEVEL, MLX5E_NIC_PRIO, 2,
+                            flags);
        if (IS_ERR(ft)) {
                err = PTR_ERR(ft);
                goto err_fs_ft;
@@ -327,7 +331,7 @@ static int rx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec,
        }
 
        ft = ipsec_ft_create(ns, MLX5E_ACCEL_FS_POL_FT_LEVEL, MLX5E_NIC_PRIO,
-                            2);
+                            2, 0);
        if (IS_ERR(ft)) {
                err = PTR_ERR(ft);
                goto err_pol_ft;
@@ -511,9 +515,10 @@ static int tx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec_tx *tx,
 {
        struct mlx5_flow_destination dest = {};
        struct mlx5_flow_table *ft;
+       u32 flags = 0;
        int err;
 
-       ft = ipsec_ft_create(tx->ns, 2, 0, 1);
+       ft = ipsec_ft_create(tx->ns, 2, 0, 1, 0);
        if (IS_ERR(ft))
                return PTR_ERR(ft);
        tx->ft.status = ft;
@@ -522,7 +527,9 @@ static int tx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec_tx *tx,
        if (err)
                goto err_status_rule;
 
-       ft = ipsec_ft_create(tx->ns, 1, 0, 4);
+       if (mlx5_ipsec_device_caps(mdev) & MLX5_IPSEC_CAP_TUNNEL)
+               flags = MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
+       ft = ipsec_ft_create(tx->ns, 1, 0, 4, flags);
        if (IS_ERR(ft)) {
                err = PTR_ERR(ft);
                goto err_sa_ft;
@@ -541,7 +548,7 @@ static int tx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec_tx *tx,
                goto connect_roce;
        }
 
-       ft = ipsec_ft_create(tx->ns, 0, 0, 2);
+       ft = ipsec_ft_create(tx->ns, 0, 0, 2, 0);
        if (IS_ERR(ft)) {
                err = PTR_ERR(ft);
                goto err_pol_ft;