]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5e: CT: Add initial support for Hardware Steering
authorCosmin Ratiu <cratiu@nvidia.com>
Tue, 14 Jan 2025 13:06:44 +0000 (15:06 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 16 Jan 2025 03:28:04 +0000 (19:28 -0800)
Connection tracking can offload tuple matches to the NIC either via
firmware commands (when the steering mode is dmfs or offload support is
disabled due to eswitch being set to legacy) or via software-managed
flow steering (smfs).

This commit adds stub operations for a third mode, hardware-managed flow
steering. This is enabled when both CONFIG_MLX5_TC_CT and
CONFIG_MLX5_HW_STEERING are enabled.

Signed-off-by: Cosmin Ratiu <cratiu@nvidia.com>
Reviewed-by: Jianbo Liu <jianbol@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20250114130646.1937192-3-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/Makefile
drivers/net/ethernet/mellanox/mlx5/core/en/tc/ct_fs.h
drivers/net/ethernet/mellanox/mlx5/core/en/tc/ct_fs_hmfs.c [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c

index d9a8817bb33c5658c589dc1ca0550dfdee6e6d14..568bbe5f83f57b5b0dd1239c78204cf18fa6bafb 100644 (file)
@@ -60,6 +60,7 @@ mlx5_core-$(CONFIG_MLX5_CLS_ACT)     += en/tc/act/act.o en/tc/act/drop.o en/tc/a
 ifneq ($(CONFIG_MLX5_TC_CT),)
        mlx5_core-y                          += en/tc_ct.o en/tc/ct_fs_dmfs.o
        mlx5_core-$(CONFIG_MLX5_SW_STEERING) += en/tc/ct_fs_smfs.o
+       mlx5_core-$(CONFIG_MLX5_HW_STEERING) += en/tc/ct_fs_hmfs.o
 endif
 
 mlx5_core-$(CONFIG_MLX5_TC_SAMPLE)   += en/tc/sample.o
index 62b3f7ff5562118328c7b1b4343964dd70c62cea..e5b30801314b8e8791c2271215b60ea8ebe87cbb 100644 (file)
@@ -48,4 +48,14 @@ mlx5_ct_fs_smfs_ops_get(void)
 }
 #endif /* IS_ENABLED(CONFIG_MLX5_SW_STEERING) */
 
+#if IS_ENABLED(CONFIG_MLX5_HW_STEERING)
+struct mlx5_ct_fs_ops *mlx5_ct_fs_hmfs_ops_get(void);
+#else
+static inline struct mlx5_ct_fs_ops *
+mlx5_ct_fs_hmfs_ops_get(void)
+{
+       return NULL;
+}
+#endif /* IS_ENABLED(CONFIG_MLX5_SW_STEERING) */
+
 #endif /* __MLX5_EN_TC_CT_FS_H__ */
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc/ct_fs_hmfs.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc/ct_fs_hmfs.c
new file mode 100644 (file)
index 0000000..be1a36d
--- /dev/null
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/* Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. */
+
+#include "en_tc.h"
+#include "en/tc_ct.h"
+#include "en/tc/ct_fs.h"
+
+static int mlx5_ct_fs_hmfs_init(struct mlx5_ct_fs *fs, struct mlx5_flow_table *ct,
+                               struct mlx5_flow_table *ct_nat, struct mlx5_flow_table *post_ct)
+{
+       return 0;
+}
+
+static void mlx5_ct_fs_hmfs_destroy(struct mlx5_ct_fs *fs)
+{
+}
+
+static struct mlx5_ct_fs_rule *
+mlx5_ct_fs_hmfs_ct_rule_add(struct mlx5_ct_fs *fs, struct mlx5_flow_spec *spec,
+                           struct mlx5_flow_attr *attr, struct flow_rule *flow_rule)
+{
+       return ERR_PTR(-EOPNOTSUPP);
+}
+
+static void mlx5_ct_fs_hmfs_ct_rule_del(struct mlx5_ct_fs *fs, struct mlx5_ct_fs_rule *fs_rule)
+{
+}
+
+static int mlx5_ct_fs_hmfs_ct_rule_update(struct mlx5_ct_fs *fs, struct mlx5_ct_fs_rule *fs_rule,
+                                         struct mlx5_flow_spec *spec, struct mlx5_flow_attr *attr)
+{
+       return -EOPNOTSUPP;
+}
+
+static struct mlx5_ct_fs_ops hmfs_ops = {
+       .ct_rule_add = mlx5_ct_fs_hmfs_ct_rule_add,
+       .ct_rule_del = mlx5_ct_fs_hmfs_ct_rule_del,
+       .ct_rule_update = mlx5_ct_fs_hmfs_ct_rule_update,
+
+       .init = mlx5_ct_fs_hmfs_init,
+       .destroy = mlx5_ct_fs_hmfs_destroy,
+};
+
+struct mlx5_ct_fs_ops *mlx5_ct_fs_hmfs_ops_get(void)
+{
+       return &hmfs_ops;
+}
index a84ebac2f011ad3e3932dd37b72ec4d0ec24fde2..fec008c540f32257be6692acaf66d636ba49e3e8 100644 (file)
@@ -2065,10 +2065,19 @@ mlx5_tc_ct_fs_init(struct mlx5_tc_ct_priv *ct_priv)
        struct mlx5_ct_fs_ops *fs_ops = mlx5_ct_fs_dmfs_ops_get();
        int err;
 
-       if (ct_priv->ns_type == MLX5_FLOW_NAMESPACE_FDB &&
-           ct_priv->dev->priv.steering->mode == MLX5_FLOW_STEERING_MODE_SMFS) {
-               ct_dbg("Using SMFS ct flow steering provider");
-               fs_ops = mlx5_ct_fs_smfs_ops_get();
+       if (ct_priv->ns_type == MLX5_FLOW_NAMESPACE_FDB) {
+               if (ct_priv->dev->priv.steering->mode == MLX5_FLOW_STEERING_MODE_HMFS) {
+                       ct_dbg("Using HMFS ct flow steering provider");
+                       fs_ops = mlx5_ct_fs_hmfs_ops_get();
+               } else if (ct_priv->dev->priv.steering->mode == MLX5_FLOW_STEERING_MODE_SMFS) {
+                       ct_dbg("Using SMFS ct flow steering provider");
+                       fs_ops = mlx5_ct_fs_smfs_ops_get();
+               }
+
+               if (!fs_ops) {
+                       ct_dbg("Requested flow steering mode is not enabled.");
+                       return -EOPNOTSUPP;
+               }
        }
 
        ct_priv->fs = kzalloc(sizeof(*ct_priv->fs) + fs_ops->priv_size, GFP_KERNEL);