net/mlx5: add translation of connection tracking item

The return register of the DR action will be used for matching.
After the ASO CT checking of a TCP packet, the syndrome is filled in
the register. Only the 8 LSB should be used. A converting from
RTE_FLOW_CONNTRACK_FLAG* to the syndrome should be done after
checking the spec and mask fields.

Signed-off-by: Bing Zhao <bingz@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
This commit is contained in:
Bing Zhao 2021-05-05 15:23:23 +03:00 committed by Raslan Darawsheh
parent 2d084f69aa
commit 5cac1a5c8d
2 changed files with 69 additions and 0 deletions

@ -409,6 +409,13 @@ enum mlx5_feature_name {
/* Maximum number of fields to modify in MODIFY_FIELD */
#define MLX5_ACT_MAX_MOD_FIELDS 5
/* Syndrome bits definition for connection tracking. */
#define MLX5_CT_SYNDROME_VALID (0x0 << 6)
#define MLX5_CT_SYNDROME_INVALID (0x1 << 6)
#define MLX5_CT_SYNDROME_TRAP (0x2 << 6)
#define MLX5_CT_SYNDROME_STATE_CHANGE (0x1 << 1)
#define MLX5_CT_SYNDROME_BAD_PACKET (0x1 << 0)
enum mlx5_flow_drv_type {
MLX5_FLOW_TYPE_MIN,
MLX5_FLOW_TYPE_DV,

@ -9615,6 +9615,64 @@ flow_dv_translate_item_ecpri(struct rte_eth_dev *dev, void *matcher,
}
}
/*
* Add connection tracking status item to matcher
*
* @param[in] dev
* The devich to configure through.
* @param[in, out] matcher
* Flow matcher.
* @param[in, out] key
* Flow matcher value.
* @param[in] item
* Flow pattern to translate.
*/
static void
flow_dv_translate_item_aso_ct(struct rte_eth_dev *dev,
void *matcher, void *key,
const struct rte_flow_item *item)
{
uint32_t reg_value = 0;
int reg_id;
/* 8LSB 0b 11/0000/11, middle 4 bits are reserved. */
uint32_t reg_mask = 0;
const struct rte_flow_item_conntrack *spec = item->spec;
const struct rte_flow_item_conntrack *mask = item->mask;
uint32_t flags;
struct rte_flow_error error;
if (!mask)
mask = &rte_flow_item_conntrack_mask;
if (!spec || !mask->flags)
return;
flags = spec->flags & mask->flags;
/* The conflict should be checked in the validation. */
if (flags & RTE_FLOW_CONNTRACK_PKT_STATE_VALID)
reg_value |= MLX5_CT_SYNDROME_VALID;
if (flags & RTE_FLOW_CONNTRACK_PKT_STATE_CHANGED)
reg_value |= MLX5_CT_SYNDROME_STATE_CHANGE;
if (flags & RTE_FLOW_CONNTRACK_PKT_STATE_INVALID)
reg_value |= MLX5_CT_SYNDROME_INVALID;
if (flags & RTE_FLOW_CONNTRACK_PKT_STATE_DISABLED)
reg_value |= MLX5_CT_SYNDROME_TRAP;
if (flags & RTE_FLOW_CONNTRACK_PKT_STATE_BAD)
reg_value |= MLX5_CT_SYNDROME_BAD_PACKET;
if (mask->flags & (RTE_FLOW_CONNTRACK_PKT_STATE_VALID |
RTE_FLOW_CONNTRACK_PKT_STATE_INVALID |
RTE_FLOW_CONNTRACK_PKT_STATE_DISABLED))
reg_mask |= 0xc0;
if (mask->flags & RTE_FLOW_CONNTRACK_PKT_STATE_CHANGED)
reg_mask |= MLX5_CT_SYNDROME_STATE_CHANGE;
if (mask->flags & RTE_FLOW_CONNTRACK_PKT_STATE_BAD)
reg_mask |= MLX5_CT_SYNDROME_BAD_PACKET;
/* The REG_C_x value could be saved during startup. */
reg_id = mlx5_flow_get_reg_id(dev, MLX5_ASO_CONNTRACK, 0, &error);
if (reg_id == REG_NON)
return;
flow_dv_match_meta_reg(matcher, key, (enum modify_reg)reg_id,
reg_value, reg_mask);
}
static uint32_t matcher_zero[MLX5_ST_SZ_DW(fte_match_param)] = { 0 };
#define HEADER_IS_ZERO(match_criteria, headers) \
@ -12726,6 +12784,10 @@ flow_dv_translate(struct rte_eth_dev *dev,
match_value,
head_item, items);
break;
case RTE_FLOW_ITEM_TYPE_CONNTRACK:
flow_dv_translate_item_aso_ct(dev, match_mask,
match_value, items);
break;
default:
break;
}