Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Oct 2000 17:05:11 -0400 (EDT)
From:      "Andrew R. Reiter" <arr@watson.org>
To:        Peter Van Epp <vanepp@sfu.ca>
Cc:        freebsd-hackers@FreeBSD.ORG
Subject:   OOPS Re: bpf.c select fix for review
Message-ID:  <Pine.NEB.3.96L.1001016170453.31935B-100000@fledge.watson.org>
In-Reply-To: <200010162026.NAA01828@fraser.sfu.ca>

next in thread | previous in thread | raw e-mail | index | archive | help

woops.. I meant bd_rdstart.

On Mon, 16 Oct 2000, Peter Van Epp wrote:

> 	While working on the new argus version I discovered that there is a
> bug in the /sys/net/bpf.c code if you are doing select with a timeout (which
> tcpdump isn't). Basically if you set up tcpreplay on another machine and send
> a less than full buffer (9 packets 2300 bytes in my case) to a FreeBSD 4.1 
> RELEASE machine, argus won't see the packets. It turns out that because it 
> is using select (and not immediate mode) the partially full buffer won't get
> passed up to libpcap. The OpenBSD folks have a partial fix (which only gets
> the first packet up and leaves the other 8 dangling). I ported that to FreeBSD
> and then made a fix which appears to work based on what their code looked to
> be trying to do (as opposed to what it does which is incorrect).
> 	Basically at receive packet time the tick counter is stored in a 
> variable in the capture structure. When the select/poll timeout occurs it
> checks if the current tick time is > then the last received packet count +
> the timeout value. If so it rotates the (partially full) packet buffer and 
> signals to wake up the process. While this appears to work (and match the 
> Solaris behavior on the same file) I figured I'd see if anyone sees a glaring
> hole in the fix before submitting a bug report on it.
> 
> Peter Van Epp / Operations and Technical Support 
> Simon Fraser University, Burnaby, B.C. Canada
> 
> *** /sys/net/bpf.c.orig	Sat Oct 14 19:00:59 2000
> --- /sys/net/bpf.c	Mon Oct 16 09:30:24 2000
> ***************
> *** 1054,1061 ****
>   	if (events & (POLLIN | POLLRDNORM)) {
>   		if (d->bd_hlen != 0 || (d->bd_immediate && d->bd_slen != 0))
>   			revents |= events & (POLLIN | POLLRDNORM);
> ! 		else
> ! 			selrecord(p, &d->bd_sel);
>   	}
>   	splx(s);
>   	return (revents);
> --- 1054,1076 ----
>   	if (events & (POLLIN | POLLRDNORM)) {
>   		if (d->bd_hlen != 0 || (d->bd_immediate && d->bd_slen != 0))
>   			revents |= events & (POLLIN | POLLRDNORM);
> ! 		else {
> !         		/*
> !          		 * If there is a timeout and no data in the hold buffer
> !        			 * see if there has been data in the capture buffer
> ! 			 * for more than a timeout interval. If so rotate the
> ! 			 * buffer to push the packets to the user.
> !         		 */
> ! 			if ((d->bd_slen != 0) && (d->bd_hlen == 0)) {
> ! 				if ((d->bd_rtout != -1) && 
> ! 				    (d->bd_rdStart + d->bd_rtout) > ticks) {
> ! 					ROTATE_BUFFERS(d);
> ! 					revents |= events & (POLLIN | POLLRDNORM);
> ! 				}
> ! 			} else 
> ! 				selrecord(p, &d->bd_sel);
> ! 				
> ! 		}
>   	}
>   	splx(s);
>   	return (revents);
> ***************
> *** 1219,1224 ****
> --- 1234,1245 ----
>   	 */
>   	(*cpfn)(pkt, (u_char *)hp + hdrlen, (hp->bh_caplen = totlen - hdrlen));
>   	d->bd_slen = curlen + totlen;
> + 
> + 	/*
> + 	 * Mark the time the last packet was seen for poll timeout processing.
> + 	 */
> + 
> + 	d->bd_rdStart = ticks;
>   }
>   
>   /*
> 
> 
> 
> *** /sys/net/bpfdesc.h.orig	Sat Oct 14 19:16:07 2000
> --- /sys/net/bpfdesc.h	Sat Oct 14 19:21:54 2000
> ***************
> *** 69,74 ****
> --- 69,75 ----
>   
>   	struct bpf_if *	bd_bif;		/* interface descriptor */
>   	u_long		bd_rtout;	/* Read timeout in 'ticks' */
> +         u_long          bd_rdStart;     /* when the read started */
>   	struct bpf_insn *bd_filter; 	/* filter code */
>   	u_long		bd_rcount;	/* number of packets received */
>   	u_long		bd_dcount;	/* number of packets dropped */
> 
> 
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-hackers" in the body of the message
> 

*-------------.................................................
| Andrew R. Reiter 
| arr@fledge.watson.org
| "It requires a very unusual mind
|   to undertake the analysis of the obvious" -- A.N. Whitehead



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.NEB.3.96L.1001016170453.31935B-100000>