> -----Original Message----- > From: Rakesh Kudurumalla <rkuduruma...@marvell.com> > Sent: Tuesday, December 5, 2023 2:57 PM > To: Nithin Kumar Dabilpuram <ndabilpu...@marvell.com>; Pavan > Nikhilesh Bhagavatula <pbhagavat...@marvell.com> > Cc: dev@dpdk.org; Jerin Jacob Kollanukkaran <jer...@marvell.com>; > Rakesh Kudurumalla <rkuduruma...@marvell.com> > Subject: [EXT] [PATCH v4 1/3] node: support to add next node to ethdev Rx > node > > External Email > > ---------------------------------------------------------------------- > By default all packets received on ethdev_rx node is forwarded to pkt_cls > node.This patch provides library support to add a new node as next node to > ethdev_rx node and forward packet to new node from rx node. > > Signed-off-by: Rakesh Kudurumalla <rkuduruma...@marvell.com> > --- > v4: Resolve compilation issues > > lib/node/ethdev_ctrl.c | 45 > +++++++++++++++++++++++++++++++++++++ > lib/node/rte_node_eth_api.h | 19 ++++++++++++++++ > lib/node/version.map | 1 + > 3 files changed, 65 insertions(+) > > diff --git a/lib/node/ethdev_ctrl.c b/lib/node/ethdev_ctrl.c index > d564b80e37..0faf4c19f2 100644 > --- a/lib/node/ethdev_ctrl.c > +++ b/lib/node/ethdev_ctrl.c > @@ -3,6 +3,7 @@ > */ > > #include <stdlib.h> > +#include <errno.h> > > #include <rte_ethdev.h> > #include <rte_graph.h> > @@ -129,3 +130,47 @@ rte_node_eth_config(struct > rte_node_ethdev_config *conf, uint16_t nb_confs, > ctrl.nb_graphs = nb_graphs; > return 0; > } > + > +int > +rte_node_ethdev_rx_next_update(rte_node_t id, const char *edge_name) { > + struct ethdev_rx_node_main *data; > + ethdev_rx_node_elem_t *elem; > + char **next_nodes; > + int rc = -EINVAL; > + uint32_t count; > + uint16_t i = 0; > + > + if (edge_name == NULL) > + return rc; > + Better to use goto scheme.
> + count = rte_node_edge_get(id, NULL); > + > + if (count == RTE_NODE_ID_INVALID) > + return rc; > + > + next_nodes = malloc(count); > + if (next_nodes == NULL) > + return -ENOMEM; > + > + count = rte_node_edge_get(id, next_nodes); > + Here it looks like that loop can misbehave for invalid edge_name. I might be wrong. Consider the case. 1. edge_name = "test_name" 2. number of elements in next_nodes is 2 and no element is matching with edge_name. In this case, loop might misbehave as there will not be any NULL entry. Did you try a negative test case on this API ? > + while (next_nodes[i] != NULL) { > + if (strcmp(edge_name, next_nodes[i]) == 0) { > + data = ethdev_rx_get_node_data_get(); > + elem = data->head; > + while (elem->next != data->head) { > + if (elem->nid == id) { > + elem->ctx.cls_next = i; > + rc = 0; > + goto exit; > + } > + elem = elem->next; > + } > + } > + i++; > + } > +exit: > + free(next_nodes); > + return rc; > +} > diff --git a/lib/node/rte_node_eth_api.h b/lib/node/rte_node_eth_api.h index > eaae50772d..b082a5bec1 100644 > --- a/lib/node/rte_node_eth_api.h > +++ b/lib/node/rte_node_eth_api.h > @@ -23,6 +23,7 @@ extern "C" { > #include <rte_compat.h> > #include <rte_common.h> > #include <rte_mempool.h> > +#include <rte_graph.h> > > /** > * Port config for ethdev_rx and ethdev_tx node. > @@ -57,6 +58,24 @@ struct rte_node_ethdev_config { > */ > int rte_node_eth_config(struct rte_node_ethdev_config *cfg, > uint16_t cnt, uint16_t nb_graphs); > + > +/** > + * Update ethdev rx next node. > + * > + * @param id > + * Node id whose edge is to be updated. > + * @param edge_name > + * Name of the next node. > + * > + * @return > + * RTE_EDGE_ID_INVALID if id is invalid I think, This is not needed now. Below error code handles for invalid ID too. > + * ENINVAL: Either of input parameters are invalid > + * ENOMEM: If memory allocation failed > + * 0 on successful initialization. > + */ > +__rte_experimental > +int rte_node_ethdev_rx_next_update(rte_node_t id, const char > +*edge_name); > + > #ifdef __cplusplus > } > #endif > diff --git a/lib/node/version.map b/lib/node/version.map index > 99ffcdd414..07abc3a79f 100644 > --- a/lib/node/version.map > +++ b/lib/node/version.map > @@ -16,6 +16,7 @@ EXPERIMENTAL { > rte_node_ip6_route_add; > > # added in 23.11 > + rte_node_ethdev_rx_next_update; > rte_node_ip4_reassembly_configure; > rte_node_udp4_dst_port_add; > rte_node_udp4_usr_node_add; > -- > 2.25.1