[dpdk-dev,v3,2/4] ethdev: add packet field set aciton in flow API

Message ID 20180416061042.785-3-qi.z.zhang@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail Compilation issues

Commit Message

Qi Zhang April 16, 2018, 6:10 a.m. UTC
  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.zhang@intel.com>
---
 doc/guides/prog_guide/rte_flow.rst | 30 +++++++++++++++++++++++++++
 lib/librte_ether/rte_flow.h        | 42 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 71 insertions(+), 1 deletion(-)
  

Comments

Adrien Mazarguil April 19, 2018, 2:48 p.m. UTC | #1
Typo in commit title: aciton => action

On Mon, Apr 16, 2018 at 02:10:40PM +0800, Qi Zhang wrote:
> 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.

requireds => required

> 
> Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>

(more below)

> ---
>  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``
> +^^^^^^^^^^^^^^^^^^^^^

FILED_SET => FIELD_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.                                    |

Please remove the direction part. What devices can match is always outermost
up to the point where they can't recognize an inner header. "innermost" is
almost guaranteed to never have the desired effect.

> +   |               | 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 ...                                                  |

Then you can remove any reference to dir_level from here.

> +   +---------------+-------------------------------------------------------------------+
> +   |  ``new_val``  | Pointer to specific data structure according to protocol type,    |
> +   |               | the content is the new value to updtae.                           |

updtae => update

> +   +---------------+-------------------------------------------------------------------+
> +   |  ``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;

See above regarding this field.

> +	/**
> +	 * 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
> 

Testpmd implementation and documentation update are also missing, however
I'm still not convinced by the definition of this new action, it seems too
generic to be useful (e.g. compare this with a dedicated "update destination
IPv4 address" action for instance).

What existing HW capabilities do you intend to expose through this, what
kind of fields can be updated at this point?

If it's still unclear, I suggest to remove this patch from the series or at
the very least mark it as experimental. You can even provide a forward
declaration without the contents of struct rte_flow_action_field_set to
prevent applications from using it before it's finalized.
  
Qi Zhang April 20, 2018, 2:24 a.m. UTC | #2
Hi Adrien:

> -----Original Message-----
> From: Adrien Mazarguil [mailto:adrien.mazarguil@6wind.com]
> Sent: Thursday, April 19, 2018 10:49 PM
> To: Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: dev@dpdk.org; Doherty, Declan <declan.doherty@intel.com>; Chandran,
> Sugesh <sugesh.chandran@intel.com>; Glynn, Michael J
> <michael.j.glynn@intel.com>; Liu, Yu Y <yu.y.liu@intel.com>; Ananyev,
> Konstantin <konstantin.ananyev@intel.com>; Richardson, Bruce
> <bruce.richardson@intel.com>
> Subject: Re: [PATCH v3 2/4] ethdev: add packet field set aciton in flow API
> 
> Typo in commit title: aciton => action
> 
> On Mon, Apr 16, 2018 at 02:10:40PM +0800, Qi Zhang wrote:
> > 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.
> 
> requireds => required
> 
> >
> > Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
> 
> (more below)
> 
> > ---
> >  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``
> > +^^^^^^^^^^^^^^^^^^^^^
> 
> FILED_SET => FIELD_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.
> |
> 
> Please remove the direction part. What devices can match is always
> outermost up to the point where they can't recognize an inner header.
> "innermost" is almost guaranteed to never have the desired effect.
> 
> > +   |               | 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 ...
> |
> 
> Then you can remove any reference to dir_level from here.
> 
> > +   +---------------+-------------------------------------------------------------------+
> > +   |  ``new_val``  | Pointer to specific data structure according to
> protocol type,    |
> > +   |               | the content is the new value to updtae.
> |
> 
> updtae => update
> 
> > +   +---------------+-------------------------------------------------------------------+
> > +   |  ``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;
> 
> See above regarding this field.
> 
> > +	/**
> > +	 * 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
> >
> 
> Testpmd implementation and documentation update are also missing,
> however
> I'm still not convinced by the definition of this new action, it seems too
> generic to be useful (e.g. compare this with a dedicated "update destination
> IPv4 address" action for instance).
> 
> What existing HW capabilities do you intend to expose through this, what
> kind of fields can be updated at this point?

For our device, there will be more than 20 actions if we create an action for each field like "RTE_FLOW_ACTION_TYPE_IPV4_ADDR_SET",
More detail, that will cover fields in IPV4/IPV6/Ether/ICMP/ND/ARP, so I think a generic field set action would be better.

For testpmd support, Seems there is no reference to enable an action with void parameters, so it may take me time to figure out a solution,
I'm not sure I can capture this on the 18.05, so is that possible we just deferred testpmd support for this action? since I saw action like rte_flow_action_security also don't have
testpmd support yet.

Thanks
Qi

> 
> If it's still unclear, I suggest to remove this patch from the series or at
> the very least mark it as experimental. You can even provide a forward
> declaration without the contents of struct rte_flow_action_field_set to
> prevent applications from using it before it's finalized.
> 
> --
> Adrien Mazarguil
> 6WIND
  
Adrien Mazarguil April 20, 2018, 8:54 a.m. UTC | #3
On Fri, Apr 20, 2018 at 02:24:20AM +0000, Zhang, Qi Z wrote:
> Hi Adrien:
> 
> > -----Original Message-----
> > From: Adrien Mazarguil [mailto:adrien.mazarguil@6wind.com]
> > Sent: Thursday, April 19, 2018 10:49 PM
> > To: Zhang, Qi Z <qi.z.zhang@intel.com>
> > Cc: dev@dpdk.org; Doherty, Declan <declan.doherty@intel.com>; Chandran,
> > Sugesh <sugesh.chandran@intel.com>; Glynn, Michael J
> > <michael.j.glynn@intel.com>; Liu, Yu Y <yu.y.liu@intel.com>; Ananyev,
> > Konstantin <konstantin.ananyev@intel.com>; Richardson, Bruce
> > <bruce.richardson@intel.com>
> > Subject: Re: [PATCH v3 2/4] ethdev: add packet field set aciton in flow API
> > 
> > Typo in commit title: aciton => action
> > 
> > On Mon, Apr 16, 2018 at 02:10:40PM +0800, Qi Zhang wrote:
> > > 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.
> > 
> > requireds => required
> > 
> > >
> > > Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
> > 
> > (more below)
> > 
> > > ---
> > >  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``
> > > +^^^^^^^^^^^^^^^^^^^^^
> > 
> > FILED_SET => FIELD_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.
> > |
> > 
> > Please remove the direction part. What devices can match is always
> > outermost up to the point where they can't recognize an inner header.
> > "innermost" is almost guaranteed to never have the desired effect.
> > 
> > > +   |               | 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 ...
> > |
> > 
> > Then you can remove any reference to dir_level from here.
> > 
> > > +   +---------------+-------------------------------------------------------------------+
> > > +   |  ``new_val``  | Pointer to specific data structure according to
> > protocol type,    |
> > > +   |               | the content is the new value to updtae.
> > |
> > 
> > updtae => update
> > 
> > > +   +---------------+-------------------------------------------------------------------+
> > > +   |  ``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;
> > 
> > See above regarding this field.
> > 
> > > +	/**
> > > +	 * 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
> > >
> > 
> > Testpmd implementation and documentation update are also missing,
> > however
> > I'm still not convinced by the definition of this new action, it seems too
> > generic to be useful (e.g. compare this with a dedicated "update destination
> > IPv4 address" action for instance).
> > 
> > What existing HW capabilities do you intend to expose through this, what
> > kind of fields can be updated at this point?
> 
> For our device, there will be more than 20 actions if we create an action for each field like "RTE_FLOW_ACTION_TYPE_IPV4_ADDR_SET",
> More detail, that will cover fields in IPV4/IPV6/Ether/ICMP/ND/ARP, so I think a generic field set action would be better.

I see. You know, I think adding 20+ focused actions would be fine actually,
easier to document, report as HW capabilities and to use by applications
(e.g. see issue you raise about adding testpmd support below).

In all the protocols you mention, is the device able to really update *all*
fields or only the "usual" set? IPv4 src/dst probably, now what about ToS,
packet ID, fragment offset and so on? Same for other protocols, should we
care about protocol fields that applications rarely set (if at all),
especially if no device can update them?

> For testpmd support, Seems there is no reference to enable an action with void parameters, so it may take me time to figure out a solution,

Dedicated actions on the other hand should be way easier to add :)

> I'm not sure I can capture this on the 18.05, so is that possible we just deferred testpmd support for this action? since I saw action like rte_flow_action_security also don't have
> testpmd support yet.

I know, there are several problematic actions without testpmd
support. However those are often associated with experimental APIs and may
be modified without prior notice.

Keep in mind there is no need to rush. Adding rte_flow actions doesn't hurt
ABI and can be done for any DPDK release, even part of the same series as
the first PMD implementation which must be validated somehow (no one ever
submits code that can't be tested, right?), this is why testpmd support is
mandatory.

> > If it's still unclear, I suggest to remove this patch from the series or at
> > the very least mark it as experimental. You can even provide a forward
> > declaration without the contents of struct rte_flow_action_field_set to
> > prevent applications from using it before it's finalized.
  

Patch

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.