1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606 * Copyright(c) 2010-2018 Intel Corporation
3a9643ea8Slogwang */
4a9643ea8Slogwang
5d30ea906Sjfb8856606 #include <stdio.h>
6d30ea906Sjfb8856606 #include <string.h>
7d30ea906Sjfb8856606 #include <fcntl.h>
8d30ea906Sjfb8856606 #include <unistd.h>
9d30ea906Sjfb8856606 #include <getopt.h>
10a9643ea8Slogwang
11d30ea906Sjfb8856606 #include <rte_launch.h>
12d30ea906Sjfb8856606 #include <rte_eal.h>
13d30ea906Sjfb8856606
14d30ea906Sjfb8856606 #include "cli.h"
15d30ea906Sjfb8856606 #include "conn.h"
16d30ea906Sjfb8856606 #include "kni.h"
17d30ea906Sjfb8856606 #include "cryptodev.h"
18d30ea906Sjfb8856606 #include "link.h"
19d30ea906Sjfb8856606 #include "mempool.h"
20d30ea906Sjfb8856606 #include "pipeline.h"
21d30ea906Sjfb8856606 #include "swq.h"
22d30ea906Sjfb8856606 #include "tap.h"
23d30ea906Sjfb8856606 #include "thread.h"
24d30ea906Sjfb8856606 #include "tmgr.h"
25d30ea906Sjfb8856606
26d30ea906Sjfb8856606 static const char usage[] =
27d30ea906Sjfb8856606 "%s EAL_ARGS -- [-h HOST] [-p PORT] [-s SCRIPT]\n";
28d30ea906Sjfb8856606
29d30ea906Sjfb8856606 static const char welcome[] =
30d30ea906Sjfb8856606 "\n"
31d30ea906Sjfb8856606 "Welcome to IP Pipeline!\n"
32d30ea906Sjfb8856606 "\n";
33d30ea906Sjfb8856606
34d30ea906Sjfb8856606 static const char prompt[] = "pipeline> ";
35d30ea906Sjfb8856606
36d30ea906Sjfb8856606 static struct app_params {
37d30ea906Sjfb8856606 struct conn_params conn;
38d30ea906Sjfb8856606 char *script_name;
39d30ea906Sjfb8856606 } app = {
40d30ea906Sjfb8856606 .conn = {
41d30ea906Sjfb8856606 .welcome = welcome,
42d30ea906Sjfb8856606 .prompt = prompt,
43d30ea906Sjfb8856606 .addr = "0.0.0.0",
44d30ea906Sjfb8856606 .port = 8086,
45d30ea906Sjfb8856606 .buf_size = 1024 * 1024,
46d30ea906Sjfb8856606 .msg_in_len_max = 1024,
47d30ea906Sjfb8856606 .msg_out_len_max = 1024 * 1024,
48d30ea906Sjfb8856606 .msg_handle = cli_process,
49d30ea906Sjfb8856606 },
50d30ea906Sjfb8856606 .script_name = NULL,
51d30ea906Sjfb8856606 };
52d30ea906Sjfb8856606
53d30ea906Sjfb8856606 static int
parse_args(int argc,char ** argv)54d30ea906Sjfb8856606 parse_args(int argc, char **argv)
55d30ea906Sjfb8856606 {
56d30ea906Sjfb8856606 char *app_name = argv[0];
57d30ea906Sjfb8856606 struct option lgopts[] = {
58d30ea906Sjfb8856606 { NULL, 0, 0, 0 }
59d30ea906Sjfb8856606 };
60d30ea906Sjfb8856606 int opt, option_index;
61d30ea906Sjfb8856606 int h_present, p_present, s_present, n_args, i;
62d30ea906Sjfb8856606
63d30ea906Sjfb8856606 /* Skip EAL input args */
64d30ea906Sjfb8856606 n_args = argc;
65d30ea906Sjfb8856606 for (i = 0; i < n_args; i++)
66d30ea906Sjfb8856606 if (strcmp(argv[i], "--") == 0) {
67d30ea906Sjfb8856606 argc -= i;
68d30ea906Sjfb8856606 argv += i;
69d30ea906Sjfb8856606 break;
70d30ea906Sjfb8856606 }
71d30ea906Sjfb8856606
72d30ea906Sjfb8856606 if (i == n_args)
73d30ea906Sjfb8856606 return 0;
74d30ea906Sjfb8856606
75d30ea906Sjfb8856606 /* Parse args */
76d30ea906Sjfb8856606 h_present = 0;
77d30ea906Sjfb8856606 p_present = 0;
78d30ea906Sjfb8856606 s_present = 0;
79d30ea906Sjfb8856606
80d30ea906Sjfb8856606 while ((opt = getopt_long(argc, argv, "h:p:s:", lgopts, &option_index))
81d30ea906Sjfb8856606 != EOF)
82d30ea906Sjfb8856606 switch (opt) {
83d30ea906Sjfb8856606 case 'h':
84d30ea906Sjfb8856606 if (h_present) {
85d30ea906Sjfb8856606 printf("Error: Multiple -h arguments\n");
86d30ea906Sjfb8856606 return -1;
87d30ea906Sjfb8856606 }
88d30ea906Sjfb8856606 h_present = 1;
89d30ea906Sjfb8856606
90d30ea906Sjfb8856606 if (!strlen(optarg)) {
91d30ea906Sjfb8856606 printf("Error: Argument for -h not provided\n");
92d30ea906Sjfb8856606 return -1;
93d30ea906Sjfb8856606 }
94d30ea906Sjfb8856606
95d30ea906Sjfb8856606 app.conn.addr = strdup(optarg);
96d30ea906Sjfb8856606 if (app.conn.addr == NULL) {
97d30ea906Sjfb8856606 printf("Error: Not enough memory\n");
98d30ea906Sjfb8856606 return -1;
99d30ea906Sjfb8856606 }
100d30ea906Sjfb8856606 break;
101d30ea906Sjfb8856606
102d30ea906Sjfb8856606 case 'p':
103d30ea906Sjfb8856606 if (p_present) {
104d30ea906Sjfb8856606 printf("Error: Multiple -p arguments\n");
105d30ea906Sjfb8856606 return -1;
106d30ea906Sjfb8856606 }
107d30ea906Sjfb8856606 p_present = 1;
108d30ea906Sjfb8856606
109d30ea906Sjfb8856606 if (!strlen(optarg)) {
110d30ea906Sjfb8856606 printf("Error: Argument for -p not provided\n");
111d30ea906Sjfb8856606 return -1;
112d30ea906Sjfb8856606 }
113d30ea906Sjfb8856606
114d30ea906Sjfb8856606 app.conn.port = (uint16_t) atoi(optarg);
115d30ea906Sjfb8856606 break;
116d30ea906Sjfb8856606
117d30ea906Sjfb8856606 case 's':
118d30ea906Sjfb8856606 if (s_present) {
119d30ea906Sjfb8856606 printf("Error: Multiple -s arguments\n");
120d30ea906Sjfb8856606 return -1;
121d30ea906Sjfb8856606 }
122d30ea906Sjfb8856606 s_present = 1;
123d30ea906Sjfb8856606
124d30ea906Sjfb8856606 if (!strlen(optarg)) {
125d30ea906Sjfb8856606 printf("Error: Argument for -s not provided\n");
126d30ea906Sjfb8856606 return -1;
127d30ea906Sjfb8856606 }
128d30ea906Sjfb8856606
129d30ea906Sjfb8856606 app.script_name = strdup(optarg);
130d30ea906Sjfb8856606 if (app.script_name == NULL) {
131d30ea906Sjfb8856606 printf("Error: Not enough memory\n");
132d30ea906Sjfb8856606 return -1;
133d30ea906Sjfb8856606 }
134d30ea906Sjfb8856606 break;
135d30ea906Sjfb8856606
136d30ea906Sjfb8856606 default:
137d30ea906Sjfb8856606 printf(usage, app_name);
138d30ea906Sjfb8856606 return -1;
139d30ea906Sjfb8856606 }
140d30ea906Sjfb8856606
141d30ea906Sjfb8856606 optind = 1; /* reset getopt lib */
142d30ea906Sjfb8856606
143d30ea906Sjfb8856606 return 0;
144d30ea906Sjfb8856606 }
145a9643ea8Slogwang
146a9643ea8Slogwang int
main(int argc,char ** argv)147a9643ea8Slogwang main(int argc, char **argv)
148a9643ea8Slogwang {
149d30ea906Sjfb8856606 struct conn *conn;
150d30ea906Sjfb8856606 int status;
151a9643ea8Slogwang
152d30ea906Sjfb8856606 /* Parse application arguments */
153d30ea906Sjfb8856606 status = parse_args(argc, argv);
154d30ea906Sjfb8856606 if (status < 0)
155d30ea906Sjfb8856606 return status;
156a9643ea8Slogwang
157d30ea906Sjfb8856606 /* EAL */
158d30ea906Sjfb8856606 status = rte_eal_init(argc, argv);
159d30ea906Sjfb8856606 if (status < 0) {
160d30ea906Sjfb8856606 printf("Error: EAL initialization failed (%d)\n", status);
161d30ea906Sjfb8856606 return status;
162d30ea906Sjfb8856606 };
163a9643ea8Slogwang
164d30ea906Sjfb8856606 /* Connectivity */
165d30ea906Sjfb8856606 conn = conn_init(&app.conn);
166d30ea906Sjfb8856606 if (conn == NULL) {
167d30ea906Sjfb8856606 printf("Error: Connectivity initialization failed (%d)\n",
168d30ea906Sjfb8856606 status);
169d30ea906Sjfb8856606 return status;
170d30ea906Sjfb8856606 };
171a9643ea8Slogwang
172d30ea906Sjfb8856606 /* Mempool */
173d30ea906Sjfb8856606 status = mempool_init();
174d30ea906Sjfb8856606 if (status) {
175d30ea906Sjfb8856606 printf("Error: Mempool initialization failed (%d)\n", status);
176d30ea906Sjfb8856606 return status;
177d30ea906Sjfb8856606 }
178a9643ea8Slogwang
179d30ea906Sjfb8856606 /* Link */
180d30ea906Sjfb8856606 status = link_init();
181d30ea906Sjfb8856606 if (status) {
182d30ea906Sjfb8856606 printf("Error: Link initialization failed (%d)\n", status);
183d30ea906Sjfb8856606 return status;
184d30ea906Sjfb8856606 }
185a9643ea8Slogwang
186d30ea906Sjfb8856606 /* SWQ */
187d30ea906Sjfb8856606 status = swq_init();
188d30ea906Sjfb8856606 if (status) {
189d30ea906Sjfb8856606 printf("Error: SWQ initialization failed (%d)\n", status);
190d30ea906Sjfb8856606 return status;
191d30ea906Sjfb8856606 }
192a9643ea8Slogwang
193d30ea906Sjfb8856606 /* Traffic Manager */
194d30ea906Sjfb8856606 status = tmgr_init();
195d30ea906Sjfb8856606 if (status) {
196d30ea906Sjfb8856606 printf("Error: TMGR initialization failed (%d)\n", status);
197d30ea906Sjfb8856606 return status;
198d30ea906Sjfb8856606 }
199d30ea906Sjfb8856606
200d30ea906Sjfb8856606 /* TAP */
201d30ea906Sjfb8856606 status = tap_init();
202d30ea906Sjfb8856606 if (status) {
203d30ea906Sjfb8856606 printf("Error: TAP initialization failed (%d)\n", status);
204d30ea906Sjfb8856606 return status;
205d30ea906Sjfb8856606 }
206d30ea906Sjfb8856606
207d30ea906Sjfb8856606 /* KNI */
208d30ea906Sjfb8856606 status = kni_init();
209d30ea906Sjfb8856606 if (status) {
210d30ea906Sjfb8856606 printf("Error: KNI initialization failed (%d)\n", status);
211d30ea906Sjfb8856606 return status;
212d30ea906Sjfb8856606 }
213d30ea906Sjfb8856606
214d30ea906Sjfb8856606 /* Sym Crypto */
215d30ea906Sjfb8856606 status = cryptodev_init();
216d30ea906Sjfb8856606 if (status) {
217d30ea906Sjfb8856606 printf("Error: Cryptodev initialization failed (%d)\n",
218d30ea906Sjfb8856606 status);
219d30ea906Sjfb8856606 return status;
220d30ea906Sjfb8856606 }
221d30ea906Sjfb8856606
222d30ea906Sjfb8856606 /* Action */
223d30ea906Sjfb8856606 status = port_in_action_profile_init();
224d30ea906Sjfb8856606 if (status) {
225d30ea906Sjfb8856606 printf("Error: Input port action profile initialization failed (%d)\n", status);
226d30ea906Sjfb8856606 return status;
227d30ea906Sjfb8856606 }
228d30ea906Sjfb8856606
229d30ea906Sjfb8856606 status = table_action_profile_init();
230d30ea906Sjfb8856606 if (status) {
231d30ea906Sjfb8856606 printf("Error: Action profile initialization failed (%d)\n",
232d30ea906Sjfb8856606 status);
233d30ea906Sjfb8856606 return status;
234d30ea906Sjfb8856606 }
235d30ea906Sjfb8856606
236d30ea906Sjfb8856606 /* Pipeline */
237d30ea906Sjfb8856606 status = pipeline_init();
238d30ea906Sjfb8856606 if (status) {
239d30ea906Sjfb8856606 printf("Error: Pipeline initialization failed (%d)\n", status);
240d30ea906Sjfb8856606 return status;
241d30ea906Sjfb8856606 }
242d30ea906Sjfb8856606
243d30ea906Sjfb8856606 /* Thread */
244d30ea906Sjfb8856606 status = thread_init();
245d30ea906Sjfb8856606 if (status) {
246d30ea906Sjfb8856606 printf("Error: Thread initialization failed (%d)\n", status);
247d30ea906Sjfb8856606 return status;
248d30ea906Sjfb8856606 }
249d30ea906Sjfb8856606
250a9643ea8Slogwang rte_eal_mp_remote_launch(
251d30ea906Sjfb8856606 thread_main,
252d30ea906Sjfb8856606 NULL,
253*2d9fd380Sjfb8856606 SKIP_MAIN);
254a9643ea8Slogwang
255d30ea906Sjfb8856606 /* Script */
256d30ea906Sjfb8856606 if (app.script_name)
257d30ea906Sjfb8856606 cli_script_process(app.script_name,
258d30ea906Sjfb8856606 app.conn.msg_in_len_max,
259d30ea906Sjfb8856606 app.conn.msg_out_len_max);
260d30ea906Sjfb8856606
261d30ea906Sjfb8856606 /* Dispatch loop */
262d30ea906Sjfb8856606 for ( ; ; ) {
263d30ea906Sjfb8856606 conn_poll_for_conn(conn);
264d30ea906Sjfb8856606
265d30ea906Sjfb8856606 conn_poll_for_msg(conn);
266d30ea906Sjfb8856606
267d30ea906Sjfb8856606 kni_handle_request();
268d30ea906Sjfb8856606 }
269a9643ea8Slogwang }
270