xref: /dpdk/app/graph/l3fwd.c (revision 34c0c38ab772e8eea5243f530866d5b68519e7c7)
1*34c0c38aSRakesh Kudurumalla /* SPDX-License-Identifier: BSD-3-Clause
2*34c0c38aSRakesh Kudurumalla  * Copyright(c) 2023 Marvell.
3*34c0c38aSRakesh Kudurumalla  */
4*34c0c38aSRakesh Kudurumalla 
5*34c0c38aSRakesh Kudurumalla #include <errno.h>
6*34c0c38aSRakesh Kudurumalla #include <stdbool.h>
7*34c0c38aSRakesh Kudurumalla #include <stdint.h>
8*34c0c38aSRakesh Kudurumalla #include <stdio.h>
9*34c0c38aSRakesh Kudurumalla #include <stdlib.h>
10*34c0c38aSRakesh Kudurumalla #include <string.h>
11*34c0c38aSRakesh Kudurumalla 
12*34c0c38aSRakesh Kudurumalla #include <rte_common.h>
13*34c0c38aSRakesh Kudurumalla #include <rte_ethdev.h>
14*34c0c38aSRakesh Kudurumalla #include <rte_graph.h>
15*34c0c38aSRakesh Kudurumalla #include <rte_graph_worker.h>
16*34c0c38aSRakesh Kudurumalla #include <rte_lcore.h>
17*34c0c38aSRakesh Kudurumalla #include <rte_node_eth_api.h>
18*34c0c38aSRakesh Kudurumalla 
19*34c0c38aSRakesh Kudurumalla #include "module_api.h"
20*34c0c38aSRakesh Kudurumalla 
21*34c0c38aSRakesh Kudurumalla static int
l3fwd_pattern_configure(void)22*34c0c38aSRakesh Kudurumalla l3fwd_pattern_configure(void)
23*34c0c38aSRakesh Kudurumalla {
24*34c0c38aSRakesh Kudurumalla 	/* Graph initialization. 8< */
25*34c0c38aSRakesh Kudurumalla 	static const char * const default_patterns[] = {
26*34c0c38aSRakesh Kudurumalla 		"ip4*",
27*34c0c38aSRakesh Kudurumalla 		"ethdev_tx-*",
28*34c0c38aSRakesh Kudurumalla 		"pkt_drop",
29*34c0c38aSRakesh Kudurumalla 	};
30*34c0c38aSRakesh Kudurumalla 	struct rte_graph_param graph_conf;
31*34c0c38aSRakesh Kudurumalla 	const char **node_patterns;
32*34c0c38aSRakesh Kudurumalla 	uint64_t pcap_pkts_count;
33*34c0c38aSRakesh Kudurumalla 	struct lcore_conf *qconf;
34*34c0c38aSRakesh Kudurumalla 	uint16_t nb_patterns;
35*34c0c38aSRakesh Kudurumalla 	uint8_t pcap_ena;
36*34c0c38aSRakesh Kudurumalla 	int rc, lcore_id;
37*34c0c38aSRakesh Kudurumalla 	char *pcap_file;
38*34c0c38aSRakesh Kudurumalla 
39*34c0c38aSRakesh Kudurumalla 	nb_patterns = RTE_DIM(default_patterns);
40*34c0c38aSRakesh Kudurumalla 	node_patterns = malloc((ETHDEV_RX_QUEUE_PER_LCORE_MAX + nb_patterns) *
41*34c0c38aSRakesh Kudurumalla 			sizeof(*node_patterns));
42*34c0c38aSRakesh Kudurumalla 	if (!node_patterns)
43*34c0c38aSRakesh Kudurumalla 		return -ENOMEM;
44*34c0c38aSRakesh Kudurumalla 	memcpy(node_patterns, default_patterns,
45*34c0c38aSRakesh Kudurumalla 			nb_patterns * sizeof(*node_patterns));
46*34c0c38aSRakesh Kudurumalla 
47*34c0c38aSRakesh Kudurumalla 	memset(&graph_conf, 0, sizeof(graph_conf));
48*34c0c38aSRakesh Kudurumalla 	graph_conf.node_patterns = node_patterns;
49*34c0c38aSRakesh Kudurumalla 
50*34c0c38aSRakesh Kudurumalla 	/* Pcap config */
51*34c0c38aSRakesh Kudurumalla 	graph_pcap_config_get(&pcap_ena, &pcap_pkts_count, &pcap_file);
52*34c0c38aSRakesh Kudurumalla 	graph_conf.pcap_enable = pcap_ena;
53*34c0c38aSRakesh Kudurumalla 	graph_conf.num_pkt_to_capture = pcap_pkts_count;
54*34c0c38aSRakesh Kudurumalla 	graph_conf.pcap_filename = strdup(pcap_file);
55*34c0c38aSRakesh Kudurumalla 
56*34c0c38aSRakesh Kudurumalla 	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
57*34c0c38aSRakesh Kudurumalla 		rte_graph_t graph_id;
58*34c0c38aSRakesh Kudurumalla 		rte_edge_t i;
59*34c0c38aSRakesh Kudurumalla 
60*34c0c38aSRakesh Kudurumalla 		if (rte_lcore_is_enabled(lcore_id) == 0)
61*34c0c38aSRakesh Kudurumalla 			continue;
62*34c0c38aSRakesh Kudurumalla 
63*34c0c38aSRakesh Kudurumalla 		qconf = &lcore_conf[lcore_id];
64*34c0c38aSRakesh Kudurumalla 
65*34c0c38aSRakesh Kudurumalla 		/* Skip graph creation if no source exists */
66*34c0c38aSRakesh Kudurumalla 		if (!qconf->n_rx_queue)
67*34c0c38aSRakesh Kudurumalla 			continue;
68*34c0c38aSRakesh Kudurumalla 
69*34c0c38aSRakesh Kudurumalla 		/* Add rx node patterns of this lcore */
70*34c0c38aSRakesh Kudurumalla 		for (i = 0; i < qconf->n_rx_queue; i++) {
71*34c0c38aSRakesh Kudurumalla 			graph_conf.node_patterns[nb_patterns + i] =
72*34c0c38aSRakesh Kudurumalla 				qconf->rx_queue_list[i].node_name;
73*34c0c38aSRakesh Kudurumalla 		}
74*34c0c38aSRakesh Kudurumalla 
75*34c0c38aSRakesh Kudurumalla 		graph_conf.nb_node_patterns = nb_patterns + i;
76*34c0c38aSRakesh Kudurumalla 		graph_conf.socket_id = rte_lcore_to_socket_id(lcore_id);
77*34c0c38aSRakesh Kudurumalla 
78*34c0c38aSRakesh Kudurumalla 		snprintf(qconf->name, sizeof(qconf->name), "worker_%u",
79*34c0c38aSRakesh Kudurumalla 				lcore_id);
80*34c0c38aSRakesh Kudurumalla 
81*34c0c38aSRakesh Kudurumalla 		graph_id = rte_graph_create(qconf->name, &graph_conf);
82*34c0c38aSRakesh Kudurumalla 		if (graph_id == RTE_GRAPH_ID_INVALID)
83*34c0c38aSRakesh Kudurumalla 			rte_exit(EXIT_FAILURE,
84*34c0c38aSRakesh Kudurumalla 					"rte_graph_create(): graph_id invalid"
85*34c0c38aSRakesh Kudurumalla 					" for lcore %u\n", lcore_id);
86*34c0c38aSRakesh Kudurumalla 
87*34c0c38aSRakesh Kudurumalla 		qconf->graph_id = graph_id;
88*34c0c38aSRakesh Kudurumalla 		qconf->graph = rte_graph_lookup(qconf->name);
89*34c0c38aSRakesh Kudurumalla 		/* >8 End of graph initialization. */
90*34c0c38aSRakesh Kudurumalla 		if (!qconf->graph)
91*34c0c38aSRakesh Kudurumalla 			rte_exit(EXIT_FAILURE,
92*34c0c38aSRakesh Kudurumalla 					"rte_graph_lookup(): graph %s not found\n",
93*34c0c38aSRakesh Kudurumalla 					qconf->name);
94*34c0c38aSRakesh Kudurumalla 	}
95*34c0c38aSRakesh Kudurumalla 
96*34c0c38aSRakesh Kudurumalla 	rc = route_ip4_add_to_lookup();
97*34c0c38aSRakesh Kudurumalla 	if (rc < 0)
98*34c0c38aSRakesh Kudurumalla 		rte_exit(EXIT_FAILURE, "Unable to add v4 route to lookup table\n");
99*34c0c38aSRakesh Kudurumalla 
100*34c0c38aSRakesh Kudurumalla 	rc = route_ip6_add_to_lookup();
101*34c0c38aSRakesh Kudurumalla 	if (rc < 0)
102*34c0c38aSRakesh Kudurumalla 		rte_exit(EXIT_FAILURE, "Unable to add v6 route to lookup table\n");
103*34c0c38aSRakesh Kudurumalla 
104*34c0c38aSRakesh Kudurumalla 	rc = neigh_ip4_add_to_rewrite();
105*34c0c38aSRakesh Kudurumalla 	if (rc < 0)
106*34c0c38aSRakesh Kudurumalla 		rte_exit(EXIT_FAILURE, "Unable to add v4 to rewrite node\n");
107*34c0c38aSRakesh Kudurumalla 
108*34c0c38aSRakesh Kudurumalla 	rc = neigh_ip6_add_to_rewrite();
109*34c0c38aSRakesh Kudurumalla 	if (rc < 0)
110*34c0c38aSRakesh Kudurumalla 		rte_exit(EXIT_FAILURE, "Unable to add v6 to rewrite node\n");
111*34c0c38aSRakesh Kudurumalla 
112*34c0c38aSRakesh Kudurumalla 	/* Launch per-lcore init on every worker lcore */
113*34c0c38aSRakesh Kudurumalla 	rte_eal_mp_remote_launch(graph_walk_start, NULL, SKIP_MAIN);
114*34c0c38aSRakesh Kudurumalla 
115*34c0c38aSRakesh Kudurumalla 	/* Accumulate and print stats on main until exit */
116*34c0c38aSRakesh Kudurumalla 	if (rte_graph_has_stats_feature() && app_graph_stats_enabled())
117*34c0c38aSRakesh Kudurumalla 		graph_stats_print();
118*34c0c38aSRakesh Kudurumalla 
119*34c0c38aSRakesh Kudurumalla 	return rc;
120*34c0c38aSRakesh Kudurumalla }
121*34c0c38aSRakesh Kudurumalla 
122*34c0c38aSRakesh Kudurumalla int
usecase_l3fwd_configure(struct rte_node_ethdev_config * conf,uint16_t nb_confs,uint16_t nb_graphs)123*34c0c38aSRakesh Kudurumalla usecase_l3fwd_configure(struct rte_node_ethdev_config *conf, uint16_t nb_confs, uint16_t nb_graphs)
124*34c0c38aSRakesh Kudurumalla {
125*34c0c38aSRakesh Kudurumalla 	int rc;
126*34c0c38aSRakesh Kudurumalla 
127*34c0c38aSRakesh Kudurumalla 	rc = rte_node_eth_config(conf, nb_confs, nb_graphs);
128*34c0c38aSRakesh Kudurumalla 	if (rc)
129*34c0c38aSRakesh Kudurumalla 		rte_exit(EXIT_FAILURE, "rte_node_eth_config: err=%d\n", rc);
130*34c0c38aSRakesh Kudurumalla 
131*34c0c38aSRakesh Kudurumalla 	rc = l3fwd_pattern_configure();
132*34c0c38aSRakesh Kudurumalla 	if (rc)
133*34c0c38aSRakesh Kudurumalla 		rte_exit(EXIT_FAILURE, "l3fwd_pattern_failure: err=%d\n", rc);
134*34c0c38aSRakesh Kudurumalla 
135*34c0c38aSRakesh Kudurumalla 	return rc;
136*34c0c38aSRakesh Kudurumalla }
137