[Winpcap-users] Better Performance
Charu Agrawal
cagrawal at altasens.com
Fri Apr 24 10:01:14 PDT 2009
Hello David,
If I change the code as you suggested, I do get a performance
improvement. I have now allocated memory outside the loop.
But I still need to use the memcpy function to store all packets in an
array. That still slows it down.
Anything else I can do to improve performance ? Is there a way to change
the winpcap source code for better performance ?
Thanks
Charu
-----Original Message-----
From: winpcap-users-bounces at winpcap.org
[mailto:winpcap-users-bounces at winpcap.org] On Behalf Of David Chang
Sent: Thursday, April 23, 2009 7:03 PM
To: winpcap-users at winpcap.org
Subject: Re: [Winpcap-users] Better Performance
Charu,
malloc() is VERY expensive; especially for larger buffers. Are you
saying that if you change the callback function to this...
void packet_handler(u_char *dumpfileHandler, const struct pcap_pkthdr
*header, const u_char *pkt_data)
{
packetCounter++;
}
you still can't read 20,000 packets / sec? (I assume each packet is
full, so this would be close to 30MB/sec)
What type of hardware (CPU, RAM, NIC, motherboard, etc) and O.S. do you
use?
DC
Charu Agrawal wrote:
>
> Hi,
>
> Yeah. I understand that. But I doubt if that effects the speed much.
>
> I am doing some processing on the array later. But the processing is
> not the bottleneck. It is the packet capture (packet_handler) that is
> the bottleneck. Even if I remove
>
> All the code inside the packet_handler the packet capture still does
> not meet expectations. We have nearly 20,000 packets. And as I
> mentioned before we are looking to achieve a frame rate
>
> Of 30-60 Mbytes/s.
>
> Any ideas ?
>
> Thanks
>
> Charu
>
> *From:* winpcap-users-bounces at winpcap.org
> [mailto:winpcap-users-bounces at winpcap.org] *On Behalf Of *Gianluca
Varenni
> *Sent:* Tuesday, April 21, 2009 3:33 PM
> *To:* winpcap-users at winpcap.org
> *Subject:* Re: [Winpcap-users] Better Performance
>
> First of all, allocating some memory at every received packet is a bad
> idea. You should preallocate memory at the very beginning.
>
> Then, how many packets do you want to capture? What are you doing with
> all those packets in these arrays?
>
> Have a nice day
>
> GV
>
> ----- Original Message -----
>
> *From:* Charu Agrawal <mailto:cagrawal at altasens.com>
>
> *To:* winpcap-users at winpcap.org <mailto:winpcap-users at winpcap.org>
>
> *Sent:* Tuesday, April 21, 2009 2:20 PM
>
> *Subject:* Re: [Winpcap-users] Better Performance
>
> Hi,
>
> This is what the code looks like -
>
> This is all initialization code -
>
> if ((adhandle= pcap_open_live(d->name, // name of the device
>
> 65536, // portion of the packet to capture.
>
> // 65536 grants that the whole packet will be captured on all the
> MACs.
>
> 1, // promiscuous mode (nonzero means promiscuous)
>
> 1, // read timeout
>
> errbuf // error buffer
>
> )) == NULL)
>
> {
>
> printf("\nUnable to open the adapter. %s is not supported by
> WinPcap\n", d->name);
>
> return RETCODE_ERR;
>
> }
>
> //Set the filter string to the source ip address
>
> //Only packets from this source address will be captured.
>
> //This does slow down the capture a bit.
>
> NetMask=0xffffff;
>
> filter = "src 192.168.1.10";
>
> if(pcap_compile(adhandle, &fcode, filter, 1, NetMask) < 0)
>
> {
>
> printf("\nError compiling filter: wrong syntax.\n");
>
> pcap_close(adhandle);
>
> return RETCODE_ERR;
>
> }
>
> if(pcap_setfilter(adhandle, &fcode)<0)
>
> {
>
> printf("\nError setting the filter\n");
>
> pcap_close(adhandle);
>
> return RETCODE_ERR;
>
> }
>
> //Set the kernel buffer
>
> if (pcap_setbuff(adhandle,41943040) < 0)
>
> {
>
> printf("\n unable to set buffer");
>
> return RETCODE_ERR;
>
> }
>
> Then I start the pcap_loop on a separate thread - This function is
> called for each packet capture.
>
> I copy the data for all packets in a global array - image_buf
>
> void packet_handler(u_char *dumpfileHandler, const struct
> pcap_pkthdr *header, const u_char *pkt_data)
>
> {
>
> //copy the packet data to image_buf and also store the packet
length
>
> image_buf[packetCounter] = (unsigned
> char*)(malloc(header->caplen*sizeof(unsigned char)));
>
> if(image_buf[packetCounter] == NULL)
>
> {
>
> printf("\n unable to allocate buffer");
>
> return;
>
> }
>
> memcpy(image_buf[packetCounter],pkt_data,header->caplen);
>
> pkt_length[packetCounter]=header->caplen;
>
> packetCounter += 1;
>
> }
>
> Please let me know if you need more details. I can zip and send
> the code file if needed.
>
> Thanks
>
> Charu
>
> *From:* winpcap-users-bounces at winpcap.org
> [mailto:winpcap-users-bounces at winpcap.org] *On Behalf Of *Gianluca
> Varenni
> *Sent:* Tuesday, April 21, 2009 1:51 PM
> *To:* winpcap-users at winpcap.org
> *Subject:* Re: [Winpcap-users] Better Performance
>
> Before trying to modify the WinPcap source code, I would try to
> understand what the bottlenecks are. What are you doing with the
> received packets?
>
> Can you show us the packet processing loop that you have in your
> code (even in form of pseudocode)?
>
> Have a nice day
>
> GV
>
> ----- Original Message -----
>
> *From:* Charu Agrawal <mailto:cagrawal at altasens.com>
>
> *To:* winpcap-users at winpcap.org
> <mailto:winpcap-users at winpcap.org>
>
> *Sent:* Monday, April 20, 2009 10:58 AM
>
> *Subject:* [Winpcap-users] Better Performance
>
> Hi,
>
> I am trying to figure out how to capture image frames most
> efficiently. Each frame is approximately 20Mbytes.
>
> I am trying to achieve frame rate of 1-2 frames per second.
> The packets are being received over a Gig eth dedicated link.
> ( Packets are sent over that link using only one source).
>
> I am unable to achieve this frame rate using winpcap. Would it
> be helpful to modify the Winpcap source code for better
> performance ? Has anyone here have any experience in modifying
> the winpcap source to achieve higher frame rate capture ?
>
> Thanks for your help in advance
>
> Regards
>
> Charu Agrawal
>
>
------------------------------------------------------------------------
>
> _______________________________________________
> Winpcap-users mailing list
> Winpcap-users at winpcap.org
> https://www.winpcap.org/mailman/listinfo/winpcap-users
>
>
------------------------------------------------------------------------
>
> _______________________________________________
> Winpcap-users mailing list
> Winpcap-users at winpcap.org
> https://www.winpcap.org/mailman/listinfo/winpcap-users
>
>
------------------------------------------------------------------------
>
> _______________________________________________
> Winpcap-users mailing list
> Winpcap-users at winpcap.org
> https://www.winpcap.org/mailman/listinfo/winpcap-users
>
_______________________________________________
Winpcap-users mailing list
Winpcap-users at winpcap.org
https://www.winpcap.org/mailman/listinfo/winpcap-users
More information about the Winpcap-users
mailing list