Skip to content

Commit 466fa6d

Browse files
Maor Gottliebdledford
authored andcommitted
IB/mlx5: Add support of more IPv6 fields to flow steering
Add support to receive Traffic Class, specific IPv6 protocol or IPv6 flow label. Signed-off-by: Maor Gottlieb <maorg@mellanox.com> Reviewed-by: Sagi Grimberg <sagi@grimberg.me> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Doug Ledford <dledford@redhat.com>
1 parent ca0d475 commit 466fa6d

File tree

1 file changed

+45
-11
lines changed
  • drivers/infiniband/hw/mlx5

1 file changed

+45
-11
lines changed

drivers/infiniband/hw/mlx5/main.c

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,15 +1425,31 @@ static int mlx5_ib_dealloc_pd(struct ib_pd *pd)
14251425
return 0;
14261426
}
14271427

1428-
static bool outer_header_zero(u32 *match_criteria)
1428+
enum {
1429+
MATCH_CRITERIA_ENABLE_OUTER_BIT,
1430+
MATCH_CRITERIA_ENABLE_MISC_BIT,
1431+
MATCH_CRITERIA_ENABLE_INNER_BIT
1432+
};
1433+
1434+
#define HEADER_IS_ZERO(match_criteria, headers) \
1435+
!(memchr_inv(MLX5_ADDR_OF(fte_match_param, match_criteria, headers), \
1436+
0, MLX5_FLD_SZ_BYTES(fte_match_param, headers))) \
1437+
1438+
static u8 get_match_criteria_enable(u32 *match_criteria)
14291439
{
1430-
int size = MLX5_ST_SZ_BYTES(fte_match_param);
1431-
char *outer_headers_c = MLX5_ADDR_OF(fte_match_param, match_criteria,
1432-
outer_headers);
1440+
u8 match_criteria_enable;
1441+
1442+
match_criteria_enable =
1443+
(!HEADER_IS_ZERO(match_criteria, outer_headers)) <<
1444+
MATCH_CRITERIA_ENABLE_OUTER_BIT;
1445+
match_criteria_enable |=
1446+
(!HEADER_IS_ZERO(match_criteria, misc_parameters)) <<
1447+
MATCH_CRITERIA_ENABLE_MISC_BIT;
1448+
match_criteria_enable |=
1449+
(!HEADER_IS_ZERO(match_criteria, inner_headers)) <<
1450+
MATCH_CRITERIA_ENABLE_INNER_BIT;
14331451

1434-
return outer_headers_c[0] == 0 && !memcmp(outer_headers_c,
1435-
outer_headers_c + 1,
1436-
size - 1);
1452+
return match_criteria_enable;
14371453
}
14381454

14391455
static void set_proto(void *outer_c, void *outer_v, u8 mask, u8 val)
@@ -1453,7 +1469,7 @@ static void set_tos(void *outer_c, void *outer_v, u8 mask, u8 val)
14531469
#define LAST_ETH_FIELD vlan_tag
14541470
#define LAST_IB_FIELD sl
14551471
#define LAST_IPV4_FIELD tos
1456-
#define LAST_IPV6_FIELD dst_ip
1472+
#define LAST_IPV6_FIELD traffic_class
14571473
#define LAST_TCP_UDP_FIELD src_port
14581474

14591475
/* Field is the last supported field */
@@ -1471,6 +1487,11 @@ static int parse_flow_attr(u32 *match_c, u32 *match_v,
14711487
outer_headers);
14721488
void *outer_headers_v = MLX5_ADDR_OF(fte_match_param, match_v,
14731489
outer_headers);
1490+
void *misc_params_c = MLX5_ADDR_OF(fte_match_param, match_c,
1491+
misc_parameters);
1492+
void *misc_params_v = MLX5_ADDR_OF(fte_match_param, match_v,
1493+
misc_parameters);
1494+
14741495
switch (ib_spec->type) {
14751496
case IB_FLOW_SPEC_ETH:
14761497
if (FIELDS_NOT_SUPPORTED(ib_spec->eth.mask, LAST_ETH_FIELD))
@@ -1570,6 +1591,21 @@ static int parse_flow_attr(u32 *match_c, u32 *match_v,
15701591
dst_ipv4_dst_ipv6.ipv6_layout.ipv6),
15711592
&ib_spec->ipv6.val.dst_ip,
15721593
sizeof(ib_spec->ipv6.val.dst_ip));
1594+
1595+
set_tos(outer_headers_c, outer_headers_v,
1596+
ib_spec->ipv6.mask.traffic_class,
1597+
ib_spec->ipv6.val.traffic_class);
1598+
1599+
set_proto(outer_headers_c, outer_headers_v,
1600+
ib_spec->ipv6.mask.next_hdr,
1601+
ib_spec->ipv6.val.next_hdr);
1602+
1603+
MLX5_SET(fte_match_set_misc, misc_params_c,
1604+
outer_ipv6_flow_label,
1605+
ntohl(ib_spec->ipv6.mask.flow_label));
1606+
MLX5_SET(fte_match_set_misc, misc_params_v,
1607+
outer_ipv6_flow_label,
1608+
ntohl(ib_spec->ipv6.val.flow_label));
15731609
break;
15741610
case IB_FLOW_SPEC_TCP:
15751611
if (FIELDS_NOT_SUPPORTED(ib_spec->tcp_udp.mask,
@@ -1817,9 +1853,7 @@ static struct mlx5_ib_flow_handler *create_flow_rule(struct mlx5_ib_dev *dev,
18171853
ib_flow += ((union ib_flow_spec *)ib_flow)->size;
18181854
}
18191855

1820-
/* Outer header support only */
1821-
spec->match_criteria_enable = (!outer_header_zero(spec->match_criteria))
1822-
<< 0;
1856+
spec->match_criteria_enable = get_match_criteria_enable(spec->match_criteria);
18231857
action = dst ? MLX5_FLOW_CONTEXT_ACTION_FWD_DEST :
18241858
MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO;
18251859
handler->rule = mlx5_add_flow_rule(ft, spec,

0 commit comments

Comments
 (0)