net/vmxnet3: support RETA query and update
[dpdk.git] / lib / ethdev / rte_flow.h
index 961a588..d8827dd 100644 (file)
 #include <rte_mbuf.h>
 #include <rte_mbuf_dyn.h>
 #include <rte_meter.h>
+#include <rte_gtp.h>
+#include <rte_l2tpv2.h>
+#include <rte_ppp.h>
+#include <rte_gre.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+#define RTE_FLOW_LOG(level, ...) \
+       rte_log(RTE_LOG_ ## level, rte_eth_dev_logtype, "" __VA_ARGS__)
+
 /**
  * Flow rule attributes.
  *
@@ -66,7 +73,10 @@ extern "C" {
  * Note that support for more than a single group and priority level is not
  * guaranteed.
  *
- * Flow rules can apply to inbound and/or outbound traffic (ingress/egress).
+ * At vNIC / ethdev level, flow rules can apply to inbound and / or outbound
+ * traffic (ingress / egress), with respect to the vNIC / ethdev in question.
+ * At embedded switch level, flow rules apply to all traffic seen by it
+ * unless fitting meta items are used to set concrete traffic source(s).
  *
  * Several pattern items and actions are valid and can be used in both
  * directions. Those valid for only one direction are described as such.
@@ -74,13 +84,37 @@ extern "C" {
  * At least one direction must be specified.
  *
  * Specifying both directions at once for a given rule is not recommended
- * but may be valid in a few cases (e.g. shared counter).
+ * but may be valid in a few cases.
  */
 struct rte_flow_attr {
        uint32_t group; /**< Priority group. */
        uint32_t priority; /**< Rule priority level within group. */
-       uint32_t ingress:1; /**< Rule applies to ingress traffic. */
-       uint32_t egress:1; /**< Rule applies to egress traffic. */
+       /**
+        * The rule in question applies to ingress traffic (non-"transfer").
+        *
+        * @deprecated
+        * It has been possible to combine this attribute with "transfer".
+        * Doing so has been assumed to restrict the scope of matching
+        * to traffic going from within the embedded switch toward the
+        * ethdev the flow rule being created through. This behaviour
+        * is deprecated. During the transition period, one may still
+        * rely on it, but PMDs and applications are encouraged to
+        * gradually move away from this approach.
+        */
+       uint32_t ingress:1;
+       /**
+        * The rule in question applies to egress traffic (non-"transfer").
+        *
+        * @deprecated
+        * It has been possible to combine this attribute with "transfer".
+        * Doing so has been assumed to restrict the scope of matching
+        * to traffic sent by the application by virtue of the ethdev
+        * the flow rule being created through. This behaviour is now
+        * deprecated. During the transition period, one may still
+        * rely on it, but PMDs and applications are encouraged to
+        * gradually move away from this approach.
+        */
+       uint32_t egress:1;
        /**
         * Instead of simply matching the properties of traffic as it would
         * appear on a given DPDK port ID, enabling this attribute transfers
@@ -92,12 +126,11 @@ struct rte_flow_attr {
         * from or addressed to different physical ports, VFs or
         * applications) at the device level.
         *
-        * It complements the behavior of some pattern items such as
-        * RTE_FLOW_ITEM_TYPE_PHY_PORT and is meaningless without them.
+        * The application should match traffic originating from precise
+        * locations. See items PORT_REPRESENTOR and REPRESENTED_PORT.
         *
-        * When transferring flow rules, ingress and egress attributes keep
-        * their original meaning, as if processing traffic emitted or
-        * received by the application.
+        * Managing "transfer" flows requires that the user communicate them
+        * through a suitable port. @see rte_flow_pick_transfer_proxy().
         */
        uint32_t transfer:1;
        uint32_t reserved:29; /**< Reserved, must be zero. */
@@ -159,6 +192,10 @@ enum rte_flow_item_type {
        RTE_FLOW_ITEM_TYPE_ANY,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR
+        * @see RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT
+        *
         * [META]
         *
         * Matches traffic originating from (ingress) or going to (egress)
@@ -169,6 +206,10 @@ enum rte_flow_item_type {
        RTE_FLOW_ITEM_TYPE_PF,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR
+        * @see RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT
+        *
         * [META]
         *
         * Matches traffic originating from (ingress) or going to (egress) a
@@ -179,6 +220,10 @@ enum rte_flow_item_type {
        RTE_FLOW_ITEM_TYPE_VF,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR
+        * @see RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT
+        *
         * [META]
         *
         * Matches traffic originating from (ingress) or going to (egress) a
@@ -189,6 +234,10 @@ enum rte_flow_item_type {
        RTE_FLOW_ITEM_TYPE_PHY_PORT,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR
+        * @see RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT
+        *
         * [META]
         *
         * Matches traffic originating from (ingress) or going to (egress) a
@@ -573,6 +622,55 @@ enum rte_flow_item_type {
         * @see struct rte_flow_item_conntrack.
         */
        RTE_FLOW_ITEM_TYPE_CONNTRACK,
+
+       /**
+        * [META]
+        *
+        * Matches traffic entering the embedded switch from the given ethdev.
+        *
+        * @see struct rte_flow_item_ethdev
+        */
+       RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR,
+
+       /**
+        * [META]
+        *
+        * Matches traffic entering the embedded switch from
+        * the entity represented by the given ethdev.
+        *
+        * @see struct rte_flow_item_ethdev
+        */
+       RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT,
+
+       /**
+        * Matches a configured set of fields at runtime calculated offsets
+        * over the generic network header with variable length and
+        * flexible pattern
+        *
+        * @see struct rte_flow_item_flex.
+        */
+       RTE_FLOW_ITEM_TYPE_FLEX,
+
+       /**
+        * Matches L2TPv2 Header.
+        *
+        * See struct rte_flow_item_l2tpv2.
+        */
+       RTE_FLOW_ITEM_TYPE_L2TPV2,
+
+       /**
+        * Matches PPP Header.
+        *
+        * See struct rte_flow_item_ppp.
+        */
+       RTE_FLOW_ITEM_TYPE_PPP,
+
+       /**
+        * Matches GRE optional fields.
+        *
+        * See struct rte_flow_item_gre_opt.
+        */
+       RTE_FLOW_ITEM_TYPE_GRE_OPTION,
 };
 
 /**
@@ -620,6 +718,10 @@ static const struct rte_flow_item_any rte_flow_item_any_mask = {
 #endif
 
 /**
+ * @deprecated
+ * @see RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR
+ * @see RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT
+ *
  * RTE_FLOW_ITEM_TYPE_VF
  *
  * Matches traffic originating from (ingress) or going to (egress) a given
@@ -649,6 +751,10 @@ static const struct rte_flow_item_vf rte_flow_item_vf_mask = {
 #endif
 
 /**
+ * @deprecated
+ * @see RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR
+ * @see RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT
+ *
  * RTE_FLOW_ITEM_TYPE_PHY_PORT
  *
  * Matches traffic originating from (ingress) or going to (egress) a
@@ -680,6 +786,10 @@ static const struct rte_flow_item_phy_port rte_flow_item_phy_port_mask = {
 #endif
 
 /**
+ * @deprecated
+ * @see RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR
+ * @see RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT
+ *
  * RTE_FLOW_ITEM_TYPE_PORT_ID
  *
  * Matches traffic originating from (ingress) or going to (egress) a given
@@ -784,8 +894,8 @@ struct rte_flow_item_eth {
 /** Default mask for RTE_FLOW_ITEM_TYPE_ETH. */
 #ifndef __cplusplus
 static const struct rte_flow_item_eth rte_flow_item_eth_mask = {
-       .hdr.d_addr.addr_bytes = "\xff\xff\xff\xff\xff\xff",
-       .hdr.s_addr.addr_bytes = "\xff\xff\xff\xff\xff\xff",
+       .hdr.dst_addr.addr_bytes = "\xff\xff\xff\xff\xff\xff",
+       .hdr.src_addr.addr_bytes = "\xff\xff\xff\xff\xff\xff",
        .hdr.ether_type = RTE_BE16(0x0000),
 };
 #endif
@@ -818,8 +928,8 @@ struct rte_flow_item_vlan {
                };
                struct rte_vlan_hdr hdr;
        };
+       /** Packet header contains at least one more VLAN, after this VLAN. */
        uint32_t has_more_vlan:1;
-       /**< Packet header contains at least one more VLAN, after this VLAN. */
        uint32_t reserved:31; /**< Reserved, must be zero. */
 };
 
@@ -861,26 +971,26 @@ static const struct rte_flow_item_ipv4 rte_flow_item_ipv4_mask = {
  */
 struct rte_flow_item_ipv6 {
        struct rte_ipv6_hdr hdr; /**< IPv6 header definition. */
+       /** Header contains Hop-by-Hop Options extension header. */
        uint32_t has_hop_ext:1;
-       /**< Header contains Hop-by-Hop Options extension header. */
+       /** Header contains Routing extension header. */
        uint32_t has_route_ext:1;
-       /**< Header contains Routing extension header. */
+       /** Header contains Fragment extension header. */
        uint32_t has_frag_ext:1;
-       /**< Header contains Fragment extension header. */
+       /** Header contains Authentication extension header. */
        uint32_t has_auth_ext:1;
-       /**< Header contains Authentication extension header. */
+       /** Header contains Encapsulation Security Payload extension header. */
        uint32_t has_esp_ext:1;
-       /**< Header contains Encapsulation Security Payload extension header. */
+       /** Header contains Destination Options extension header. */
        uint32_t has_dest_ext:1;
-       /**< Header contains Destination Options extension header. */
+       /** Header contains Mobility extension header. */
        uint32_t has_mobil_ext:1;
-       /**< Header contains Mobility extension header. */
+       /** Header contains Host Identity Protocol extension header. */
        uint32_t has_hip_ext:1;
-       /**< Header contains Host Identity Protocol extension header. */
+       /** Header contains Shim6 Protocol extension header. */
        uint32_t has_shim6_ext:1;
-       /**< Header contains Shim6 Protocol extension header. */
+       /** Reserved for future extension headers, must be zero. */
        uint32_t reserved:23;
-       /**< Reserved for future extension headers, must be zero. */
 };
 
 /** Default mask for RTE_FLOW_ITEM_TYPE_IPV6. */
@@ -1096,6 +1206,17 @@ static const struct rte_flow_item_gre rte_flow_item_gre_mask = {
 };
 #endif
 
+/**
+ * RTE_FLOW_ITEM_TYPE_GRE_OPTION.
+ *
+ * Matches GRE optional fields in header.
+ */
+struct rte_flow_item_gre_opt {
+       struct rte_gre_hdr_opt_checksum_rsvd checksum_rsvd;
+       struct rte_gre_hdr_opt_key key;
+       struct rte_gre_hdr_opt_sequence sequence;
+};
+
 /**
  * RTE_FLOW_ITEM_TYPE_FUZZY
  *
@@ -1421,11 +1542,12 @@ rte_flow_item_icmp6_nd_opt_tla_eth_mask = {
  * RTE_FLOW_ITEM_TYPE_META
  *
  * Matches a specified metadata value. On egress, metadata can be set
- * either by mbuf dynamic metadata field with PKT_TX_DYNF_METADATA flag or
- * RTE_FLOW_ACTION_TYPE_SET_META. On ingress, RTE_FLOW_ACTION_TYPE_SET_META
+ * either by mbuf dynamic metadata field with RTE_MBUF_DYNFLAG_TX_METADATA flag
+ * or RTE_FLOW_ACTION_TYPE_SET_META. On ingress, RTE_FLOW_ACTION_TYPE_SET_META
  * sets metadata for a packet and the metadata will be reported via mbuf
- * metadata dynamic field with PKT_RX_DYNF_METADATA flag. The dynamic mbuf
- * field must be registered in advance by rte_flow_dynf_metadata_register().
+ * metadata dynamic field with RTE_MBUF_DYNFLAG_RX_METADATA flag. The dynamic
+ * mbuf field must be registered in advance by
+ * rte_flow_dynf_metadata_register().
  */
 struct rte_flow_item_meta {
        uint32_t data;
@@ -1444,15 +1566,14 @@ static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
  * Matches a GTP PDU extension header with type 0x85.
  */
 struct rte_flow_item_gtp_psc {
-       uint8_t pdu_type; /**< PDU type. */
-       uint8_t qfi; /**< PPP, RQI, QoS flow identifier. */
+       struct rte_gtp_psc_generic_hdr hdr; /**< gtp psc generic hdr. */
 };
 
 /** Default mask for RTE_FLOW_ITEM_TYPE_GTP_PSC. */
 #ifndef __cplusplus
 static const struct rte_flow_item_gtp_psc
 rte_flow_item_gtp_psc_mask = {
-       .qfi = 0xff,
+       .hdr.qfi = 0x3f,
 };
 #endif
 
@@ -1799,6 +1920,76 @@ static const struct rte_flow_item_conntrack rte_flow_item_conntrack_mask = {
 };
 #endif
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * Provides an ethdev port ID for use with the following items:
+ * RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR,
+ * RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT.
+ */
+struct rte_flow_item_ethdev {
+       uint16_t port_id; /**< ethdev port ID */
+};
+
+/** Default mask for items based on struct rte_flow_item_ethdev */
+#ifndef __cplusplus
+static const struct rte_flow_item_ethdev rte_flow_item_ethdev_mask = {
+       .port_id = 0xffff,
+};
+#endif
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ITEM_TYPE_L2TPV2
+ *
+ * Matches L2TPv2 Header
+ */
+struct rte_flow_item_l2tpv2 {
+       struct rte_l2tpv2_combined_msg_hdr hdr;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_L2TPV2. */
+#ifndef __cplusplus
+static const struct rte_flow_item_l2tpv2 rte_flow_item_l2tpv2_mask = {
+       /*
+        * flags and version bit mask
+        * 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+        * T L x x S x O P x x x x V V V V
+        */
+       .hdr = {
+               .common = {
+                       .flags_version = RTE_BE16(0xcb0f),
+               },
+       },
+};
+#endif
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ITEM_TYPE_PPP
+ *
+ * Matches PPP Header
+ */
+struct rte_flow_item_ppp {
+       struct rte_ppp_hdr hdr;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_PPP. */
+#ifndef __cplusplus
+static const struct rte_flow_item_ppp rte_flow_item_ppp_mask = {
+       .hdr = {
+               .addr = 0xff,
+               .ctrl = 0xff,
+               .proto_id = RTE_BE16(0xffff),
+       }
+};
+#endif
+
 /**
  * Matching pattern item definition.
  *
@@ -1839,6 +2030,177 @@ struct rte_flow_item {
        const void *mask; /**< Bit-mask applied to spec and last. */
 };
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ITEM_TYPE_FLEX
+ *
+ * Matches a specified set of fields within the network protocol
+ * header. Each field is presented as set of bits with specified width, and
+ * bit offset from the header beginning.
+ *
+ * The pattern is concatenation of bit fields configured at item creation
+ * by rte_flow_flex_item_create(). At configuration the fields are presented
+ * by sample_data array.
+ *
+ * This type does not support ranges (struct rte_flow_item.last).
+ */
+struct rte_flow_item_flex {
+       struct rte_flow_item_flex_handle *handle; /**< Opaque item handle. */
+       uint32_t length; /**< Pattern length in bytes. */
+       const uint8_t *pattern; /**< Combined bitfields pattern to match. */
+};
+/**
+ * Field bit offset calculation mode.
+ */
+enum rte_flow_item_flex_field_mode {
+       /**
+        * Dummy field, used for byte boundary alignment in pattern.
+        * Pattern mask and data are ignored in the match. All configuration
+        * parameters besides field size are ignored.
+        */
+       FIELD_MODE_DUMMY = 0,
+       /**
+        * Fixed offset field. The bit offset from header beginning
+        * is permanent and defined by field_base parameter.
+        */
+       FIELD_MODE_FIXED,
+       /**
+        * The field bit offset is extracted from other header field (indirect
+        * offset field). The resulting field offset to match is calculated as:
+        *
+        *    field_base + (*offset_base & offset_mask) << offset_shift
+        */
+       FIELD_MODE_OFFSET,
+       /**
+        * The field bit offset is extracted from other header field (indirect
+        * offset field), the latter is considered as bitmask containing some
+        * number of one bits, the resulting field offset to match is
+        * calculated as:
+        *
+        *    field_base + bitcount(*offset_base & offset_mask) << offset_shift
+        */
+       FIELD_MODE_BITMASK,
+};
+
+/**
+ * Flex item field tunnel mode
+ */
+enum rte_flow_item_flex_tunnel_mode {
+       /**
+        * The protocol header can be present in the packet only once.
+        * No multiple flex item flow inclusions (for inner/outer) are allowed.
+        * No any relations with tunnel protocols are imposed. The drivers
+        * can optimize hardware resource usage to handle match on single flex
+        * item of specific type.
+        */
+       FLEX_TUNNEL_MODE_SINGLE = 0,
+       /**
+        * Flex item presents outer header only.
+        */
+       FLEX_TUNNEL_MODE_OUTER,
+       /**
+        * Flex item presents inner header only.
+        */
+       FLEX_TUNNEL_MODE_INNER,
+       /**
+        * Flex item presents either inner or outer header. The driver
+        * handles as many multiple inners as hardware supports.
+        */
+       FLEX_TUNNEL_MODE_MULTI,
+       /**
+        * Flex item presents tunnel protocol header.
+        */
+       FLEX_TUNNEL_MODE_TUNNEL,
+};
+
+/**
+ *
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ */
+__extension__
+struct rte_flow_item_flex_field {
+       /** Defines how match field offset is calculated over the packet. */
+       enum rte_flow_item_flex_field_mode field_mode;
+       uint32_t field_size; /**< Field size in bits. */
+       int32_t field_base; /**< Field offset in bits. */
+       uint32_t offset_base; /**< Indirect offset field offset in bits. */
+       uint32_t offset_mask; /**< Indirect offset field bit mask. */
+       int32_t offset_shift; /**< Indirect offset multiply factor. */
+       uint32_t field_id:16; /**< Device hint, for multiple items in flow. */
+       uint32_t reserved:16; /**< Reserved field. */
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ */
+struct rte_flow_item_flex_link {
+       /**
+        * Preceding/following header. The item type must be always provided.
+        * For preceding one item must specify the header value/mask to match
+        * for the link be taken and start the flex item header parsing.
+        */
+       struct rte_flow_item item;
+       /**
+        * Next field value to match to continue with one of the configured
+        * next protocols.
+        */
+       uint32_t next;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ */
+struct rte_flow_item_flex_conf {
+       /**
+        * Specifies the flex item and tunnel relations and tells the PMD
+        * whether flex item can be used for inner, outer or both headers,
+        * or whether flex item presents the tunnel protocol itself.
+        */
+       enum rte_flow_item_flex_tunnel_mode tunnel;
+       /**
+        * The next header offset, it presents the network header size covered
+        * by the flex item and can be obtained with all supported offset
+        * calculating methods (fixed, dedicated field, bitmask, etc).
+        */
+       struct rte_flow_item_flex_field next_header;
+       /**
+        * Specifies the next protocol field to match with link next protocol
+        * values and continue packet parsing with matching link.
+        */
+       struct rte_flow_item_flex_field next_protocol;
+       /**
+        * The fields will be sampled and presented for explicit match
+        * with pattern in the rte_flow_flex_item. There can be multiple
+        * fields descriptors, the number should be specified by nb_samples.
+        */
+       struct rte_flow_item_flex_field *sample_data;
+       /** Number of field descriptors in the sample_data array. */
+       uint32_t nb_samples;
+       /**
+        * Input link defines the flex item relation with preceding
+        * header. It specified the preceding item type and provides pattern
+        * to match. The flex item will continue parsing and will provide the
+        * data to flow match in case if there is the match with one of input
+        * links.
+        */
+       struct rte_flow_item_flex_link *input_link;
+       /** Number of link descriptors in the input link array. */
+       uint32_t nb_inputs;
+       /**
+        * Output link defines the next protocol field value to match and
+        * the following protocol header to continue packet parsing. Also
+        * defines the tunnel-related behaviour.
+        */
+       struct rte_flow_item_flex_link *output_link;
+       /** Number of link descriptors in the output link array. */
+       uint32_t nb_outputs;
+};
+
 /**
  * Action types.
  *
@@ -1900,18 +2262,26 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_JUMP,
 
        /**
-        * Attaches an integer value to packets and sets PKT_RX_FDIR and
-        * PKT_RX_FDIR_ID mbuf flags.
+        * Attaches an integer value to packets and sets RTE_MBUF_F_RX_FDIR and
+        * RTE_MBUF_F_RX_FDIR_ID mbuf flags.
         *
         * See struct rte_flow_action_mark.
+        *
+        * One should negotiate mark delivery from the NIC to the PMD.
+        * @see rte_eth_rx_metadata_negotiate()
+        * @see RTE_ETH_RX_METADATA_USER_MARK
         */
        RTE_FLOW_ACTION_TYPE_MARK,
 
        /**
         * Flags packets. Similar to MARK without a specific value; only
-        * sets the PKT_RX_FDIR mbuf flag.
+        * sets the RTE_MBUF_F_RX_FDIR mbuf flag.
         *
         * No associated configuration structure.
+        *
+        * One should negotiate flag delivery from the NIC to the PMD.
+        * @see rte_eth_rx_metadata_negotiate()
+        * @see RTE_ETH_RX_METADATA_USER_FLAG
         */
        RTE_FLOW_ACTION_TYPE_FLAG,
 
@@ -1952,6 +2322,10 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_RSS,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR
+        * @see RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT
+        *
         * Directs matching traffic to the physical function (PF) of the
         * current device.
         *
@@ -1960,6 +2334,10 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_PF,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR
+        * @see RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT
+        *
         * Directs matching traffic to a given virtual function of the
         * current device.
         *
@@ -1968,6 +2346,10 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_VF,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR
+        * @see RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT
+        *
         * Directs packets to a given physical port index of the underlying
         * device.
         *
@@ -1976,6 +2358,10 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_PHY_PORT,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR
+        * @see RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT
+        *
         * Directs matching traffic to a given DPDK port ID.
         *
         * See struct rte_flow_action_port_id.
@@ -1999,6 +2385,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SECURITY,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Implements OFPAT_SET_MPLS_TTL ("MPLS TTL") as defined by the
         * OpenFlow Switch Specification.
         *
@@ -2007,6 +2396,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_OF_SET_MPLS_TTL,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Implements OFPAT_DEC_MPLS_TTL ("decrement MPLS TTL") as defined
         * by the OpenFlow Switch Specification.
         *
@@ -2015,6 +2407,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_OF_DEC_MPLS_TTL,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Implements OFPAT_SET_NW_TTL ("IP TTL") as defined by the OpenFlow
         * Switch Specification.
         *
@@ -2023,6 +2418,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_OF_SET_NW_TTL,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Implements OFPAT_DEC_NW_TTL ("decrement IP TTL") as defined by
         * the OpenFlow Switch Specification.
         *
@@ -2031,6 +2429,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_OF_DEC_NW_TTL,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Implements OFPAT_COPY_TTL_OUT ("copy TTL "outwards" -- from
         * next-to-outermost to outermost") as defined by the OpenFlow
         * Switch Specification.
@@ -2040,6 +2441,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_OF_COPY_TTL_OUT,
 
        /**
+        * @deprecated
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Implements OFPAT_COPY_TTL_IN ("copy TTL "inwards" -- from
         * outermost to next-to-outermost") as defined by the OpenFlow
         * Switch Specification.
@@ -2065,7 +2469,7 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN,
 
        /**
-        * Implements OFPAT_SET_VLAN_VID ("set the 802.1q VLAN id") as
+        * Implements OFPAT_SET_VLAN_VID ("set the 802.1q VLAN ID") as
         * defined by the OpenFlow Switch Specification.
         *
         * See struct rte_flow_action_of_set_vlan_vid.
@@ -2145,6 +2549,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_RAW_DECAP,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Modify IPv4 source address in the outermost IPv4 header.
         *
         * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV4,
@@ -2155,6 +2562,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Modify IPv4 destination address in the outermost IPv4 header.
         *
         * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV4,
@@ -2165,6 +2575,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_IPV4_DST,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Modify IPv6 source address in the outermost IPv6 header.
         *
         * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV6,
@@ -2175,6 +2588,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Modify IPv6 destination address in the outermost IPv6 header.
         *
         * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV6,
@@ -2185,6 +2601,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_IPV6_DST,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Modify source port number in the outermost TCP/UDP header.
         *
         * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_TCP
@@ -2196,6 +2615,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_TP_SRC,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Modify destination port number in the outermost TCP/UDP header.
         *
         * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_TCP
@@ -2218,6 +2640,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_MAC_SWAP,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Decrease TTL value directly
         *
         * No associated configuration structure.
@@ -2225,6 +2650,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_DEC_TTL,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Set TTL value
         *
         * See struct rte_flow_action_set_ttl
@@ -2232,6 +2660,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_TTL,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Set source MAC address from matched flow.
         *
         * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_ETH,
@@ -2242,6 +2673,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_MAC_SRC,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Set destination MAC address from matched flow.
         *
         * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_ETH,
@@ -2252,6 +2686,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_MAC_DST,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Increase sequence number in the outermost TCP header.
         *
         * Action configuration specifies the value to increase
@@ -2266,6 +2703,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_INC_TCP_SEQ,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Decrease sequence number in the outermost TCP header.
         *
         * Action configuration specifies the value to decrease
@@ -2280,6 +2720,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_DEC_TCP_SEQ,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Increase acknowledgment number in the outermost TCP header.
         *
         * Action configuration specifies the value to increase
@@ -2294,6 +2737,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_INC_TCP_ACK,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Decrease acknowledgment number in the outermost TCP header.
         *
         * Action configuration specifies the value to decrease
@@ -2308,6 +2754,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_DEC_TCP_ACK,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Set Tag.
         *
         * Tag is for internal flow usage only and
@@ -2318,6 +2767,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_TAG,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Set metadata on ingress or egress path.
         *
         * See struct rte_flow_action_set_meta.
@@ -2325,6 +2777,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_META,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Modify IPv4 DSCP in the outermost IP header.
         *
         * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV4,
@@ -2335,6 +2790,9 @@ enum rte_flow_action_type {
        RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP,
 
        /**
+        * @warning This is a legacy action.
+        * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+        *
         * Modify IPv6 DSCP in the outermost IP header.
         *
         * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV6,
@@ -2409,13 +2867,28 @@ enum rte_flow_action_type {
         * See struct rte_flow_action_meter_color.
         */
        RTE_FLOW_ACTION_TYPE_METER_COLOR,
+
+       /**
+        * At embedded switch level, sends matching traffic to the given ethdev.
+        *
+        * @see struct rte_flow_action_ethdev
+        */
+       RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR,
+
+       /**
+        * At embedded switch level, send matching traffic to
+        * the entity represented by the given ethdev.
+        *
+        * @see struct rte_flow_action_ethdev
+        */
+       RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT,
 };
 
 /**
  * RTE_FLOW_ACTION_TYPE_MARK
  *
- * Attaches an integer value to packets and sets PKT_RX_FDIR and
- * PKT_RX_FDIR_ID mbuf flags.
+ * Attaches an integer value to packets and sets RTE_MBUF_F_RX_FDIR and
+ * RTE_MBUF_F_RX_FDIR_ID mbuf flags.
  *
  * This value is arbitrary and application-defined. Maximum allowed value
  * depends on the underlying implementation. It is returned in the
@@ -2466,8 +2939,8 @@ struct rte_flow_action_queue {
 struct rte_flow_action_age {
        uint32_t timeout:24; /**< Time in seconds. */
        uint32_t reserved:8; /**< Reserved, must be zero. */
+       /** The user flow context, NULL means the rte_flow pointer. */
        void *context;
-               /**< The user flow context, NULL means the rte_flow pointer. */
 };
 
 /**
@@ -2479,8 +2952,8 @@ struct rte_flow_action_age {
 struct rte_flow_query_age {
        uint32_t reserved:6; /**< Reserved, must be zero. */
        uint32_t aged:1; /**< 1 if aging timeout expired, 0 otherwise. */
+       /** sec_since_last_hit value is valid. */
        uint32_t sec_since_last_hit_valid:1;
-       /**< sec_since_last_hit value is valid. */
        uint32_t sec_since_last_hit:24; /**< Seconds since last traffic hit. */
 };
 
@@ -2493,29 +2966,15 @@ struct rte_flow_query_age {
  * Adds a counter action to a matched flow.
  *
  * If more than one count action is specified in a single flow rule, then each
- * action must specify a unique id.
+ * action must specify a unique ID.
  *
  * Counters can be retrieved and reset through ``rte_flow_query()``, see
  * ``struct rte_flow_query_count``.
  *
- * @deprecated Shared attribute is deprecated, use generic
- * RTE_FLOW_ACTION_TYPE_INDIRECT action.
- *
- * The shared flag indicates whether the counter is unique to the flow rule the
- * action is specified with, or whether it is a shared counter.
- *
- * For a count action with the shared flag set, then then a global device
- * namespace is assumed for the counter id, so that any matched flow rules using
- * a count action with the same counter id on the same port will contribute to
- * that counter.
- *
- * For ports within the same switch domain then the counter id namespace extends
+ * For ports within the same switch domain then the counter ID namespace extends
  * to all ports within that switch domain.
  */
 struct rte_flow_action_count {
-       /** @deprecated Share counter ID with other flow rules. */
-       uint32_t shared:1;
-       uint32_t reserved:31; /**< Reserved, must be zero. */
        uint32_t id; /**< Counter ID. */
 };
 
@@ -2593,7 +3052,7 @@ struct rte_flow_action_rss {
         * through.
         */
        uint32_t level;
-       uint64_t types; /**< Specific RSS hash types (see ETH_RSS_*). */
+       uint64_t types; /**< Specific RSS hash types (see RTE_ETH_RSS_*). */
        uint32_t key_len; /**< Hash key length in bytes. */
        uint32_t queue_num; /**< Number of entries in @p queue. */
        const uint8_t *key; /**< Hash key. */
@@ -2601,6 +3060,10 @@ struct rte_flow_action_rss {
 };
 
 /**
+ * @deprecated
+ * @see RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR
+ * @see RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT
+ *
  * RTE_FLOW_ACTION_TYPE_VF
  *
  * Directs matching traffic to a given virtual function of the current
@@ -2619,6 +3082,10 @@ struct rte_flow_action_vf {
 };
 
 /**
+ * @deprecated
+ * @see RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR
+ * @see RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT
+ *
  * RTE_FLOW_ACTION_TYPE_PHY_PORT
  *
  * Directs packets to a given physical port index of the underlying
@@ -2633,6 +3100,10 @@ struct rte_flow_action_phy_port {
 };
 
 /**
+ * @deprecated
+ * @see RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR
+ * @see RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT
+ *
  * RTE_FLOW_ACTION_TYPE_PORT_ID
  *
  * Directs matching traffic to a given DPDK port ID.
@@ -2692,6 +3163,9 @@ struct rte_flow_action_security {
 };
 
 /**
+ * @deprecated
+ * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+ *
  * RTE_FLOW_ACTION_TYPE_OF_SET_MPLS_TTL
  *
  * Implements OFPAT_SET_MPLS_TTL ("MPLS TTL") as defined by the OpenFlow
@@ -2702,6 +3176,9 @@ struct rte_flow_action_of_set_mpls_ttl {
 };
 
 /**
+ * @deprecated
+ * @see RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
+ *
  * RTE_FLOW_ACTION_TYPE_OF_SET_NW_TTL
  *
  * Implements OFPAT_SET_NW_TTL ("IP TTL") as defined by the OpenFlow Switch
@@ -2724,11 +3201,11 @@ struct rte_flow_action_of_push_vlan {
 /**
  * RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID
  *
- * Implements OFPAT_SET_VLAN_VID ("set the 802.1q VLAN id") as defined by
+ * Implements OFPAT_SET_VLAN_VID ("set the 802.1q VLAN ID") as defined by
  * the OpenFlow Switch Specification.
  */
 struct rte_flow_action_of_set_vlan_vid {
-       rte_be16_t vlan_vid; /**< VLAN id. */
+       rte_be16_t vlan_vid; /**< VLAN ID. */
 };
 
 /**
@@ -2960,10 +3437,10 @@ struct rte_flow_action_set_tag {
  * RTE_FLOW_ACTION_TYPE_SET_META
  *
  * Set metadata. Metadata set by mbuf metadata dynamic field with
- * PKT_TX_DYNF_DATA flag on egress will be overridden by this action. On
- * ingress, the metadata will be carried by mbuf metadata dynamic field
- * with PKT_RX_DYNF_METADATA flag if set.  The dynamic mbuf field must be
- * registered in advance by rte_flow_dynf_metadata_register().
+ * RTE_MBUF_DYNFLAG_TX_METADATA flag on egress will be overridden by this
+ * action. On ingress, the metadata will be carried by mbuf metadata dynamic
+ * field with RTE_MBUF_DYNFLAG_RX_METADATA flag if set.  The dynamic mbuf field
+ * must be registered in advance by rte_flow_dynf_metadata_register().
  *
  * Altering partial bits is supported with mask. For bits which have never
  * been set, unpredictable value will be seen depending on driver
@@ -3113,7 +3590,7 @@ struct rte_flow_action_conntrack {
        uint32_t last_direction:1;
        /** No TCP check will be done except the state change. */
        uint32_t liberal_mode:1;
-       /**<The current state of this connection. */
+       /** The current state of this connection. */
        enum rte_flow_conntrack_state state;
        /** Scaling factor for maximal allowed ACK window. */
        uint8_t max_ack_window;
@@ -3168,6 +3645,18 @@ struct rte_flow_action_meter_color {
        enum rte_color color; /**< Packet color. */
 };
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * Provides an ethdev port ID for use with the following actions:
+ * RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR,
+ * RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT.
+ */
+struct rte_flow_action_ethdev {
+       uint16_t port_id; /**< ethdev port ID */
+};
+
 /**
  * Field IDs for MODIFY_FIELD action.
  */
@@ -3204,6 +3693,9 @@ enum rte_flow_field_id {
 };
 
 /**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
  * Field description for MODIFY_FIELD action.
  */
 struct rte_flow_action_modify_data {
@@ -3211,16 +3703,24 @@ struct rte_flow_action_modify_data {
        RTE_STD_C11
        union {
                struct {
-                       /**< Encapsulation level or tag index. */
+                       /** Encapsulation level or tag index. */
                        uint32_t level;
-                       /**< Number of bits to skip from a field. */
+                       /** Number of bits to skip from a field. */
                        uint32_t offset;
                };
                /**
-                * Immediate value for RTE_FLOW_FIELD_VALUE or
-                * memory address for RTE_FLOW_FIELD_POINTER.
+                * Immediate value for RTE_FLOW_FIELD_VALUE, presented in the
+                * same byte order and length as in relevant rte_flow_item_xxx.
+                * The immediate source bitfield offset is inherited from
+                * the destination's one.
                 */
-               uint64_t value;
+               uint8_t value[16];
+               /**
+                * Memory address for RTE_FLOW_FIELD_POINTER, memory layout
+                * should be the same as for relevant field in the
+                * rte_flow_item_xxx structure.
+                */
+               void *pvalue;
        };
 };
 
@@ -3240,7 +3740,7 @@ enum rte_flow_modify_op {
  * RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
  *
  * Modify a destination header field according to the specified
- * operation. Another packet field can be used as a source as well
+ * operation. Another field of the packet can be used as a source as well
  * as tag, mark, metadata, immediate value or a pointer to it.
  */
 struct rte_flow_action_modify_field {
@@ -3261,8 +3761,12 @@ extern uint64_t rte_flow_dynf_metadata_mask;
        RTE_MBUF_DYNFIELD((m), rte_flow_dynf_metadata_offs, uint32_t *)
 
 /* Mbuf dynamic flags for metadata. */
-#define PKT_RX_DYNF_METADATA (rte_flow_dynf_metadata_mask)
-#define PKT_TX_DYNF_METADATA (rte_flow_dynf_metadata_mask)
+#define RTE_MBUF_DYNFLAG_RX_METADATA (rte_flow_dynf_metadata_mask)
+#define PKT_RX_DYNF_METADATA RTE_DEPRECATED(PKT_RX_DYNF_METADATA) \
+               RTE_MBUF_DYNFLAG_RX_METADATA
+#define RTE_MBUF_DYNFLAG_TX_METADATA (rte_flow_dynf_metadata_mask)
+#define PKT_TX_DYNF_METADATA RTE_DEPRECATED(PKT_TX_DYNF_METADATA) \
+               RTE_MBUF_DYNFLAG_TX_METADATA
 
 __rte_experimental
 static inline uint32_t
@@ -3278,7 +3782,7 @@ rte_flow_dynf_metadata_set(struct rte_mbuf *m, uint32_t v)
        *RTE_FLOW_DYNF_METADATA(m) = v;
 }
 
-/*
+/**
  * Definition of a single action.
  *
  * A list of actions is terminated by a END action.
@@ -3316,8 +3820,8 @@ struct rte_flow;
  */
 struct rte_flow_action_sample {
        uint32_t ratio; /**< packets sampled equals to '1/ratio'. */
+       /** sub-action list specific for the sampling hit cases. */
        const struct rte_flow_action *actions;
-               /**< sub-action list specific for the sampling hit cases. */
 };
 
 /**
@@ -3344,6 +3848,7 @@ enum rte_flow_error_type {
        RTE_FLOW_ERROR_TYPE_ACTION_NUM, /**< Number of actions. */
        RTE_FLOW_ERROR_TYPE_ACTION_CONF, /**< Action configuration. */
        RTE_FLOW_ERROR_TYPE_ACTION, /**< Specific action. */
+       RTE_FLOW_ERROR_TYPE_STATE, /**< Current device state. */
 };
 
 /**
@@ -3549,7 +4054,7 @@ enum rte_flow_conv_op {
  *   Perform verbose error reporting if not NULL. PMDs initialize this
  *   structure in case of error only.
  * @return
- *   0 on success, a nagative value otherwise.
+ *   0 on success, a negative value otherwise.
  */
 __rte_experimental
 int
@@ -3911,7 +4416,7 @@ rte_flow_conv(enum rte_flow_conv_op op,
  *
  * RTE_ETH_EVENT_FLOW_AGED event will be triggered when at least one new aged
  * out flow was detected after the last call to rte_flow_get_aged_flows.
- * This function can be called to get the aged flows usynchronously from the
+ * This function can be called to get the aged flows asynchronously from the
  * event callback or synchronously regardless the event.
  * This is not safe to call rte_flow_get_aged_flows function with other flow
  * functions from multiple threads simultaneously.
@@ -3949,10 +4454,10 @@ struct rte_flow_indir_action_conf {
         * Action should be valid at least for one flow direction,
         * otherwise it is invalid for both ingress and egress rules.
         */
+       /** Action valid for rules applied to ingress traffic. */
        uint32_t ingress:1;
-       /**< Action valid for rules applied to ingress traffic. */
+       /** Action valid for rules applied to egress traffic. */
        uint32_t egress:1;
-       /**< Action valid for rules applied to egress traffic. */
        /**
         * When set to 1, indicates that the action is valid for
         * transfer traffic; otherwise, for non-transfer traffic.
@@ -4131,17 +4636,17 @@ struct rte_flow_tunnel {
 /**
  * Indicate that the packet has a tunnel.
  */
-#define RTE_FLOW_RESTORE_INFO_TUNNEL  (1ULL << 0)
+#define RTE_FLOW_RESTORE_INFO_TUNNEL RTE_BIT64(0)
 
 /**
  * Indicate that the packet has a non decapsulated tunnel header.
  */
-#define RTE_FLOW_RESTORE_INFO_ENCAPSULATED  (1ULL << 1)
+#define RTE_FLOW_RESTORE_INFO_ENCAPSULATED RTE_BIT64(1)
 
 /**
  * Indicate that the packet has a group_id.
  */
-#define RTE_FLOW_RESTORE_INFO_GROUP_ID  (1ULL << 2)
+#define RTE_FLOW_RESTORE_INFO_GROUP_ID RTE_BIT64(2)
 
 /**
  * Restore information structure to communicate the current packet processing
@@ -4223,6 +4728,10 @@ rte_flow_tunnel_match(uint16_t port_id,
 /**
  * Populate the current packet processing state, if exists, for the given mbuf.
  *
+ * One should negotiate tunnel metadata delivery from the NIC to the HW.
+ * @see rte_eth_rx_metadata_negotiate()
+ * @see RTE_ETH_RX_METADATA_TUNNEL_ID
+ *
  * @param port_id
  *   Port identifier of Ethernet device.
  * @param[in] m
@@ -4288,6 +4797,822 @@ rte_flow_tunnel_item_release(uint16_t port_id,
                             struct rte_flow_item *items,
                             uint32_t num_of_items,
                             struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Get a proxy port to manage "transfer" flows.
+ *
+ * Managing "transfer" flows requires that the user communicate them
+ * via a port which has the privilege to control the embedded switch.
+ * For some vendors, all ports in a given switching domain have
+ * this privilege. For other vendors, it's only one port.
+ *
+ * This API indicates such a privileged port (a "proxy")
+ * for a given port in the same switching domain.
+ *
+ * @note
+ *   If the PMD serving @p port_id doesn't have the corresponding method
+ *   implemented, the API will return @p port_id via @p proxy_port_id.
+ *
+ * @param port_id
+ *   Indicates the port to get a "proxy" for
+ * @param[out] proxy_port_id
+ *   Indicates the "proxy" port
+ * @param[out] error
+ *   If not NULL, allows the PMD to provide verbose report in case of error
+ *
+ * @return
+ *   0 on success, a negative error code otherwise
+ */
+__rte_experimental
+int
+rte_flow_pick_transfer_proxy(uint16_t port_id, uint16_t *proxy_port_id,
+                            struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Create the flex item with specified configuration over
+ * the Ethernet device.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] conf
+ *   Item configuration.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL. PMDs initialize this
+ *   structure in case of error only.
+ *
+ * @return
+ *   Non-NULL opaque pointer on success, NULL otherwise and rte_errno is set.
+ */
+__rte_experimental
+struct rte_flow_item_flex_handle *
+rte_flow_flex_item_create(uint16_t port_id,
+                         const struct rte_flow_item_flex_conf *conf,
+                         struct rte_flow_error *error);
+
+/**
+ * Release the flex item on the specified Ethernet device.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] handle
+ *   Handle of the item existing on the specified device.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL. PMDs initialize this
+ *   structure in case of error only.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_flex_item_release(uint16_t port_id,
+                          const struct rte_flow_item_flex_handle *handle,
+                          struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Information about flow engine resources.
+ * The zero value means a resource is not supported.
+ *
+ */
+struct rte_flow_port_info {
+       /**
+        * Maximum number of queues for asynchronous operations.
+        */
+       uint32_t max_nb_queues;
+       /**
+        * Maximum number of counters.
+        * @see RTE_FLOW_ACTION_TYPE_COUNT
+        */
+       uint32_t max_nb_counters;
+       /**
+        * Maximum number of aging objects.
+        * @see RTE_FLOW_ACTION_TYPE_AGE
+        */
+       uint32_t max_nb_aging_objects;
+       /**
+        * Maximum number traffic meters.
+        * @see RTE_FLOW_ACTION_TYPE_METER
+        */
+       uint32_t max_nb_meters;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Information about flow engine asynchronous queues.
+ * The value only valid if @p port_attr.max_nb_queues is not zero.
+ *
+ */
+struct rte_flow_queue_info {
+       /**
+        * Maximum number of operations a queue can hold.
+        */
+       uint32_t max_size;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Get information about flow engine resources.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param[out] port_info
+ *   A pointer to a structure of type *rte_flow_port_info*
+ *   to be filled with the resources information of the port.
+ * @param[out] queue_info
+ *   A pointer to a structure of type *rte_flow_queue_info*
+ *   to be filled with the asynchronous queues information.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_info_get(uint16_t port_id,
+                 struct rte_flow_port_info *port_info,
+                 struct rte_flow_queue_info *queue_info,
+                 struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Flow engine resources settings.
+ * The zero value means on demand resource allocations only.
+ *
+ */
+struct rte_flow_port_attr {
+       /**
+        * Number of counters to configure.
+        * @see RTE_FLOW_ACTION_TYPE_COUNT
+        */
+       uint32_t nb_counters;
+       /**
+        * Number of aging objects to configure.
+        * @see RTE_FLOW_ACTION_TYPE_AGE
+        */
+       uint32_t nb_aging_objects;
+       /**
+        * Number of traffic meters to configure.
+        * @see RTE_FLOW_ACTION_TYPE_METER
+        */
+       uint32_t nb_meters;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Flow engine asynchronous queues settings.
+ * The value means default value picked by PMD.
+ *
+ */
+struct rte_flow_queue_attr {
+       /**
+        * Number of flow rule operations a queue can hold.
+        */
+       uint32_t size;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Configure the port's flow API engine.
+ *
+ * This API can only be invoked before the application
+ * starts using the rest of the flow library functions.
+ *
+ * The API can be invoked multiple times to change the settings.
+ * The port, however, may reject changes and keep the old config.
+ *
+ * Parameters in configuration attributes must not exceed
+ * numbers of resources returned by the rte_flow_info_get API.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] port_attr
+ *   Port configuration attributes.
+ * @param[in] nb_queue
+ *   Number of flow queues to be configured.
+ * @param[in] queue_attr
+ *   Array that holds attributes for each flow queue.
+ *   Number of elements is set in @p port_attr.nb_queues.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_configure(uint16_t port_id,
+                  const struct rte_flow_port_attr *port_attr,
+                  uint16_t nb_queue,
+                  const struct rte_flow_queue_attr *queue_attr[],
+                  struct rte_flow_error *error);
+
+/**
+ * Opaque type returned after successful creation of pattern template.
+ * This handle can be used to manage the created pattern template.
+ */
+struct rte_flow_pattern_template;
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Flow pattern template attributes.
+ */
+__extension__
+struct rte_flow_pattern_template_attr {
+       /**
+        * Relaxed matching policy.
+        * - If 1, matching is performed only on items with the mask member set
+        * and matching on protocol layers specified without any masks is skipped.
+        * - If 0, matching on protocol layers specified without any masks is done
+        * as well. This is the standard behaviour of Flow API now.
+        */
+       uint32_t relaxed_matching:1;
+       /**
+        * Flow direction for the pattern template.
+        * At least one direction must be specified.
+        */
+       /** Pattern valid for rules applied to ingress traffic. */
+       uint32_t ingress:1;
+       /** Pattern valid for rules applied to egress traffic. */
+       uint32_t egress:1;
+       /** Pattern valid for rules applied to transfer traffic. */
+       uint32_t transfer:1;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Create flow pattern template.
+ *
+ * The pattern template defines common matching fields without values.
+ * For example, matching on 5 tuple TCP flow, the template will be
+ * eth(null) + IPv4(source + dest) + TCP(s_port + d_port),
+ * while values for each rule will be set during the flow rule creation.
+ * The number and order of items in the template must be the same
+ * at the rule creation.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] template_attr
+ *   Pattern template attributes.
+ * @param[in] pattern
+ *   Pattern specification (list terminated by the END pattern item).
+ *   The spec member of an item is not used unless the end member is used.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   Handle on success, NULL otherwise and rte_errno is set.
+ */
+__rte_experimental
+struct rte_flow_pattern_template *
+rte_flow_pattern_template_create(uint16_t port_id,
+               const struct rte_flow_pattern_template_attr *template_attr,
+               const struct rte_flow_item pattern[],
+               struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Destroy flow pattern template.
+ *
+ * This function may be called only when
+ * there are no more tables referencing this template.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] pattern_template
+ *   Handle of the template to be destroyed.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_pattern_template_destroy(uint16_t port_id,
+               struct rte_flow_pattern_template *pattern_template,
+               struct rte_flow_error *error);
+
+/**
+ * Opaque type returned after successful creation of actions template.
+ * This handle can be used to manage the created actions template.
+ */
+struct rte_flow_actions_template;
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Flow actions template attributes.
+ */
+__extension__
+struct rte_flow_actions_template_attr {
+       /**
+        * Flow direction for the actions template.
+        * At least one direction must be specified.
+        */
+       /** Action valid for rules applied to ingress traffic. */
+       uint32_t ingress:1;
+       /** Action valid for rules applied to egress traffic. */
+       uint32_t egress:1;
+       /** Action valid for rules applied to transfer traffic. */
+       uint32_t transfer:1;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Create flow actions template.
+ *
+ * The actions template holds a list of action types without values.
+ * For example, the template to change TCP ports is TCP(s_port + d_port),
+ * while values for each rule will be set during the flow rule creation.
+ * The number and order of actions in the template must be the same
+ * at the rule creation.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] template_attr
+ *   Template attributes.
+ * @param[in] actions
+ *   Associated actions (list terminated by the END action).
+ *   The spec member is only used if @p masks spec is non-zero.
+ * @param[in] masks
+ *   List of actions that marks which of the action's member is constant.
+ *   A mask has the same format as the corresponding action.
+ *   If the action field in @p masks is not 0,
+ *   the corresponding value in an action from @p actions will be the part
+ *   of the template and used in all flow rules.
+ *   The order of actions in @p masks is the same as in @p actions.
+ *   In case of indirect actions present in @p actions,
+ *   the actual action type should be present in @p mask.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   Handle on success, NULL otherwise and rte_errno is set.
+ */
+__rte_experimental
+struct rte_flow_actions_template *
+rte_flow_actions_template_create(uint16_t port_id,
+               const struct rte_flow_actions_template_attr *template_attr,
+               const struct rte_flow_action actions[],
+               const struct rte_flow_action masks[],
+               struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Destroy flow actions template.
+ *
+ * This function may be called only when
+ * there are no more tables referencing this template.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] actions_template
+ *   Handle to the template to be destroyed.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_actions_template_destroy(uint16_t port_id,
+               struct rte_flow_actions_template *actions_template,
+               struct rte_flow_error *error);
+
+/**
+ * Opaque type returned after successful creation of a template table.
+ * This handle can be used to manage the created template table.
+ */
+struct rte_flow_template_table;
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Table attributes.
+ */
+struct rte_flow_template_table_attr {
+       /**
+        * Flow attributes to be used in each rule generated from this table.
+        */
+       struct rte_flow_attr flow_attr;
+       /**
+        * Maximum number of flow rules that this table holds.
+        */
+       uint32_t nb_flows;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Create flow template table.
+ *
+ * A template table consists of multiple pattern templates and actions
+ * templates associated with a single set of rule attributes (group ID,
+ * priority and traffic direction).
+ *
+ * Each rule is free to use any combination of pattern and actions templates
+ * and specify particular values for items and actions it would like to change.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] table_attr
+ *   Template table attributes.
+ * @param[in] pattern_templates
+ *   Array of pattern templates to be used in this table.
+ * @param[in] nb_pattern_templates
+ *   The number of pattern templates in the pattern_templates array.
+ * @param[in] actions_templates
+ *   Array of actions templates to be used in this table.
+ * @param[in] nb_actions_templates
+ *   The number of actions templates in the actions_templates array.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   Handle on success, NULL otherwise and rte_errno is set.
+ */
+__rte_experimental
+struct rte_flow_template_table *
+rte_flow_template_table_create(uint16_t port_id,
+               const struct rte_flow_template_table_attr *table_attr,
+               struct rte_flow_pattern_template *pattern_templates[],
+               uint8_t nb_pattern_templates,
+               struct rte_flow_actions_template *actions_templates[],
+               uint8_t nb_actions_templates,
+               struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Destroy flow template table.
+ *
+ * This function may be called only when
+ * there are no more flow rules referencing this table.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] template_table
+ *   Handle to the table to be destroyed.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_template_table_destroy(uint16_t port_id,
+               struct rte_flow_template_table *template_table,
+               struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Asynchronous operation attributes.
+ */
+__extension__
+struct rte_flow_op_attr {
+        /**
+         * When set, the requested action will not be sent to the HW immediately.
+         * The application must call the rte_flow_queue_push to actually send it.
+         */
+       uint32_t postpone:1;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Enqueue rule creation operation.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param queue_id
+ *   Flow queue used to insert the rule.
+ * @param[in] op_attr
+ *   Rule creation operation attributes.
+ * @param[in] template_table
+ *   Template table to select templates from.
+ * @param[in] pattern
+ *   List of pattern items to be used.
+ *   The list order should match the order in the pattern template.
+ *   The spec is the only relevant member of the item that is being used.
+ * @param[in] pattern_template_index
+ *   Pattern template index in the table.
+ * @param[in] actions
+ *   List of actions to be used.
+ *   The list order should match the order in the actions template.
+ * @param[in] actions_template_index
+ *   Actions template index in the table.
+ * @param[in] user_data
+ *   The user data that will be returned on the completion events.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   Handle on success, NULL otherwise and rte_errno is set.
+ *   The rule handle doesn't mean that the rule has been populated.
+ *   Only completion result indicates that if there was success or failure.
+ */
+__rte_experimental
+struct rte_flow *
+rte_flow_async_create(uint16_t port_id,
+                     uint32_t queue_id,
+                     const struct rte_flow_op_attr *op_attr,
+                     struct rte_flow_template_table *template_table,
+                     const struct rte_flow_item pattern[],
+                     uint8_t pattern_template_index,
+                     const struct rte_flow_action actions[],
+                     uint8_t actions_template_index,
+                     void *user_data,
+                     struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Enqueue rule destruction operation.
+ *
+ * This function enqueues a destruction operation on the queue.
+ * Application should assume that after calling this function
+ * the rule handle is not valid anymore.
+ * Completion indicates the full removal of the rule from the HW.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param queue_id
+ *   Flow queue which is used to destroy the rule.
+ *   This must match the queue on which the rule was created.
+ * @param[in] op_attr
+ *   Rule destruction operation attributes.
+ * @param[in] flow
+ *   Flow handle to be destroyed.
+ * @param[in] user_data
+ *   The user data that will be returned on the completion events.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_async_destroy(uint16_t port_id,
+                      uint32_t queue_id,
+                      const struct rte_flow_op_attr *op_attr,
+                      struct rte_flow *flow,
+                      void *user_data,
+                      struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Push all internally stored rules to the HW.
+ * Postponed rules are rules that were inserted with the postpone flag set.
+ * Can be used to notify the HW about batch of rules prepared by the SW to
+ * reduce the number of communications between the HW and SW.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param queue_id
+ *   Flow queue to be pushed.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_push(uint16_t port_id,
+             uint32_t queue_id,
+             struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Asynchronous operation status.
+ */
+enum rte_flow_op_status {
+       /**
+        * The operation was completed successfully.
+        */
+       RTE_FLOW_OP_SUCCESS,
+       /**
+        * The operation was not completed successfully.
+        */
+       RTE_FLOW_OP_ERROR,
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Asynchronous operation result.
+ */
+__extension__
+struct rte_flow_op_result {
+       /**
+        * Returns the status of the operation that this completion signals.
+        */
+       enum rte_flow_op_status status;
+       /**
+        * The user data that will be returned on the completion events.
+        */
+       void *user_data;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Pull a rte flow operation.
+ * The application must invoke this function in order to complete
+ * the flow rule offloading and to retrieve the flow rule operation status.
+ *
+ * @param port_id
+ *   Port identifier of Ethernet device.
+ * @param queue_id
+ *   Flow queue which is used to pull the operation.
+ * @param[out] res
+ *   Array of results that will be set.
+ * @param[in] n_res
+ *   Maximum number of results that can be returned.
+ *   This value is equal to the size of the res array.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   Number of results that were pulled,
+ *   a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_pull(uint16_t port_id,
+             uint32_t queue_id,
+             struct rte_flow_op_result res[],
+             uint16_t n_res,
+             struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Enqueue indirect action creation operation.
+ * @see rte_flow_action_handle_create
+ *
+ * @param[in] port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] queue_id
+ *   Flow queue which is used to create the rule.
+ * @param[in] op_attr
+ *   Indirect action creation operation attributes.
+ * @param[in] indir_action_conf
+ *   Action configuration for the indirect action object creation.
+ * @param[in] action
+ *   Specific configuration of the indirect action object.
+ * @param[in] user_data
+ *   The user data that will be returned on the completion events.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   A valid handle in case of success, NULL otherwise and rte_errno is set.
+ */
+__rte_experimental
+struct rte_flow_action_handle *
+rte_flow_async_action_handle_create(uint16_t port_id,
+               uint32_t queue_id,
+               const struct rte_flow_op_attr *op_attr,
+               const struct rte_flow_indir_action_conf *indir_action_conf,
+               const struct rte_flow_action *action,
+               void *user_data,
+               struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Enqueue indirect action destruction operation.
+ * The destroy queue must be the same
+ * as the queue on which the action was created.
+ *
+ * @param[in] port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] queue_id
+ *   Flow queue which is used to destroy the rule.
+ * @param[in] op_attr
+ *   Indirect action destruction operation attributes.
+ * @param[in] action_handle
+ *   Handle for the indirect action object to be destroyed.
+ * @param[in] user_data
+ *   The user data that will be returned on the completion events.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_async_action_handle_destroy(uint16_t port_id,
+               uint32_t queue_id,
+               const struct rte_flow_op_attr *op_attr,
+               struct rte_flow_action_handle *action_handle,
+               void *user_data,
+               struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Enqueue indirect action update operation.
+ * @see rte_flow_action_handle_create
+ *
+ * @param[in] port_id
+ *   Port identifier of Ethernet device.
+ * @param[in] queue_id
+ *   Flow queue which is used to update the rule.
+ * @param[in] op_attr
+ *   Indirect action update operation attributes.
+ * @param[in] action_handle
+ *   Handle for the indirect action object to be updated.
+ * @param[in] update
+ *   Update profile specification used to modify the action pointed by handle.
+ *   *update* could be with the same type of the immediate action corresponding
+ *   to the *handle* argument when creating, or a wrapper structure includes
+ *   action configuration to be updated and bit fields to indicate the member
+ *   of fields inside the action to update.
+ * @param[in] user_data
+ *   The user data that will be returned on the completion events.
+ * @param[out] error
+ *   Perform verbose error reporting if not NULL.
+ *   PMDs initialize this structure in case of error only.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+__rte_experimental
+int
+rte_flow_async_action_handle_update(uint16_t port_id,
+               uint32_t queue_id,
+               const struct rte_flow_op_attr *op_attr,
+               struct rte_flow_action_handle *action_handle,
+               const void *update,
+               void *user_data,
+               struct rte_flow_error *error);
 #ifdef __cplusplus
 }
 #endif