New upstream version 18.08
[deb_dpdk.git] / examples / ip_pipeline / main.c
index a44cf9a..a69face 100644 (file)
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2015 Intel Corporation
+ * Copyright(c) 2010-2018 Intel Corporation
  */
 
-#include "app.h"
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <getopt.h>
 
-static struct app_params app;
+#include <rte_launch.h>
+#include <rte_eal.h>
+
+#include "cli.h"
+#include "conn.h"
+#include "kni.h"
+#include "link.h"
+#include "mempool.h"
+#include "pipeline.h"
+#include "swq.h"
+#include "tap.h"
+#include "thread.h"
+#include "tmgr.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)
 {
-       rte_openlog_stream(stderr);
+       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) {
+               printf("Error: EAL initialization failed (%d)\n", status);
+               return status;
+       };
+
+       /* Connectivity */
+       conn = conn_init(&app.conn);
+       if (conn == NULL) {
+               printf("Error: Connectivity initialization failed (%d)\n",
+                       status);
+               return status;
+       };
 
-       /* Config */
-       app_config_init(&app);
+       /* Mempool */
+       status = mempool_init();
+       if (status) {
+               printf("Error: Mempool initialization failed (%d)\n", status);
+               return status;
+       }
 
-       app_config_args(&app, argc, argv);
+       /* Link */
+       status = link_init();
+       if (status) {
+               printf("Error: Link initialization failed (%d)\n", status);
+               return status;
+       }
 
-       app_config_preproc(&app);
+       /* SWQ */
+       status = swq_init();
+       if (status) {
+               printf("Error: SWQ initialization failed (%d)\n", status);
+               return status;
+       }
 
-       app_config_parse(&app, app.parser_file);
+       /* Traffic Manager */
+       status = tmgr_init();
+       if (status) {
+               printf("Error: TMGR initialization failed (%d)\n", status);
+               return status;
+       }
 
-       app_config_check(&app);
+       /* TAP */
+       status = tap_init();
+       if (status) {
+               printf("Error: TAP initialization failed (%d)\n", status);
+               return status;
+       }
 
-       /* Init */
-       app_init(&app);
+       /* KNI */
+       status = kni_init();
+       if (status) {
+               printf("Error: KNI initialization failed (%d)\n", status);
+               return status;
+       }
+
+       /* 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;
+       }
+
+       /* Pipeline */
+       status = pipeline_init();
+       if (status) {
+               printf("Error: Pipeline initialization failed (%d)\n", status);
+               return status;
+       }
+
+       /* Thread */
+       status = thread_init();
+       if (status) {
+               printf("Error: Thread initialization failed (%d)\n", status);
+               return status;
+       }
 
-       /* Run-time */
        rte_eal_mp_remote_launch(
-               app_thread,
-               (void *) &app,
-               CALL_MASTER);
+               thread_main,
+               NULL,
+               SKIP_MASTER);
 
-       return 0;
+       /* 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);
+
+               kni_handle_request();
+       }
 }