tcpdump mailing list archives

pcap_dispatch() using non-blocking I/O


From: "TCPdump" <tcpdump () intrusense com>
Date: Tue, 6 May 2003 23:00:35 -0400

Hello,

I'm having some portability problems with pcap_dispatch() on FreeBSD
4.8-STABLE. I doubt the problem is specific to FreeBSD, however, at the
moment I only have Redhat 9 and FreeBSD 4.8 environments to test on. 

The problem is simply that I can't seem to get pcap_dispatch() to block
and based on the pcap man page and from what I've read on Google, it
should be the default (even on FreeBSD). 

As a side note: When I use pcap_setnonblock() to force blocking I/O,
pcap_dispatch() still returns without any delay. 

The code I'm working with runs flawlessly on my Redhat 9 machine.


Here's an example of what I'm doing:


--- START SNIPPET ---

void
response_timeout()
{
    fprintf(stdout, "-- timeout --\n");

    if(pcap_setnonblock(pkt, 1, error_buf) < 0)
        fatal_error("bad\n");

    return;
}

void
my_example_func(pcap_t *pkt);
{
    struct bpf_program bpf;
    struct itimerval timeout;

    signal(SIGALRM, response_timeout);

    /* setup pcap with very specific filter */

    if(pcap_setnonblock(pkt, 0, error_buf) < 0)
        fatal_error("bad\n");

    timeout.it_value.tv_sec = 2;
    setitimer(ITIMER_REAL, &timeout, NULL);

    if(pcap_dispatch(pkt, 1, (pcap_handler)process_packets, NULL) < 0)
        fatal_error("bad\n"):

    /* I've also used pcap_dispatch(pkt, -1,
(pcap_handler)process_packets,    NULL); */

    timeout.it_value.tv_sec = 0;
    setitimer(ITIMER_REAL, &timeout, NULL);

    /* do other stuff */

    return;
}

--- END SNIPPET ---


The goal here (and it works in Linux) is to have pcap_dispatch() wait
for a packet until setitimer() sends SIGALRM.  response_timeout() will
then put pcap_dispatch() into non-blocking mode, which will then return
and continue, disabling the setitimer() in the process.


Any help would be greatly appreciated,

Darren Bounds




-
This is the TCPDUMP workers list. It is archived at
http://www.tcpdump.org/lists/workers/index.html
To unsubscribe use mailto:tcpdump-workers-request () tcpdump org?body=unsubscribe


Current thread: