Skip to content

Commit b6d1223

Browse files
Yevgeny KliteynikSaeed Mahameed
authored andcommitted
net/mlx5: DR, Add support for Geneve packets SW steering
Add support for SW steering matching on Geneve header fields: - VNI - OAM - protocol type - options length Signed-off-by: Yevgeny Kliteynik <[email protected]> Reviewed-by: Alex Vesker <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent a18fab4 commit b6d1223

File tree

3 files changed

+83
-0
lines changed

3 files changed

+83
-0
lines changed

drivers/net/ethernet/mellanox/mlx5/core/steering/dr_matcher.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,29 @@ dr_mask_is_flex_parser_tnl_vxlan_gpe_set(struct mlx5dr_match_param *mask,
125125
dr_matcher_supp_flex_parser_vxlan_gpe(&dmn->info.caps);
126126
}
127127

128+
static bool dr_mask_is_misc_geneve_set(struct mlx5dr_match_misc *misc)
129+
{
130+
return misc->geneve_vni ||
131+
misc->geneve_oam ||
132+
misc->geneve_protocol_type ||
133+
misc->geneve_opt_len;
134+
}
135+
136+
static bool
137+
dr_matcher_supp_flex_parser_geneve(struct mlx5dr_cmd_caps *caps)
138+
{
139+
return caps->flex_protocols &
140+
MLX5_FLEX_PARSER_GENEVE_ENABLED;
141+
}
142+
143+
static bool
144+
dr_mask_is_flex_parser_tnl_geneve_set(struct mlx5dr_match_param *mask,
145+
struct mlx5dr_domain *dmn)
146+
{
147+
return dr_mask_is_misc_geneve_set(&mask->misc) &&
148+
dr_matcher_supp_flex_parser_geneve(&dmn->info.caps);
149+
}
150+
128151
static bool dr_mask_is_flex_parser_icmpv6_set(struct mlx5dr_match_misc3 *misc3)
129152
{
130153
return (misc3->icmpv6_type || misc3->icmpv6_code ||
@@ -275,6 +298,10 @@ static int dr_matcher_set_ste_builders(struct mlx5dr_matcher *matcher,
275298
mlx5dr_ste_build_flex_parser_tnl_vxlan_gpe(&sb[idx++],
276299
&mask,
277300
inner, rx);
301+
else if (dr_mask_is_flex_parser_tnl_geneve_set(&mask, dmn))
302+
mlx5dr_ste_build_flex_parser_tnl_geneve(&sb[idx++],
303+
&mask,
304+
inner, rx);
278305

279306
if (DR_MASK_IS_ETH_L4_MISC_SET(mask.misc3, outer))
280307
mlx5dr_ste_build_eth_l4_misc(&sb[idx++], &mask, inner, rx);

drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2156,6 +2156,59 @@ void mlx5dr_ste_build_flex_parser_tnl_vxlan_gpe(struct mlx5dr_ste_build *sb,
21562156
sb->ste_build_tag_func = &dr_ste_build_flex_parser_tnl_vxlan_gpe_tag;
21572157
}
21582158

2159+
static void
2160+
dr_ste_build_flex_parser_tnl_geneve_bit_mask(struct mlx5dr_match_param *value,
2161+
u8 *bit_mask)
2162+
{
2163+
struct mlx5dr_match_misc *misc_mask = &value->misc;
2164+
2165+
DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
2166+
geneve_protocol_type,
2167+
misc_mask, geneve_protocol_type);
2168+
DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
2169+
geneve_oam,
2170+
misc_mask, geneve_oam);
2171+
DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
2172+
geneve_opt_len,
2173+
misc_mask, geneve_opt_len);
2174+
DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
2175+
geneve_vni,
2176+
misc_mask, geneve_vni);
2177+
}
2178+
2179+
static int
2180+
dr_ste_build_flex_parser_tnl_geneve_tag(struct mlx5dr_match_param *value,
2181+
struct mlx5dr_ste_build *sb,
2182+
u8 *hw_ste_p)
2183+
{
2184+
struct dr_hw_ste_format *hw_ste = (struct dr_hw_ste_format *)hw_ste_p;
2185+
struct mlx5dr_match_misc *misc = &value->misc;
2186+
u8 *tag = hw_ste->tag;
2187+
2188+
DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
2189+
geneve_protocol_type, misc, geneve_protocol_type);
2190+
DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
2191+
geneve_oam, misc, geneve_oam);
2192+
DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
2193+
geneve_opt_len, misc, geneve_opt_len);
2194+
DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
2195+
geneve_vni, misc, geneve_vni);
2196+
2197+
return 0;
2198+
}
2199+
2200+
void mlx5dr_ste_build_flex_parser_tnl_geneve(struct mlx5dr_ste_build *sb,
2201+
struct mlx5dr_match_param *mask,
2202+
bool inner, bool rx)
2203+
{
2204+
dr_ste_build_flex_parser_tnl_geneve_bit_mask(mask, sb->bit_mask);
2205+
sb->rx = rx;
2206+
sb->inner = inner;
2207+
sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_TNL_HEADER;
2208+
sb->byte_mask = dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
2209+
sb->ste_build_tag_func = &dr_ste_build_flex_parser_tnl_geneve_tag;
2210+
}
2211+
21592212
static void dr_ste_build_register_0_bit_mask(struct mlx5dr_match_param *value,
21602213
u8 *bit_mask)
21612214
{

drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,9 @@ int mlx5dr_ste_build_flex_parser_1(struct mlx5dr_ste_build *sb,
328328
void mlx5dr_ste_build_flex_parser_tnl_vxlan_gpe(struct mlx5dr_ste_build *sb,
329329
struct mlx5dr_match_param *mask,
330330
bool inner, bool rx);
331+
void mlx5dr_ste_build_flex_parser_tnl_geneve(struct mlx5dr_ste_build *sb,
332+
struct mlx5dr_match_param *mask,
333+
bool inner, bool rx);
331334
void mlx5dr_ste_build_general_purpose(struct mlx5dr_ste_build *sb,
332335
struct mlx5dr_match_param *mask,
333336
bool inner, bool rx);

0 commit comments

Comments
 (0)