From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <adrien.mazarguil@6wind.com>
Received: from mail-wm0-f50.google.com (mail-wm0-f50.google.com [74.125.82.50])
 by dpdk.org (Postfix) with ESMTP id 53040199B4
 for <stable@dpdk.org>; Wed, 16 May 2018 17:42:06 +0200 (CEST)
Received: by mail-wm0-f50.google.com with SMTP id w194-v6so2676524wmf.2
 for <stable@dpdk.org>; Wed, 16 May 2018 08:42:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=6wind-com.20150623.gappssmtp.com; s=20150623;
 h=date:from:to:cc:subject:message-id:references:mime-version
 :content-disposition:in-reply-to;
 bh=U2EjdS2Y2Onhp3O4Io0+q+bE7vpjKgJLOZPFaT1Qp1w=;
 b=OzIPSHE9S49gKuht3N231nVJnnvW8fXlOthc/sL/I+ReFhr7bNK/Dt/Xy84QEIumLx
 RcMtsyvLxWYBI8ot0emWe++Hm/P1TVPAlCX7brNZjxR8ZL6jvsFpfRJMLLS2ODcXx/3P
 6bNwzxe7HDuS8NtU3F2+aOf2JeQj02WbZ6pEx1HHxMyyvX+G8OUmzP8N3zu0yPtVlt+I
 cGds8utSJICHS9gcUy71it0zZoEl4Ufg+2meJH4gUpmExJGbz/Vvdg/8To6aMoibtg2L
 99+g50CnPhZafl5lGp10yTh6nOiO6/IIn64/uyz0fCt4H6qNHdx7XKUQbxmfTA0uosM4
 Dtjg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:date:from:to:cc:subject:message-id:references
 :mime-version:content-disposition:in-reply-to;
 bh=U2EjdS2Y2Onhp3O4Io0+q+bE7vpjKgJLOZPFaT1Qp1w=;
 b=EY1MS5EPSWFRUBY66wGH3TVy0MKlx7X8QYEPM5HWF+j/YP2UrPSLr9SoExSVwKfZVp
 rB5LpYv/UyRRgS6aVOWXj08/t1lJOKLA5NMNKT3FAE/YqYGhprxe2h/zrpLcchbJc9Wn
 bzLgSgUMAkouzVu8Hnz+rNcBTsXFvKgtR+2Zoc4YhJYroA7Ea8uYRspKlVlZ2ScNGUe9
 nctvyaL2xHWBJ1TAIRr6MKQdFpXKFfuoW0AjxdQQZdntJ8u9zOBsc2NW9VzhfYG2CTfZ
 Wl+2A0mnoQZRvUFfYxUOvpNByEBuGFTxWXJyn8y6SOVcc+sNjPP0uwyDEn9BQkPewQdu
 ZuLA==
X-Gm-Message-State: ALKqPwc2xrsae0MSYoFwkRApCion9NQbNjaOSIr0Ws8xV0gyq/P0UMaw
 BXVlXGMO+TRqbNFsL/YJQo40k1Q7
X-Google-Smtp-Source: AB8JxZqWe5mHBNXsj2su0UPX4B423FMCtmO8ANPgF9eylfNe4PZgGm1G2IVlJd5JQc62VsOKVppXkg==
X-Received: by 2002:a1c:2856:: with SMTP id o83-v6mr1145008wmo.3.1526485325968; 
 Wed, 16 May 2018 08:42:05 -0700 (PDT)
Received: from 6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78])
 by smtp.gmail.com with ESMTPSA id 76-v6sm21028038wmj.0.2018.05.16.08.42.05
 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
 Wed, 16 May 2018 08:42:05 -0700 (PDT)
Date: Wed, 16 May 2018 17:41:50 +0200
From: Adrien Mazarguil <adrien.mazarguil@6wind.com>
To: Ferruh Yigit <ferruh.yigit@intel.com>
Cc: dev@dpdk.org, stable@dpdk.org, Qi Zhang <qi.z.zhang@intel.com>
Message-ID: <20180516154052.16836-2-adrien.mazarguil@6wind.com>
References: <20180516154052.16836-1-adrien.mazarguil@6wind.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20180516154052.16836-1-adrien.mazarguil@6wind.com>
X-Mailer: git-send-email 2.11.0
Subject: [dpdk-stable] [PATCH 2/2] ethdev: fix shallow copy of flow API RAW
	item
X-BeenThere: stable@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: patches for DPDK stable branches <stable.dpdk.org>
List-Unsubscribe: <https://dpdk.org/ml/options/stable>,
 <mailto:stable-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/stable/>
List-Post: <mailto:stable@dpdk.org>
List-Help: <mailto:stable-request@dpdk.org?subject=help>
List-Subscribe: <https://dpdk.org/ml/listinfo/stable>,
 <mailto:stable-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Wed, 16 May 2018 15:42:06 -0000

Like original commit mentioned below, this fix synchronizes flow rule copy
function with testpmd's own implementation following "app/testpmd: fix copy
of raw flow item (revisited)".

Fixes: d0ad8648b1c5 ("ethdev: fix shallow copy of flow API RSS action")
Cc: stable@dpdk.org
Cc: Qi Zhang <qi.z.zhang@intel.com>

Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
---
 lib/librte_ethdev/rte_flow.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index 7947529da..b2afba089 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -300,17 +300,26 @@ flow_item_spec_copy(void *buf, const struct rte_flow_item *item,
 		    enum item_spec_type type)
 {
 	size_t size = 0;
-	const void *item_spec =
+	const void *data =
 		type == ITEM_SPEC ? item->spec :
 		type == ITEM_LAST ? item->last :
 		type == ITEM_MASK ? item->mask :
 		NULL;
 
-	if (!item_spec)
+	if (!item->spec || !data)
 		goto empty;
 	switch (item->type) {
 		union {
 			const struct rte_flow_item_raw *raw;
+		} spec;
+		union {
+			const struct rte_flow_item_raw *raw;
+		} last;
+		union {
+			const struct rte_flow_item_raw *raw;
+		} mask;
+		union {
+			const struct rte_flow_item_raw *raw;
 		} src;
 		union {
 			struct rte_flow_item_raw *raw;
@@ -318,11 +327,21 @@ flow_item_spec_copy(void *buf, const struct rte_flow_item *item,
 		size_t off;
 
 	case RTE_FLOW_ITEM_TYPE_RAW:
-		src.raw = item_spec;
+		spec.raw = item->spec;
+		last.raw = item->last ? item->last : item->spec;
+		mask.raw = item->mask ? item->mask : &rte_flow_item_raw_mask;
+		src.raw = data;
 		dst.raw = buf;
 		off = RTE_ALIGN_CEIL(sizeof(struct rte_flow_item_raw),
 				     sizeof(*src.raw->pattern));
-		size = off + src.raw->length * sizeof(*src.raw->pattern);
+		if (type == ITEM_SPEC ||
+		    (type == ITEM_MASK &&
+		     ((spec.raw->length & mask.raw->length) >=
+		      (last.raw->length & mask.raw->length))))
+			size = spec.raw->length & mask.raw->length;
+		else
+			size = last.raw->length & mask.raw->length;
+		size = off + size * sizeof(*src.raw->pattern);
 		if (dst.raw) {
 			memcpy(dst.raw, src.raw, sizeof(*src.raw));
 			dst.raw->pattern = memcpy((uint8_t *)dst.raw + off,
@@ -333,7 +352,7 @@ flow_item_spec_copy(void *buf, const struct rte_flow_item *item,
 	default:
 		size = rte_flow_desc_item[item->type].size;
 		if (buf)
-			memcpy(buf, item_spec, size);
+			memcpy(buf, data, size);
 		break;
 	}
 empty:
-- 
2.11.0