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 <qi.z.zh...@intel.com> --- 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. * -- 2.7.4