10aa375704
According to the programming guide, the rte_eal_init should be used pairs with rte_eal_cleanup. This patch add rte_eal_cleanup to examples to encourage new users of DPDK to use it. Fixes:aec9c13c52
("eal: add function to release internal resources") Fixes:3d0fad56b7
("examples/fips_validation: add crypto FIPS application") Fixes:c8e6ceeceb
("examples/ioat: add new sample app for ioat driver") Fixes:4ff457986f
("examples/l2fwd-event: add default poll mode routines") Fixes:08bd1a1744
("examples/l3fwd-graph: add graph-based l3fwd skeleton") Fixes:c5eebf85ba
("examples/ntb: add example for NTB") Fixes:b77f660028
("examples/pipeline: add new example application") Fixes:edbed86d1c
("examples/vdpa: introduce a new sample for vDPA") Fixes:c19beb3f38
("examples/vhost_blk: introduce vhost storage sample") Fixes:f5188211c7
("examples/vhost_crypto: add sample application") Cc: stable@dpdk.org Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
197 lines
3.5 KiB
C
197 lines
3.5 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2020 Intel Corporation
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <getopt.h>
|
|
|
|
#include <rte_launch.h>
|
|
#include <rte_eal.h>
|
|
|
|
#include "cli.h"
|
|
#include "conn.h"
|
|
#include "obj.h"
|
|
#include "thread.h"
|
|
|
|
static const char usage[] =
|
|
"%s EAL_ARGS -- [-h HOST] [-p PORT] [-s SCRIPT]\n";
|
|
|
|
static struct app_params {
|
|
struct conn_params conn;
|
|
char *script_name;
|
|
} app = {
|
|
.conn = {
|
|
.welcome = "\nWelcome!\n\n",
|
|
.prompt = "pipeline> ",
|
|
.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,
|
|
.msg_handle_arg = NULL, /* set later. */
|
|
},
|
|
.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;
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
struct conn *conn;
|
|
struct obj *obj;
|
|
int status;
|
|
|
|
/* Parse application arguments */
|
|
status = parse_args(argc, argv);
|
|
if (status < 0)
|
|
return status;
|
|
|
|
/* EAL */
|
|
status = rte_eal_init(argc, argv);
|
|
if (status < 0) {
|
|
printf("Error: EAL initialization failed (%d)\n", status);
|
|
return status;
|
|
};
|
|
|
|
/* Obj */
|
|
obj = obj_init();
|
|
if (!obj) {
|
|
printf("Error: Obj initialization failed (%d)\n", status);
|
|
return status;
|
|
}
|
|
|
|
/* Thread */
|
|
status = thread_init();
|
|
if (status) {
|
|
printf("Error: Thread initialization failed (%d)\n", status);
|
|
return status;
|
|
}
|
|
|
|
rte_eal_mp_remote_launch(
|
|
thread_main,
|
|
NULL,
|
|
SKIP_MAIN);
|
|
|
|
/* Script */
|
|
if (app.script_name)
|
|
cli_script_process(app.script_name,
|
|
app.conn.msg_in_len_max,
|
|
app.conn.msg_out_len_max,
|
|
obj);
|
|
|
|
/* Connectivity */
|
|
app.conn.msg_handle_arg = obj;
|
|
conn = conn_init(&app.conn);
|
|
if (!conn) {
|
|
printf("Error: Connectivity initialization failed (%d)\n",
|
|
status);
|
|
return status;
|
|
};
|
|
|
|
/* Dispatch loop */
|
|
for ( ; ; ) {
|
|
conn_poll_for_conn(conn);
|
|
|
|
conn_poll_for_msg(conn);
|
|
}
|
|
|
|
/* clean up the EAL */
|
|
rte_eal_cleanup();
|
|
}
|