examples/ip_pipeline: add CLI interface
[dpdk.git] / examples / ip_pipeline / main.c
index 1696e36..60936f4 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2015 Intel Corporation
+ * Copyright(c) 2010-2018 Intel Corporation
  */
 
 #include <stdio.h>
 
 #include <rte_eal.h>
 
+#include "cli.h"
+#include "conn.h"
+
+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;
+}
+
 int
 main(int argc, char **argv)
 {
+       struct conn *conn;
        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) {
@@ -22,4 +151,24 @@ main(int argc, char **argv)
                return status;
        };
 
+       /* Connectivity */
+       conn = conn_init(&app.conn);
+       if (conn == NULL) {
+               printf("Error: Connectivity initialization failed (%d)\n",
+                       status);
+               return status;
+       };
+
+       /* 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);
+       }
 }