xref: /dpdk/examples/ip_pipeline/main.c (revision 8245472c58c898f1bc2b30058b0f159e9ab2bb3f)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2018 Intel Corporation
3  */
4 
5 #include <stdio.h>
6 #include <string.h>
7 #include <fcntl.h>
8 #include <unistd.h>
9 #include <getopt.h>
10 
11 #include <rte_eal.h>
12 
13 #include "cli.h"
14 #include "conn.h"
15 #include "link.h"
16 #include "mempool.h"
17 #include "swq.h"
18 
19 static const char usage[] =
20 	"%s EAL_ARGS -- [-h HOST] [-p PORT] [-s SCRIPT]\n";
21 
22 static const char welcome[] =
23 	"\n"
24 	"Welcome to IP Pipeline!\n"
25 	"\n";
26 
27 static const char prompt[] = "pipeline> ";
28 
29 static struct app_params {
30 	struct conn_params conn;
31 	char *script_name;
32 } app = {
33 	.conn = {
34 		.welcome = welcome,
35 		.prompt = prompt,
36 		.addr = "0.0.0.0",
37 		.port = 8086,
38 		.buf_size = 1024 * 1024,
39 		.msg_in_len_max = 1024,
40 		.msg_out_len_max = 1024 * 1024,
41 		.msg_handle = cli_process,
42 	},
43 	.script_name = NULL,
44 };
45 
46 static int
47 parse_args(int argc, char **argv)
48 {
49 	char *app_name = argv[0];
50 	struct option lgopts[] = {
51 		{ NULL,  0, 0, 0 }
52 	};
53 	int opt, option_index;
54 	int h_present, p_present, s_present, n_args, i;
55 
56 	/* Skip EAL input args */
57 	n_args = argc;
58 	for (i = 0; i < n_args; i++)
59 		if (strcmp(argv[i], "--") == 0) {
60 			argc -= i;
61 			argv += i;
62 			break;
63 		}
64 
65 	if (i == n_args)
66 		return 0;
67 
68 	/* Parse args */
69 	h_present = 0;
70 	p_present = 0;
71 	s_present = 0;
72 
73 	while ((opt = getopt_long(argc, argv, "h:p:s:", lgopts, &option_index))
74 			!= EOF)
75 		switch (opt) {
76 		case 'h':
77 			if (h_present) {
78 				printf("Error: Multiple -h arguments\n");
79 				return -1;
80 			}
81 			h_present = 1;
82 
83 			if (!strlen(optarg)) {
84 				printf("Error: Argument for -h not provided\n");
85 				return -1;
86 			}
87 
88 			app.conn.addr = strdup(optarg);
89 			if (app.conn.addr == NULL) {
90 				printf("Error: Not enough memory\n");
91 				return -1;
92 			}
93 			break;
94 
95 		case 'p':
96 			if (p_present) {
97 				printf("Error: Multiple -p arguments\n");
98 				return -1;
99 			}
100 			p_present = 1;
101 
102 			if (!strlen(optarg)) {
103 				printf("Error: Argument for -p not provided\n");
104 				return -1;
105 			}
106 
107 			app.conn.port = (uint16_t) atoi(optarg);
108 			break;
109 
110 		case 's':
111 			if (s_present) {
112 				printf("Error: Multiple -s arguments\n");
113 				return -1;
114 			}
115 			s_present = 1;
116 
117 			if (!strlen(optarg)) {
118 				printf("Error: Argument for -s not provided\n");
119 				return -1;
120 			}
121 
122 			app.script_name = strdup(optarg);
123 			if (app.script_name == NULL) {
124 				printf("Error: Not enough memory\n");
125 				return -1;
126 			}
127 			break;
128 
129 		default:
130 			printf(usage, app_name);
131 			return -1;
132 		}
133 
134 	optind = 1; /* reset getopt lib */
135 
136 	return 0;
137 }
138 
139 int
140 main(int argc, char **argv)
141 {
142 	struct conn *conn;
143 	int status;
144 
145 	/* Parse application arguments */
146 	status = parse_args(argc, argv);
147 	if (status < 0)
148 		return status;
149 
150 	/* EAL */
151 	status = rte_eal_init(argc, argv);
152 	if (status < 0) {
153 		printf("Error: EAL initialization failed (%d)\n", status);
154 		return status;
155 	};
156 
157 	/* Connectivity */
158 	conn = conn_init(&app.conn);
159 	if (conn == NULL) {
160 		printf("Error: Connectivity initialization failed (%d)\n",
161 			status);
162 		return status;
163 	};
164 
165 	/* Mempool */
166 	status = mempool_init();
167 	if (status) {
168 		printf("Error: Mempool initialization failed (%d)\n", status);
169 		return status;
170 	}
171 
172 	/* Link */
173 	status = link_init();
174 	if (status) {
175 		printf("Error: Link initialization failed (%d)\n", status);
176 		return status;
177 	}
178 
179 	/* SWQ */
180 	status = swq_init();
181 	if (status) {
182 		printf("Error: SWQ initialization failed (%d)\n", status);
183 		return status;
184 	}
185 
186 	/* Script */
187 	if (app.script_name)
188 		cli_script_process(app.script_name,
189 			app.conn.msg_in_len_max,
190 			app.conn.msg_out_len_max);
191 
192 	/* Dispatch loop */
193 	for ( ; ; ) {
194 		conn_poll_for_conn(conn);
195 
196 		conn_poll_for_msg(conn);
197 	}
198 }
199