xref: /dpdk/examples/ip_pipeline/main.c (revision 6bfe74f8c93e9d5ca5906981397aab79a59bb04e)
13998e2a0SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
24bbf8e30SJasvinder Singh  * Copyright(c) 2010-2018 Intel Corporation
377a33467SCristian Dumitrescu  */
477a33467SCristian Dumitrescu 
5fbc74e66SJasvinder Singh #include <stdio.h>
6fbc74e66SJasvinder Singh #include <string.h>
7fbc74e66SJasvinder Singh #include <fcntl.h>
8fbc74e66SJasvinder Singh #include <unistd.h>
9fbc74e66SJasvinder Singh #include <getopt.h>
1077a33467SCristian Dumitrescu 
11fbc74e66SJasvinder Singh #include <rte_eal.h>
1277a33467SCristian Dumitrescu 
134bbf8e30SJasvinder Singh #include "cli.h"
144bbf8e30SJasvinder Singh #include "conn.h"
15*6bfe74f8SJasvinder Singh #include "mempool.h"
164bbf8e30SJasvinder Singh 
174bbf8e30SJasvinder Singh static const char usage[] =
184bbf8e30SJasvinder Singh 	"%s EAL_ARGS -- [-h HOST] [-p PORT] [-s SCRIPT]\n";
194bbf8e30SJasvinder Singh 
204bbf8e30SJasvinder Singh static const char welcome[] =
214bbf8e30SJasvinder Singh 	"\n"
224bbf8e30SJasvinder Singh 	"Welcome to IP Pipeline!\n"
234bbf8e30SJasvinder Singh 	"\n";
244bbf8e30SJasvinder Singh 
254bbf8e30SJasvinder Singh static const char prompt[] = "pipeline> ";
264bbf8e30SJasvinder Singh 
274bbf8e30SJasvinder Singh static struct app_params {
284bbf8e30SJasvinder Singh 	struct conn_params conn;
294bbf8e30SJasvinder Singh 	char *script_name;
304bbf8e30SJasvinder Singh } app = {
314bbf8e30SJasvinder Singh 	.conn = {
324bbf8e30SJasvinder Singh 		.welcome = welcome,
334bbf8e30SJasvinder Singh 		.prompt = prompt,
344bbf8e30SJasvinder Singh 		.addr = "0.0.0.0",
354bbf8e30SJasvinder Singh 		.port = 8086,
364bbf8e30SJasvinder Singh 		.buf_size = 1024 * 1024,
374bbf8e30SJasvinder Singh 		.msg_in_len_max = 1024,
384bbf8e30SJasvinder Singh 		.msg_out_len_max = 1024 * 1024,
394bbf8e30SJasvinder Singh 		.msg_handle = cli_process,
404bbf8e30SJasvinder Singh 	},
414bbf8e30SJasvinder Singh 	.script_name = NULL,
424bbf8e30SJasvinder Singh };
434bbf8e30SJasvinder Singh 
444bbf8e30SJasvinder Singh static int
454bbf8e30SJasvinder Singh parse_args(int argc, char **argv)
464bbf8e30SJasvinder Singh {
474bbf8e30SJasvinder Singh 	char *app_name = argv[0];
484bbf8e30SJasvinder Singh 	struct option lgopts[] = {
494bbf8e30SJasvinder Singh 		{ NULL,  0, 0, 0 }
504bbf8e30SJasvinder Singh 	};
514bbf8e30SJasvinder Singh 	int opt, option_index;
524bbf8e30SJasvinder Singh 	int h_present, p_present, s_present, n_args, i;
534bbf8e30SJasvinder Singh 
544bbf8e30SJasvinder Singh 	/* Skip EAL input args */
554bbf8e30SJasvinder Singh 	n_args = argc;
564bbf8e30SJasvinder Singh 	for (i = 0; i < n_args; i++)
574bbf8e30SJasvinder Singh 		if (strcmp(argv[i], "--") == 0) {
584bbf8e30SJasvinder Singh 			argc -= i;
594bbf8e30SJasvinder Singh 			argv += i;
604bbf8e30SJasvinder Singh 			break;
614bbf8e30SJasvinder Singh 		}
624bbf8e30SJasvinder Singh 
634bbf8e30SJasvinder Singh 	if (i == n_args)
644bbf8e30SJasvinder Singh 		return 0;
654bbf8e30SJasvinder Singh 
664bbf8e30SJasvinder Singh 	/* Parse args */
674bbf8e30SJasvinder Singh 	h_present = 0;
684bbf8e30SJasvinder Singh 	p_present = 0;
694bbf8e30SJasvinder Singh 	s_present = 0;
704bbf8e30SJasvinder Singh 
714bbf8e30SJasvinder Singh 	while ((opt = getopt_long(argc, argv, "h:p:s:", lgopts, &option_index))
724bbf8e30SJasvinder Singh 			!= EOF)
734bbf8e30SJasvinder Singh 		switch (opt) {
744bbf8e30SJasvinder Singh 		case 'h':
754bbf8e30SJasvinder Singh 			if (h_present) {
764bbf8e30SJasvinder Singh 				printf("Error: Multiple -h arguments\n");
774bbf8e30SJasvinder Singh 				return -1;
784bbf8e30SJasvinder Singh 			}
794bbf8e30SJasvinder Singh 			h_present = 1;
804bbf8e30SJasvinder Singh 
814bbf8e30SJasvinder Singh 			if (!strlen(optarg)) {
824bbf8e30SJasvinder Singh 				printf("Error: Argument for -h not provided\n");
834bbf8e30SJasvinder Singh 				return -1;
844bbf8e30SJasvinder Singh 			}
854bbf8e30SJasvinder Singh 
864bbf8e30SJasvinder Singh 			app.conn.addr = strdup(optarg);
874bbf8e30SJasvinder Singh 			if (app.conn.addr == NULL) {
884bbf8e30SJasvinder Singh 				printf("Error: Not enough memory\n");
894bbf8e30SJasvinder Singh 				return -1;
904bbf8e30SJasvinder Singh 			}
914bbf8e30SJasvinder Singh 			break;
924bbf8e30SJasvinder Singh 
934bbf8e30SJasvinder Singh 		case 'p':
944bbf8e30SJasvinder Singh 			if (p_present) {
954bbf8e30SJasvinder Singh 				printf("Error: Multiple -p arguments\n");
964bbf8e30SJasvinder Singh 				return -1;
974bbf8e30SJasvinder Singh 			}
984bbf8e30SJasvinder Singh 			p_present = 1;
994bbf8e30SJasvinder Singh 
1004bbf8e30SJasvinder Singh 			if (!strlen(optarg)) {
1014bbf8e30SJasvinder Singh 				printf("Error: Argument for -p not provided\n");
1024bbf8e30SJasvinder Singh 				return -1;
1034bbf8e30SJasvinder Singh 			}
1044bbf8e30SJasvinder Singh 
1054bbf8e30SJasvinder Singh 			app.conn.port = (uint16_t) atoi(optarg);
1064bbf8e30SJasvinder Singh 			break;
1074bbf8e30SJasvinder Singh 
1084bbf8e30SJasvinder Singh 		case 's':
1094bbf8e30SJasvinder Singh 			if (s_present) {
1104bbf8e30SJasvinder Singh 				printf("Error: Multiple -s arguments\n");
1114bbf8e30SJasvinder Singh 				return -1;
1124bbf8e30SJasvinder Singh 			}
1134bbf8e30SJasvinder Singh 			s_present = 1;
1144bbf8e30SJasvinder Singh 
1154bbf8e30SJasvinder Singh 			if (!strlen(optarg)) {
1164bbf8e30SJasvinder Singh 				printf("Error: Argument for -s not provided\n");
1174bbf8e30SJasvinder Singh 				return -1;
1184bbf8e30SJasvinder Singh 			}
1194bbf8e30SJasvinder Singh 
1204bbf8e30SJasvinder Singh 			app.script_name = strdup(optarg);
1214bbf8e30SJasvinder Singh 			if (app.script_name == NULL) {
1224bbf8e30SJasvinder Singh 				printf("Error: Not enough memory\n");
1234bbf8e30SJasvinder Singh 				return -1;
1244bbf8e30SJasvinder Singh 			}
1254bbf8e30SJasvinder Singh 			break;
1264bbf8e30SJasvinder Singh 
1274bbf8e30SJasvinder Singh 		default:
1284bbf8e30SJasvinder Singh 			printf(usage, app_name);
1294bbf8e30SJasvinder Singh 			return -1;
1304bbf8e30SJasvinder Singh 		}
1314bbf8e30SJasvinder Singh 
1324bbf8e30SJasvinder Singh 	optind = 1; /* reset getopt lib */
1334bbf8e30SJasvinder Singh 
1344bbf8e30SJasvinder Singh 	return 0;
1354bbf8e30SJasvinder Singh }
1364bbf8e30SJasvinder Singh 
13777a33467SCristian Dumitrescu int
13898a16481SDavid Marchand main(int argc, char **argv)
13977a33467SCristian Dumitrescu {
1404bbf8e30SJasvinder Singh 	struct conn *conn;
141fbc74e66SJasvinder Singh 	int status;
14277a33467SCristian Dumitrescu 
1434bbf8e30SJasvinder Singh 	/* Parse application arguments */
1444bbf8e30SJasvinder Singh 	status = parse_args(argc, argv);
1454bbf8e30SJasvinder Singh 	if (status < 0)
1464bbf8e30SJasvinder Singh 		return status;
1474bbf8e30SJasvinder Singh 
148fbc74e66SJasvinder Singh 	/* EAL */
149fbc74e66SJasvinder Singh 	status = rte_eal_init(argc, argv);
150fbc74e66SJasvinder Singh 	if (status < 0) {
151fbc74e66SJasvinder Singh 		printf("Error: EAL initialization failed (%d)\n", status);
152fbc74e66SJasvinder Singh 		return status;
153fbc74e66SJasvinder Singh 	};
15477a33467SCristian Dumitrescu 
1554bbf8e30SJasvinder Singh 	/* Connectivity */
1564bbf8e30SJasvinder Singh 	conn = conn_init(&app.conn);
1574bbf8e30SJasvinder Singh 	if (conn == NULL) {
1584bbf8e30SJasvinder Singh 		printf("Error: Connectivity initialization failed (%d)\n",
1594bbf8e30SJasvinder Singh 			status);
1604bbf8e30SJasvinder Singh 		return status;
1614bbf8e30SJasvinder Singh 	};
1624bbf8e30SJasvinder Singh 
163*6bfe74f8SJasvinder Singh 	/* Mempool */
164*6bfe74f8SJasvinder Singh 	status = mempool_init();
165*6bfe74f8SJasvinder Singh 	if (status) {
166*6bfe74f8SJasvinder Singh 		printf("Error: Mempool initialization failed (%d)\n", status);
167*6bfe74f8SJasvinder Singh 		return status;
168*6bfe74f8SJasvinder Singh 	}
169*6bfe74f8SJasvinder Singh 
1704bbf8e30SJasvinder Singh 	/* Script */
1714bbf8e30SJasvinder Singh 	if (app.script_name)
1724bbf8e30SJasvinder Singh 		cli_script_process(app.script_name,
1734bbf8e30SJasvinder Singh 			app.conn.msg_in_len_max,
1744bbf8e30SJasvinder Singh 			app.conn.msg_out_len_max);
1754bbf8e30SJasvinder Singh 
1764bbf8e30SJasvinder Singh 	/* Dispatch loop */
1774bbf8e30SJasvinder Singh 	for ( ; ; ) {
1784bbf8e30SJasvinder Singh 		conn_poll_for_conn(conn);
1794bbf8e30SJasvinder Singh 
1804bbf8e30SJasvinder Singh 		conn_poll_for_msg(conn);
1814bbf8e30SJasvinder Singh 	}
18277a33467SCristian Dumitrescu }
183