From patchwork Thu Dec 21 02:35:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zhang X-Patchwork-Id: 32554 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 809EF1B26C; Thu, 21 Dec 2017 10:45:08 +0100 (CET) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id E66931B250 for ; Thu, 21 Dec 2017 10:45:00 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Dec 2017 01:45:00 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.45,435,1508828400"; d="scan'208";a="188920513" Received: from dpdk27.sh.intel.com ([10.67.111.90]) by fmsmga006.fm.intel.com with ESMTP; 21 Dec 2017 01:44:59 -0800 From: Qi Zhang To: adrien.mazarguil@6wind.com Cc: dev@dpdk.org, declan.doherty@intel.com, Qi Zhang Date: Wed, 20 Dec 2017 21:35:19 -0500 Message-Id: <1513823719-36066-6-git-send-email-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513823719-36066-1-git-send-email-qi.z.zhang@intel.com> References: <1513823719-36066-1-git-send-email-qi.z.zhang@intel.com> Subject: [dpdk-dev] [RFC v2 5/5] ether: add packet modification aciton in rte_flow 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 | 79 +++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+) diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index 1a242fc..b706a78 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -1504,6 +1504,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_increment: + +.. 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_increment: + +.. 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 4ee2b62..12f194f 100644 --- a/lib/librte_ether/rte_flow.h +++ b/lib/librte_ether/rte_flow.h @@ -1176,6 +1176,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_type_field_update. + */ + RTE_FLOW_ACTION_TYPE_FILED_UPDATE, + + /** + * Increment specific field of the packet. + * + * See struct rte_flow_item_type_field_increment. + */ + RTE_FLOW_ACTION_TYPE_FIELD_INCREMENT, + + /** + * Decrement specific field of the packet. + * + * See struct rte_flow_item_type_field_decrement. + */ + 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, }; /** @@ -1325,6 +1353,57 @@ struct rte_flow_action_port { uint16_t port_id; /**< identification of the forward destination. */ }; +/** RTE_FLOW_ACTION_TYPE_FIELD_UPDATE + * + * 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_INCREMENT + * + * Increment 1 on specific field of the packet. + * + * Typical usage: increase TTL + */ +struct rte_flow_action_field_increment { + 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_DECREMENT + * + * Decrement 1 on specific field of the packet. + * + * Typical usage: Decrease TTL + */ +struct rte_flow_action_field_decrement { + 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. *