Add new action RTE_FLOW_ACTION_TYPE_FIELD_SET, it is used to
modify fields of specific protocol layer of the packet, the
action only apply on packets that contain the requireds protocol
layer.

Signed-off-by: Qi Zhang <qi.z.zh...@intel.com>
---
 doc/guides/prog_guide/rte_flow.rst | 30 +++++++++++++++++++++++++++
 lib/librte_ether/rte_flow.h        | 42 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/doc/guides/prog_guide/rte_flow.rst 
b/doc/guides/prog_guide/rte_flow.rst
index 99468bf60..68deb9812 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1574,6 +1574,36 @@ fields in the pattern items.
    | 1     | END      |
    +-------+----------+
 
+Action: ``FILED_SET``
+^^^^^^^^^^^^^^^^^^^^^
+
+Modify the value of fields in a protocol layer, only applies to packets that
+contain respective protocol layer.
+
+.. _table_rte_flow_action_field_set:
+
+.. table:: FIELD_SET
+
+   
+---------------+-------------------------------------------------------------------+
+   | Field         | Value                                                     
        |
+   
+===============+===================================================================+
+   | ``type``      | Specify the type of a protocol layer. (see 
RTE_FLOW_ITEM_TYPE_*)  |
+   
+---------------+-------------------------------------------------------------------+
+   | ``dir_level`` | Specify the level of matched protocol layer.              
        |
+   |               | direction (1b)                                            
        |
+   |               | 0: match start from outermost.                            
        |
+   |               | 1: match start from innermost.                            
        |
+   |               | level: (31b)                                              
        |
+   |               | 0: outermost or innermost protocol layer that matched 
@type       |
+   |               | 1: next to outmost or innermost protocol layer that 
matched @type |
+   |               | 2: and so on ...                                          
        |
+   
+---------------+-------------------------------------------------------------------+
+   |  ``new_val``  | Pointer to specific data structure according to protocol 
type,    |
+   |               | the content is the new value to updtae.                   
        |
+   
+---------------+-------------------------------------------------------------------+
+   |  ``mask``     | Bit-mask applied to new_val                               
        |
+   
+---------------+-------------------------------------------------------------------+
+
 Negative types
 ~~~~~~~~~~~~~~
 
diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h
index f84bbfda5..2dc95b6b8 100644
--- a/lib/librte_ether/rte_flow.h
+++ b/lib/librte_ether/rte_flow.h
@@ -1245,7 +1245,15 @@ enum rte_flow_action_type {
         *
         * See struct rte_flow_action_security.
         */
-       RTE_FLOW_ACTION_TYPE_SECURITY
+       RTE_FLOW_ACTION_TYPE_SECURITY,
+
+       /**
+        * Modify the value of fields in a protocol layer, only applies to
+        * packets that contain respective protocol layer.
+        *
+        * See struct rte_flow_action_field_set.
+        */
+       RTE_FLOW_ACTION_TYPE_FIELD_SET,
 };
 
 /**
@@ -1384,6 +1392,38 @@ struct rte_flow_action_security {
 };
 
 /**
+ * RTE_FLOW_ACTION_TYPE_FIELD_SET
+ *
+ * Modify the value of fields in a protocol layer, only applies to
+ * packets that contain respective protocol layer.
+ */
+struct rte_flow_action_field_set {
+       /**
+        * Specify the type of a protocol layer.
+        */
+       enum rte_flow_item_type type;
+       /**
+        * Specify the level of matched protocol layer.
+        *
+        * direction (1b)
+        * 0: match start from outermost.
+        * 1: match start from innermost.
+        *
+        * level (31b)
+        * 0: outermost|innermost protocol layer that matched @type.
+        * 1: next to outermost|innermost protocol layer that matched @type.
+        * 2: and so on ...
+        */
+       uint32_t dir_level;
+       /**
+        * Pointer to specific data structure according to protocol type,
+        * the content is the new value to update.
+        */
+       const void *new_val;
+       const void *mask; /**< Bit-mask applied to new_val. */
+};
+
+/**
  * Definition of a single action.
  *
  * A list of actions is terminated by a END action.
-- 
2.13.6

Reply via email to