net/mlx5: CT: Add support for matching on ct_state inv and rel flags
Add support for matching on ct_state inv and rel flags. Currently the support is only for match on -inv and -rel. Matching on +inv and +rel will be rejected. Example: $ tc filter add dev ens1f0_0 ingress prio 1 chain 1 proto ip flower \ ct_state -est-rel+trk \ action mirred egress redirect dev ens1f0_1 $ tc filter add dev ens1f0_1 ingress prio 1 chain 1 proto ip flower \ ct_state +trk+est-inv \ action mirred egress redirect dev ens1f0_0 Signed-off-by: Ariel Levkovich <lariel@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
bd78980be1
commit
116c76c510
@ -29,6 +29,8 @@
|
||||
#define MLX5_CT_STATE_TRK_BIT BIT(2)
|
||||
#define MLX5_CT_STATE_NAT_BIT BIT(3)
|
||||
#define MLX5_CT_STATE_REPLY_BIT BIT(4)
|
||||
#define MLX5_CT_STATE_RELATED_BIT BIT(5)
|
||||
#define MLX5_CT_STATE_INVALID_BIT BIT(6)
|
||||
|
||||
#define MLX5_FTE_ID_BITS (mlx5e_tc_attr_to_reg_mappings[FTEID_TO_REG].mlen * 8)
|
||||
#define MLX5_FTE_ID_MAX GENMASK(MLX5_FTE_ID_BITS - 1, 0)
|
||||
@ -1207,8 +1209,8 @@ mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
|
||||
struct mlx5_ct_attr *ct_attr,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
bool trk, est, untrk, unest, new, rpl, unrpl, rel, unrel, inv, uninv;
|
||||
struct flow_rule *rule = flow_cls_offload_flow_rule(f);
|
||||
bool trk, est, untrk, unest, new, rpl, unrpl;
|
||||
struct flow_dissector_key_ct *mask, *key;
|
||||
u32 ctstate = 0, ctstate_mask = 0;
|
||||
u16 ct_state_on, ct_state_off;
|
||||
@ -1236,7 +1238,9 @@ mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
|
||||
if (ct_state_mask & ~(TCA_FLOWER_KEY_CT_FLAGS_TRACKED |
|
||||
TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED |
|
||||
TCA_FLOWER_KEY_CT_FLAGS_NEW |
|
||||
TCA_FLOWER_KEY_CT_FLAGS_REPLY)) {
|
||||
TCA_FLOWER_KEY_CT_FLAGS_REPLY |
|
||||
TCA_FLOWER_KEY_CT_FLAGS_RELATED |
|
||||
TCA_FLOWER_KEY_CT_FLAGS_INVALID)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"only ct_state trk, est, new and rpl are supported for offload");
|
||||
return -EOPNOTSUPP;
|
||||
@ -1248,9 +1252,13 @@ mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
|
||||
new = ct_state_on & TCA_FLOWER_KEY_CT_FLAGS_NEW;
|
||||
est = ct_state_on & TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED;
|
||||
rpl = ct_state_on & TCA_FLOWER_KEY_CT_FLAGS_REPLY;
|
||||
rel = ct_state_on & TCA_FLOWER_KEY_CT_FLAGS_RELATED;
|
||||
inv = ct_state_on & TCA_FLOWER_KEY_CT_FLAGS_INVALID;
|
||||
untrk = ct_state_off & TCA_FLOWER_KEY_CT_FLAGS_TRACKED;
|
||||
unest = ct_state_off & TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED;
|
||||
unrpl = ct_state_off & TCA_FLOWER_KEY_CT_FLAGS_REPLY;
|
||||
unrel = ct_state_off & TCA_FLOWER_KEY_CT_FLAGS_RELATED;
|
||||
uninv = ct_state_off & TCA_FLOWER_KEY_CT_FLAGS_INVALID;
|
||||
|
||||
ctstate |= trk ? MLX5_CT_STATE_TRK_BIT : 0;
|
||||
ctstate |= est ? MLX5_CT_STATE_ESTABLISHED_BIT : 0;
|
||||
@ -1258,6 +1266,20 @@ mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
|
||||
ctstate_mask |= (untrk || trk) ? MLX5_CT_STATE_TRK_BIT : 0;
|
||||
ctstate_mask |= (unest || est) ? MLX5_CT_STATE_ESTABLISHED_BIT : 0;
|
||||
ctstate_mask |= (unrpl || rpl) ? MLX5_CT_STATE_REPLY_BIT : 0;
|
||||
ctstate_mask |= unrel ? MLX5_CT_STATE_RELATED_BIT : 0;
|
||||
ctstate_mask |= uninv ? MLX5_CT_STATE_INVALID_BIT : 0;
|
||||
|
||||
if (rel) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"matching on ct_state +rel isn't supported");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (inv) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"matching on ct_state +inv isn't supported");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (new) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
|
Loading…
x
Reference in New Issue
Block a user