Hi Jiawei, > -----Original Message----- > From: Jiawei(Jonny) Wang <jiaw...@nvidia.com> > Sent: Monday, 30 January 2023 19:01 > > For the multiple hardware ports connect to a single DPDK port (mhpsdp), > currently, there is no information to indicate the packet belongs to > which hardware port. > > This patch introduces a new phy affinity item in rte flow API, and > the phy affinity value reflects the physical port of the received packets. > > While uses the phy affinity as a matching item in the flow, and sets the > same phy_affinity value on the tx queue, then the packet can be sent from > the same hardware port with received. > > This patch also adds the testpmd command line to match the new item: > flow create 0 ingress group 0 pattern phy_affinity affinity is 1 / > end actions queue index 0 / end > > The above command means that creates a flow on a single DPDK port and > matches the packet from the first physical port (assume the phy affinity 1 > stands for the first port) and redirects these packets into RxQ 0. > > Signed-off-by: Jiawei Wang <jiaw...@nvidia.com> > --- > app/test-pmd/cmdline_flow.c | 29 +++++++++++++++++++++ > doc/guides/prog_guide/rte_flow.rst | 8 ++++++ > doc/guides/rel_notes/release_23_03.rst | 5 ++++ > doc/guides/testpmd_app_ug/testpmd_funcs.rst | 4 +++ > lib/ethdev/rte_flow.c | 1 + > lib/ethdev/rte_flow.h | 28 ++++++++++++++++++++ > 6 files changed, 75 insertions(+) > > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c > index 88108498e0..a6d4615038 100644 > --- a/app/test-pmd/cmdline_flow.c > +++ b/app/test-pmd/cmdline_flow.c > @@ -465,6 +465,8 @@ enum index { > ITEM_METER, > ITEM_METER_COLOR, > ITEM_METER_COLOR_NAME, > + ITEM_PHY_AFFINITY, > + ITEM_PHY_AFFINITY_VALUE, > > /* Validate/create actions. */ > ACTIONS, > @@ -1355,6 +1357,7 @@ static const enum index next_item[] = { > ITEM_L2TPV2, > ITEM_PPP, > ITEM_METER, > + ITEM_PHY_AFFINITY, > END_SET, > ZERO, > }; > @@ -1821,6 +1824,12 @@ static const enum index item_meter[] = { > ZERO, > }; > > +static const enum index item_phy_affinity[] = { > + ITEM_PHY_AFFINITY_VALUE, > + ITEM_NEXT, > + ZERO, > +}; > + > static const enum index next_action[] = { > ACTION_END, > ACTION_VOID, > @@ -6443,6 +6452,23 @@ static const struct token token_list[] = { > ARGS_ENTRY(struct buffer, port)), > .call = parse_mp, > }, > + [ITEM_PHY_AFFINITY] = { > + .name = "phy_affinity", > + .help = "match on the physical affinity of the" > + " received packet.", > + .priv = PRIV_ITEM(PHY_AFFINITY, > + sizeof(struct rte_flow_item_phy_affinity)), > + .next = NEXT(item_phy_affinity), > + .call = parse_vc, > + }, > + [ITEM_PHY_AFFINITY_VALUE] = { > + .name = "affinity", > + .help = "physical affinity value", > + .next = NEXT(item_phy_affinity, > NEXT_ENTRY(COMMON_UNSIGNED), > + item_param), > + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_phy_affinity, > + affinity)), > + }, > }; > > /** Remove and return last entry from argument stack. */ > @@ -10981,6 +11007,9 @@ flow_item_default_mask(const struct > rte_flow_item *item) > case RTE_FLOW_ITEM_TYPE_METER_COLOR: > mask = &rte_flow_item_meter_color_mask; > break; > + case RTE_FLOW_ITEM_TYPE_PHY_AFFINITY: > + mask = &rte_flow_item_phy_affinity_mask; > + break; > default: > break; > } > diff --git a/doc/guides/prog_guide/rte_flow.rst > b/doc/guides/prog_guide/rte_flow.rst > index 3e6242803d..3b4e8923dc 100644 > --- a/doc/guides/prog_guide/rte_flow.rst > +++ b/doc/guides/prog_guide/rte_flow.rst > @@ -1544,6 +1544,14 @@ Matches Color Marker set by a Meter. > > - ``color``: Metering color marker. > > +Item: ``PHY_AFFINITY`` > +^^^^^^^^^^^^^^^^^^^^^^ > + > +Matches on the physical affinity of the received packet, the physical port > +in the group of physical ports connected to a single DPDK port. > + > +- ``affinity``: Physical affinity. > + > Actions > ~~~~~~~ > > diff --git a/doc/guides/rel_notes/release_23_03.rst > b/doc/guides/rel_notes/release_23_03.rst > index c15f6fbb9f..a1abd67771 100644 > --- a/doc/guides/rel_notes/release_23_03.rst > +++ b/doc/guides/rel_notes/release_23_03.rst > @@ -69,6 +69,11 @@ New Features > ``rte_event_dev_config::nb_single_link_event_port_queues`` parameter > required for eth_rx, eth_tx, crypto and timer eventdev adapters. > > +* **Added rte_flow support for matching PHY Affinity fields.** > + > + For the multiple hardware ports connect to a single DPDK port (mhpsdp), > + Added ``phy_affinity`` item in rte_flow to support physical affinity of > + the packets. > > Removed Items > ------------- > diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > index 0037506a79..1853030e93 100644 > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > @@ -3712,6 +3712,10 @@ This section lists supported pattern items and > their attributes, if any. > > - ``color {value}``: meter color value (green/yellow/red). > > +- ``phy_affinity``: match physical affinity. > + > + - ``affinity {value}``: physical affinity value. > + > - ``send_to_kernel``: send packets to kernel. > > > diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c > index 7d0c24366c..0c2d3b679b 100644 > --- a/lib/ethdev/rte_flow.c > +++ b/lib/ethdev/rte_flow.c > @@ -157,6 +157,7 @@ static const struct rte_flow_desc_data > rte_flow_desc_item[] = { > 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(PHY_AFFINITY, sizeof(struct > rte_flow_item_phy_affinity)), > }; > > /** Generate flow_action[] entry. */ > diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h > index b60987db4b..56c04ea37c 100644 > --- a/lib/ethdev/rte_flow.h > +++ b/lib/ethdev/rte_flow.h > @@ -624,6 +624,13 @@ enum rte_flow_item_type { > * See struct rte_flow_item_meter_color. > */ > RTE_FLOW_ITEM_TYPE_METER_COLOR, > + > + /** > + * Matches on the physical affinity of the received packet. > + * > + * @see struct rte_flow_item_phy_affinity. > + */ > + RTE_FLOW_ITEM_TYPE_PHY_AFFINITY, > }; > > /** > @@ -2103,6 +2110,27 @@ static const struct rte_flow_item_meter_color > rte_flow_item_meter_color_mask = { > }; > #endif > > +/** > + * @warning > + * @b EXPERIMENTAL: this structure may change without prior notice > + * > + * RTE_FLOW_ITEM_TYPE_PHY_AFFINITY > + * > + * For the multiple hardware ports connect to a single DPDK port (mhpsdp), > + * use this item to match the physical affinity of the packets. > + */ > +struct rte_flow_item_phy_affinity { > + uint8_t affinity; /**< physical affinity value. */ > +}; > + > +/** Default mask for RTE_FLOW_ITEM_TYPE_PHY_AFFINITY. */ > +#ifndef __cplusplus > +static const struct rte_flow_item_phy_affinity > +rte_flow_item_phy_affinity_mask = { > + .affinity = 0xff, > +}; > +#endif > + > /** > * Action types. > * > -- > 2.18.1
Acked-by: Ori Kam <or...@nvidia.com> Best, Ori