From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from rcdn-iport-4.cisco.com (rcdn-iport-4.cisco.com [173.37.86.75]) by dpdk.org (Postfix) with ESMTP id A676A4CC7; Thu, 28 Feb 2019 08:04:30 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=3240; q=dns/txt; s=iport; t=1551337470; x=1552547070; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=e1UStQsyXH9iS/grFWjUiFWo2XqrmoPfNg5VN5/IL2c=; b=jQlsirIkxX7DEWUv0y35PMjmz2Mq6IrN2oMA2BnhAI/s53b8VhIFqb5f Yh1eY4ukF7Qvm8dzbpyAtXe8ukoLLNueL4rgL7ISEVI+zL/hT26LpdCGQ lXlTn+JuOuMi04VHTzDCgZsbxo2nxprF6MfYUABk3wi/xkB4PUD59TGFI I=; X-IronPort-AV: E=Sophos;i="5.58,422,1544486400"; d="scan'208";a="525792558" Received: from alln-core-2.cisco.com ([173.36.13.135]) by rcdn-iport-4.cisco.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Feb 2019 07:04:28 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by alln-core-2.cisco.com (8.15.2/8.15.2) with ESMTP id x1S74S29027636; Thu, 28 Feb 2019 07:04:28 GMT Received: by cisco.com (Postfix, from userid 508933) id 245AA20F2001; Wed, 27 Feb 2019 23:04:28 -0800 (PST) From: Hyong Youb Kim To: Ferruh Yigit Cc: dev@dpdk.org, John Daley , Hyong Youb Kim , stable@dpdk.org Date: Wed, 27 Feb 2019 23:03:06 -0800 Message-Id: <20190228070317.17002-5-hyonkim@cisco.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20190228070317.17002-1-hyonkim@cisco.com> References: <20190228070317.17002-1-hyonkim@cisco.com> X-Outbound-SMTP-Client: 10.193.184.48, savbu-usnic-a.cisco.com X-Outbound-Node: alln-core-2.cisco.com Subject: [dpdk-dev] [PATCH 04/15] net/enic: allow flow mark ID 0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Feb 2019 07:04:31 -0000 The driver currently accepts mark ID 0 but does not report it in matching packet's mbuf. For example, the following testpmd command succeeds. But, the mbuf of a matching IPv4 UDP packet does not have PKT_RX_FDIR_ID set. flow create 0 ingress pattern ... actions mark id 0 / queue index 0 / end The problem has to do with mapping mark IDs (32-bit) to NIC filter IDs. Filter ID is currently 16-bit, so values greater than 0xffff are rejected. The firmware reserves filter ID 0 for filters that do not mark (e.g. steer w/o mark). And, the driver reserves 0xffff for the flag action. This leaves 1...0xfffe for app use. It is possible to simply reject mark ID 0 as unsupported. But, 0 is commonly used (e.g. OVS-DPDK and VPP). So, when adding a filter, set filter ID = mark ID + 1 to support mark ID 0. The receive handler subtracts 1 from filter ID to get back the original mark ID. Fixes: dfbd6a9cb504 ("net/enic: extend flow director support for 1300 series") Cc: stable@dpdk.org Signed-off-by: Hyong Youb Kim Reviewed-by: John Daley --- drivers/net/enic/enic_flow.c | 15 +++++++++++---- drivers/net/enic/enic_rxtx_common.h | 3 ++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/net/enic/enic_flow.c b/drivers/net/enic/enic_flow.c index 55d8d50a1..e12a6ec73 100644 --- a/drivers/net/enic/enic_flow.c +++ b/drivers/net/enic/enic_flow.c @@ -1081,12 +1081,18 @@ enic_copy_action_v2(const struct rte_flow_action actions[], if (overlap & MARK) return ENOTSUP; overlap |= MARK; - /* ENIC_MAGIC_FILTER_ID is reserved and is the highest - * in the range of allows mark ids. + /* + * Map mark ID (32-bit) to filter ID (16-bit): + * - Reject values > 16 bits + * - Filter ID 0 is reserved for filters that steer + * but not mark. So add 1 to the mark ID to avoid + * using 0. + * - Filter ID (ENIC_MAGIC_FILTER_ID = 0xffff) is + * reserved for the "flag" action below. */ - if (mark->id >= ENIC_MAGIC_FILTER_ID) + if (mark->id >= ENIC_MAGIC_FILTER_ID - 1) return EINVAL; - enic_action->filter_id = mark->id; + enic_action->filter_id = mark->id + 1; enic_action->flags |= FILTER_ACTION_FILTER_ID_FLAG; break; } @@ -1094,6 +1100,7 @@ enic_copy_action_v2(const struct rte_flow_action actions[], if (overlap & MARK) return ENOTSUP; overlap |= MARK; + /* ENIC_MAGIC_FILTER_ID is reserved for flagging */ enic_action->filter_id = ENIC_MAGIC_FILTER_ID; enic_action->flags |= FILTER_ACTION_FILTER_ID_FLAG; break; diff --git a/drivers/net/enic/enic_rxtx_common.h b/drivers/net/enic/enic_rxtx_common.h index bfbb4909e..66f631dfe 100644 --- a/drivers/net/enic/enic_rxtx_common.h +++ b/drivers/net/enic/enic_rxtx_common.h @@ -226,7 +226,8 @@ enic_cq_rx_to_pkt_flags(struct cq_desc *cqd, struct rte_mbuf *mbuf) if (filter_id) { pkt_flags |= PKT_RX_FDIR; if (filter_id != ENIC_MAGIC_FILTER_ID) { - mbuf->hash.fdir.hi = clsf_cqd->filter_id; + /* filter_id = mark id + 1, so subtract 1 */ + mbuf->hash.fdir.hi = filter_id - 1; pkt_flags |= PKT_RX_FDIR_ID; } } -- 2.16.2