Hi, > -----Original Message----- > From: Dekel Peled <dek...@mellanox.com> > Sent: Tuesday, March 3, 2020 2:38 PM > To: Matan Azrad <ma...@mellanox.com>; Slava Ovsiienko > <viachesl...@mellanox.com>; Raslan Darawsheh <rasl...@mellanox.com> > Cc: dev@dpdk.org; Eli Britstein <el...@mellanox.com> > Subject: [PATCH] net/mlx5: support match on IPv4 TTL and IPv6 HLIM > > This patch adds to MLX5 PMD the support of matching on IPv4 TTL and > IPv6 hoplimit. > Support is valid when using DV flow engine (Verbs flow engine doesn't > support matching on this field). > > Signed-off-by: Eli Britstein <el...@mellanox.com> > Signed-off-by: Dekel Peled <dek...@mellanox.com> > Acked-by: Matan Azrad <ma...@mellanox.com> > --- > doc/guides/rel_notes/release_20_05.rst | 6 +++++ > drivers/common/mlx5/mlx5_prm.h | 3 ++- > drivers/net/mlx5/mlx5_flow_dv.c | 40 > +++++++++++++++++++++++++++++++--- > 3 files changed, 45 insertions(+), 4 deletions(-) > > diff --git a/doc/guides/rel_notes/release_20_05.rst > b/doc/guides/rel_notes/release_20_05.rst > index 2190eaf..000bbf5 100644 > --- a/doc/guides/rel_notes/release_20_05.rst > +++ b/doc/guides/rel_notes/release_20_05.rst > @@ -56,6 +56,12 @@ New Features > Also, make sure to start the actual text at the margin. > > ========================================================= > > +* **Updated Mellanox mlx5 driver.** > + > + Updated Mellanox mlx5 driver with new features and improvements, > including: > + > + * Added support for matching on IPv4 Time To Live and IPv6 Hop Limit. > + > > Removed Items > ------------- > diff --git a/drivers/common/mlx5/mlx5_prm.h > b/drivers/common/mlx5/mlx5_prm.h > index 4ac3d4b..eee3a4b 100644 > --- a/drivers/common/mlx5/mlx5_prm.h > +++ b/drivers/common/mlx5/mlx5_prm.h > @@ -651,7 +651,8 @@ struct mlx5_ifc_fte_match_set_lyr_2_4_bits { > u8 tcp_flags[0x9]; > u8 tcp_sport[0x10]; > u8 tcp_dport[0x10]; > - u8 reserved_at_c0[0x20]; > + u8 reserved_at_c0[0x18]; > + u8 ip_ttl_hoplimit[0x8]; > u8 udp_sport[0x10]; > u8 udp_dport[0x10]; > union mlx5_ifc_ipv6_layout_ipv4_layout_auto_bits > src_ipv4_src_ipv6; > diff --git a/drivers/net/mlx5/mlx5_flow_dv.c > b/drivers/net/mlx5/mlx5_flow_dv.c > index 2414a97..e7278f0 100644 > --- a/drivers/net/mlx5/mlx5_flow_dv.c > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > @@ -4490,13 +4490,35 @@ struct field_modify_info modify_tcp[] = { > const struct rte_flow_action_raw_decap *decap; > const struct rte_flow_action_raw_encap *encap; > const struct rte_flow_action_rss *rss; > - struct rte_flow_item_tcp nic_tcp_mask = { > + const struct rte_flow_item_tcp nic_tcp_mask = { > .hdr = { > .tcp_flags = 0xFF, > .src_port = RTE_BE16(UINT16_MAX), > .dst_port = RTE_BE16(UINT16_MAX), > } > }; > + const struct rte_flow_item_ipv4 nic_ipv4_mask = { > + .hdr = { > + .src_addr = RTE_BE32(0xffffffff), > + .dst_addr = RTE_BE32(0xffffffff), > + .type_of_service = 0xff, > + .next_proto_id = 0xff, > + .time_to_live = 0xff, > + }, > + }; > + const struct rte_flow_item_ipv6 nic_ipv6_mask = { > + .hdr = { > + .src_addr = > + "\xff\xff\xff\xff\xff\xff\xff\xff" > + "\xff\xff\xff\xff\xff\xff\xff\xff", > + .dst_addr = > + "\xff\xff\xff\xff\xff\xff\xff\xff" > + "\xff\xff\xff\xff\xff\xff\xff\xff", > + .vtc_flow = RTE_BE32(0xffffffff), > + .proto = 0xff, > + .hop_limits = 0xff, > + }, > + }; > struct mlx5_priv *priv = dev->data->dev_private; > struct mlx5_dev_config *dev_conf = &priv->config; > uint16_t queue_index = 0xFFFF; > @@ -4563,7 +4585,8 @@ struct field_modify_info modify_tcp[] = { > &item_flags, &tunnel); > ret = mlx5_flow_validate_item_ipv4(items, > item_flags, > last_item, > - ether_type, NULL, > + ether_type, > + &nic_ipv4_mask, > error); > if (ret < 0) > return ret; > @@ -4588,7 +4611,8 @@ struct field_modify_info modify_tcp[] = { > &item_flags, &tunnel); > ret = mlx5_flow_validate_item_ipv6(items, > item_flags, > last_item, > - ether_type, NULL, > + ether_type, > + &nic_ipv6_mask, > error); > if (ret < 0) > return ret; > @@ -5421,6 +5445,7 @@ struct field_modify_info modify_tcp[] = { > .dst_addr = RTE_BE32(0xffffffff), > .type_of_service = 0xff, > .next_proto_id = 0xff, > + .time_to_live = 0xff, > }, > }; > void *headers_m; > @@ -5470,6 +5495,10 @@ struct field_modify_info modify_tcp[] = { > ipv4_m->hdr.next_proto_id); > MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol, > ipv4_v->hdr.next_proto_id & ipv4_m->hdr.next_proto_id); > + MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_ttl_hoplimit, > + ipv4_m->hdr.time_to_live); > + MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_ttl_hoplimit, > + ipv4_v->hdr.time_to_live & ipv4_m->hdr.time_to_live); > /* > * On outer header (which must contains L2), or inner header with L2, > * set cvlan_tag mask bit to mark this packet as untagged. > @@ -5583,6 +5612,11 @@ struct field_modify_info modify_tcp[] = { > ipv6_m->hdr.proto); > MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol, > ipv6_v->hdr.proto & ipv6_m->hdr.proto); > + /* Hop limit. */ > + MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_ttl_hoplimit, > + ipv6_m->hdr.hop_limits); > + MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_ttl_hoplimit, > + ipv6_v->hdr.hop_limits & ipv6_m->hdr.hop_limits); > /* > * On outer header (which must contains L2), or inner header with L2, > * set cvlan_tag mask bit to mark this packet as untagged. > -- > 1.8.3.1
Patch applied to next-net-mlx, Kindest regards, Raslan Darawsheh