[PATCH v7 01/25] ethdev: add default mask query to flow
Anatoly Burakov
anatoly.burakov at intel.com
Tue Oct 13 14:02:59 CEST 2026
The rte_flow API defines that if the mask provided with the flow item is
NULL, a default mask should be used where applicable. There is no API to
get such mask, so add this API to rte_flow.
Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
Acked-by: Thomas Monjalon <thomas at monjalon.net>
Acked-by: Vladimir Medvedkin <vladimir.medvedkin at intel.com>
---
doc/guides/rel_notes/release_26_11.rst | 5 +
lib/ethdev/rte_flow.c | 207 ++++++++++++++++++-------
lib/ethdev/rte_flow.h | 15 ++
3 files changed, 167 insertions(+), 60 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 3fb7eac25db..c1656895996 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -64,6 +64,11 @@ New Features
Added ``rte_vlan_insert_tpid()`` to the net library.
+* **Added flow item default mask lookup.**
+
+ Added ``RTE_FLOW_CONV_OP_ITEM_DEFAULT_MASK_PTR`` conversion operation
+ to ``rte_flow_conv()`` to retrieve the default mask of a flow item type.
+
* **Updated AF_XDP driver.**
* Changed the default device plugin endpoint path used when
diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c
index 1056cfd2c55..0ebf59165d4 100644
--- a/lib/ethdev/rte_flow.c
+++ b/lib/ethdev/rte_flow.c
@@ -37,6 +37,7 @@ struct rte_flow_desc_data {
const char *name;
size_t size;
size_t (*desc_fn)(void *dst, const void *src, size_t size);
+ const void *default_mask; /* items only, NULL if none */
};
/**
@@ -101,81 +102,146 @@ rte_flow_item_flex_conv(void *buf, const void *data, size_t size)
.desc_fn = fn, \
}
+#define MK_FLOW_ITEM_MASK(t, s, m) \
+ [RTE_FLOW_ITEM_TYPE_ ## t] = { \
+ .name = # t, \
+ .size = s, \
+ .desc_fn = NULL, \
+ .default_mask = &(m), \
+ }
+
/** Information about known flow pattern items. */
static const struct rte_flow_desc_data rte_flow_desc_item[] = {
MK_FLOW_ITEM(END, 0),
MK_FLOW_ITEM(VOID, 0),
MK_FLOW_ITEM(INVERT, 0),
- MK_FLOW_ITEM(ANY, sizeof(struct rte_flow_item_any)),
- MK_FLOW_ITEM(PORT_ID, sizeof(struct rte_flow_item_port_id)),
- MK_FLOW_ITEM(RAW, sizeof(struct rte_flow_item_raw)),
- MK_FLOW_ITEM(ETH, sizeof(struct rte_flow_item_eth)),
- MK_FLOW_ITEM(VLAN, sizeof(struct rte_flow_item_vlan)),
- MK_FLOW_ITEM(IPV4, sizeof(struct rte_flow_item_ipv4)),
- MK_FLOW_ITEM(IPV6, sizeof(struct rte_flow_item_ipv6)),
- MK_FLOW_ITEM(ICMP, sizeof(struct rte_flow_item_icmp)),
- MK_FLOW_ITEM(UDP, sizeof(struct rte_flow_item_udp)),
- MK_FLOW_ITEM(TCP, sizeof(struct rte_flow_item_tcp)),
- MK_FLOW_ITEM(SCTP, sizeof(struct rte_flow_item_sctp)),
- MK_FLOW_ITEM(VXLAN, sizeof(struct rte_flow_item_vxlan)),
- MK_FLOW_ITEM(E_TAG, sizeof(struct rte_flow_item_e_tag)),
- MK_FLOW_ITEM(NVGRE, sizeof(struct rte_flow_item_nvgre)),
- MK_FLOW_ITEM(MPLS, sizeof(struct rte_flow_item_mpls)),
- MK_FLOW_ITEM(GRE, sizeof(struct rte_flow_item_gre)),
- MK_FLOW_ITEM(FUZZY, sizeof(struct rte_flow_item_fuzzy)),
- MK_FLOW_ITEM(GTP, sizeof(struct rte_flow_item_gtp)),
- MK_FLOW_ITEM(GTPC, sizeof(struct rte_flow_item_gtp)),
- MK_FLOW_ITEM(GTPU, sizeof(struct rte_flow_item_gtp)),
- MK_FLOW_ITEM(ESP, sizeof(struct rte_flow_item_esp)),
- MK_FLOW_ITEM(GENEVE, sizeof(struct rte_flow_item_geneve)),
- MK_FLOW_ITEM(VXLAN_GPE, sizeof(struct rte_flow_item_vxlan_gpe)),
- MK_FLOW_ITEM(ARP_ETH_IPV4, sizeof(struct rte_flow_item_arp_eth_ipv4)),
- MK_FLOW_ITEM(IPV6_EXT, sizeof(struct rte_flow_item_ipv6_ext)),
+ MK_FLOW_ITEM_MASK(ANY, sizeof(struct rte_flow_item_any),
+ rte_flow_item_any_mask),
+ MK_FLOW_ITEM_MASK(PORT_ID, sizeof(struct rte_flow_item_port_id),
+ rte_flow_item_port_id_mask),
+ MK_FLOW_ITEM_MASK(RAW, sizeof(struct rte_flow_item_raw),
+ rte_flow_item_raw_mask),
+ MK_FLOW_ITEM_MASK(ETH, sizeof(struct rte_flow_item_eth),
+ rte_flow_item_eth_mask),
+ MK_FLOW_ITEM_MASK(VLAN, sizeof(struct rte_flow_item_vlan),
+ rte_flow_item_vlan_mask),
+ MK_FLOW_ITEM_MASK(IPV4, sizeof(struct rte_flow_item_ipv4),
+ rte_flow_item_ipv4_mask),
+ MK_FLOW_ITEM_MASK(IPV6, sizeof(struct rte_flow_item_ipv6),
+ rte_flow_item_ipv6_mask),
+ MK_FLOW_ITEM_MASK(ICMP, sizeof(struct rte_flow_item_icmp),
+ rte_flow_item_icmp_mask),
+ MK_FLOW_ITEM_MASK(UDP, sizeof(struct rte_flow_item_udp),
+ rte_flow_item_udp_mask),
+ MK_FLOW_ITEM_MASK(TCP, sizeof(struct rte_flow_item_tcp),
+ rte_flow_item_tcp_mask),
+ MK_FLOW_ITEM_MASK(SCTP, sizeof(struct rte_flow_item_sctp),
+ rte_flow_item_sctp_mask),
+ MK_FLOW_ITEM_MASK(VXLAN, sizeof(struct rte_flow_item_vxlan),
+ rte_flow_item_vxlan_mask),
+ MK_FLOW_ITEM_MASK(E_TAG, sizeof(struct rte_flow_item_e_tag),
+ rte_flow_item_e_tag_mask),
+ MK_FLOW_ITEM_MASK(NVGRE, sizeof(struct rte_flow_item_nvgre),
+ rte_flow_item_nvgre_mask),
+ MK_FLOW_ITEM_MASK(MPLS, sizeof(struct rte_flow_item_mpls),
+ rte_flow_item_mpls_mask),
+ MK_FLOW_ITEM_MASK(GRE, sizeof(struct rte_flow_item_gre),
+ rte_flow_item_gre_mask),
+ MK_FLOW_ITEM_MASK(FUZZY, sizeof(struct rte_flow_item_fuzzy),
+ rte_flow_item_fuzzy_mask),
+ MK_FLOW_ITEM_MASK(GTP, sizeof(struct rte_flow_item_gtp),
+ rte_flow_item_gtp_mask),
+ MK_FLOW_ITEM_MASK(GTPC, sizeof(struct rte_flow_item_gtp),
+ rte_flow_item_gtp_mask),
+ MK_FLOW_ITEM_MASK(GTPU, sizeof(struct rte_flow_item_gtp),
+ rte_flow_item_gtp_mask),
+ MK_FLOW_ITEM_MASK(ESP, sizeof(struct rte_flow_item_esp),
+ rte_flow_item_esp_mask),
+ MK_FLOW_ITEM_MASK(GENEVE, sizeof(struct rte_flow_item_geneve),
+ rte_flow_item_geneve_mask),
+ MK_FLOW_ITEM_MASK(VXLAN_GPE, sizeof(struct rte_flow_item_vxlan_gpe),
+ rte_flow_item_vxlan_gpe_mask),
+ MK_FLOW_ITEM_MASK(ARP_ETH_IPV4, sizeof(struct rte_flow_item_arp_eth_ipv4),
+ rte_flow_item_arp_eth_ipv4_mask),
+ MK_FLOW_ITEM_MASK(IPV6_EXT, sizeof(struct rte_flow_item_ipv6_ext),
+ rte_flow_item_ipv6_ext_mask),
MK_FLOW_ITEM(IPV6_FRAG_EXT, sizeof(struct rte_flow_item_ipv6_frag_ext)),
- MK_FLOW_ITEM(ICMP6, sizeof(struct rte_flow_item_icmp6)),
+ MK_FLOW_ITEM_MASK(ICMP6, sizeof(struct rte_flow_item_icmp6),
+ rte_flow_item_icmp6_mask),
MK_FLOW_ITEM(ICMP6_ECHO_REQUEST, sizeof(struct rte_flow_item_icmp6_echo)),
MK_FLOW_ITEM(ICMP6_ECHO_REPLY, sizeof(struct rte_flow_item_icmp6_echo)),
- MK_FLOW_ITEM(ICMP6_ND_NS, sizeof(struct rte_flow_item_icmp6_nd_ns)),
- MK_FLOW_ITEM(ICMP6_ND_NA, sizeof(struct rte_flow_item_icmp6_nd_na)),
- MK_FLOW_ITEM(ICMP6_ND_OPT, sizeof(struct rte_flow_item_icmp6_nd_opt)),
- MK_FLOW_ITEM(ICMP6_ND_OPT_SLA_ETH,
- sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
- 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)),
- MK_FLOW_ITEM(RANDOM, sizeof(struct rte_flow_item_random)),
- MK_FLOW_ITEM(TAG, sizeof(struct rte_flow_item_tag)),
+ MK_FLOW_ITEM_MASK(ICMP6_ND_NS, sizeof(struct rte_flow_item_icmp6_nd_ns),
+ rte_flow_item_icmp6_nd_ns_mask),
+ MK_FLOW_ITEM_MASK(ICMP6_ND_NA, sizeof(struct rte_flow_item_icmp6_nd_na),
+ rte_flow_item_icmp6_nd_na_mask),
+ MK_FLOW_ITEM_MASK(ICMP6_ND_OPT, sizeof(struct rte_flow_item_icmp6_nd_opt),
+ rte_flow_item_icmp6_nd_opt_mask),
+ MK_FLOW_ITEM_MASK(ICMP6_ND_OPT_SLA_ETH,
+ sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth),
+ rte_flow_item_icmp6_nd_opt_sla_eth_mask),
+ MK_FLOW_ITEM_MASK(ICMP6_ND_OPT_TLA_ETH,
+ sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth),
+ rte_flow_item_icmp6_nd_opt_tla_eth_mask),
+ MK_FLOW_ITEM_MASK(MARK, sizeof(struct rte_flow_item_mark),
+ rte_flow_item_mark_mask),
+ MK_FLOW_ITEM_MASK(META, sizeof(struct rte_flow_item_meta),
+ rte_flow_item_meta_mask),
+ MK_FLOW_ITEM_MASK(RANDOM, sizeof(struct rte_flow_item_random),
+ rte_flow_item_random_mask),
+ MK_FLOW_ITEM_MASK(TAG, sizeof(struct rte_flow_item_tag),
+ rte_flow_item_tag_mask),
MK_FLOW_ITEM(GRE_KEY, sizeof(rte_be32_t)),
MK_FLOW_ITEM(GRE_OPTION, sizeof(struct rte_flow_item_gre_opt)),
- MK_FLOW_ITEM(GTP_PSC, sizeof(struct rte_flow_item_gtp_psc)),
+ MK_FLOW_ITEM_MASK(GTP_PSC, sizeof(struct rte_flow_item_gtp_psc),
+ rte_flow_item_gtp_psc_mask),
MK_FLOW_ITEM(PPPOES, sizeof(struct rte_flow_item_pppoe)),
MK_FLOW_ITEM(PPPOED, sizeof(struct rte_flow_item_pppoe)),
- MK_FLOW_ITEM(PPPOE_PROTO_ID,
- sizeof(struct rte_flow_item_pppoe_proto_id)),
- MK_FLOW_ITEM(NSH, sizeof(struct rte_flow_item_nsh)),
- MK_FLOW_ITEM(IGMP, sizeof(struct rte_flow_item_igmp)),
- MK_FLOW_ITEM(AH, sizeof(struct rte_flow_item_ah)),
- MK_FLOW_ITEM(HIGIG2, sizeof(struct rte_flow_item_higig2_hdr)),
- MK_FLOW_ITEM(L2TPV3OIP, sizeof(struct rte_flow_item_l2tpv3oip)),
- MK_FLOW_ITEM(PFCP, sizeof(struct rte_flow_item_pfcp)),
- MK_FLOW_ITEM(ECPRI, sizeof(struct rte_flow_item_ecpri)),
- MK_FLOW_ITEM(GENEVE_OPT, sizeof(struct rte_flow_item_geneve_opt)),
- MK_FLOW_ITEM(INTEGRITY, sizeof(struct rte_flow_item_integrity)),
- MK_FLOW_ITEM(CONNTRACK, sizeof(uint32_t)),
- MK_FLOW_ITEM(PORT_REPRESENTOR, sizeof(struct rte_flow_item_ethdev)),
- MK_FLOW_ITEM(REPRESENTED_PORT, sizeof(struct rte_flow_item_ethdev)),
+ MK_FLOW_ITEM_MASK(PPPOE_PROTO_ID,
+ sizeof(struct rte_flow_item_pppoe_proto_id),
+ rte_flow_item_pppoe_proto_id_mask),
+ MK_FLOW_ITEM_MASK(NSH, sizeof(struct rte_flow_item_nsh),
+ rte_flow_item_nsh_mask),
+ MK_FLOW_ITEM_MASK(IGMP, sizeof(struct rte_flow_item_igmp),
+ rte_flow_item_igmp_mask),
+ MK_FLOW_ITEM_MASK(AH, sizeof(struct rte_flow_item_ah),
+ rte_flow_item_ah_mask),
+ MK_FLOW_ITEM_MASK(HIGIG2, sizeof(struct rte_flow_item_higig2_hdr),
+ rte_flow_item_higig2_hdr_mask),
+ MK_FLOW_ITEM_MASK(L2TPV3OIP, sizeof(struct rte_flow_item_l2tpv3oip),
+ rte_flow_item_l2tpv3oip_mask),
+ MK_FLOW_ITEM_MASK(PFCP, sizeof(struct rte_flow_item_pfcp),
+ rte_flow_item_pfcp_mask),
+ MK_FLOW_ITEM_MASK(ECPRI, sizeof(struct rte_flow_item_ecpri),
+ rte_flow_item_ecpri_mask),
+ MK_FLOW_ITEM_MASK(GENEVE_OPT, sizeof(struct rte_flow_item_geneve_opt),
+ rte_flow_item_geneve_opt_mask),
+ MK_FLOW_ITEM_MASK(INTEGRITY, sizeof(struct rte_flow_item_integrity),
+ rte_flow_item_integrity_mask),
+ MK_FLOW_ITEM_MASK(CONNTRACK, sizeof(uint32_t),
+ rte_flow_item_conntrack_mask),
+ MK_FLOW_ITEM_MASK(PORT_REPRESENTOR, sizeof(struct rte_flow_item_ethdev),
+ rte_flow_item_ethdev_mask),
+ MK_FLOW_ITEM_MASK(REPRESENTED_PORT, sizeof(struct rte_flow_item_ethdev),
+ rte_flow_item_ethdev_mask),
MK_FLOW_ITEM_FN(FLEX, sizeof(struct rte_flow_item_flex),
rte_flow_item_flex_conv),
- MK_FLOW_ITEM(L2TPV2, sizeof(struct rte_flow_item_l2tpv2)),
- MK_FLOW_ITEM(PPP, sizeof(struct rte_flow_item_ppp)),
- MK_FLOW_ITEM(METER_COLOR, sizeof(struct rte_flow_item_meter_color)),
+ MK_FLOW_ITEM_MASK(L2TPV2, sizeof(struct rte_flow_item_l2tpv2),
+ rte_flow_item_l2tpv2_mask),
+ MK_FLOW_ITEM_MASK(PPP, sizeof(struct rte_flow_item_ppp),
+ rte_flow_item_ppp_mask),
+ MK_FLOW_ITEM_MASK(METER_COLOR, sizeof(struct rte_flow_item_meter_color),
+ rte_flow_item_meter_color_mask),
MK_FLOW_ITEM(IPV6_ROUTING_EXT, sizeof(struct rte_flow_item_ipv6_routing_ext)),
- MK_FLOW_ITEM(QUOTA, sizeof(struct rte_flow_item_quota)),
- MK_FLOW_ITEM(AGGR_AFFINITY, sizeof(struct rte_flow_item_aggr_affinity)),
- MK_FLOW_ITEM(TX_QUEUE, sizeof(struct rte_flow_item_tx_queue)),
- MK_FLOW_ITEM(IB_BTH, sizeof(struct rte_flow_item_ib_bth)),
- MK_FLOW_ITEM(PTYPE, sizeof(struct rte_flow_item_ptype)),
+ MK_FLOW_ITEM_MASK(QUOTA, sizeof(struct rte_flow_item_quota),
+ rte_flow_item_quota_mask),
+ MK_FLOW_ITEM_MASK(AGGR_AFFINITY, sizeof(struct rte_flow_item_aggr_affinity),
+ rte_flow_item_aggr_affinity_mask),
+ MK_FLOW_ITEM_MASK(TX_QUEUE, sizeof(struct rte_flow_item_tx_queue),
+ rte_flow_item_tx_queue_mask),
+ MK_FLOW_ITEM_MASK(IB_BTH, sizeof(struct rte_flow_item_ib_bth),
+ rte_flow_item_ib_bth_mask),
+ MK_FLOW_ITEM_MASK(PTYPE, sizeof(struct rte_flow_item_ptype),
+ rte_flow_item_ptype_mask),
MK_FLOW_ITEM(COMPARE, sizeof(struct rte_flow_item_compare)),
};
@@ -1118,6 +1184,24 @@ rte_flow_conv_name(int is_action,
return sizeof(const char **);
}
+/** Retrieve the default mask pointer of a flow item type. */
+static int
+rte_flow_conv_item_default_mask(void *dst,
+ const size_t size,
+ const void *src,
+ struct rte_flow_error *error)
+{
+ unsigned int type = (uintptr_t)src;
+
+ if (type >= RTE_DIM(rte_flow_desc_item))
+ return rte_flow_error_set
+ (error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
+ "unknown item type to retrieve the default mask of");
+ if (size >= sizeof(const void **))
+ *((const void **)dst) = rte_flow_desc_item[type].default_mask;
+ return sizeof(const void **);
+}
+
/** Helper function to convert flow API objects. */
RTE_EXPORT_SYMBOL(rte_flow_conv)
int
@@ -1179,6 +1263,9 @@ rte_flow_conv(enum rte_flow_conv_op op,
case RTE_FLOW_CONV_OP_ACTION_NAME_PTR:
ret = rte_flow_conv_name(1, 1, dst, size, src, error);
break;
+ case RTE_FLOW_CONV_OP_ITEM_DEFAULT_MASK_PTR:
+ ret = rte_flow_conv_item_default_mask(dst, size, src, error);
+ break;
default:
ret = rte_flow_error_set
(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
index 1bfe1b3f619..df8101e4395 100644
--- a/lib/ethdev/rte_flow.h
+++ b/lib/ethdev/rte_flow.h
@@ -4411,6 +4411,21 @@ enum rte_flow_conv_op {
* @code const char ** @endcode
*/
RTE_FLOW_CONV_OP_ACTION_NAME_PTR,
+
+ /**
+ * Convert item type to pointer to its default mask.
+ *
+ * Writes a pointer to rte_flow_item_{name}_mask to @p dst,
+ * or NULL if the item type has no default mask. The mask itself is not
+ * copied; instead, a unique pointer to an internal static constant
+ * storage is written to @p dst.
+ *
+ * - @p src type:
+ * @code (const void *)enum rte_flow_item_type @endcode
+ * - @p dst type:
+ * @code const void ** @endcode
+ */
+ RTE_FLOW_CONV_OP_ITEM_DEFAULT_MASK_PTR,
};
/**
--
2.52.0
More information about the dev
mailing list