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