This adds the signal handler for SIGINT, SIGTERM. Also, this will come out from infinite loop and do cleanup once it receives any of the registered signal.
Signed-off-by: Rahul Bhansali <rbhans...@marvell.com> --- examples/ptpclient/ptpclient.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/examples/ptpclient/ptpclient.c b/examples/ptpclient/ptpclient.c index 1f1c9c9c52..8b69716be1 100644 --- a/examples/ptpclient/ptpclient.c +++ b/examples/ptpclient/ptpclient.c @@ -19,6 +19,9 @@ #include <limits.h> #include <sys/time.h> #include <getopt.h> +#include <signal.h> + +static volatile bool force_quit; #define RX_RING_SIZE 1024 #define TX_RING_SIZE 1024 @@ -609,7 +612,7 @@ parse_ptp_frames(uint16_t portid, struct rte_mbuf *m) { * The lcore main. This is the main thread that does the work, reading from an * input port and writing to an output port. */ -static __rte_noreturn void +static void lcore_main(void) { uint16_t portid; @@ -621,7 +624,7 @@ lcore_main(void) /* Run until the application is quit or killed. */ - while (1) { + while (!force_quit) { /* Read packet from RX queues. 8< */ for (portid = 0; portid < ptp_enabled_port_nb; portid++) { @@ -734,6 +737,13 @@ ptp_parse_args(int argc, char **argv) return 0; } +static void +signal_handler(int signum) +{ + if (signum == SIGINT || signum == SIGTERM) + force_quit = true; +} + /* * The main function, which does initialization and calls the per-lcore * functions. @@ -758,6 +768,10 @@ main(int argc, char *argv[]) argc -= ret; argv += ret; + force_quit = false; + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + ret = ptp_parse_args(argc, argv); if (ret < 0) rte_exit(EXIT_FAILURE, "Error with PTP initialization\n"); @@ -802,6 +816,20 @@ main(int argc, char *argv[]) /* Call lcore_main on the main core only. */ lcore_main(); + RTE_ETH_FOREACH_DEV(portid) { + if ((ptp_enabled_port_mask & (1 << portid)) == 0) + continue; + + /* Disable timesync timestamping for the Ethernet device */ + rte_eth_timesync_disable(portid); + + ret = rte_eth_dev_stop(portid); + if (ret != 0) + printf("rte_eth_dev_stop: err=%d, port=%d\n", ret, portid); + + rte_eth_dev_close(portid); + } + /* clean up the EAL */ rte_eal_cleanup(); -- 2.25.1