Hi Slava, Looks good to me, Best, Ori
> -----Original Message----- > From: Slava Ovsiienko <viachesl...@nvidia.com> > Sent: Wednesday, 28 December 2022 18:55 > > The RTE Flow API implements the concept of shared objects, > known as indirect actions (RTE_FLOW_ACTION_TYPE_INDIRECT). > An application can create the indirect action of desired > type and configuration with rte_flow_action_handle_create > call and then specify the obtained action handle in multiple > flows. > > The initial concept supposes the action handle has strict > attachment to the port it was created on and to be used > exclusively in the flows being installed on the port. > > Nowadays the multipath network topologies are quite common, > packets belonging to the same connection might arrive and > be sent over multiple ports, and there is the raising demand > to handle these "spread" connections. To fulfil this demand > it is proposed to extend indirect action sharing across the > multiple ports. This kind of sharing would be extremely useful > for the meters and counters, allowing to manage the single > connection over the multiple ports. > > This cross-port object sharing is hard to implement in > generic way merely with software on the upper layers, but > can be provided by the driver over the single hardware > instance, where multiple ports reside on the same physical > NIC and share the same hardware context. > > To allow this action sharing application should specify > the "host port" during flow configuring to claim the intention > to share the indirect actions. All indirect actions reside within > "host port" context and can be shared in flows being installed > on the host port and on all the ports referencing this one. > > If sharing between host and port being configured is not supported > the configuration should be rejected with error. There might be > multiple independent (mutual exclusive) sharing domains with > dedicated host and referencing ports. > > To manage the shared indirect action any port from sharing domain > can be specified. To share or not the created action is up to > application, no API change is needed. > > Signed-off-by: Viacheslav Ovsiienko <viachesl...@nvidia.com> > --- > lib/ethdev/rte_flow.c | 6 ++++++ > lib/ethdev/rte_flow.h | 11 +++++++++++ > 2 files changed, 17 insertions(+) > > diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c > index 7d0c24366c..692d37925a 100644 > --- a/lib/ethdev/rte_flow.c > +++ b/lib/ethdev/rte_flow.c > @@ -1476,6 +1476,12 @@ rte_flow_configure(uint16_t port_id, > RTE_FLOW_LOG(ERR, "Port %"PRIu16" queue info is > NULL.\n", port_id); > return -EINVAL; > } > + if ((port_attr->flags & RTE_FLOW_PORT_FLAG_SHARE_INDIRECT) && > + !rte_eth_dev_is_valid_port(port_attr->host_port_id)) { > + return rte_flow_error_set(error, ENODEV, > + > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > + NULL, rte_strerror(ENODEV)); > + } > if (likely(!!ops->configure)) { > ret = ops->configure(dev, port_attr, nb_queue, queue_attr, > error); > if (ret == 0) > diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h > index b60987db4b..c784f4ec30 100644 > --- a/lib/ethdev/rte_flow.h > +++ b/lib/ethdev/rte_flow.h > @@ -4903,6 +4903,13 @@ rte_flow_info_get(uint16_t port_id, > struct rte_flow_queue_info *queue_info, > struct rte_flow_error *error); > > +/** > + * Indicate all steering objects should be created on contexts > + * of the host port, providing indirect object sharing beetween > + * ports. > + */ > +#define RTE_FLOW_PORT_FLAG_SHARE_INDIRECT RTE_BIT32(0) > + > /** > * @warning > * @b EXPERIMENTAL: this API may change without prior notice. > @@ -4932,6 +4939,10 @@ struct rte_flow_port_attr { > * @see RTE_FLOW_ACTION_TYPE_CONNTRACK > */ > uint32_t nb_conn_tracks; > + /** > + * Port to base shared objects on. > + */ > + uint16_t host_port_id; > /** > * Port flags (RTE_FLOW_PORT_FLAG_*). > */ > -- > 2.18.1