<br><font size=2 face="sans-serif">We are writing a tool that will basically
pull IP packets from the network, do some modifications and put the modified
packet back on the network. &nbsp;We are writing this for multiple OSes
and we see that performance on Windows is really poor compared to the other
OSes. I wanted to check our design to find the most efficient method and
also solicit for any ideas about what would improve performance. We see
very low CPU usage, memory is also not constrained but packet throughput
is low. We have executed on single and multi-cpus with little difference
in throughput.</font>
<br>
<br><font size=2 face="sans-serif">We have two different version, both
showing the same performance.</font>
<br><font size=2 face="sans-serif">Design #1, </font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; Find
adapter and open each using pcap_open (InterfaceName, 1600,</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PCAP_OPENFLAG_PROMISCUOUS
| PCAP_OPENFLAG_NOCAPTURE_LOCAL | PCAP_OPENFLAG_MAX_RESPONSIVENESS,</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3600,
NULL, errbuf);</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; pcap_setmintocopy
to 0</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;Spin off thread(s) to loop reading / modifying /sending
packets (we have changed the number of threads and performance seems to
decrease as threads increase)</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; pcap_next_ex &nbsp; &nbsp; &nbsp; &nbsp;</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; Modify</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; pcap_sendpacket</font>
<br>
<br><font size=2 face="sans-serif">Design #2 &nbsp; &nbsp; &nbsp; &nbsp;</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; Open
adapter pcap_open_live capture timeout 0</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; pcap_setmintocopy
to 0 </font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; Start
threads (have tried 1 to 10, performance decreases with threads increasing)
:</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; calls pcap_loop</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; callback modifies packet</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
pcap_sendpacket</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; </font>
<br><font size=2 face="sans-serif">We have tried increasing thread priority
but it did not make a significant performance improvement. The modify packet
code is common to linux and windows so we don't think that the problem
lies in that portion of the code. We are running tests on 1Gb/s &nbsp;ethernet
and we are using the same hardware for both tests. Linux is showing around
100Mb/s windows is around 10Mb/s.</font>