On Sep 2, 2009, at 11:10 PM, Haitham Al-Saif wrote:
Hi I'm using tshark which is installed in embedded linux running on
powerpc 440 of FPGA board. I use tshark to analyze MPEG transport
stream for FHD H.264. but I'm getting packet loss when I analyze the
video stream in real-time with tshark and therefore I used tcpdump
to capture packets instead of tshark and then analyze the saved
packets with tshark. I'm getting much better result but still there
is packet loss. I don't know why I get packet loss. I don't think
that it is caused by the cpu getting overloaded because many times
I'm able to analyze FHD with tshark without getting packet loss. is
there anyone who knows what causes the packet loss? is there some
buffers in embedded Linux causing the packet loss?
There's a buffer in Linux (embedded or not) that could cause packet
loss if it's too small - it's the socket buffer on the PF_PACKET
socket libpcap uses on Linux.
If packets get put onto the socket buffer faster than, at some
particular point in time, dumpcap or tcpdump can read them from the
socket buffer through libpcap, *even though, over the time the capture
is running, the CPU isn't overloaded*, that can cause packet loss.
It's not sufficient to have the CPU, on average, capable of analyzing
packets as they arrive without dropping packets; a burst of packets,
or (in the case of using TShark to analyze the packets as they arrive)
some packets that require a lot more work, or some I/O that happens to
happen at some time, or some work that consumes CPU at some particular
time, could cause packets to be dropped.
Buffers can be used to alleviate this problem - if you have a big
enough buffer, then packets can be stored in the buffer faster than
they are drained from the buffer, to handle either faster-than-usual
arrival of packet data or slower-than-usual reading of packet data, as
long as the buffer is big enough that it doesn't fill up before the
reader can drain it.
Try downloading libpcap 1.0.0 from www.tcpdump.org:
1) on Linux kernels with memory-mapped capture support, it uses the
memory-mapped capture mechanism, which might be able to handle packet
bursts a little better, and might allocate a memory-mapped ring buffer
larger than the default socket buffer size;
2) it has an API that, on platforms where the buffer size for the
capture mechanism used by libpcap can be set, allows you to set it at
the time you open the network interface for capturing (on systems with
BPF, such as *BSD, AIX, and Mac OS X, it can't be set *after* that, so
that's not supported), so if the buffer is too small, it can be made
bigger.
If tcpdump 4.0.0, also available from www.tcpdump.org, is built with
libpcap 1.0.0, it supports the "-B" flag to set the buffer size.