2017-12-19 15:49:02 +00:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
2018-03-29 18:31:40 +00:00
|
|
|
* Copyright(c) 2010-2018 Intel Corporation
|
2014-06-04 18:08:38 +00:00
|
|
|
*/
|
|
|
|
|
2018-03-29 18:31:39 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <getopt.h>
|
2014-06-04 18:08:38 +00:00
|
|
|
|
2018-03-29 18:31:50 +00:00
|
|
|
#include <rte_launch.h>
|
2018-03-29 18:31:39 +00:00
|
|
|
#include <rte_eal.h>
|
2014-06-04 18:08:38 +00:00
|
|
|
|
2018-03-29 18:31:40 +00:00
|
|
|
#include "cli.h"
|
|
|
|
#include "conn.h"
|
2018-03-29 18:31:46 +00:00
|
|
|
#include "kni.h"
|
2018-09-28 12:26:10 +00:00
|
|
|
#include "cryptodev.h"
|
2018-03-29 18:31:42 +00:00
|
|
|
#include "link.h"
|
2018-03-29 18:31:41 +00:00
|
|
|
#include "mempool.h"
|
2018-03-29 18:31:48 +00:00
|
|
|
#include "pipeline.h"
|
2018-03-29 18:31:43 +00:00
|
|
|
#include "swq.h"
|
2018-03-29 18:31:45 +00:00
|
|
|
#include "tap.h"
|
2018-03-29 18:31:49 +00:00
|
|
|
#include "thread.h"
|
2018-03-29 18:31:44 +00:00
|
|
|
#include "tmgr.h"
|
2018-03-29 18:31:40 +00:00
|
|
|
|
|
|
|
static const char usage[] =
|
|
|
|
"%s EAL_ARGS -- [-h HOST] [-p PORT] [-s SCRIPT]\n";
|
|
|
|
|
|
|
|
static const char welcome[] =
|
|
|
|
"\n"
|
|
|
|
"Welcome to IP Pipeline!\n"
|
|
|
|
"\n";
|
|
|
|
|
|
|
|
static const char prompt[] = "pipeline> ";
|
|
|
|
|
|
|
|
static struct app_params {
|
|
|
|
struct conn_params conn;
|
|
|
|
char *script_name;
|
|
|
|
} app = {
|
|
|
|
.conn = {
|
|
|
|
.welcome = welcome,
|
|
|
|
.prompt = prompt,
|
|
|
|
.addr = "0.0.0.0",
|
|
|
|
.port = 8086,
|
|
|
|
.buf_size = 1024 * 1024,
|
|
|
|
.msg_in_len_max = 1024,
|
|
|
|
.msg_out_len_max = 1024 * 1024,
|
|
|
|
.msg_handle = cli_process,
|
|
|
|
},
|
|
|
|
.script_name = NULL,
|
|
|
|
};
|
|
|
|
|
|
|
|
static int
|
|
|
|
parse_args(int argc, char **argv)
|
|
|
|
{
|
|
|
|
char *app_name = argv[0];
|
|
|
|
struct option lgopts[] = {
|
|
|
|
{ NULL, 0, 0, 0 }
|
|
|
|
};
|
|
|
|
int opt, option_index;
|
|
|
|
int h_present, p_present, s_present, n_args, i;
|
|
|
|
|
|
|
|
/* Skip EAL input args */
|
|
|
|
n_args = argc;
|
|
|
|
for (i = 0; i < n_args; i++)
|
|
|
|
if (strcmp(argv[i], "--") == 0) {
|
|
|
|
argc -= i;
|
|
|
|
argv += i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i == n_args)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Parse args */
|
|
|
|
h_present = 0;
|
|
|
|
p_present = 0;
|
|
|
|
s_present = 0;
|
|
|
|
|
|
|
|
while ((opt = getopt_long(argc, argv, "h:p:s:", lgopts, &option_index))
|
|
|
|
!= EOF)
|
|
|
|
switch (opt) {
|
|
|
|
case 'h':
|
|
|
|
if (h_present) {
|
|
|
|
printf("Error: Multiple -h arguments\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
h_present = 1;
|
|
|
|
|
|
|
|
if (!strlen(optarg)) {
|
|
|
|
printf("Error: Argument for -h not provided\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
app.conn.addr = strdup(optarg);
|
|
|
|
if (app.conn.addr == NULL) {
|
|
|
|
printf("Error: Not enough memory\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'p':
|
|
|
|
if (p_present) {
|
|
|
|
printf("Error: Multiple -p arguments\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
p_present = 1;
|
|
|
|
|
|
|
|
if (!strlen(optarg)) {
|
|
|
|
printf("Error: Argument for -p not provided\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
app.conn.port = (uint16_t) atoi(optarg);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 's':
|
|
|
|
if (s_present) {
|
|
|
|
printf("Error: Multiple -s arguments\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
s_present = 1;
|
|
|
|
|
|
|
|
if (!strlen(optarg)) {
|
|
|
|
printf("Error: Argument for -s not provided\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
app.script_name = strdup(optarg);
|
|
|
|
if (app.script_name == NULL) {
|
|
|
|
printf("Error: Not enough memory\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
printf(usage, app_name);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
optind = 1; /* reset getopt lib */
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-06-04 18:08:38 +00:00
|
|
|
int
|
2014-09-26 14:04:02 +00:00
|
|
|
main(int argc, char **argv)
|
2014-06-04 18:08:38 +00:00
|
|
|
{
|
2018-03-29 18:31:40 +00:00
|
|
|
struct conn *conn;
|
2018-03-29 18:31:39 +00:00
|
|
|
int status;
|
2014-06-04 18:08:38 +00:00
|
|
|
|
2018-03-29 18:31:40 +00:00
|
|
|
/* Parse application arguments */
|
|
|
|
status = parse_args(argc, argv);
|
|
|
|
if (status < 0)
|
|
|
|
return status;
|
|
|
|
|
2018-03-29 18:31:39 +00:00
|
|
|
/* EAL */
|
|
|
|
status = rte_eal_init(argc, argv);
|
|
|
|
if (status < 0) {
|
|
|
|
printf("Error: EAL initialization failed (%d)\n", status);
|
|
|
|
return status;
|
|
|
|
};
|
2014-06-04 18:08:38 +00:00
|
|
|
|
2018-03-29 18:31:40 +00:00
|
|
|
/* Connectivity */
|
|
|
|
conn = conn_init(&app.conn);
|
|
|
|
if (conn == NULL) {
|
|
|
|
printf("Error: Connectivity initialization failed (%d)\n",
|
|
|
|
status);
|
|
|
|
return status;
|
|
|
|
};
|
|
|
|
|
2018-03-29 18:31:41 +00:00
|
|
|
/* Mempool */
|
|
|
|
status = mempool_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: Mempool initialization failed (%d)\n", status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2018-03-29 18:31:42 +00:00
|
|
|
/* Link */
|
|
|
|
status = link_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: Link initialization failed (%d)\n", status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2018-03-29 18:31:43 +00:00
|
|
|
/* SWQ */
|
|
|
|
status = swq_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: SWQ initialization failed (%d)\n", status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2018-03-29 18:31:44 +00:00
|
|
|
/* Traffic Manager */
|
|
|
|
status = tmgr_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: TMGR initialization failed (%d)\n", status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2018-03-29 18:31:45 +00:00
|
|
|
/* TAP */
|
|
|
|
status = tap_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: TAP initialization failed (%d)\n", status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2018-03-29 18:31:46 +00:00
|
|
|
/* KNI */
|
|
|
|
status = kni_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: KNI initialization failed (%d)\n", status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2018-09-28 12:26:10 +00:00
|
|
|
/* Sym Crypto */
|
|
|
|
status = cryptodev_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: Cryptodev initialization failed (%d)\n",
|
|
|
|
status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2018-03-29 18:31:47 +00:00
|
|
|
/* Action */
|
|
|
|
status = port_in_action_profile_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: Input port action profile initialization failed (%d)\n", status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
status = table_action_profile_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: Action profile initialization failed (%d)\n",
|
|
|
|
status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2018-03-29 18:31:48 +00:00
|
|
|
/* Pipeline */
|
|
|
|
status = pipeline_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: Pipeline initialization failed (%d)\n", status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2018-03-29 18:31:49 +00:00
|
|
|
/* Thread */
|
|
|
|
status = thread_init();
|
|
|
|
if (status) {
|
|
|
|
printf("Error: Thread initialization failed (%d)\n", status);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2018-03-29 18:31:50 +00:00
|
|
|
rte_eal_mp_remote_launch(
|
|
|
|
thread_main,
|
|
|
|
NULL,
|
|
|
|
SKIP_MASTER);
|
|
|
|
|
2018-03-29 18:31:40 +00:00
|
|
|
/* Script */
|
|
|
|
if (app.script_name)
|
|
|
|
cli_script_process(app.script_name,
|
|
|
|
app.conn.msg_in_len_max,
|
|
|
|
app.conn.msg_out_len_max);
|
|
|
|
|
|
|
|
/* Dispatch loop */
|
|
|
|
for ( ; ; ) {
|
|
|
|
conn_poll_for_conn(conn);
|
|
|
|
|
|
|
|
conn_poll_for_msg(conn);
|
2018-03-29 18:31:46 +00:00
|
|
|
|
|
|
|
kni_handle_request();
|
2018-03-29 18:31:40 +00:00
|
|
|
}
|
2014-06-04 18:08:38 +00:00
|
|
|
}
|