numam-dpdk/drivers/net/mlx5/hws/mlx5dr_matcher.h
Alex Vesker c467608215 net/mlx5/hws: add matcher object
HWS matcher resides under the table object, each table can
have multiple chained matches with different attributes.

Each matcher represents a combination of match and action templates,
and can contain multiple configurations based on the templates.

Packets are steered from the table to the matcher and from there to
other objects.

The matcher allows efficient HW packet field matching and action
execution based on the configuration done to it.

Signed-off-by: Alex Vesker <valex@nvidia.com>
Signed-off-by: Erez Shitrit <erezsh@nvidia.com>
2022-10-26 13:33:34 +02:00

77 lines
2.2 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) 2022 NVIDIA Corporation & Affiliates
*/
#ifndef MLX5DR_MATCHER_H_
#define MLX5DR_MATCHER_H_
/* Max supported match template */
#define MLX5DR_MATCHER_MAX_MT 2
#define MLX5DR_MATCHER_MAX_MT_ROOT 1
/* Max supported action template */
#define MLX5DR_MATCHER_MAX_AT 4
/* We calculated that concatenating a collision table to the main table with
* 3% of the main table rows will be enough resources for high insertion
* success probability.
*
* The calculation: log2(2^x * 3 / 100) = log2(2^x) + log2(3/100) = x - 5.05 ~ 5
*/
#define MLX5DR_MATCHER_ASSURED_ROW_RATIO 5
/* Thrashold to determine if amount of rules require a collision table */
#define MLX5DR_MATCHER_ASSURED_RULES_TH 10
/* Required depth of an assured collision table */
#define MLX5DR_MATCHER_ASSURED_COL_TBL_DEPTH 4
/* Required depth of the main large table */
#define MLX5DR_MATCHER_ASSURED_MAIN_TBL_DEPTH 2
struct mlx5dr_match_template {
struct rte_flow_item *items;
struct mlx5dr_definer *definer;
struct mlx5dr_definer_fc *fc;
uint32_t fc_sz;
uint64_t item_flags;
uint8_t vport_item_id;
enum mlx5dr_match_template_flags flags;
uint32_t refcount;
};
struct mlx5dr_matcher_match_ste {
struct mlx5dr_pool_chunk ste;
struct mlx5dr_devx_obj *rtc_0;
struct mlx5dr_devx_obj *rtc_1;
struct mlx5dr_pool *pool;
};
struct mlx5dr_matcher_action_ste {
struct mlx5dr_pool_chunk ste;
struct mlx5dr_pool_chunk stc;
struct mlx5dr_devx_obj *rtc_0;
struct mlx5dr_devx_obj *rtc_1;
struct mlx5dr_pool *pool;
uint8_t max_stes;
};
struct mlx5dr_matcher {
struct mlx5dr_table *tbl;
struct mlx5dr_matcher_attr attr;
struct mlx5dv_flow_matcher *dv_matcher;
struct mlx5dr_match_template *mt[MLX5DR_MATCHER_MAX_MT];
uint8_t num_of_mt;
struct mlx5dr_action_template *at[MLX5DR_MATCHER_MAX_AT];
uint8_t num_of_at;
struct mlx5dr_devx_obj *end_ft;
struct mlx5dr_matcher *col_matcher;
struct mlx5dr_matcher_match_ste match_ste;
struct mlx5dr_matcher_action_ste action_ste;
LIST_ENTRY(mlx5dr_matcher) next;
};
int mlx5dr_matcher_conv_items_to_prm(uint64_t *match_buf,
struct rte_flow_item *items,
uint8_t *match_criteria,
bool is_value);
#endif /* MLX5DR_MATCHER_H_ */