thanks, I have another question
if I want to capture packets with ACK flag set for EACH INCOMING TCP
connection
so I put accept() in a loop

        // proxy server listen, waiting for receiver's tcp request
        listen(listenfd, 1024);

        while(1) {
        connfd = accept(listenfd, (struct sockaddr *)&sender_addr,
&sock_len);
        pcap_packet = pcap_next(handle, &pcap_header);

        pid=fork();
        if(pid=0)  // child process
         {
          pcap_packet = pcap_next(handle, &pcap_header);
         }
         blabla.....
        }


in this way, if I put the following code block before accept(), then all
incoming TCP connections may share the same pcap handler
but if I put the following code block in each child process after fork(),
the handler may miss some TCP packets

        handle = pcap_open_live(dev, BUFSIZ, 0, 0, errbuf);
        pcap_compile(handle, &fp, filter_exp, 0, mask) == -1
        pcap_setfilter(handle, &fp);
        struct pcap_pkthdr pcap_header;      // The header that pcap gives
us
        const u_char *pcap_packet;           // The actual packet


are there any solutions like: just create 1 handler, but split the related
FIFO queue into multip FIFO queues, each of which corresponds to one tcp
connection, and then pcap_next() in each child process just fetch packets
from its corresponding sub-FIFO queue?
or any other solutions?

thanks!


2013/4/8 Guy Harris <g...@alum.mit.edu>

>
> On Apr 7, 2013, at 3:25 PM, wen lui <esolvepol...@gmail.com> wrote:
>
> > 1 I don't know how pcap handler works, my understanding is: when
> > pcap_open_live() function is called and the filter is set, it will
> capture
> > all matching packets and put them in a FIFO queue somewhere. Then, each
> > time I call pcap_next(), the packet in the head of the FIFO queue is
> > fetched. Is it correct or not?
>
> It's basically correct.  pcap_open_live() starts the capture process, and
> setting the filter changes the filter used by the capture process
> (discarding some not-yet-read packets); the packets that arrive are put
> into a FIFO buffer (there might be separate OS-level buffers and
> libpcap-level buffers, but the overall effect is that of a FIFO buffer).
>  pcap_next() will extract the oldest packet from the buffer.
>
> > 2 how is the granularity of the packet?if there are IP fragmentation, are
> > they IP packets or TCP/UDP packets?
>
> They're *probably* link-layer packets, so, if there's IP fragmentation,
> each fragment will be a separate packet.
>
> However, if the network adapter is doing IP reassembly or TCP reassembly,
> you might get a packet that looks like a link-layer packet but is really a
> "fake" link-layer packet with a fully-reassembled IP datagram or with
> multiple TCP segments, so that multiple link-layer packets are combined
> into one packet.
>
> > how to get only 4-th layer packets?
>
> By using something other than libpcap or the mechanism it uses, or by
> doing whatever reassembly is involved by yourself.  There's no way to do
> that in libpcap unless your adapter happens to do it for you.
>
> > 3 when there are incoming TCP connections, for each connection  I want to
> > capture the final ACK packet and the following data packets and FIN/ACK
> > packets, which are all with ACK flag set to 1 , so the filter_exp is
> > something like "port 54000 and tcp[tcpflags] & (tcp-ack) != 0"
> >
> > the problems is, when in the child process, will the pcap handler still
> > work?
>
> On *most* platforms, it should work in the child process; do *NOT*,
> however, do anything with the pcap_t in the parent process until the child
> process has exited, and don't use monitor mode on a Wi-Fi device if you're
> going to do any forking.
>
> I'm not sure whether it'll work on Linux if the memory-mapped capture
> mechanism is being used; the memory-mapped capture mechanism will be used
> on current versions of Linux.  I *think* it should work, as the region is
> mapped MAP_SHARED and hasn't been flagged as MADV_DONTFORK.  Again, once
> the child process has been forked, don't do *anything* in the parent
> process.
>
>
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers@lists.tcpdump.org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers

Reply via email to