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