From patchwork Thu Apr 5 13:51:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Doherty, Declan" X-Patchwork-Id: 37302 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8F8F31CBF3; Thu, 5 Apr 2018 16:00:24 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 396F91CBF3 for ; Thu, 5 Apr 2018 16:00:22 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Apr 2018 07:00:21 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,411,1517904000"; d="scan'208";a="214177572" Received: from dwdohert-ws.ir.intel.com ([163.33.210.60]) by orsmga005.jf.intel.com with ESMTP; 05 Apr 2018 07:00:18 -0700 From: Declan Doherty To: dev@dpdk.org Cc: Alex Rosenbaum , Ferruh Yigit , Thomas Monjalon , Shahaf Shuler , Qi Zhang , Alejandro Lucero , Andrew Rybchenko , Mohammad Abdul Awal , Remy Horton , John McNamara , Rony Efraim , Jingjing Wu , Wenzhuo Lu , Yuanhan Liu , Bruce Richardson , Declan Doherty Date: Thu, 5 Apr 2018 14:51:48 +0100 Message-Id: <20180405135148.16388-5-declan.doherty@intel.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180405135148.16388-1-declan.doherty@intel.com> References: <20180405135148.16388-1-declan.doherty@intel.com> Subject: [dpdk-dev] [PATCH v2 4/4] ethdev: Add metadata flow and action items support 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Introduces a new action type RTE_FLOW_ACTION_TYPE_METADATA which enables metadata extraction from a packet into a specified metadata container for consumption on further pipeline stages or for propagation to the host interface. As complementary function to the new metadata action type this patch also introduces a new flow item type which enables flow patterns to specify a specific metadata container as a matching criteria for a flow rule. Signed-off-by: Declan Doherty --- doc/guides/prog_guide/rte_flow.rst | 85 ++++++++++++++++++++++++++++++++++++++ lib/librte_ether/rte_flow.h | 54 +++++++++++++++++++++++- 2 files changed, 138 insertions(+), 1 deletion(-) diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index 362231829..48e84b374 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -1580,6 +1580,91 @@ group on that device. +--------------+---------------------------------+ + +Action: ``METADATA`` +^^^^^^^^^^^^^^^^^^^^ + +Action extracts data from packet into user specified metadata field in pipeline +for use in downstream processing stages or for propagation to host interface. + +The pattern mask is used to define the data which is to be extracted from the +packet. The mask pattern types defined in the action metadata pattern must +match the flow pattern definitions up to the last flow item from which data is +to be extracted. + +- Non-terminating by default. + +.. _table_rte_flow_action_metadata: + +.. table:: METADATA + + +--------------+---------------------------+ + | Field | Value | + +==============+===========================+ + | ``id`` | Metadata field Identifier | + +--------------+---------------------------+ + | ``pattern`` | Extraction mask pattern | + +--------------+---------------------------+ + +The example below demonstrates how the extraction mask to extract the source/ +destination IPv4 address, the UDP destination port and and the VxLAN VNI can be +specified. + +.. _table_rte_flow_action_metadata_example: + +.. table:: IPv4 VxLAN metadata extraction + + +-------+--------------------------+-----------------------------------+ + | Index | Flow Item Type | Flow Mask | + +=======+==========================+===================================+ + | 0 | RTE_FLOW_ITEM_TYPE_ETH | .dst = "\x00\x00\x00\x00\x00\x00" | + | | +-----------------------------------+ + | | | .src = "\x00\x00\x00\x00\x00\x00" | + | | +-----------------------------------+ + | | | .type = RTE_BE16(0x0) | + +-------+--------------------------+-----------------------------------+ + | 1 | RTE_FLOW_ITEM_TYPE_IPV4 | .src_addr = RTE_BE32(0xffffffff) | + | | +-----------------------------------+ + | | | .dst_addr = RTE_BE32(0xffffffff) | + +-------+--------------------------+-----------------------------------+ + | 2 | RTE_FLOW_ITEM_TYPE_UDP | .src_port = RTE_BE16(0x0) | + | | +-----------------------------------+ + | | | .dst_port = RTE_BE16(0xffff) | + +-------+--------------------------+-----------------------------------+ + | 3 | RTE_FLOW_ITEM_TYPE_VXLAN | .vni = "\xff\xff\xff" | + +-------+--------------------------+-----------------------------------+ + | 4 | RTE_FLOW_ITEM_TYPE_END | NULL | + +-------+--------------------------+-----------------------------------+ + +If only the VxLAN VNI extraction was required then the extraction mask would be +as follows. + +.. _table_rte_flow_action_metadata_example_2: + +.. table:: VxLAN VNI metadata extraction + + +-------+--------------------------+-----------------------------------+ + | Index | Flow Item Type | Flow Mask | + +=======+==========================+===================================+ + | 0 | RTE_FLOW_ITEM_TYPE_ETH | .dst = "\x00\x00\x00\x00\x00\x00" | + | | +-----------------------------------+ + | | | .src = "\x00\x00\x00\x00\x00\x00" | + | | +-----------------------------------+ + | | | .type = RTE_BE16(0x0) | + +-------+--------------------------+-----------------------------------+ + | 1 | RTE_FLOW_ITEM_TYPE_IPV4 | .src_addr = RTE_BE32(0x0) | + | | +-----------------------------------+ + | | | .dst_addr = RTE_BE32(0x0) | + +-------+--------------------------+-----------------------------------+ + | 2 | RTE_FLOW_ITEM_TYPE_UDP | .src_port = RTE_BE16(0x0) | + | | +-----------------------------------+ + | | | .dst_port = RTE_BE16(0x0) | + +-------+--------------------------+-----------------------------------+ + | 3 | RTE_FLOW_ITEM_TYPE_VXLAN | .vni = "\xff\xff\xff" | + +-------+--------------------------+-----------------------------------+ + | 4 | RTE_FLOW_ITEM_TYPE_END | NULL | + +-------+--------------------------+-----------------------------------+ + Negative types ~~~~~~~~~~~~~~ diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h index 55951b6ca..be1b0348b 100644 --- a/lib/librte_ether/rte_flow.h +++ b/lib/librte_ether/rte_flow.h @@ -323,6 +323,13 @@ enum rte_flow_item_type { * See struct rte_flow_item_geneve. */ RTE_FLOW_ITEM_TYPE_GENEVE, + + /** + * Matches specified pipeline metadata field. + * + * See struct rte_flow_item_metadata. + */ + RTE_FLOW_ITEM_TYPE_METADATA }; /** @@ -814,6 +821,17 @@ static const struct rte_flow_item_geneve rte_flow_item_geneve_mask = { }; #endif +/** + * RTE_FLOW_ITEM_TYPE_METADATA + * + * Allow arbitrary pipeline metadata to be used in specification flow pattern + */ +struct rte_flow_item_metadata { + uint32_t id; /**< field identifier */ + uint32_t size; /**< field size */ + uint8_t bytes[]; /**< field value */ +}; + /** * Matching pattern item definition. * @@ -1054,7 +1072,17 @@ enum rte_flow_action_type { * * See struct rte_flow_action_group. */ - RTE_FLOW_ACTION_TYPE_GROUP + RTE_FLOW_ACTION_TYPE_GROUP, + + /** + * [META] + * + * Set specific metadata field associated with packet which is then + * available to further pipeline stages. + * + * See struct rte_flow_action_metadata. + */ + RTE_FLOW_ACTION_TYPE_METADATA }; /** @@ -1252,6 +1280,30 @@ struct rte_flow_action_group { uint32_t id; }; +/** + * RTE_FLOW_ACTION_TYPE_METADATA + * + * Action extracts data from packet into specified metadata field in pipeline + * for use in downstream processing stages or for propagation to host interface. + * + * Pattern mask is use to define the extraction data for packet. The mask + * pattern types defined in the action metadata pattern must match the flow + * pattern definitions up to the last item from which data is to be extracted. + * + * Non-terminating by default. + */ +struct rte_flow_action_metadata { + uint32_t id; /**< field identifier */ + + struct rte_flow_action_mask_item { + enum rte_flow_item_type type; + /**< Flow item type. */ + const void *mask; + /**< Flow item mask. */ + } *pattern; + /** metadata extraction pattern mask specification */ +}; + /** * Definition of a single action. *