4444#include <pcap/pcap.h>
4545#include <pcap/bpf.h>
4646
47- #define RING_NAME "capture-ring"
4847#define MONITOR_INTERVAL (500 * 1000)
4948#define MBUF_POOL_CACHE_SIZE 32
5049#define BURST_SIZE 32
@@ -547,6 +546,11 @@ static void dpdk_init(void)
547546 eal_argv [i ++ ] = strdup (file_prefix );
548547 }
549548
549+ for (i = 0 ; i < (unsigned int )eal_argc ; i ++ ) {
550+ if (eal_argv [i ] == NULL )
551+ rte_panic ("No memory\n" );
552+ }
553+
550554 if (rte_eal_init (eal_argc , eal_argv ) < 0 )
551555 rte_exit (EXIT_FAILURE , "EAL init failed: is primary process running?\n" );
552556}
@@ -555,6 +559,7 @@ static void dpdk_init(void)
555559static struct rte_ring * create_ring (void )
556560{
557561 struct rte_ring * ring ;
562+ char ring_name [RTE_RING_NAMESIZE ];
558563 size_t size , log2 ;
559564
560565 /* Find next power of 2 >= size. */
@@ -568,31 +573,31 @@ static struct rte_ring *create_ring(void)
568573 ring_size = size ;
569574 }
570575
571- ring = rte_ring_lookup (RING_NAME );
572- if (ring == NULL ) {
573- ring = rte_ring_create (RING_NAME , ring_size ,
574- rte_socket_id (), 0 );
575- if (ring == NULL )
576- rte_exit (EXIT_FAILURE , "Could not create ring :%s\n" ,
577- rte_strerror (rte_errno ));
578- }
576+ /* Want one ring per invocation of program */
577+ snprintf (ring_name , sizeof (ring_name ),
578+ "dumpcap-%d" , getpid ());
579+
580+ ring = rte_ring_create (ring_name , ring_size ,
581+ rte_socket_id (), 0 );
582+ if (ring == NULL )
583+ rte_exit (EXIT_FAILURE , "Could not create ring :%s\n" ,
584+ rte_strerror (rte_errno ));
585+
579586 return ring ;
580587}
581588
582589static struct rte_mempool * create_mempool (void )
583590{
584- static const char pool_name [] = "capture_mbufs" ;
591+ char pool_name [RTE_MEMPOOL_NAMESIZE ] ;
585592 size_t num_mbufs = 2 * ring_size ;
586593 struct rte_mempool * mp ;
587594
588- mp = rte_mempool_lookup (pool_name );
589- if (mp )
590- return mp ;
595+ snprintf (pool_name , sizeof (pool_name ), "capture_%d" , getpid ());
591596
592597 mp = rte_pktmbuf_pool_create_by_ops (pool_name , num_mbufs ,
593598 MBUF_POOL_CACHE_SIZE , 0 ,
594599 rte_pcapng_mbuf_size (snaplen ),
595- rte_socket_id (), "ring_mp_sc " );
600+ rte_socket_id (), "ring_mp_mc " );
596601 if (mp == NULL )
597602 rte_exit (EXIT_FAILURE ,
598603 "Mempool (%s) creation failed: %s\n" , pool_name ,
@@ -800,6 +805,11 @@ int main(int argc, char **argv)
800805{
801806 struct rte_ring * r ;
802807 struct rte_mempool * mp ;
808+ struct sigaction action = {
809+ .sa_flags = SA_RESTART ,
810+ .sa_handler = signal_handler ,
811+ };
812+ struct sigaction origaction ;
803813 dumpcap_out_t out ;
804814 char * p ;
805815
@@ -827,6 +837,14 @@ int main(int argc, char **argv)
827837 if (TAILQ_EMPTY (& interfaces ))
828838 set_default_interface ();
829839
840+ sigemptyset (& action .sa_mask );
841+ sigaction (SIGTERM , & action , NULL );
842+ sigaction (SIGINT , & action , NULL );
843+ sigaction (SIGPIPE , & action , NULL );
844+ sigaction (SIGHUP , NULL , & origaction );
845+ if (origaction .sa_handler == SIG_DFL )
846+ sigaction (SIGHUP , & action , NULL );
847+
830848 r = create_ring ();
831849 mp = create_mempool ();
832850 out = create_output ();
0 commit comments