> -----Original Message----- > From: dev <dev-boun...@dpdk.org> On Behalf Of Dekel Peled > Sent: Sunday, September 16, 2018 10:38 PM > To: wenzhuo...@intel.com; jingjing...@intel.com; bernard.iremon...@intel.com; > dev@dpdk.org; > olivier.m...@6wind.com; Adrien Mazarguil <adrien.mazarg...@6wind.com>; Thomas > Monjalon > <tho...@monjalon.net>; ferruh.yi...@intel.com; arybche...@solarflare.com > Cc: Shahaf Shuler <shah...@mellanox.com>; Ori Kam <or...@mellanox.com> > Subject: [dpdk-dev] [PATCH v2 1/3] ethdev: support metadata as flow rule > criteria > > As described in [1], a new rte_flow item is added to support metadata to use > as flow rule match > pattern. > The metadata is an opaque item, fully controlled by the application. > > The use of metadata is relevant for egress rules only. > It can be set in the flow rule using the RTE_FLOW_ITEM_META. > > In order to avoid change in mbuf API, exisitng field buf.hash.fdir.hi is used > to carry the metadata > item. This field is used only in ingress packets, so using it for egress > metadata will not cause > conflicts. > > Application should set the packet metadata in the mbuf dedicated field, and > set the PKT_TX_METADATA > flag in the mbuf->ol_flags. > The NIC will use the packet metadata as match criteria for relevant flow > rules. > > This patch introduces metadata item type for rte_flow RTE_FLOW_ITEM_META, > along with corresponding > struct rte_flow_item_meta and ol_flag PKT_TX_METADATA. > > [1] "[RFC,v2] ethdev: support metadata as flow rule criteria" > > Signed-off-by: Dekel Peled <dek...@mellanox.com> > --- > V2: > * Fix some checkpatch coding style issues (wrongly sent). > --- > > doc/guides/prog_guide/rte_flow.rst | 21 +++++++++++++++++++++ > lib/librte_ethdev/rte_ethdev.c | 1 + > lib/librte_ethdev/rte_ethdev.h | 5 +++++ > lib/librte_ethdev/rte_flow.c | 1 + > lib/librte_ethdev/rte_flow.h | 24 ++++++++++++++++++++++++ > lib/librte_mbuf/rte_mbuf.c | 2 ++ > lib/librte_mbuf/rte_mbuf.h | 16 ++++++++++++++-- > 7 files changed, 68 insertions(+), 2 deletions(-) > > diff --git a/doc/guides/prog_guide/rte_flow.rst > b/doc/guides/prog_guide/rte_flow.rst > index b305a72..560e45a 100644 > --- a/doc/guides/prog_guide/rte_flow.rst > +++ b/doc/guides/prog_guide/rte_flow.rst > @@ -1191,6 +1191,27 @@ Normally preceded by any of: > - `Item: ICMP6_ND_NS`_ > - `Item: ICMP6_ND_OPT`_ > > +Item: ``META`` > +^^^^^^^^^^^^^^ > + > +Matches an application specific 32 bit metadata item. > + > +- Default ``mask`` matches any 32 bit value. > + > +.. _table_rte_flow_item_meta: > + > +.. table:: META > + > + +----------+----------+---------------------------+ > + | Field | Subfield | Value | > + +==========+==========+===========================+ > + | ``spec`` | ``data`` | 32 bit metadata value | > + +----------+--------------------------------------+ > + | ``last`` | ``data`` | upper range value | > + +----------+----------+---------------------------+ > + | ``mask`` | ``data`` | zeroed to match any value | > + +----------+----------+---------------------------+ > + > Actions > ~~~~~~~ > > diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c > index f790d42..1ae7694 > 100644 > --- a/lib/librte_ethdev/rte_ethdev.c > +++ b/lib/librte_ethdev/rte_ethdev.c > @@ -158,6 +158,7 @@ struct rte_eth_xstats_name_off { > RTE_TX_OFFLOAD_BIT2STR(SECURITY), > RTE_TX_OFFLOAD_BIT2STR(UDP_TNL_TSO), > RTE_TX_OFFLOAD_BIT2STR(IP_TNL_TSO), > + RTE_TX_OFFLOAD_BIT2STR(MATCH_METADATA), > }; > > #undef RTE_TX_OFFLOAD_BIT2STR > diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h > index 7070e9a..a0da16c > 100644 > --- a/lib/librte_ethdev/rte_ethdev.h > +++ b/lib/librte_ethdev/rte_ethdev.h > @@ -953,6 +953,11 @@ struct rte_eth_conf { > * for tunnel TSO. > */ > #define DEV_TX_OFFLOAD_IP_TNL_TSO 0x00080000 > +/** > + * Device supports match on metadata Tx offload.. > + * Application must set PKT_TX_METADATA and mbuf metadata field. > + */ > +#define DEV_TX_OFFLOAD_MATCH_METADATA 0x00100000 > > #define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001 /**< Device > supports Rx queue setup > after device started*/ diff --git a/lib/librte_ethdev/rte_flow.c > b/lib/librte_ethdev/rte_flow.c > index cff4b52..54e5ef8 100644 > --- a/lib/librte_ethdev/rte_flow.c > +++ b/lib/librte_ethdev/rte_flow.c > @@ -66,6 +66,7 @@ struct rte_flow_desc_data { > 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(META, sizeof(struct rte_flow_item_meta)), > }; > > /** Generate flow_action[] entry. */ > diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h > index f8ba71c..4cc5954 > 100644 > --- a/lib/librte_ethdev/rte_flow.h > +++ b/lib/librte_ethdev/rte_flow.h > @@ -413,6 +413,14 @@ enum rte_flow_item_type { > * 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, > }; > > /** > @@ -1156,6 +1164,22 @@ struct rte_flow_item_icmp6_nd_opt_tla_eth { #endif > > /** > + * RTE_FLOW_ITEM_TYPE_META. > + * > + * Matches a specified metadata value. > + */ > +struct rte_flow_item_meta { > + uint32_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 > * > diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c index > e714c5a..4b25ae8 100644 > --- a/lib/librte_mbuf/rte_mbuf.c > +++ b/lib/librte_mbuf/rte_mbuf.c > @@ -395,6 +395,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask) > case PKT_TX_TUNNEL_UDP: return "PKT_TX_TUNNEL_UDP"; > case PKT_TX_MACSEC: return "PKT_TX_MACSEC"; > case PKT_TX_SEC_OFFLOAD: return "PKT_TX_SEC_OFFLOAD"; > + case PKT_TX_METADATA: return "PKT_TX_METADATA"; > default: return NULL; > } > } > @@ -435,6 +436,7 @@ const char *rte_get_tx_ol_flag_name(uint64_t mask) > "PKT_TX_TUNNEL_NONE" }, > { PKT_TX_MACSEC, PKT_TX_MACSEC, NULL }, > { PKT_TX_SEC_OFFLOAD, PKT_TX_SEC_OFFLOAD, NULL }, > + { PKT_TX_METADATA, PKT_TX_METADATA, NULL }, > }; > const char *name; > unsigned int i; > diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index > 9ce5d76..ea75ad0 100644 > --- a/lib/librte_mbuf/rte_mbuf.h > +++ b/lib/librte_mbuf/rte_mbuf.h > @@ -182,6 +182,11 @@ > /* add new TX flags here */ > > /** > + * Indicate that the metadata field in the mbuf is in use. > + */ > +#define PKT_TX_METADATA (1ULL << 41) > + > +/** > * UDP Fragmentation Offload flag. This flag is used for enabling UDP > * fragmentation in SW or in HW. When use UFO, mbuf->tso_segsz is used > * to store the MSS of UDP fragments. > @@ -342,8 +347,9 @@ > PKT_TX_QINQ_PKT | \ > PKT_TX_VLAN_PKT | \ > PKT_TX_TUNNEL_MASK | \ > - PKT_TX_MACSEC | \ > - PKT_TX_SEC_OFFLOAD) > + PKT_TX_MACSEC | \ > + PKT_TX_SEC_OFFLOAD | \ > + PKT_TX_METADATA) > > /** > * Mbuf having an external buffer attached. shinfo in mbuf must be filled. > @@ -526,6 +532,12 @@ struct rte_mbuf { > uint32_t hi; > /**< First 4 flexible bytes or FD ID, dependent on > PKT_RX_FDIR_* flag in ol_flags. */ > + /** > + * Above member has optional use on egress: > + * Application specific metadata value > + * for flow rule match. > + * Valid if PKT_TX_METADATA is set. > + */ > } fdir; /**< Filter identifier if FDIR enabled */
Use mbuf->hash.fdir.hi to set metadata? How about a dedicate name mbuf->meta at same offset like this: union { union { // current hash definiton } hash; struct { uint32 lo; uint32 meta; } } > struct { > uint32_t lo; > -- > 1.8.3.1