On Thu, Sep 21, 2023 at 9:22 AM Morten Brørup <m...@smartsharesystems.com> wrote: > > > From: Stephen Hemminger [mailto:step...@networkplumber.org] > > Sent: Thursday, 21 September 2023 06.24 > > > > If dumpcap is run twice with each instance pointing a different > > interface, it would fail because of overlap in ring a pool names. > > Fix by putting process id in the name. > > > > Fixes: cbb44143be74 ("app/dumpcap: add new packet capture application") > > Reported-by: Isaac Boukris <ibouk...@gmail.com> > > Signed-off-by: Stephen Hemminger <step...@networkplumber.org> > > --- > > app/dumpcap/main.c | 28 ++++++++++++++-------------- > > 1 file changed, 14 insertions(+), 14 deletions(-) > > > > diff --git a/app/dumpcap/main.c b/app/dumpcap/main.c > > index 64294bbfb3e6..37754fd06f4f 100644 > > --- a/app/dumpcap/main.c > > +++ b/app/dumpcap/main.c > > @@ -44,7 +44,6 @@ > > #include <pcap/pcap.h> > > #include <pcap/bpf.h> > > > > -#define RING_NAME "capture-ring" > > #define MONITOR_INTERVAL (500 * 1000) > > #define MBUF_POOL_CACHE_SIZE 32 > > #define BURST_SIZE 32 > > @@ -647,6 +646,7 @@ static void dpdk_init(void) > > static struct rte_ring *create_ring(void) > > { > > struct rte_ring *ring; > > + char ring_name[RTE_RING_NAMESIZE]; > > size_t size, log2; > > > > /* Find next power of 2 >= size. */ > > @@ -660,28 +660,28 @@ static struct rte_ring *create_ring(void) > > ring_size = size; > > } > > > > - ring = rte_ring_lookup(RING_NAME); > > - if (ring == NULL) { > > - ring = rte_ring_create(RING_NAME, ring_size, > > - rte_socket_id(), 0); > > - if (ring == NULL) > > - rte_exit(EXIT_FAILURE, "Could not create ring :%s\n", > > - rte_strerror(rte_errno)); > > - } > > + /* Want one ring per invocation of program */ > > + snprintf(ring_name, sizeof(ring_name), > > + "dumpcap-%u", getpid()); > > I'm not sure getpid() is available on Windows. How about:
I think the 'app/dumpcap/meson.build' file indicates no support for Windows. Regards > #ifdef _WIN32 > #include <processthreadsapi.h> // With the headers, not here. > "dumpcap-%lu", GetCurrentProcessId()); > #else > "dumpcap-%u", getpid()); > #endif > > > + > > + ring = rte_ring_create(ring_name, ring_size, > > + rte_socket_id(), 0); > > + if (ring == NULL) > > + rte_exit(EXIT_FAILURE, "Could not create ring :%s\n", > > + rte_strerror(rte_errno)); > > + > > return ring; > > } > > > > static struct rte_mempool *create_mempool(void) > > { > > const struct interface *intf; > > - static const char pool_name[] = "capture_mbufs"; > > + char pool_name[RTE_MEMPOOL_NAMESIZE]; > > size_t num_mbufs = 2 * ring_size; > > struct rte_mempool *mp; > > uint32_t data_size = 128; > > > > - mp = rte_mempool_lookup(pool_name); > > - if (mp) > > - return mp; > > + snprintf(pool_name, sizeof(pool_name), "capture_%u", getpid()); > > Same regarding getpid(). > > > > > /* Common pool so size mbuf for biggest snap length */ > > TAILQ_FOREACH(intf, &interfaces, next) { > > @@ -826,7 +826,7 @@ static void enable_pdump(struct rte_ring *r, struct > > rte_mempool *mp) > > rte_exit(EXIT_FAILURE, > > "Packet dump enable on %u:%s failed %s\n", > > intf->port, intf->name, > > - rte_strerror(-ret)); > > + rte_strerror(rte_errno)); > > } > > > > if (intf->opts.promisc_mode) { > > -- > > 2.39.2 >