summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authorpst <pst@FreeBSD.org>1995-06-15 18:11:00 +0000
committerpst <pst@FreeBSD.org>1995-06-15 18:11:00 +0000
commit763ad9c0a0b8880384f64a68a10dd2f459c5df45 (patch)
tree9c1d96c825647a1f01ca99e904a9d6cee8744209 /sys/net
parentaf679f9c572744dad3260580ccb92ef78d5cff51 (diff)
downloadFreeBSD-src-763ad9c0a0b8880384f64a68a10dd2f459c5df45.zip
FreeBSD-src-763ad9c0a0b8880384f64a68a10dd2f459c5df45.tar.gz
Give the BPF the ability to generate signals when a packet is available.
Reviewed by: pst & wollman Submitted by: grossman@cygnus.com
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/bpf.c60
-rw-r--r--sys/net/bpf.h6
-rw-r--r--sys/net/bpfdesc.h5
3 files changed, 66 insertions, 5 deletions
diff --git a/sys/net/bpf.c b/sys/net/bpf.c
index c11a4cf..d99e89f 100644
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -37,7 +37,7 @@
*
* @(#)bpf.c 8.2 (Berkeley) 3/28/94
*
- * $Id: bpf.c,v 1.6 1995/05/09 13:35:38 davidg Exp $
+ * $Id: bpf.c,v 1.7 1995/05/30 08:07:50 rgrimes Exp $
*/
#include "bpfilter.h"
@@ -328,6 +328,7 @@ bpfopen(dev, flag)
/* Mark "free" and do most initialization. */
bzero((char *)d, sizeof(*d));
d->bd_bufsize = bpf_bufsize;
+ d->bd_sig = SIGIO;
return (0);
}
@@ -439,8 +440,11 @@ bpfread(dev, uio)
ROTATE_BUFFERS(d);
break;
}
- error = BPF_SLEEP((caddr_t)d, PRINET|PCATCH, "bpf",
- d->bd_rtout);
+ if (d->bd_rtout != -1)
+ error = BPF_SLEEP((caddr_t)d, PRINET|PCATCH, "bpf",
+ d->bd_rtout);
+ else
+ error = EWOULDBLOCK; /* User requested non-blocking I/O */
if (error == EINTR || error == ERESTART) {
splx(s);
return (error);
@@ -496,7 +500,15 @@ static inline void
bpf_wakeup(d)
register struct bpf_d *d;
{
+ struct proc *p;
+
wakeup((caddr_t)d);
+ if (d->bd_async && d->bd_sig)
+ if (d->bd_pgid > 0)
+ gsignal (d->bd_pgid, d->bd_sig);
+ else if (p = pfind (-d->bd_pgid))
+ psignal (p, d->bd_sig);
+
#if BSD >= 199103
selwakeup(&d->bd_sel);
/* XXX */
@@ -782,6 +794,48 @@ bpfioctl(dev, cmd, addr, flag)
bv->bv_minor = BPF_MINOR_VERSION;
break;
}
+
+
+ case FIONBIO: /* Non-blocking I/O */
+ if (*(int *)addr)
+ d->bd_rtout = -1;
+ else
+ d->bd_rtout = 0;
+ break;
+
+ case FIOASYNC: /* Send signal on receive packets */
+ d->bd_async = *(int *)addr;
+ break;
+
+/* N.B. ioctl (FIOSETOWN) and fcntl (F_SETOWN) both end up doing the
+ equivalent of a TIOCSPGRP and hence end up here. *However* TIOCSPGRP's arg
+ is a process group if it's positive and a process id if it's negative. This
+ is exactly the opposite of what the other two functions want! Therefore
+ there is code in ioctl and fcntl to negate the arg before calling here. */
+
+ case TIOCSPGRP: /* Process or group to send signals to */
+ d->bd_pgid = *(int *)addr;
+ break;
+
+ case TIOCGPGRP:
+ *(int *)addr = d->bd_pgid;
+ break;
+
+ case BIOCSRSIG: /* Set receive signal */
+ {
+ u_int sig;
+
+ sig = *(u_int *)addr;
+
+ if (sig >= NSIG)
+ error = EINVAL;
+ else
+ d->bd_sig = sig;
+ break;
+ }
+ case BIOCGRSIG:
+ *(u_int *)addr = d->bd_sig;
+ break;
}
return (error);
}
diff --git a/sys/net/bpf.h b/sys/net/bpf.h
index 2da90b0..af3edd8 100644
--- a/sys/net/bpf.h
+++ b/sys/net/bpf.h
@@ -37,7 +37,7 @@
*
* @(#)bpf.h 8.1 (Berkeley) 6/10/93
*
- * $Id: bpf.h,v 1.3 1994/08/21 05:11:38 paul Exp $
+ * $Id: bpf.h,v 1.4 1995/05/30 08:07:52 rgrimes Exp $
*/
#ifndef _NET_BPF_H_
@@ -110,6 +110,8 @@ struct bpf_version {
#define BIOCGSTATS _IOR(B,111, struct bpf_stat)
#define BIOCIMMEDIATE _IOW(B,112, u_int)
#define BIOCVERSION _IOR(B,113, struct bpf_version)
+#define BIOCGRSIG _IOR(B,114, u_int)
+#define BIOCSRSIG _IOW(B,115, u_int)
#else
#define BIOCGBLEN _IOR('B',102, u_int)
#define BIOCSBLEN _IOWR('B',102, u_int)
@@ -124,6 +126,8 @@ struct bpf_version {
#define BIOCGSTATS _IOR('B',111, struct bpf_stat)
#define BIOCIMMEDIATE _IOW('B',112, u_int)
#define BIOCVERSION _IOR('B',113, struct bpf_version)
+#define BIOCGRSIG _IOR('B',114, u_int)
+#define BIOCSRSIG _IOW('B',115, u_int)
#endif
/*
diff --git a/sys/net/bpfdesc.h b/sys/net/bpfdesc.h
index 598ce9e..a0cf3b3 100644
--- a/sys/net/bpfdesc.h
+++ b/sys/net/bpfdesc.h
@@ -37,7 +37,7 @@
*
* @(#)bpfdesc.h 8.1 (Berkeley) 6/10/93
*
- * $Id: bpfdesc.h,v 1.3 1994/08/02 07:46:00 davidg Exp $
+ * $Id: bpfdesc.h,v 1.4 1994/08/21 05:11:39 paul Exp $
*/
#ifndef _NET_BPFDESC_H_
@@ -76,6 +76,9 @@ struct bpf_d {
u_char bd_promisc; /* true if listening promiscuously */
u_char bd_state; /* idle, waiting, or timed out */
u_char bd_immediate; /* true to return on packet arrival */
+ int bd_async; /* non-zero if packet reception should generate signal */
+ int bd_sig; /* signal to send upon packet reception */
+ pid_t bd_pgid; /* process or group id for signal */
#if BSD < 199103
u_char bd_selcoll; /* true if selects collide */
int bd_timedout;
OpenPOWER on IntegriCloud