On 11/21/2019 8:09 PM, Suanming Mou wrote: > For tunnel mode, there maybe two L3/L4 layer match pattern items, > the inner layer follows the outer layer as the latter layer item, > the TTL and port modify actions should handle the outermost layer. > > Current the outer and inner L3/L4 layers are both regared as the > outer layer in flow_dv_attr_init(), it caueses actions may use the > incorrect latter inner protocal for header modifier. > > Check former L3/L4 outer layer existence avoid set the incorrect inner > layer to the flow attr. > > Fixes: 4bb14c83df95 ("net/mlx5: support modify header using Direct Verbs") > Cc: dek...@mellanox.com > Cc: sta...@dpdk.org > > Signed-off-by: Suanming Mou <suanmi...@mellanox.com> > --- > > v2: > * Add L4 layer check. > > --- > drivers/net/mlx5/mlx5_flow_dv.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c > index c402a8d..688291f 100644 > --- a/drivers/net/mlx5/mlx5_flow_dv.c > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > @@ -73,6 +73,9 @@ > /** > * Initialize flow attributes structure according to flow items' types. > * > + * flow_dv_validate() avoids multiple L3/L4 layers cases other than tunnel > + * mode. For tunnel mode, the items to be modified are the outermost ones. > + * > * @param[in] item > * Pointer to item specification. > * @param[out] attr > @@ -84,16 +87,20 @@ > for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) { > switch (item->type) { > case RTE_FLOW_ITEM_TYPE_IPV4: > - attr->ipv4 = 1; > + if (!attr->ipv6) > + attr->ipv4 = 1; > break; > case RTE_FLOW_ITEM_TYPE_IPV6: > - attr->ipv6 = 1; > + if (!attr->ipv4) > + attr->ipv6 = 1; > break; > case RTE_FLOW_ITEM_TYPE_UDP: > - attr->udp = 1; > + if (!attr->tcp) > + attr->udp = 1; > break; > case RTE_FLOW_ITEM_TYPE_TCP: > - attr->tcp = 1; > + if (!attr->udp) > + attr->tcp = 1; > break; > default: > break;
Sorry for that v2 mail missed mail to Matan and Slava. Just add. Thanks SuanmingMou