On Dec 11, 2010, at 4:35 AM, Vikram Roopchand wrote:

>                  We have been using Libpcap 1.1.1 heavily

On what operating system are you using it?  The code used for capturing is very 
different on different OSes.

> and noticed
> something of the following nature. It seems that during a packet read,
> internal buffer to read each segment is allocated a size of "snap_len"
> bytes.

The buffer into which packets are read is allocated in pcap_activate(), not in 
the read code.  libpcap doesn't allocate a separate buffer for each packet.

> This is okay since we do not know how many bytes will arrive so it
> makes sense to have snap_len number of bytes as buffer to read into. But
> after that it looks that no realloc is done to reduce the buffer to
> the captured length (caplen) size. Is this correct ?

Yes.  There's no good reason to do so, as the next packet to be read into the 
buffer might be larger.

And this only applies on those platforms where

        1) only one packet is read into the buffer at a time

and

        2) the packets aren't read from a memory-mapped buffer shared between 
the kernel and userland.

If more than one packet is read into the buffer at a time - as is the case, for 
example, if your OS has BPF as the capture mechanism (*BSD, Mac OS X, AIX, some 
newer OpenSolaris builds), the buffer has to be as big as BPF's internal packet 
buffer, which can be, and has to be, much bigger than a single packet.

If it's a memory-mapped buffer, that buffer is also bigger than one packet.

> If this is the
> case, isn't some memory getting wasted each time a segment is caught.

For any given packet, not all the memory allocated for the buffer contains 
packet data, so, in that sense, it's "wasted".  It might be used for the next 
packet.

That "waste" is not cumulative, i.e. it's not as if you lose more and more 
memory with each packet that's captured.

> For
> example, in case of Ethernet, If the snap_len was kept to 65535, and the
> ethernet frame can go atmost to 9022 (jumbo),

Actually, the "frame" can be bigger; if the network adapter is doing TCP 
reassembly (TCP Segmentation Offloading, or TSO), it might hand a reassembled 
chunk of TCP data to the host, so what you're getting wouldn't be a single 
Ethernet frame.

> we lose on quite a bit of
> internal buffer each time a segment is caught.

Again, it's not as if memory is lost for each packet captured; there might be 
some memory that, during the entire capture, is never used, but that amount of 
memory is allocated at the start of the capture, not allocated for every packet 
captured.

> I understand there must be
> some performance drop doing realloc, may be that is the reason ?

If we did a realloc() to shrink the buffer after the packet's been read, we 
would have to do *another* realloc() to grow it again before reading the next 
packet; that would increase the CPU time required to capture, *and* would 
potentially fragment memory significantly and waste a lot more memory.-
This is the tcpdump-workers list.
Visit https://cod.sandelman.ca/ to unsubscribe.

Reply via email to