mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
net/mlx5e: CT: Add initial support for Hardware Steering
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>
This commit is contained in:
parent
af02dbfe37
commit
34eea5b12a
@ -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
|
||||
|
@ -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__ */
|
||||
|
47
drivers/net/ethernet/mellanox/mlx5/core/en/tc/ct_fs_hmfs.c
Normal file
47
drivers/net/ethernet/mellanox/mlx5/core/en/tc/ct_fs_hmfs.c
Normal file
@ -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;
|
||||
}
|
@ -2065,12 +2065,21 @@ 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) {
|
||||
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);
|
||||
if (!ct_priv->fs)
|
||||
return -ENOMEM;
|
||||
|
Loading…
Reference in New Issue
Block a user