Hi, > -----Original Message----- > From: Ivan Malov <ivan.ma...@oktetlabs.ru> > Sent: Wednesday, October 13, 2021 2:15 > To: Slava Ovsiienko <viachesl...@nvidia.com>; dev@dpdk.org > Cc: NBU-Contact-Thomas Monjalon <tho...@monjalon.net>; Ori Kam > <or...@nvidia.com>; Xiaoyun Li <xiaoyun...@intel.com>; Ferruh Yigit > <ferruh.yi...@intel.com>; Andrew Rybchenko > <andrew.rybche...@oktetlabs.ru> > Subject: Re: [dpdk-dev] [PATCH v3 01/12] ethdev: add port representor item > to flow API > > Hi, > > On 12/10/2021 23:55, Slava Ovsiienko wrote: > > Hi, > > > > Please, see below. > > > >> -----Original Message----- > >> From: dev <dev-boun...@dpdk.org> On Behalf Of Ivan Malov > >> Sent: Sunday, October 10, 2021 17:39 > >> To: dev@dpdk.org > >> Cc: NBU-Contact-Thomas Monjalon <tho...@monjalon.net>; Ori Kam > >> <or...@nvidia.com>; Xiaoyun Li <xiaoyun...@intel.com>; Ferruh Yigit > >> <ferruh.yi...@intel.com>; Andrew Rybchenko > >> <andrew.rybche...@oktetlabs.ru> > >> Subject: [dpdk-dev] [PATCH v3 01/12] ethdev: add port representor > >> item to flow API > >> > >> For use in "transfer" flows. Supposed to match traffic entering the > >> embedded switch from the given ethdev. > >> > >> Must not be combined with direction attributes. > >> > >> Signed-off-by: Ivan Malov <ivan.ma...@oktetlabs.ru> > >> --- > >> app/test-pmd/cmdline_flow.c | 27 ++++++++++ > > > > Should we separate testpmd changes into dedicated commit? > > This patch intermixes RTE Flow API update and testpmd. > > I'm no fan of mixing things like that, but doing so appears to be rather > logical. > Each commit should be build testable. If the new defines have no users in the > same commit, they are dummy. And I believe that readers typically want to > see the use example in the same commit, too. Sometime the testpmd change is larged and should be reviewed carefully. But this series is not a case, and I see it is common practice to include small updates of testpmd in the primary patch. I wonder why I do not follow this practice 😉 OK, please, disregard my comment in previous mail.
With best regards, Slava > > > > > With best regards, > > Slava > > > >> doc/guides/prog_guide/rte_flow.rst | 59 +++++++++++++++++++++ > >> doc/guides/rel_notes/release_21_11.rst | 2 + > >> doc/guides/testpmd_app_ug/testpmd_funcs.rst | 4 ++ > >> lib/ethdev/rte_flow.c | 1 + > >> lib/ethdev/rte_flow.h | 27 ++++++++++ > >> 6 files changed, 120 insertions(+) > >> > >> diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c > >> index bb22294dd3..a912a8d815 100644 > >> --- a/app/test-pmd/cmdline_flow.c > >> +++ b/app/test-pmd/cmdline_flow.c > >> @@ -306,6 +306,8 @@ enum index { > >> ITEM_POL_PORT, > >> ITEM_POL_METER, > >> ITEM_POL_POLICY, > >> + ITEM_PORT_REPRESENTOR, > >> + ITEM_PORT_REPRESENTOR_PORT_ID, > >> > >> /* Validate/create actions. */ > >> ACTIONS, > >> @@ -1000,6 +1002,7 @@ static const enum index next_item[] = { > >> ITEM_GENEVE_OPT, > >> ITEM_INTEGRITY, > >> ITEM_CONNTRACK, > >> + ITEM_PORT_REPRESENTOR, > >> END_SET, > >> ZERO, > >> }; > >> @@ -1368,6 +1371,12 @@ static const enum index item_integrity_lv[] = { > >> ZERO, > >> }; > >> > >> +static const enum index item_port_representor[] = { > >> + ITEM_PORT_REPRESENTOR_PORT_ID, > >> + ITEM_NEXT, > >> + ZERO, > >> +}; > >> + > >> static const enum index next_action[] = { > >> ACTION_END, > >> ACTION_VOID, > >> @@ -3608,6 +3617,21 @@ static const struct token token_list[] = { > >> item_param), > >> .args = ARGS(ARGS_ENTRY(struct rte_flow_item_conntrack, > >> flags)), > >> }, > >> + [ITEM_PORT_REPRESENTOR] = { > >> + .name = "port_representor", > >> + .help = "match traffic entering the embedded switch from the > >> given ethdev", > >> + .priv = PRIV_ITEM(PORT_REPRESENTOR, > >> + sizeof(struct rte_flow_item_ethdev)), > >> + .next = NEXT(item_port_representor), > >> + .call = parse_vc, > >> + }, > >> + [ITEM_PORT_REPRESENTOR_PORT_ID] = { > >> + .name = "port_id", > >> + .help = "ethdev port ID", > >> + .next = NEXT(item_port_representor, > >> NEXT_ENTRY(COMMON_UNSIGNED), > >> + item_param), > >> + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_ethdev, > >> port_id)), > >> + }, > >> /* Validate/create actions. */ > >> [ACTIONS] = { > >> .name = "actions", > >> @@ -8343,6 +8367,9 @@ flow_item_default_mask(const struct > >> rte_flow_item *item) > >> case RTE_FLOW_ITEM_TYPE_PFCP: > >> mask = &rte_flow_item_pfcp_mask; > >> break; > >> + case RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR: > >> + mask = &rte_flow_item_ethdev_mask; > >> + break; > >> default: > >> break; > >> } > >> diff --git a/doc/guides/prog_guide/rte_flow.rst > >> b/doc/guides/prog_guide/rte_flow.rst > >> index 2b42d5ec8c..91d5bdd712 100644 > >> --- a/doc/guides/prog_guide/rte_flow.rst > >> +++ b/doc/guides/prog_guide/rte_flow.rst > >> @@ -1425,6 +1425,65 @@ Matches a conntrack state after conntrack > action. > >> - ``flags``: conntrack packet state flags. > >> - Default ``mask`` matches all state bits. > >> > >> +Item: ``PORT_REPRESENTOR`` > >> +^^^^^^^^^^^^^^^^^^^^^^^^^^ > >> + > >> +Matches traffic entering the embedded switch from the given ethdev. > >> + > >> +Term **ethdev** and the concept of **port representor** are > synonymous. > >> +The **represented port** is an *entity* plugged to the embedded switch > >> +at the opposite end of the "wire" leading to the ethdev. > >> + > >> +:: > >> + > >> + .--------------------. > >> + | PORT_REPRESENTOR | Ethdev (Application Port Referred to by its > ID) > >> + '--------------------' > >> + || > >> + \/ > >> + .----------------. > >> + | Logical Port | > >> + '----------------' > >> + || > >> + || > >> + || > >> + \/ > >> + .----------. > >> + | Switch | > >> + '----------' > >> + : > >> + : > >> + : > >> + : > >> + .----------------. > >> + | Logical Port | > >> + '----------------' > >> + : > >> + : > >> + .--------------------. > >> + | REPRESENTED_PORT | Net / Guest / Another Ethdev (Same > >> Application) > >> + '--------------------' > >> + > >> + > >> +- Incompatible with `Attribute: Traffic direction`_. > >> +- Requires `Attribute: Transfer`_. > >> + > >> +.. _table_rte_flow_item_ethdev: > >> + > >> +.. table:: ``struct rte_flow_item_ethdev`` > >> + > >> + +----------+-------------+---------------------------+ > >> + | Field | Subfield | Value | > >> + +==========+=============+===========================+ > >> + | ``spec`` | ``port_id`` | ethdev port ID | > >> + +----------+-------------+---------------------------+ > >> + | ``last`` | ``port_id`` | upper range value | > >> + +----------+-------------+---------------------------+ > >> + | ``mask`` | ``port_id`` | zeroed for wildcard match | > >> + +----------+-------------+---------------------------+ > >> + > >> +- Default ``mask`` provides exact match behaviour. > >> + > >> Actions > >> ~~~~~~~ > >> > >> diff --git a/doc/guides/rel_notes/release_21_11.rst > >> b/doc/guides/rel_notes/release_21_11.rst > >> index 89d4b33ef1..1261cb2bf3 100644 > >> --- a/doc/guides/rel_notes/release_21_11.rst > >> +++ b/doc/guides/rel_notes/release_21_11.rst > >> @@ -188,6 +188,8 @@ API Changes > >> Also, make sure to start the actual text at the margin. > >> ======================================================= > >> > >> +* ethdev: Added item ``PORT_REPRESENTOR`` to flow API. > >> + > >> * kvargs: The experimental function ``rte_kvargs_strcmp()`` has been > >> removed. Its usages have been replaced by a new function > >> ``rte_kvargs_get_with_value()``. > >> diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > >> b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > >> index 8ead7a4a71..dcb9f47d98 100644 > >> --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > >> +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > >> @@ -3795,6 +3795,10 @@ This section lists supported pattern items and > >> their attributes, if any. > >> > >> - ``conntrack``: match conntrack state. > >> > >> +- ``port_representor``: match traffic entering the embedded switch from > >> +the given ethdev > >> + > >> + - ``port_id {unsigned}``: ethdev port ID > >> + > >> Actions list > >> ^^^^^^^^^^^^ > >> > >> diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index > >> 8cb7a069c8..5e9317c6d1 100644 > >> --- a/lib/ethdev/rte_flow.c > >> +++ b/lib/ethdev/rte_flow.c > >> @@ -100,6 +100,7 @@ static const struct rte_flow_desc_data > >> rte_flow_desc_item[] = { > >> 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)), > >> }; > >> > >> /** Generate flow_action[] entry. */ > >> diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index > >> 7b1ed7f110..3625fd2c12 100644 > >> --- a/lib/ethdev/rte_flow.h > >> +++ b/lib/ethdev/rte_flow.h > >> @@ -574,6 +574,15 @@ 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, > >> }; > >> > >> /** > >> @@ -1799,6 +1808,24 @@ 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. > >> + */ > >> +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 > >> + > >> /** > >> * Matching pattern item definition. > >> * > >> -- > >> 2.20.1 > > -- > Ivan M