Hi, PSB. > -----Original Message----- > From: Ori Kam <or...@mellanox.com> > Sent: Monday, July 27, 2020 7:21 PM > To: Dekel Peled <dek...@mellanox.com>; Raslan Darawsheh > <rasl...@mellanox.com>; Thomas Monjalon <thom...@mellanox.com>; > ferruh.yi...@intel.com; Andrew Rybchenko <arybche...@solarflare.com> > Cc: dev@dpdk.org; sta...@dpdk.org; Matan Azrad <ma...@mellanox.com>; > Slava Ovsiienko <viachesl...@mellanox.com> > Subject: RE: [PATCH] ethdev: fix RSS flow expansion in case of mismatch > > Hi Dekel, > > > -----Original Message----- > > From: Dekel Peled <dek...@mellanox.com> > > > > Resending To: maintaners. > > > > > -----Original Message----- > > > From: Dekel Peled <dek...@mellanox.com> > > > > > > Function rte_flow_expand_rss() is used to expand a flow rule with > > > partial pattern into several rules, to ensure all relevant packets are > matched. > > > It uses utility function rte_flow_expand_rss_item_complete(), to > > > check if the last valid item in the flow rule pattern needs to be > completed. > > Which is also based on the requested RSS type. Right? If no RSS type is set > then the issue will not appear.
Correct. > > > > For example the pattern "eth / ipv4 proto is 17 / end" will be > > > completed with a "udp" item. > > Only if UDP rss type is selected, if TCP is selected then it will be TCP > right? Correct. > > > > This function returns "void" item in two cases: > > > 1) The last item has empty spec, for example "eth / ipv4 / end". > > > 2) The last itme has spec that can't be expanded for RSS. > > > For example the pattern "eth / ipv4 proto is 47 / end" ends with IPv4 > > > item that has next protocol GRE. > > > > Typo in itme -> item? Indeed. > > > > In both cases the flow rule may be expanded, but in the second case > > > such expansion may create rules with invalid pattern. > > You mean that in both cases the flow will be expanded, that is the issue. > That in the second case the flow shouldn't be expended. Correct. > > > > For example "eth / ipv4 proto is 47 / udp / end". > > > In such a case the flow rule should not be expanded. > > > > > > This patch updates function rte_flow_expand_rss_item_complete(). > > > Return value RTE_FLOW_ITEM_TYPE_END is used to indicate the flow > > > rule should not be expanded. > > > In such a case, rte_flow_expand_rss() will return with the original > > > flow rule only, without any expansion. > > > > > > > > Fixes: fc2dd8dd492f ("ethdev: fix expand RSS flows") > > > Cc: sta...@dpdk.org > > > > > > Signed-off-by: Dekel Peled <dek...@mellanox.com> > > > Acked-by: Xiaoyu Min <jack...@mellanox.com> > > > Acked-by: Viacheslav Ovsiienko <viachesl...@mellanox.com> > > > --- > > > lib/librte_ethdev/rte_flow.c | 16 ++++++++++++++-- > > > 1 file changed, 14 insertions(+), 2 deletions(-) > > > > > > diff --git a/lib/librte_ethdev/rte_flow.c > > > b/lib/librte_ethdev/rte_flow.c index f8fdd68..59a386d 100644 > > > --- a/lib/librte_ethdev/rte_flow.c > > > +++ b/lib/librte_ethdev/rte_flow.c > > > @@ -247,6 +247,8 @@ struct rte_flow_desc_data { > > > ret = RTE_FLOW_ITEM_TYPE_IPV6; > > > else if (rte_be_to_cpu_16(ether_type) == > > > RTE_ETHER_TYPE_VLAN) > > > ret = RTE_FLOW_ITEM_TYPE_VLAN; > > > + else > > > + ret = RTE_FLOW_ITEM_TYPE_END; > > > break; > > > case RTE_FLOW_ITEM_TYPE_VLAN: > > > if (item->mask) > > > @@ -264,6 +266,8 @@ struct rte_flow_desc_data { > > > ret = RTE_FLOW_ITEM_TYPE_IPV6; > > > else if (rte_be_to_cpu_16(ether_type) == > > > RTE_ETHER_TYPE_VLAN) > > > ret = RTE_FLOW_ITEM_TYPE_VLAN; > > > + else > > > + ret = RTE_FLOW_ITEM_TYPE_END; > > > break; > > > case RTE_FLOW_ITEM_TYPE_IPV4: > > > if (item->mask) > > > @@ -284,6 +288,8 @@ struct rte_flow_desc_data { > > > ret = RTE_FLOW_ITEM_TYPE_IPV4; > > > else if (ip_next_proto == IPPROTO_IPV6) > > > ret = RTE_FLOW_ITEM_TYPE_IPV6; > > > + else > > > + ret = RTE_FLOW_ITEM_TYPE_END; > > > break; > > > case RTE_FLOW_ITEM_TYPE_IPV6: > > > if (item->mask) > > > @@ -304,6 +310,8 @@ struct rte_flow_desc_data { > > > ret = RTE_FLOW_ITEM_TYPE_IPV4; > > > else if (ip_next_proto == IPPROTO_IPV6) > > > ret = RTE_FLOW_ITEM_TYPE_IPV6; > > > + else > > > + ret = RTE_FLOW_ITEM_TYPE_END; > > > break; > > > default: > > > ret = RTE_FLOW_ITEM_TYPE_VOID; > > > @@ -1110,10 +1118,14 @@ enum rte_flow_conv_item_spec_type { > > > memset(flow_items, 0, sizeof(flow_items)); > > > user_pattern_size -= sizeof(*item); > > > /* > > > - * Check if the last valid item has spec set > > > - * and need complete pattern. > > > + * Check if the last valid item has spec set, need complete pattern, > > > + * and the pattern can be used for expansion. > > > */ > > > missed_item.type = > > > rte_flow_expand_rss_item_complete(last_item); > > > + if (missed_item.type == RTE_FLOW_ITEM_TYPE_END) { > > > + /* Item type END indicates expansion is not required. */ > > > + return lsize; > > > + } > > > if (missed_item.type != RTE_FLOW_ITEM_TYPE_VOID) { > > > next = NULL; > > > missed = 1; > > > -- > > > 1.8.3.1 > > I don't think this is the correct solution. > The idea of the rte_flow_expand_rss_item_complete function is to add the > last item so later the parsing will be based on items regardless of spec. > This mean the function already support pattern with the following format: > Eth / ipv4 / gre. What the result will be? Will it be expended? Flow rule with such pattern will not be expanded using the current mlx5_support_expansion array. > > I think the solution should be that the function will return the correct item. > Assuming there is such an item. This is what the current solution does. > > Best, > Ori