In existing code the match on tagged/untagged packets is not explicit.
Recent documentation update [1] describes the different patterns and
clarifies the intended use of different patterns.

This patch proposes an update to ETH item struct, to clearly define the
required characteristic of a packet, and enable precise match criteria.

[1] http://mails.dpdk.org/archives/dev/2020-May/166257.html

Signed-off-by: Dekel Peled <dek...@mellanox.com>
---
 lib/librte_ethdev/rte_flow.h | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index cf0eccb..345feb5 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -726,11 +726,20 @@ struct rte_flow_item_raw {
  * If the @p ETH item is the only item in the pattern, and the @p type field
  * is not specified, then both tagged and untagged packets will match the
  * pattern.
+ * The fields @p cvlan_exist and @p svlan_exist can be used to match specific
+ * packet types, instead of using the @p type field. This can be used to match
+ * on packets that do/don't contain either cvlan, svlan, or both.
+ * The field @p num_of_vlans can be used to match packets by the exact number
+ * of VLANs in header.
  */
 struct rte_flow_item_eth {
        struct rte_ether_addr dst; /**< Destination MAC. */
        struct rte_ether_addr src; /**< Source MAC. */
        rte_be16_t type; /**< EtherType or TPID. */
+       uint32_t cvlan_exist:1; /**< C-tag VLAN exist in header. */
+       uint32_t svlan_exist:1; /**< S-tag VLAN exist in header. */
+       uint32_t reserved:14; /**< Reserved, must be zero. */
+       uint32_t num_of_vlans:16; /**< Number of VLANs in header. */
 };
 
 /** Default mask for RTE_FLOW_ITEM_TYPE_ETH. */
-- 
1.8.3.1

Reply via email to