DPDK patches and discussions
 help / color / mirror / Atom feed
From: Matan Azrad <matan@mellanox.com>
To: dev@dpdk.org
Cc: Ori Kam <orika@mellanox.com>, jackmin@mellanox.com
Subject: [dpdk-dev] [PATCH] ethdev: fix last item detection on RSS flow expand
Date: Mon, 11 Nov 2019 10:42:05 +0000	[thread overview]
Message-ID: <1573468925-24415-1-git-send-email-matan@mellanox.com> (raw)

There is a rte_flow API which expands a RSS flow pattern to multipile
patterns according to the RSS hash types in the RSS action
configuration.

Aa part of the expansion, detection of the last item of the flow uses
the "next proto" field of the last configured item in the pattern list.
Wrongly, the mask of this field was not considered in order to validate
the field.

Ignore "next proto" fields when their corresponded masks invalidate them.

Fixes: ec84aa45f17b ("ethdev: fix expand RSS flows")
Cc: jackmin@mellanox.com

Signed-off-by: Matan Azrad <matan@mellanox.com>
---
 lib/librte_ethdev/rte_flow.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index 8ec9c90..d7f29e5 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -218,12 +218,21 @@ struct rte_flow_desc_data {
 {
 	enum rte_flow_item_type ret = RTE_FLOW_ITEM_TYPE_VOID;
 	uint16_t ether_type = 0;
+	uint16_t ether_type_m;
 	uint8_t ip_next_proto = 0;
+	uint8_t ip_next_proto_m;
 
 	if (item == NULL || item->spec == NULL)
 		return ret;
 	switch (item->type) {
 	case RTE_FLOW_ITEM_TYPE_ETH:
+		if (item->mask)
+			ether_type_m = ((const struct rte_flow_item_eth *)
+						(item->mask))->type;
+		else
+			ether_type_m = rte_flow_item_eth_mask.type;
+		if (ether_type_m != RTE_BE16(0xFFFF))
+			break;
 		ether_type = ((const struct rte_flow_item_eth *)
 				(item->spec))->type;
 		if (rte_be_to_cpu_16(ether_type) == RTE_ETHER_TYPE_IPV4)
@@ -234,6 +243,13 @@ struct rte_flow_desc_data {
 			ret = RTE_FLOW_ITEM_TYPE_VLAN;
 		break;
 	case RTE_FLOW_ITEM_TYPE_VLAN:
+		if (item->mask)
+			ether_type_m = ((const struct rte_flow_item_vlan *)
+						(item->mask))->inner_type;
+		else
+			ether_type_m = rte_flow_item_vlan_mask.inner_type;
+		if (ether_type_m != RTE_BE16(0xFFFF))
+			break;
 		ether_type = ((const struct rte_flow_item_vlan *)
 				(item->spec))->inner_type;
 		if (rte_be_to_cpu_16(ether_type) == RTE_ETHER_TYPE_IPV4)
@@ -244,6 +260,14 @@ struct rte_flow_desc_data {
 			ret = RTE_FLOW_ITEM_TYPE_VLAN;
 		break;
 	case RTE_FLOW_ITEM_TYPE_IPV4:
+		if (item->mask)
+			ip_next_proto_m = ((const struct rte_flow_item_ipv4 *)
+					(item->mask))->hdr.next_proto_id;
+		else
+			ip_next_proto_m =
+				rte_flow_item_ipv4_mask.hdr.next_proto_id;
+		if (ip_next_proto_m != 0xFF)
+			break;
 		ip_next_proto = ((const struct rte_flow_item_ipv4 *)
 				(item->spec))->hdr.next_proto_id;
 		if (ip_next_proto == IPPROTO_UDP)
@@ -256,6 +280,14 @@ struct rte_flow_desc_data {
 			ret = RTE_FLOW_ITEM_TYPE_IPV6;
 		break;
 	case RTE_FLOW_ITEM_TYPE_IPV6:
+		if (item->mask)
+			ip_next_proto_m = ((const struct rte_flow_item_ipv6 *)
+						(item->mask))->hdr.proto;
+		else
+			ip_next_proto_m =
+				rte_flow_item_ipv6_mask.hdr.proto;
+		if (ip_next_proto_m != 0xFF)
+			break;
 		ip_next_proto = ((const struct rte_flow_item_ipv6 *)
 				(item->spec))->hdr.proto;
 		if (ip_next_proto == IPPROTO_UDP)
-- 
1.8.3.1


             reply	other threads:[~2019-11-11 10:42 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-11 10:42 Matan Azrad [this message]
2019-11-11 10:53 ` Jack Min
2019-11-11 17:13 ` Ferruh Yigit
2019-11-11 21:36   ` Ori Kam
2019-11-11 17:41 ` Ori Kam
2019-11-12  1:02   ` Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1573468925-24415-1-git-send-email-matan@mellanox.com \
    --to=matan@mellanox.com \
    --cc=dev@dpdk.org \
    --cc=jackmin@mellanox.com \
    --cc=orika@mellanox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).