--- Begin Message ---
On May 20, 2022, at 10:56 AM, Bill Fenner via tcpdump-workers
<tcpdump-workers@lists.tcpdump.org> wrote:
> I'm helping to debug a system that uses many many pcap handles, and never
> calls pcap_loop - only ever pcap_next.
Both pcap_loop() and pcap_next() ultimately go to the same place.
Note, BTW, that pcap_next() sucks; it's impossible to know whether it returns
NULL because of an error or because the timeout expired and no packets had
arrived during that time. pcap_next_ex() doesn't have that problem. (On
Linux, the turbopacket timer doesn't expire if no packets have arrived, so, *on
Linux*, NULL should, as far as I know, be returned only on errors.)
> We've found that each pcap handle has an associated eventfd, which is used to
> make sure to wake up when
> pcap_breakloop() is called. Since this code doesn't call pcap_loop or
> pcap_breakloop, the eventfd is unneeded.
If it called pcap_breakloop(), the eventfd would still be needed; otherwise, a
call could remain indefinitely stuck in pcap_next() until a packet finally
arrives. Only the lack of a pcap_breakloop() call renders the eventfd
unnecessary.
So how is this system handling those pcap handles?
If it's putting them in non-blocking mode, and using some
select/poll/epoll/etc. mechanism in a single event loop, then the right name
for the API is pcap_setnonblock(). There's no need for an eventfd to wake up
the blocking poll() if there *is* no blocking poll(), so:
if non-blocking mode is on before pcap_activate() is called, no eventfd
should be opened, and poll_breakloop_fd should be set to -1;
if non-blocking mode is turned on after pcap_activate() is called, the
eventfd should be closed, and poll_breakloop_fd should be set to -1;
if non-blocking mode is turned *off* afterwards, an eventfd should be
opened, and poll_breakloop_fd should be set to it;
if poll_breakloop_fd is -1, the poll() should only wait on the socket
FD;
so this can be handled without API changes.
If it's doing something else, e.g. using multiple threads, then:
> I'm willing to write and test the code that skips creating the breakloop_fd
> - but, I wanted to discuss what the API should be. Should there be a
> pcap.c "pcap_breakloop_not_needed( pcap_t * )" that dispatches to the
> implementation, or should there be a linux-specific
> "pcap_linux_dont_create_eventfd( pcap_t * )"?
...it should be called pcap_breakloop_not_needed() (or something such as that),
with a per-type implementation, and a *default* implementation that does
nothing, so only implementations that need to do something different would need
to do so.
--- End Message ---
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers@lists.tcpdump.org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers