13998e2a0SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 24bbf8e30SJasvinder Singh * Copyright(c) 2010-2018 Intel Corporation 377a33467SCristian Dumitrescu */ 477a33467SCristian Dumitrescu 5fbc74e66SJasvinder Singh #include <stdio.h> 6fbc74e66SJasvinder Singh #include <string.h> 7fbc74e66SJasvinder Singh #include <fcntl.h> 8fbc74e66SJasvinder Singh #include <unistd.h> 9fbc74e66SJasvinder Singh #include <getopt.h> 1077a33467SCristian Dumitrescu 11fbc74e66SJasvinder Singh #include <rte_eal.h> 1277a33467SCristian Dumitrescu 134bbf8e30SJasvinder Singh #include "cli.h" 144bbf8e30SJasvinder Singh #include "conn.h" 15*6bfe74f8SJasvinder Singh #include "mempool.h" 164bbf8e30SJasvinder Singh 174bbf8e30SJasvinder Singh static const char usage[] = 184bbf8e30SJasvinder Singh "%s EAL_ARGS -- [-h HOST] [-p PORT] [-s SCRIPT]\n"; 194bbf8e30SJasvinder Singh 204bbf8e30SJasvinder Singh static const char welcome[] = 214bbf8e30SJasvinder Singh "\n" 224bbf8e30SJasvinder Singh "Welcome to IP Pipeline!\n" 234bbf8e30SJasvinder Singh "\n"; 244bbf8e30SJasvinder Singh 254bbf8e30SJasvinder Singh static const char prompt[] = "pipeline> "; 264bbf8e30SJasvinder Singh 274bbf8e30SJasvinder Singh static struct app_params { 284bbf8e30SJasvinder Singh struct conn_params conn; 294bbf8e30SJasvinder Singh char *script_name; 304bbf8e30SJasvinder Singh } app = { 314bbf8e30SJasvinder Singh .conn = { 324bbf8e30SJasvinder Singh .welcome = welcome, 334bbf8e30SJasvinder Singh .prompt = prompt, 344bbf8e30SJasvinder Singh .addr = "0.0.0.0", 354bbf8e30SJasvinder Singh .port = 8086, 364bbf8e30SJasvinder Singh .buf_size = 1024 * 1024, 374bbf8e30SJasvinder Singh .msg_in_len_max = 1024, 384bbf8e30SJasvinder Singh .msg_out_len_max = 1024 * 1024, 394bbf8e30SJasvinder Singh .msg_handle = cli_process, 404bbf8e30SJasvinder Singh }, 414bbf8e30SJasvinder Singh .script_name = NULL, 424bbf8e30SJasvinder Singh }; 434bbf8e30SJasvinder Singh 444bbf8e30SJasvinder Singh static int 454bbf8e30SJasvinder Singh parse_args(int argc, char **argv) 464bbf8e30SJasvinder Singh { 474bbf8e30SJasvinder Singh char *app_name = argv[0]; 484bbf8e30SJasvinder Singh struct option lgopts[] = { 494bbf8e30SJasvinder Singh { NULL, 0, 0, 0 } 504bbf8e30SJasvinder Singh }; 514bbf8e30SJasvinder Singh int opt, option_index; 524bbf8e30SJasvinder Singh int h_present, p_present, s_present, n_args, i; 534bbf8e30SJasvinder Singh 544bbf8e30SJasvinder Singh /* Skip EAL input args */ 554bbf8e30SJasvinder Singh n_args = argc; 564bbf8e30SJasvinder Singh for (i = 0; i < n_args; i++) 574bbf8e30SJasvinder Singh if (strcmp(argv[i], "--") == 0) { 584bbf8e30SJasvinder Singh argc -= i; 594bbf8e30SJasvinder Singh argv += i; 604bbf8e30SJasvinder Singh break; 614bbf8e30SJasvinder Singh } 624bbf8e30SJasvinder Singh 634bbf8e30SJasvinder Singh if (i == n_args) 644bbf8e30SJasvinder Singh return 0; 654bbf8e30SJasvinder Singh 664bbf8e30SJasvinder Singh /* Parse args */ 674bbf8e30SJasvinder Singh h_present = 0; 684bbf8e30SJasvinder Singh p_present = 0; 694bbf8e30SJasvinder Singh s_present = 0; 704bbf8e30SJasvinder Singh 714bbf8e30SJasvinder Singh while ((opt = getopt_long(argc, argv, "h:p:s:", lgopts, &option_index)) 724bbf8e30SJasvinder Singh != EOF) 734bbf8e30SJasvinder Singh switch (opt) { 744bbf8e30SJasvinder Singh case 'h': 754bbf8e30SJasvinder Singh if (h_present) { 764bbf8e30SJasvinder Singh printf("Error: Multiple -h arguments\n"); 774bbf8e30SJasvinder Singh return -1; 784bbf8e30SJasvinder Singh } 794bbf8e30SJasvinder Singh h_present = 1; 804bbf8e30SJasvinder Singh 814bbf8e30SJasvinder Singh if (!strlen(optarg)) { 824bbf8e30SJasvinder Singh printf("Error: Argument for -h not provided\n"); 834bbf8e30SJasvinder Singh return -1; 844bbf8e30SJasvinder Singh } 854bbf8e30SJasvinder Singh 864bbf8e30SJasvinder Singh app.conn.addr = strdup(optarg); 874bbf8e30SJasvinder Singh if (app.conn.addr == NULL) { 884bbf8e30SJasvinder Singh printf("Error: Not enough memory\n"); 894bbf8e30SJasvinder Singh return -1; 904bbf8e30SJasvinder Singh } 914bbf8e30SJasvinder Singh break; 924bbf8e30SJasvinder Singh 934bbf8e30SJasvinder Singh case 'p': 944bbf8e30SJasvinder Singh if (p_present) { 954bbf8e30SJasvinder Singh printf("Error: Multiple -p arguments\n"); 964bbf8e30SJasvinder Singh return -1; 974bbf8e30SJasvinder Singh } 984bbf8e30SJasvinder Singh p_present = 1; 994bbf8e30SJasvinder Singh 1004bbf8e30SJasvinder Singh if (!strlen(optarg)) { 1014bbf8e30SJasvinder Singh printf("Error: Argument for -p not provided\n"); 1024bbf8e30SJasvinder Singh return -1; 1034bbf8e30SJasvinder Singh } 1044bbf8e30SJasvinder Singh 1054bbf8e30SJasvinder Singh app.conn.port = (uint16_t) atoi(optarg); 1064bbf8e30SJasvinder Singh break; 1074bbf8e30SJasvinder Singh 1084bbf8e30SJasvinder Singh case 's': 1094bbf8e30SJasvinder Singh if (s_present) { 1104bbf8e30SJasvinder Singh printf("Error: Multiple -s arguments\n"); 1114bbf8e30SJasvinder Singh return -1; 1124bbf8e30SJasvinder Singh } 1134bbf8e30SJasvinder Singh s_present = 1; 1144bbf8e30SJasvinder Singh 1154bbf8e30SJasvinder Singh if (!strlen(optarg)) { 1164bbf8e30SJasvinder Singh printf("Error: Argument for -s not provided\n"); 1174bbf8e30SJasvinder Singh return -1; 1184bbf8e30SJasvinder Singh } 1194bbf8e30SJasvinder Singh 1204bbf8e30SJasvinder Singh app.script_name = strdup(optarg); 1214bbf8e30SJasvinder Singh if (app.script_name == NULL) { 1224bbf8e30SJasvinder Singh printf("Error: Not enough memory\n"); 1234bbf8e30SJasvinder Singh return -1; 1244bbf8e30SJasvinder Singh } 1254bbf8e30SJasvinder Singh break; 1264bbf8e30SJasvinder Singh 1274bbf8e30SJasvinder Singh default: 1284bbf8e30SJasvinder Singh printf(usage, app_name); 1294bbf8e30SJasvinder Singh return -1; 1304bbf8e30SJasvinder Singh } 1314bbf8e30SJasvinder Singh 1324bbf8e30SJasvinder Singh optind = 1; /* reset getopt lib */ 1334bbf8e30SJasvinder Singh 1344bbf8e30SJasvinder Singh return 0; 1354bbf8e30SJasvinder Singh } 1364bbf8e30SJasvinder Singh 13777a33467SCristian Dumitrescu int 13898a16481SDavid Marchand main(int argc, char **argv) 13977a33467SCristian Dumitrescu { 1404bbf8e30SJasvinder Singh struct conn *conn; 141fbc74e66SJasvinder Singh int status; 14277a33467SCristian Dumitrescu 1434bbf8e30SJasvinder Singh /* Parse application arguments */ 1444bbf8e30SJasvinder Singh status = parse_args(argc, argv); 1454bbf8e30SJasvinder Singh if (status < 0) 1464bbf8e30SJasvinder Singh return status; 1474bbf8e30SJasvinder Singh 148fbc74e66SJasvinder Singh /* EAL */ 149fbc74e66SJasvinder Singh status = rte_eal_init(argc, argv); 150fbc74e66SJasvinder Singh if (status < 0) { 151fbc74e66SJasvinder Singh printf("Error: EAL initialization failed (%d)\n", status); 152fbc74e66SJasvinder Singh return status; 153fbc74e66SJasvinder Singh }; 15477a33467SCristian Dumitrescu 1554bbf8e30SJasvinder Singh /* Connectivity */ 1564bbf8e30SJasvinder Singh conn = conn_init(&app.conn); 1574bbf8e30SJasvinder Singh if (conn == NULL) { 1584bbf8e30SJasvinder Singh printf("Error: Connectivity initialization failed (%d)\n", 1594bbf8e30SJasvinder Singh status); 1604bbf8e30SJasvinder Singh return status; 1614bbf8e30SJasvinder Singh }; 1624bbf8e30SJasvinder Singh 163*6bfe74f8SJasvinder Singh /* Mempool */ 164*6bfe74f8SJasvinder Singh status = mempool_init(); 165*6bfe74f8SJasvinder Singh if (status) { 166*6bfe74f8SJasvinder Singh printf("Error: Mempool initialization failed (%d)\n", status); 167*6bfe74f8SJasvinder Singh return status; 168*6bfe74f8SJasvinder Singh } 169*6bfe74f8SJasvinder Singh 1704bbf8e30SJasvinder Singh /* Script */ 1714bbf8e30SJasvinder Singh if (app.script_name) 1724bbf8e30SJasvinder Singh cli_script_process(app.script_name, 1734bbf8e30SJasvinder Singh app.conn.msg_in_len_max, 1744bbf8e30SJasvinder Singh app.conn.msg_out_len_max); 1754bbf8e30SJasvinder Singh 1764bbf8e30SJasvinder Singh /* Dispatch loop */ 1774bbf8e30SJasvinder Singh for ( ; ; ) { 1784bbf8e30SJasvinder Singh conn_poll_for_conn(conn); 1794bbf8e30SJasvinder Singh 1804bbf8e30SJasvinder Singh conn_poll_for_msg(conn); 1814bbf8e30SJasvinder Singh } 18277a33467SCristian Dumitrescu } 183