[tcpdump-workers] Re: libpcap : An entry in the manual about multithreading

2023-05-11 Thread Guy Harris
On May 7, 2023, at 9:27 AM, Michael Richardson  wrote:

> Frederick Virchanza Gotham  wrote:
>> I think that there should be a page in the libpcap manual that
>> explicitly explains the multithreading capabilities and limitations.
> 
> okay, that sounds reasonable.
> git clone  https://github.com/the-tcpdump-group/tcpdump-htdocs

Either a separate page or something in the main pcap(3PCAP) page.

>> Some libraries have an entry in the manual stating that the library is
>> not threadsafe at all. Nine times out of ten, you're safe to use these
>> libraries from multiple threads so long as you use an exclusive lock.
> 
> I don't think that libpcap has been tested in this way.
> I think it would work, and I don't think we use any thread local storage.

We do now, as of


https://github.com/the-tcpdump-group/libpcap/commit/b10eefd47f979a339aaeb247bf47cc333aa7ba91

which was done in order to fix a case where some libpcap routines weren't 
thread-safe.

>> Some other libraries are thread-safe but the manual states that the
>> handle returned from the 'open' function can only be used by one
>> thread.
> 
> This is where libpcap is.

Yes.  We do not support using a pcap_t handle from multiple threads without the 
caller using a mutex, except for calling pcap_breakloop() from a thread other 
than the thread using the pcap_t.

>> I remember seeing a page somewhere on the internet that read something
>> along the lines of: "The libpcap library is thread-safe, i.e. multiple
>> threads can call libpcap functions concurrently. However once you've
>> obtained a handle from pcap_open_live, that handle can only be used
>> exclusively by one thread -- with the exception of the pcap_breakloop
>> function".
> 
> I don't think we ever said this.

We have never stated that in the documentation, but I may have answered a 
question on a Q site with such an answer.

That's certainly our *policy*, at least as of making the filter compiler 
reentrant; prior to doing so, pcap_compile() was known to be very much not 
thread-safe.  To fix that, I changed it to use a reentrant parser and scanner 
(which is why it now requires Bison or Berkeley YACC, and a sufficiently recent 
version of Flex), so different threads should be able to compile pcap filters 
in parallel.

However, it was later discovered that we'd missed 
pcap_datalink_val_to_description_or_dlt(), pcap_statustostr(), bpf_image(), and 
pcap_next_etherent(), all of which work around C's tragic low level of support 
for strings by formatting into a static buffer and returning a pointer to that, 
so that the callee doesn't have to free the string when it's no longer needed:

https://github.com/the-tcpdump-group/libpcap/issues/1174

which was fixed by the aforementioned commit.

>> I think the debug build of libpcap should have runtime asserts to
>> ensure that the same thread is always operating on any given pcap_t*
>> handle. For example there could be a global map of pcap_t* handles to
>> thread ID's, something like:
> 
>>struct Mapping { pcap_t *handle; pthread_t thread_id; };
> 
>>Mapping mappings[32u];
> 
> I could tolerate this.

Except, of course, that pcap_breakloop() shouldn't do that check, as noted 
above.

That would certainly test the thread safety of code *using* libpcap, as long as 
they're testing with the debug build of libpcap, and as long as this is a 
platform for which "release" and "debug" builds are provided.  Unfortunately, 
the only platform I know of where that's a common notion if Windows, unless 
I've missed something in the lands of Apple, Linux, *BSD, Solaris, etc. 
developers, and I don't know whether Npcap provides separate release and debug 
builds of Npcap.

It wouldn't test the thread safety of libpcap *itself*, however.  That would 
require tests of the sort done by the people who submitted the bug mentioned 
above.
___
tcpdump-workers mailing list -- tcpdump-workers@lists.tcpdump.org
To unsubscribe send an email to tcpdump-workers-le...@lists.tcpdump.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s


[tcpdump-workers] Re: libpcap : An entry in the manual about multithreading

2023-05-07 Thread Michael Richardson

Frederick Virchanza Gotham  wrote:
> I think that there should be a page in the libpcap manual that
> explicitly explains the multithreading capabilities and limitations.

okay, that sounds reasonable.
git clone  https://github.com/the-tcpdump-group/tcpdump-htdocs

> Some libraries have an entry in the manual stating that the library is
> not threadsafe at all. Nine times out of ten, you're safe to use these
> libraries from multiple threads so long as you use an exclusive lock.

I don't think that libpcap has been tested in this way.
I think it would work, and I don't think we use any thread local storage.

> Some other libraries are thread-safe but the manual states that the
> handle returned from the 'open' function can only be used by one
> thread.

This is where libpcap is.

> I remember seeing a page somewhere on the internet that read something
> along the lines of: "The libpcap library is thread-safe, i.e. multiple
> threads can call libpcap functions concurrently. However once you've
> obtained a handle from pcap_open_live, that handle can only be used
> exclusively by one thread -- with the exception of the pcap_breakloop
> function".

I don't think we ever said this.

> I think the debug build of libpcap should have runtime asserts to
> ensure that the same thread is always operating on any given pcap_t*
> handle. For example there could be a global map of pcap_t* handles to
> thread ID's, something like:

> struct Mapping { pcap_t *handle; pthread_t thread_id; };

> Mapping mappings[32u];

I could tolerate this.

--
]   Never tell me the odds! | ipv6 mesh networks [
]   Michael Richardson, Sandelman Software Works|IoT architect   [
] m...@sandelman.ca  http://www.sandelman.ca/|   ruby on rails[

___
tcpdump-workers mailing list -- tcpdump-workers@lists.tcpdump.org
To unsubscribe send an email to tcpdump-workers-le...@lists.tcpdump.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s