Give BPF the "almost-clone" update. If you need more of them, make

more entries in /dev and be happy you don't need to recompile your
kernel.
This commit is contained in:
Poul-Henning Kamp 1999-08-15 09:38:21 +00:00
parent 9a27d57978
commit bd3a53203f
9 changed files with 47 additions and 94 deletions

View File

@ -15,7 +15,7 @@
# device lines is also present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
# $Id: GENERIC,v 1.179 1999/08/07 01:42:08 jkh Exp $
# $Id: GENERIC,v 1.180 1999/08/08 19:28:57 phk Exp $
machine i386
cpu I386_CPU
@ -201,7 +201,7 @@ pseudo-device gzip # Exec gzipped a.out's
# The `bpf' pseudo-device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
pseudo-device bpf 4 #Berkeley packet filter
pseudo-device bpf #Berkeley packet filter
# USB support
#controller uhci0 # UHCI PCI->USB interface

View File

@ -2,7 +2,7 @@
# LINT -- config file for checking all the sources, tries to pull in
# as much of the source tree as it can.
#
# $Id: LINT,v 1.624 1999/08/08 16:27:17 chris Exp $
# $Id: LINT,v 1.625 1999/08/08 19:28:57 phk Exp $
#
# NB: You probably don't want to try running a kernel built from this
# file. Instead, you should start from GENERIC, and add options from
@ -402,7 +402,7 @@ pseudo-device token #Generic TokenRing
pseudo-device fddi #Generic FDDI
pseudo-device sppp #Generic Synchronous PPP
pseudo-device loop #Network loopback device
pseudo-device bpf 4 #Berkeley packet filter
pseudo-device bpf #Berkeley packet filter
pseudo-device disc #Discard device
pseudo-device tun 1 #Tunnel driver (ppp(8), nos-tun(8))
pseudo-device sl 2 #Serial Line IP

View File

@ -15,7 +15,7 @@
# device lines is also present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
# $Id: GENERIC,v 1.179 1999/08/07 01:42:08 jkh Exp $
# $Id: GENERIC,v 1.180 1999/08/08 19:28:57 phk Exp $
machine i386
cpu I386_CPU
@ -201,7 +201,7 @@ pseudo-device gzip # Exec gzipped a.out's
# The `bpf' pseudo-device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
pseudo-device bpf 4 #Berkeley packet filter
pseudo-device bpf #Berkeley packet filter
# USB support
#controller uhci0 # UHCI PCI->USB interface

View File

@ -2,7 +2,7 @@
# LINT -- config file for checking all the sources, tries to pull in
# as much of the source tree as it can.
#
# $Id: LINT,v 1.624 1999/08/08 16:27:17 chris Exp $
# $Id: LINT,v 1.625 1999/08/08 19:28:57 phk Exp $
#
# NB: You probably don't want to try running a kernel built from this
# file. Instead, you should start from GENERIC, and add options from
@ -402,7 +402,7 @@ pseudo-device token #Generic TokenRing
pseudo-device fddi #Generic FDDI
pseudo-device sppp #Generic Synchronous PPP
pseudo-device loop #Network loopback device
pseudo-device bpf 4 #Berkeley packet filter
pseudo-device bpf #Berkeley packet filter
pseudo-device disc #Discard device
pseudo-device tun 1 #Tunnel driver (ppp(8), nos-tun(8))
pseudo-device sl 2 #Serial Line IP

View File

@ -2,7 +2,7 @@
# LINT -- config file for checking all the sources, tries to pull in
# as much of the source tree as it can.
#
# $Id: LINT,v 1.624 1999/08/08 16:27:17 chris Exp $
# $Id: LINT,v 1.625 1999/08/08 19:28:57 phk Exp $
#
# NB: You probably don't want to try running a kernel built from this
# file. Instead, you should start from GENERIC, and add options from
@ -402,7 +402,7 @@ pseudo-device token #Generic TokenRing
pseudo-device fddi #Generic FDDI
pseudo-device sppp #Generic Synchronous PPP
pseudo-device loop #Network loopback device
pseudo-device bpf 4 #Berkeley packet filter
pseudo-device bpf #Berkeley packet filter
pseudo-device disc #Discard device
pseudo-device tun 1 #Tunnel driver (ppp(8), nos-tun(8))
pseudo-device sl 2 #Serial Line IP

View File

@ -12,7 +12,7 @@
# device lines is present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
# $Id: PCCARD,v 1.14 1999/07/19 15:18:21 hosokawa Exp $
# $Id: PCCARD,v 1.15 1999/08/08 19:28:59 phk Exp $
machine i386
cpu I386_CPU
@ -197,7 +197,7 @@ pseudo-device gzip # Exec gzipped a.out's
# The `bpf' pseudo-device enables the Berkeley Packet Filter.
# Be aware of the legal and administrative consequences of enabling this!
#pseudo-device bpf 4 #Berkeley packet filter
#pseudo-device bpf #Berkeley packet filter
# USB support
#controller uhci0 # UHCI PCI->USB interface

View File

@ -37,7 +37,7 @@
*
* @(#)bpf.c 8.2 (Berkeley) 3/28/94
*
* $Id: bpf.c,v 1.51 1999/05/31 11:28:08 phk Exp $
* $Id: bpf.c,v 1.52 1999/07/06 19:23:10 des Exp $
*/
#include "bpf.h"
@ -78,11 +78,7 @@
#include <sys/kernel.h>
#include <sys/sysctl.h>
#include "opt_devfs.h"
#ifdef DEVFS
#include <sys/devfsext.h>
#endif /*DEVFS*/
MALLOC_DEFINE(M_BPF, "BPF", "BPF data");
#if NBPF > 0
@ -111,11 +107,8 @@ SYSCTL_INT(_debug, OID_AUTO, bpf_bufsize, CTLFLAG_RW,
/*
* bpf_iflist is the list of interfaces; each corresponds to an ifnet
* bpf_dtab holds the descriptors, indexed by minor device #
*/
static struct bpf_if *bpf_iflist;
static struct bpf_d bpf_dtab[NBPF];
static int bpf_dtab_init;
static int bpf_allocbufs __P((struct bpf_d *));
static void bpf_attachd __P((struct bpf_d *d, struct bpf_if *bp));
@ -339,16 +332,6 @@ bpf_detachd(d)
d->bd_bif = 0;
}
/*
* Mark a descriptor free by making it point to itself.
* This is probably cheaper than marking with a constant since
* the address should be in a register anyway.
*/
#define D_ISFREE(d) ((d) == (d)->bd_next)
#define D_MARKFREE(d) ((d)->bd_next = (d))
#define D_MARKUSED(d) ((d)->bd_next = 0)
/*
* Open ethernet device. Returns ENXIO for illegal minor device number,
* EBUSY if file is open by another process.
@ -366,18 +349,17 @@ bpfopen(dev, flags, fmt, p)
if (p->p_prison)
return (EPERM);
if (minor(dev) >= NBPF)
return (ENXIO);
d = dev->si_drv1;
/*
* Each minor can be opened by only one process. If the requested
* Each minor can be opened by only one process. If the requested
* minor is in use, return EBUSY.
*/
d = &bpf_dtab[minor(dev)];
if (!D_ISFREE(d))
if (d)
return (EBUSY);
/* Mark "free" and do most initialization. */
bzero((char *)d, sizeof(*d));
make_dev(&bpf_cdevsw, minor(dev), 0, 0, 0600, "bpf%d", lminor(dev));
MALLOC(d, struct bpf_d *, sizeof(*d), M_BPF, M_WAITOK);
bzero(d, sizeof(*d));
dev->si_drv1 = d;
d->bd_bufsize = bpf_bufsize;
d->bd_sig = SIGIO;
@ -396,7 +378,7 @@ bpfclose(dev, flags, fmt, p)
int fmt;
struct proc *p;
{
register struct bpf_d *d = &bpf_dtab[minor(dev)];
register struct bpf_d *d = dev->si_drv1;
register int s;
funsetown(d->bd_sigio);
@ -405,6 +387,8 @@ bpfclose(dev, flags, fmt, p)
bpf_detachd(d);
splx(s);
bpf_freed(d);
dev->si_drv1 = 0;
FREE(d, M_BPF);
return (0);
}
@ -468,7 +452,7 @@ bpfread(dev, uio, ioflag)
register struct uio *uio;
int ioflag;
{
register struct bpf_d *d = &bpf_dtab[minor(dev)];
register struct bpf_d *d = dev->si_drv1;
int error;
int s;
@ -578,7 +562,7 @@ bpfwrite(dev, uio, ioflag)
struct uio *uio;
int ioflag;
{
register struct bpf_d *d = &bpf_dtab[minor(dev)];
register struct bpf_d *d = dev->si_drv1;
struct ifnet *ifp;
struct mbuf *m;
int error, s;
@ -657,7 +641,7 @@ bpfioctl(dev, cmd, addr, flags, p)
int flags;
struct proc *p;
{
register struct bpf_d *d = &bpf_dtab[minor(dev)];
register struct bpf_d *d = dev->si_drv1;
int s, error = 0;
switch (cmd) {
@ -909,7 +893,7 @@ bpf_setf(d, fp)
reset_d(d);
splx(s);
if (old != 0)
free((caddr_t)old, M_DEVBUF);
free((caddr_t)old, M_BPF);
return (0);
}
flen = fp->bf_len;
@ -917,7 +901,7 @@ bpf_setf(d, fp)
return (EINVAL);
size = flen * sizeof(*fp->bf_insns);
fcode = (struct bpf_insn *)malloc(size, M_DEVBUF, M_WAITOK);
fcode = (struct bpf_insn *)malloc(size, M_BPF, M_WAITOK);
if (copyin((caddr_t)fp->bf_insns, (caddr_t)fcode, size) == 0 &&
bpf_validate(fcode, (int)flen)) {
s = splimp();
@ -925,11 +909,11 @@ bpf_setf(d, fp)
reset_d(d);
splx(s);
if (old != 0)
free((caddr_t)old, M_DEVBUF);
free((caddr_t)old, M_BPF);
return (0);
}
free((caddr_t)fcode, M_DEVBUF);
free((caddr_t)fcode, M_BPF);
return (EINVAL);
}
@ -1031,7 +1015,7 @@ bpfpoll(dev, events, p)
/*
* An imitation of the FIONREAD ioctl code.
*/
d = &bpf_dtab[minor(dev)];
d = dev->si_drv1;
s = splimp();
if (events & (POLLIN | POLLRDNORM)) {
@ -1209,13 +1193,13 @@ static int
bpf_allocbufs(d)
register struct bpf_d *d;
{
d->bd_fbuf = (caddr_t)malloc(d->bd_bufsize, M_DEVBUF, M_WAITOK);
d->bd_fbuf = (caddr_t)malloc(d->bd_bufsize, M_BPF, M_WAITOK);
if (d->bd_fbuf == 0)
return (ENOBUFS);
d->bd_sbuf = (caddr_t)malloc(d->bd_bufsize, M_DEVBUF, M_WAITOK);
d->bd_sbuf = (caddr_t)malloc(d->bd_bufsize, M_BPF, M_WAITOK);
if (d->bd_sbuf == 0) {
free(d->bd_fbuf, M_DEVBUF);
free(d->bd_fbuf, M_BPF);
return (ENOBUFS);
}
d->bd_slen = 0;
@ -1237,16 +1221,14 @@ bpf_freed(d)
* free.
*/
if (d->bd_sbuf != 0) {
free(d->bd_sbuf, M_DEVBUF);
free(d->bd_sbuf, M_BPF);
if (d->bd_hbuf != 0)
free(d->bd_hbuf, M_DEVBUF);
free(d->bd_hbuf, M_BPF);
if (d->bd_fbuf != 0)
free(d->bd_fbuf, M_DEVBUF);
free(d->bd_fbuf, M_BPF);
}
if (d->bd_filter)
free((caddr_t)d->bd_filter, M_DEVBUF);
D_MARKFREE(d);
free((caddr_t)d->bd_filter, M_BPF);
}
/*
@ -1260,8 +1242,7 @@ bpfattach(ifp, dlt, hdrlen)
u_int dlt, hdrlen;
{
struct bpf_if *bp;
int i;
bp = (struct bpf_if *)malloc(sizeof(*bp), M_DEVBUF, M_DONTWAIT);
bp = (struct bpf_if *)malloc(sizeof(*bp), M_BPF, M_DONTWAIT);
if (bp == 0)
panic("bpfattach");
@ -1282,46 +1263,18 @@ bpfattach(ifp, dlt, hdrlen)
*/
bp->bif_hdrlen = BPF_WORDALIGN(hdrlen + SIZEOF_BPF_HDR) - hdrlen;
/*
* Mark all the descriptors free if this hasn't been done.
*/
if (!bpf_dtab_init) {
for (i = 0; i < NBPF; ++i)
D_MARKFREE(&bpf_dtab[i]);
bpf_dtab_init = 1;
}
if (bootverbose)
printf("bpf: %s%d attached\n", ifp->if_name, ifp->if_unit);
}
#ifdef DEVFS
static void *bpf_devfs_token[NBPF];
#endif
static int bpf_devsw_installed;
static void bpf_drvinit __P((void *unused));
static void
bpf_drvinit(unused)
void *unused;
{
#ifdef DEVFS
int i;
#endif
if( ! bpf_devsw_installed ) {
cdevsw_add(&bpf_cdevsw);
bpf_devsw_installed = 1;
#ifdef DEVFS
for ( i = 0 ; i < NBPF ; i++ ) {
bpf_devfs_token[i] =
devfs_add_devswf(&bpf_cdevsw, i, DV_CHR, 0, 0,
0600, "bpf%d", i);
}
#endif
}
cdevsw_add(&bpf_cdevsw);
}
SYSINIT(bpfdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,bpf_drvinit,NULL)
@ -1366,4 +1319,4 @@ bpf_filter(pc, p, wirelen, buflen)
return -1; /* "no filter" behaviour */
}
#endif
#endif /* !BPF */

View File

@ -11,7 +11,7 @@
# device lines is present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
# $Id: GENERIC98,v 1.81 1999/08/08 11:09:28 kato Exp $
# $Id: GENERIC98,v 1.82 1999/08/08 19:28:59 phk Exp $
# GENERIC98 -- Generic PC98 machine with WD/SCSI disks
@ -253,7 +253,7 @@ pseudo-device gzip # Exec gzipped a.out's
# The `bpf' pseudo-device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
pseudo-device bpf 4 #Berkeley packet filter
pseudo-device bpf #Berkeley packet filter
# KTRACE enables the system-call tracing facility ktrace(2).
# This adds 4 KB bloat to your kernel, and slightly increases

View File

@ -11,7 +11,7 @@
# device lines is present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
# $Id: GENERIC98,v 1.81 1999/08/08 11:09:28 kato Exp $
# $Id: GENERIC98,v 1.82 1999/08/08 19:28:59 phk Exp $
# GENERIC98 -- Generic PC98 machine with WD/SCSI disks
@ -253,7 +253,7 @@ pseudo-device gzip # Exec gzipped a.out's
# The `bpf' pseudo-device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
pseudo-device bpf 4 #Berkeley packet filter
pseudo-device bpf #Berkeley packet filter
# KTRACE enables the system-call tracing facility ktrace(2).
# This adds 4 KB bloat to your kernel, and slightly increases