summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatan Azrad <matan@mellanox.com>2019-11-11 10:42:05 +0000
committerFerruh Yigit <ferruh.yigit@intel.com>2019-11-12 01:55:26 +0100
commiteccc5d3237fc549ba647654a7f74f8b9e9dcaf6d (patch)
tree41cd0f098059a7c677349a550a9fd985687f4bc1
parent4a72909224527386b913bc04b4e535416b7ef5bb (diff)
downloaddpdk-eccc5d3237fc549ba647654a7f74f8b9e9dcaf6d.zip
dpdk-eccc5d3237fc549ba647654a7f74f8b9e9dcaf6d.tar.gz
dpdk-eccc5d3237fc549ba647654a7f74f8b9e9dcaf6d.tar.xz
ethdev: fix last item detection on RSS flow expand
There is a rte_flow API which expands a RSS flow pattern to multiple patterns according to the RSS hash types in the RSS action configuration. As 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: fc2dd8dd492f ("ethdev: fix expand RSS flows") Cc: stable@dpdk.org Signed-off-by: Matan Azrad <matan@mellanox.com> Acked-by: Xiaoyu Min <jackmin@mellanox.com> Acked-by: Ori Kam <orika@mellanox.com>
-rw-r--r--lib/librte_ethdev/rte_flow.c32
1 files changed, 32 insertions, 0 deletions
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 @@ rte_flow_expand_rss_item_complete(const struct rte_flow_item *item)
{
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 @@ rte_flow_expand_rss_item_complete(const struct rte_flow_item *item)
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 @@ rte_flow_expand_rss_item_complete(const struct rte_flow_item *item)
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 @@ rte_flow_expand_rss_item_complete(const struct rte_flow_item *item)
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)