[dpdk-dev] [PATCH v3 01/12] ethdev: add port representor item to flow API
Slava Ovsiienko
viacheslavo at nvidia.com
Wed Oct 13 20:26:17 CEST 2021
Hi,
> -----Original Message-----
> From: Ivan Malov <Ivan.Malov at oktetlabs.ru>
> Sent: Wednesday, October 13, 2021 2:15
> To: Slava Ovsiienko <viacheslavo at nvidia.com>; dev at dpdk.org
> Cc: NBU-Contact-Thomas Monjalon <thomas at monjalon.net>; Ori Kam
> <orika at nvidia.com>; Xiaoyun Li <xiaoyun.li at intel.com>; Ferruh Yigit
> <ferruh.yigit at intel.com>; Andrew Rybchenko
> <andrew.rybchenko at 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-bounces at dpdk.org> On Behalf Of Ivan Malov
> >> Sent: Sunday, October 10, 2021 17:39
> >> To: dev at dpdk.org
> >> Cc: NBU-Contact-Thomas Monjalon <thomas at monjalon.net>; Ori Kam
> >> <orika at nvidia.com>; Xiaoyun Li <xiaoyun.li at intel.com>; Ferruh Yigit
> >> <ferruh.yigit at intel.com>; Andrew Rybchenko
> >> <andrew.rybchenko at 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.malov at 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
More information about the dev
mailing list