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