From patchwork Sun Apr 1 21:19:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zhang X-Patchwork-Id: 36842 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 9706C7CFA; Mon, 2 Apr 2018 06:29:15 +0200 (CEST) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id 5A2AE7CD6 for ; Mon, 2 Apr 2018 06:29:14 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Apr 2018 21:29:14 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,393,1517904000"; d="scan'208";a="28812579" Received: from dpdk27.sh.intel.com ([10.67.111.90]) by fmsmga007.fm.intel.com with ESMTP; 01 Apr 2018 21:29:12 -0700 From: Qi Zhang To: adrien.mazarguil@6wind.com Cc: dev@dpdk.org, declan.doherty@intel.com, sugesh.chandran@intel.com, michael.j.glynn@intel.com, yu.y.liu@intel.com, konstantin.ananyev@intel.com, bruce.richardson@intel.com, Qi Zhang Date: Sun, 1 Apr 2018 17:19:22 -0400 Message-Id: <1522617562-25940-5-git-send-email-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1522617562-25940-1-git-send-email-qi.z.zhang@intel.com> References: <1522279780-34842-1-git-send-email-qi.z.zhang@intel.com> <1522617562-25940-1-git-send-email-qi.z.zhang@intel.com> Subject: [dpdk-dev] [PATCH v2 4/4] ether: add packet modification aciton in flow API 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" Add new actions that be used to modify packet content with generic semantic: RTE_FLOW_ACTION_TYPE_FIELD_UPDATE: - update specific field of packet RTE_FLWO_ACTION_TYPE_FIELD_INCREMENT: - increament specific field of packet RTE_FLWO_ACTION_TYPE_FIELD_DECREMENT: - decreament specific field of packet RTE_FLWO_ACTION_TYPE_FIELD_COPY: - copy data from one field to another in packet. All action use struct rte_flow_item parameter to match the pattern that going to be modified, if no pattern match, the action just be skipped. These action are non-terminating action. they will not impact the fate of the packets. Signed-off-by: Qi Zhang --- doc/guides/prog_guide/rte_flow.rst | 89 ++++++++++++++++++++++++++++++++++++++ lib/librte_ether/rte_flow.h | 57 ++++++++++++++++++++++++ 2 files changed, 146 insertions(+) diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index aa5c818..6628964 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -1508,6 +1508,95 @@ Representor. | ``port_id`` | identification of the destination | +--------------+-----------------------------------+ +Action: ``FILED_UPDATE`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Update specific field of the packet. + +- Non-terminating by default. + +.. _table_rte_flow_action_field_update: + +.. table:: FIELD_UPDATE + + +-----------+---------------------------------------------------------+ + | Field | Value | + +===========+=========================================================+ + | ``item`` | item->type: specify the pattern to modify | + | | item->spec: specify the new value to update | + | | item->mask: specify which part of the pattern to update | + | | item->last: ignored | + +-----------+---------------------------------------------------------+ + | ``layer`` | 0 means outermost matched pattern, | + | | 1 means next-to-outermost and so on ... | + +-----------+---------------------------------------------------------+ + +Action: ``FILED_INCREMENT`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Increment 1 on specific field of the packet. + +- Non-terminating by default. + +.. _table_rte_flow_action_field_update: + +.. table:: FIELD_INCREMENT + + +-----------+---------------------------------------------------------+ + | Field | Value | + +===========+=========================================================+ + | ``item`` | item->type: specify the pattern to modify | + | | item->spec: ignored | + | | item->mask: specify which part of the pattern to update | + | | item->last: ignored | + +-----------+---------------------------------------------------------+ + | ``layer`` | 0 means outermost matched pattern, | + | | 1 means next-to-outermost and so on ... | + +-----------+---------------------------------------------------------+ + +Action: ``FIELD_DECREMENT`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Decrement 1 on specific field of the packet. + +Paramenter is same is FIELD_INCREMENT. + +-Non-terminating by default. + +ACTION: ``FIELD_COPY`` +^^^^^^^^^^^^^^^^^^^^^^ + +Copy data of one field to another of the packet. + +-Non-terminating by default. + +.. _table_rte_flow_action_field_copy: + +.. table:: FIELD_COPY + + +-----------------+-----------------------------------------------------------------+ + | Field | Value | + +=================+=================================================================+ + | ``src_item`` | src_item->type: match the pattern that data will be copy from | + | | src_item->spec: ignored | + | | src_item->mask: specify which part of the pattern to copy | + | | src_item->last: ignored | + +-----------------+-----------------------------------------------------------------+ + | ``src_layer`` | layer of src_item | + | | 0 means outermost matched pattern, | + | | 1 means next-to-outermost and so on ... | + +-----------------+-----------------------------------------------------------------+ + | ``dst_item`` | dst_item->type: match the pattern that data will be copy to | + | | dst_item->spec: ignored | + | | dst_item->mask: specify which part of the pattern to be update | + | | it must match src_item->mask. | + | | dst_item->last: ignored | + +-----------------+-----------------------------------------------------------------+ + | ``dst_layer`` | layer of dst_item | + | | 0 means outermost matched pattern, | + | | 1 means next-to-outermost and so on ... | + +-----------------+-----------------------------------------------------------------+ + Negative types ~~~~~~~~~~~~~~ diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h index a8ec780..d81ac4c 100644 --- a/lib/librte_ether/rte_flow.h +++ b/lib/librte_ether/rte_flow.h @@ -1178,6 +1178,34 @@ enum rte_flow_action_type { * See struct rte_flow_action_port. */ RTE_FLOW_ACTION_TYPE_PORT, + + /** + * Update specific field of the packet. + * + * See struct rte_flow_item_field_update. + */ + RTE_FLOW_ACTION_TYPE_FILED_UPDATE, + + /** + * Increment specific field of the packet. + * + * See struct rte_flow_item_field_update. + */ + RTE_FLOW_ACTION_TYPE_FIELD_INCREMENT, + + /** + * Decrement specific field of the packet. + * + * See struct rte_flow_item_field_update. + */ + RTE_FLOW_ACTION_TYPE_FIELD_DECREMENT, + + /** + * Copy data of one field to another of the packet. + * + * See struct rte_flow_item_type_field_copy. + */ + RTE_FLOW_ACTION_TYPE_FIELD_COPY, }; /** @@ -1327,6 +1355,35 @@ struct rte_flow_action_port { uint16_t port_id; /**< identification of the forward destination. */ }; +/** RTE_FLOW_ACTION_TYPE_FIELD_UPDATE + * RTE_FLOW_ACTION_TYPE_FIELD_INCREMENT + * RTE_FLOW_ACTION_TYPE_FIELD_DECREMENT + * + * Update specific field of the packet. + * + * Typical usage: update mac/ip address. + */ +struct rte_flow_action_field_update { + const struct rte_flow_item *item; /**< specify the data to modify. */ + uint8_t layer; + /**< 0 means outermost matched pattern, 1 means next-to-outermost... */ +}; + +/** RTE_FLOW_ACTION_TYPE_FIELD_COPY + * + * Copy data from one field to another of the packet. + * + * Typical usage: TTL copy-in / copy-out + */ +struct rte_flow_action_field_copy { + const struct rte_flow_item *src_item; /**< Specify the data copy from */ + uint8_t src_layer; + /**< 0 means outermost matched pattern, 1 means next-to-outermost... */ + const struct rte_flow_item *dst_item; /**< Specify the data copy to */ + uint8_t dst_layer; + /**< 0 means outermost matched pattern, 1 means next-to-outermost... */ +}; + /** * Definition of a single action. *