- `Item: ICMP6_ND_NS`_
 - `Item: ICMP6_ND_OPT`_
 
+Item: ``META``
+^^^^^^^^^^^^^^
+
+Matches an application specific 32 bit metadata item.
+
+- Default ``mask`` matches the specified metadata value.
+
+.. _table_rte_flow_item_meta:
+
+.. table:: META
+
+   +----------+----------+-----------------------+
+   | Field    | Subfield | Value                 |
+   +==========+==========+=======================+
+   | ``spec`` | ``data`` | 32 bit metadata value |
+   +----------+----------------------------------+
+   | ``last`` | ``data`` | ignored               |
+   +----------+----------+-----------------------+
+   | ``mask`` | ``data`` | ignored               |
+   +----------+----------+-----------------------+
+
 Actions
 ~~~~~~~
 
 
        RTE_TX_OFFLOAD_BIT2STR(UDP_TNL_TSO),
        RTE_TX_OFFLOAD_BIT2STR(IP_TNL_TSO),
        RTE_TX_OFFLOAD_BIT2STR(OUTER_UDP_CKSUM),
+       RTE_TX_OFFLOAD_BIT2STR(MATCH_METADATA),
 };
 
 #undef RTE_TX_OFFLOAD_BIT2STR
 
 #define DEV_TX_OFFLOAD_IP_TNL_TSO       0x00080000
 /** Device supports outer UDP checksum */
 #define DEV_TX_OFFLOAD_OUTER_UDP_CKSUM  0x00100000
+/**
+ * Device supports match on metadata Tx offload..
+ * Application must set PKT_TX_METADATA and mbuf metadata field.
+ */
+#define DEV_TX_OFFLOAD_MATCH_METADATA   0x00200000
 
 #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001
 /**< Device supports Rx queue setup after device started*/
 
        MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
                     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
        MK_FLOW_ITEM(MARK, sizeof(struct rte_flow_item_mark)),
+       MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
 };
 
 /** Generate flow_action[] entry. */
 
         * See struct rte_flow_item_mark.
         */
        RTE_FLOW_ITEM_TYPE_MARK,
+
+       /**
+        * [META]
+        *
+        * Matches a metadata value specified in mbuf metadata field.
+        * See struct rte_flow_item_meta.
+        */
+       RTE_FLOW_ITEM_TYPE_META,
 };
 
 /**
 };
 #endif
 
+/**
+ * RTE_FLOW_ITEM_TYPE_META.
+ *
+ * Matches a specified metadata value.
+ */
+struct rte_flow_item_meta {
+       rte_be32_t data;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_META. */
+#ifndef __cplusplus
+static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
+       .data = RTE_BE32(UINT32_MAX),
+};
+#endif
+
 /**
  * @warning
  * @b EXPERIMENTAL: this structure may change without prior notice
 
        case PKT_TX_SEC_OFFLOAD: return "PKT_TX_SEC_OFFLOAD";
        case PKT_TX_UDP_SEG: return "PKT_TX_UDP_SEG";
        case PKT_TX_OUTER_UDP_CKSUM: return "PKT_TX_OUTER_UDP_CKSUM";
+       case PKT_TX_METADATA: return "PKT_TX_METADATA";
        default: return NULL;
        }
 }
                { PKT_TX_SEC_OFFLOAD, PKT_TX_SEC_OFFLOAD, NULL },
                { PKT_TX_UDP_SEG, PKT_TX_UDP_SEG, NULL },
                { PKT_TX_OUTER_UDP_CKSUM, PKT_TX_OUTER_UDP_CKSUM, NULL },
+               { PKT_TX_METADATA, PKT_TX_METADATA, NULL },
        };
        const char *name;
        unsigned int i;
 
 
 /* add new TX flags here */
 
+/**
+ * Indicate that the metadata field in the mbuf is in use.
+ */
+#define PKT_TX_METADATA        (1ULL << 40)
+
 /**
  * Outer UDP checksum offload flag. This flag is used for enabling
  * outer UDP checksum in PMD. To use outer UDP checksum, the user needs to
                PKT_TX_QINQ_PKT |        \
                PKT_TX_TUNNEL_MASK |     \
                PKT_TX_MACSEC |          \
-               PKT_TX_SEC_OFFLOAD |    \
-               PKT_TX_UDP_SEG |        \
-               PKT_TX_OUTER_UDP_CKSUM)
+               PKT_TX_SEC_OFFLOAD |     \
+               PKT_TX_UDP_SEG |         \
+               PKT_TX_OUTER_UDP_CKSUM | \
+               PKT_TX_METADATA)
 
 /**
  * Mbuf having an external buffer attached. shinfo in mbuf must be filled.
        /** VLAN TCI (CPU order), valid if PKT_RX_VLAN is set. */
        uint16_t vlan_tci;
 
+       RTE_STD_C11
        union {
-               uint32_t rss;     /**< RSS hash result if RSS enabled */
-               struct {
-                       RTE_STD_C11
-                       union {
-                               struct {
-                                       uint16_t hash;
-                                       uint16_t id;
+               union {
+                       uint32_t rss;     /**< RSS hash result if RSS enabled */
+                       struct {
+                               union {
+                                       struct {
+                                               uint16_t hash;
+                                               uint16_t id;
+                                       };
+                                       uint32_t lo;
+                                       /**< Second 4 flexible bytes */
                                };
+                               uint32_t hi;
+                               /**< First 4 flexible bytes or FD ID, dependent
+                                * on PKT_RX_FDIR_* flag in ol_flags.
+                                */
+                       } fdir; /**< Filter identifier if FDIR enabled */
+                       struct {
                                uint32_t lo;
-                               /**< Second 4 flexible bytes */
-                       };
-                       uint32_t hi;
-                       /**< First 4 flexible bytes or FD ID, dependent on
-                            PKT_RX_FDIR_* flag in ol_flags. */
-               } fdir;           /**< Filter identifier if FDIR enabled */
+                               uint32_t hi;
+                               /**< The event eth Tx adapter uses this field
+                                * to store Tx queue id.
+                                * @see rte_event_eth_tx_adapter_txq_set()
+                                */
+                       } sched;          /**< Hierarchical scheduler */
+                       /**< User defined tags. See rte_distributor_process() */
+                       uint32_t usr;
+               } hash;                   /**< hash information */
                struct {
-                       uint32_t lo;
-                       uint32_t hi;
-                       /**< The event eth Tx adapter uses this field to store
-                        * Tx queue id. @see rte_event_eth_tx_adapter_txq_set()
+                       /**
+                        * Application specific metadata value
+                        * for egress flow rule match.
+                        * Valid if PKT_TX_METADATA is set.
+                        * Located here to allow conjunct use
+                        * with hash.sched.hi.
                         */
-               } sched;          /**< Hierarchical scheduler */
-               uint32_t usr;     /**< User defined tags. See rte_distributor_process() */
-       } hash;                   /**< hash information */
+                       uint32_t tx_metadata;
+                       uint32_t reserved;
+               };
+       };
 
        /** Outer VLAN TCI (CPU order), valid if PKT_RX_QINQ is set. */
        uint16_t vlan_tci_outer;