From patchwork Wed Dec 20 21:34:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zhang X-Patchwork-Id: 32544 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 04D041B236; Thu, 21 Dec 2017 05:44:38 +0100 (CET) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id 6A03F1B226 for ; Thu, 21 Dec 2017 05:44:32 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Dec 2017 20:44:32 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.45,434,1508828400"; d="scan'208";a="17790365" Received: from dpdk27.sh.intel.com ([10.67.111.90]) by orsmga001.jf.intel.com with ESMTP; 20 Dec 2017 20:44:30 -0800 From: Qi Zhang To: adrien.mazarguil@6wind.com Cc: dev@dpdk.org, declan.doherty@intel.com, Qi Zhang Date: Wed, 20 Dec 2017 16:34:49 -0500 Message-Id: <1513805689-28202-6-git-send-email-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513805689-28202-1-git-send-email-qi.z.zhang@intel.com> References: <1513805689-28202-1-git-send-email-qi.z.zhang@intel.com> Subject: [dpdk-dev] [RFC 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 e09e07f..c3796ed 100644 --- a/lib/librte_ether/rte_flow.h +++ b/lib/librte_ether/rte_flow.h @@ -1020,6 +1020,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, }; /** @@ -1169,6 +1197,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. *