Skip to content

Commit

Permalink
mlx5: DR, Support full tunnel headers match
Browse files Browse the repository at this point in the history
Currently, the full-tunnel-header matching cannot be used along with
many other criteria within one matcher.
This patch adds the support for that by using the new definer index to
build matcher, so they can be used with all other criteria.

Signed-off-by: Shun Hao <shunh@nvidia.com>
Signed-off-by: Alex Vesker <valex@nvidia.com>
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
  • Loading branch information
Shun-Hao authored and Yishai Hadas committed Feb 28, 2022
1 parent 41003b9 commit 7d88b2d
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 25 deletions.
12 changes: 7 additions & 5 deletions providers/mlx5/dr_matcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -416,9 +416,10 @@ static bool dr_mask_is_tnl_geneve_tlv_opt_exist_set(struct dr_match_misc *misc,
misc->geneve_tlv_option_0_exist;
}

static bool dr_mask_is_tunnel_header_0_1_set(struct dr_match_misc5 *misc5)
static bool dr_mask_is_tunnel_header_set(struct dr_match_misc5 *misc5)
{
return misc5->tunnel_header_0 || misc5->tunnel_header_1;
return misc5->tunnel_header_0 || misc5->tunnel_header_1 ||
misc5->tunnel_header_2 || misc5->tunnel_header_3;
}

static int dr_matcher_supp_tnl_mpls_over_gre(struct dr_devx_caps *caps)
Expand Down Expand Up @@ -865,9 +866,10 @@ static int dr_matcher_set_ste_builders(struct mlx5dv_dr_matcher *matcher,
if (dr_mask_is_tnl_gtpu(&mask, dmn))
dr_ste_build_tnl_gtpu(ste_ctx, &sb[idx++],
&mask, inner, rx);
} else if (dr_mask_is_tunnel_header_0_1_set(&mask.misc5)) {
dr_ste_build_tunnel_header_0_1(ste_ctx, &sb[idx++],
&mask, false, rx);
} else if (dr_mask_is_tunnel_header_set(&mask.misc5)) {
dr_ste_build_tunnel_header(ste_ctx, &sb[idx++],
&mask, &dmn->info.caps,
false, rx);
}

if (DR_MASK_IS_ETH_L4_MISC_SET(mask.misc3, outer))
Expand Down
13 changes: 8 additions & 5 deletions providers/mlx5/dr_ste.c
Original file line number Diff line number Diff line change
Expand Up @@ -1408,14 +1408,17 @@ void dr_ste_build_flex_parser_1(struct dr_ste_ctx *ste_ctx,
ste_ctx->build_flex_parser_1_init(sb, mask);
}

void dr_ste_build_tunnel_header_0_1(struct dr_ste_ctx *ste_ctx,
struct dr_ste_build *sb,
struct dr_match_param *mask,
bool inner, bool rx)
void dr_ste_build_tunnel_header(struct dr_ste_ctx *ste_ctx,
struct dr_ste_build *sb,
struct dr_match_param *mask,
struct dr_devx_caps *caps,
bool inner, bool rx)
{
sb->rx = rx;
sb->inner = inner;
ste_ctx->build_tunnel_header_0_1(sb, mask);
sb->caps = caps;

ste_ctx->build_tunnel_header_init(sb, mask);
}

int dr_ste_build_def0(struct dr_ste_ctx *ste_ctx,
Expand Down
2 changes: 1 addition & 1 deletion providers/mlx5/dr_ste.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ struct dr_ste_ctx {
dr_ste_builder_void_init build_src_gvmi_qpn_init;
dr_ste_builder_void_init build_flex_parser_0_init;
dr_ste_builder_void_init build_flex_parser_1_init;
dr_ste_builder_void_init build_tunnel_header_0_1;
dr_ste_builder_void_init build_tunnel_header_init;
dr_ste_builder_void_init build_def0_init;
dr_ste_builder_void_init build_def2_init;
dr_ste_builder_void_init build_def6_init;
Expand Down
2 changes: 1 addition & 1 deletion providers/mlx5/dr_ste_v0.c
Original file line number Diff line number Diff line change
Expand Up @@ -1899,7 +1899,7 @@ static struct dr_ste_ctx ste_ctx_v0 = {
.build_src_gvmi_qpn_init = &dr_ste_v0_build_src_gvmi_qpn_init,
.build_flex_parser_0_init = &dr_ste_v0_build_flex_parser_0_init,
.build_flex_parser_1_init = &dr_ste_v0_build_flex_parser_1_init,
.build_tunnel_header_0_1 = &dr_ste_v0_build_tunnel_header_0_1_init,
.build_tunnel_header_init = &dr_ste_v0_build_tunnel_header_0_1_init,
/* Getters and Setters */
.ste_init = &dr_ste_v0_init,
.set_next_lu_type = &dr_ste_v0_set_next_lu_type,
Expand Down
25 changes: 16 additions & 9 deletions providers/mlx5/dr_ste_v1.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ enum dr_ste_v1_lu_type {
DR_STE_V1_LU_TYPE_FLEX_PARSER_1 = 0x0112,
DR_STE_V1_LU_TYPE_ETHL4_MISC_O = 0x0113,
DR_STE_V1_LU_TYPE_ETHL4_MISC_I = 0x0114,
DR_STE_V1_LU_TYPE_TNL_HEADER = 0x0117,
DR_STE_V1_LU_TYPE_MATCH = 0x0400,
DR_STE_V1_LU_TYPE_INVALID = 0x00ff,
DR_STE_V1_LU_TYPE_DONT_CARE = DR_STE_LU_TYPE_DONT_CARE,
Expand Down Expand Up @@ -2332,25 +2333,31 @@ static void dr_ste_v1_build_flex_parser_1_init(struct dr_ste_build *sb,
sb->ste_build_tag_func = &dr_ste_v1_build_felx_parser_tag;
}

static int dr_ste_v1_build_tunnel_header_0_1_tag(struct dr_match_param *value,
struct dr_ste_build *sb,
uint8_t *tag)
static int dr_ste_v1_build_tunnel_header_tag(struct dr_match_param *value,
struct dr_ste_build *sb,
uint8_t *tag)
{
struct dr_match_misc5 *misc5 = &value->misc5;

DR_STE_SET_TAG(tunnel_header_v1, tag, tunnel_header_0, misc5, tunnel_header_0);
DR_STE_SET_TAG(tunnel_header_v1, tag, tunnel_header_1, misc5, tunnel_header_1);
if (sb->caps->support_full_tnl_hdr) {
DR_STE_SET_TAG(tunnel_header_v1, tag, tunnel_header_2, misc5, tunnel_header_2);
DR_STE_SET_TAG(tunnel_header_v1, tag, tunnel_header_3, misc5, tunnel_header_3);
}

return 0;
}

static void dr_ste_v1_build_tunnel_header_0_1_init(struct dr_ste_build *sb,
struct dr_match_param *mask)
static void dr_ste_v1_build_tunnel_header_init(struct dr_ste_build *sb,
struct dr_match_param *mask)
{
sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER;
dr_ste_v1_build_tunnel_header_0_1_tag(mask, sb, sb->bit_mask);
sb->lu_type = sb->caps->support_full_tnl_hdr ?
DR_STE_V1_LU_TYPE_TNL_HEADER :
DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER;
dr_ste_v1_build_tunnel_header_tag(mask, sb, sb->bit_mask);
sb->byte_mask = dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
sb->ste_build_tag_func = &dr_ste_v1_build_tunnel_header_0_1_tag;
sb->ste_build_tag_func = &dr_ste_v1_build_tunnel_header_tag;
}

static int dr_ste_v1_build_def0_tag(struct dr_match_param *value,
Expand Down Expand Up @@ -3468,7 +3475,7 @@ static struct dr_ste_ctx ste_ctx_v1 = {
.build_src_gvmi_qpn_init = &dr_ste_v1_build_src_gvmi_qpn_init,
.build_flex_parser_0_init = &dr_ste_v1_build_flex_parser_0_init,
.build_flex_parser_1_init = &dr_ste_v1_build_flex_parser_1_init,
.build_tunnel_header_0_1 = &dr_ste_v1_build_tunnel_header_0_1_init,
.build_tunnel_header_init = &dr_ste_v1_build_tunnel_header_init,
.build_def0_init = &dr_ste_v1_build_def0_init,
.build_def2_init = &dr_ste_v1_build_def2_init,
.build_def6_init = &dr_ste_v1_build_def6_init,
Expand Down
9 changes: 5 additions & 4 deletions providers/mlx5/mlx5dv_dr.h
Original file line number Diff line number Diff line change
Expand Up @@ -595,10 +595,11 @@ void dr_ste_build_flex_parser_1(struct dr_ste_ctx *ste_ctx,
struct dr_ste_build *sb,
struct dr_match_param *mask,
bool inner, bool rx);
void dr_ste_build_tunnel_header_0_1(struct dr_ste_ctx *ste_ctx,
struct dr_ste_build *sb,
struct dr_match_param *mask,
bool inner, bool rx);
void dr_ste_build_tunnel_header(struct dr_ste_ctx *ste_ctx,
struct dr_ste_build *sb,
struct dr_match_param *mask,
struct dr_devx_caps *caps,
bool inner, bool rx);
int dr_ste_build_def0(struct dr_ste_ctx *ste_ctx,
struct dr_ste_build *sb,
struct dr_match_param *mask,
Expand Down

0 comments on commit 7d88b2d

Please sign in to comment.