Hello,
 
>From your experience, what is the best approach for a service using WinPcap to 
>read/write raw packets at high speeds (Gbps or more).
 
I'm P/invoking from .NET.
 
For reading, I am currently using a single thread that invokes 
pcac_read_next_ex in a loop and copies the bytes (with Marshal.Copy) to a ring 
buffer. Another single thread converts those individual reads left in the ring 
buffer into TPL tasks to process the individual messages in managed thread pool 
threads, allowing multithreaded processing. I use a -1 timeout and switch to a 
wait on the result of pcap_getevent when a certain amount of consecutive reads 
don't yield a message. That way I limit CPU comsumption in that case.
 
For writing, I would like to be as multithreaded as possible, having into 
account that messages to be written are produced concurrently by multiple 
threads. If each thread can call pcap_sendpacket right away, and use the pinned 
buffer it already owns, I think the global performance must increase.
 
I'm aware that a single pcap_t contains certain resources that are not directly 
shareable by different threads (e.g., an errbuf). So I think I cannot reuse for 
writing the same pcap_t (from pcap_open) used for reading.
 
Furthermore, I think I cannot open a second pcap_t and use it for writing from 
several threads concurrently (for the same sharing problem).
 
One approach to do it would be to use Threading.ThreadLocal<T> in .NET. It 
gives a different instance of T per thread.
If I build a managed wrapper over pcap_t, initialized in every writing thread 
to the result of a new pcap_open (independent of the pcap_open for reading), 
and provide a destructor to conveniently recycle the pcap_t in case of thread 
destruction, I can have a convenient mechanism to have a different pcap_t per 
writing thread.
 
But what about global resources consumed by this approach? I plan to use thread 
pool threads to write (potencially a big number). How many resources does a 
pcap_t hold? Imagine multiplying it by 1000 or more.
 
Can an "only for writing" pcap_t be made tiny in resource consumption compared 
to a reading capable pcap_t or else will it also spend kernel buffers, capture 
all packets again even if no one will ask for them, etc.? I find prohibitive 
having 1001 pcap_t's, each consuming 1 MByte kernel buffer and capturing the 
whole stream of bytes from the NIC.
 
But, at the same time, synchronizing writes in my service to perform them with 
a single thread if the driver already perfoms that synchronization or it is 
avoidable is a wasteful expense of resources.
 
Thank you very much.
 
Regards,
J.M.
                                          
_______________________________________________
Winpcap-users mailing list
[email protected]
https://www.winpcap.org/mailman/listinfo/winpcap-users

Reply via email to