app/testpmd: handle SIGINT and SIGTERM
authorZhihong Wang <zhihong.wang@intel.com>
Wed, 30 Dec 2015 21:59:49 +0000 (16:59 -0500)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 27 Jan 2016 16:06:51 +0000 (17:06 +0100)
Handle SIGINT and SIGTERM in testpmd.

Signed-off-by: Zhihong Wang <zhihong.wang@intel.com>
Acked-by: Michael Qiu <michael.qiu@intel.com>
app/test-pmd/cmdline.c
app/test-pmd/testpmd.c
app/test-pmd/testpmd.h

index 73298c9..6d28c1b 100644 (file)
@@ -90,6 +90,8 @@
 
 #include "testpmd.h"
 
+static struct cmdline *testpmd_cl;
+
 static void cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue);
 
 #ifdef RTE_NIC_BYPASS
@@ -9778,17 +9780,21 @@ cmdline_parse_ctx_t main_ctx[] = {
 void
 prompt(void)
 {
-       struct cmdline *cl;
-
        /* initialize non-constant commands */
        cmd_set_fwd_mode_init();
 
-       cl = cmdline_stdin_new(main_ctx, "testpmd> ");
-       if (cl == NULL) {
+       testpmd_cl = cmdline_stdin_new(main_ctx, "testpmd> ");
+       if (testpmd_cl == NULL)
                return;
-       }
-       cmdline_interact(cl);
-       cmdline_stdin_exit(cl);
+       cmdline_interact(testpmd_cl);
+       cmdline_stdin_exit(testpmd_cl);
+}
+
+void
+prompt_exit(void)
+{
+       if (testpmd_cl != NULL)
+               cmdline_quit(testpmd_cl);
 }
 
 static void
index 98ae46d..1319917 100644 (file)
@@ -1570,13 +1570,16 @@ pmd_test_exit(void)
        if (test_done == 0)
                stop_packet_forwarding();
 
-       FOREACH_PORT(pt_id, ports) {
-               printf("Stopping port %d...", pt_id);
-               fflush(stdout);
-               rte_eth_dev_close(pt_id);
-               printf("done\n");
+       if (ports != NULL) {
+               no_link_check = 1;
+               FOREACH_PORT(pt_id, ports) {
+                       printf("\nShutting down port %d...\n", pt_id);
+                       fflush(stdout);
+                       stop_port(pt_id);
+                       close_port(pt_id);
+               }
        }
-       printf("bye...\n");
+       printf("\nBye...\n");
 }
 
 typedef void (*cmd_func_t)(void);
@@ -1984,12 +1987,35 @@ init_port(void)
                ports[pid].enabled = 1;
 }
 
+static void
+force_quit(void)
+{
+       pmd_test_exit();
+       prompt_exit();
+}
+
+static void
+signal_handler(int signum)
+{
+       if (signum == SIGINT || signum == SIGTERM) {
+               printf("\nSignal %d received, preparing to exit...\n",
+                               signum);
+               force_quit();
+               /* exit with the expected status */
+               signal(signum, SIG_DFL);
+               kill(getpid(), signum);
+       }
+}
+
 int
 main(int argc, char** argv)
 {
        int  diag;
        uint8_t port_id;
 
+       signal(SIGINT, signal_handler);
+       signal(SIGTERM, signal_handler);
+
        diag = rte_eal_init(argc, argv);
        if (diag < 0)
                rte_panic("Cannot init EAL\n");
@@ -2041,6 +2067,7 @@ main(int argc, char** argv)
                start_packet_forwarding(0);
                printf("Press enter to exit\n");
                rc = read(0, &c, 1);
+               pmd_test_exit();
                if (rc < 0)
                        return 1;
        }
index ee7de98..7ffc17b 100644 (file)
@@ -462,6 +462,7 @@ unsigned int parse_item_list(char* str, const char* item_name,
                        unsigned int *parsed_items, int check_unique_values);
 void launch_args_parse(int argc, char** argv);
 void prompt(void);
+void prompt_exit(void);
 void nic_stats_display(portid_t port_id);
 void nic_stats_clear(portid_t port_id);
 void nic_xstats_display(portid_t port_id);