numam-dpdk/examples/pipeline/main.c
Chengchang Tang 10aa375704 examples: add eal cleanup to examples
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>
2021-04-21 20:21:25 +02:00

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();
}