]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/net/bpf.c
This commit was generated by cvs2svn to compensate for changes in r47151,
[FreeBSD/FreeBSD.git] / sys / net / bpf.c
1 /*
2  * Copyright (c) 1990, 1991, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from the Stanford/CMU enet packet filter,
6  * (net/enet.c) distributed as part of 4.3BSD, and code contributed
7  * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence
8  * Berkeley Laboratory.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *      This product includes software developed by the University of
21  *      California, Berkeley and its contributors.
22  * 4. Neither the name of the University nor the names of its contributors
23  *    may be used to endorse or promote products derived from this software
24  *    without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36  * SUCH DAMAGE.
37  *
38  *      @(#)bpf.c       8.2 (Berkeley) 3/28/94
39  *
40  * $Id: bpf.c,v 1.48 1999/04/28 01:18:13 msmith Exp $
41  */
42
43 #include "bpfilter.h"
44
45 #ifndef __GNUC__
46 #define inline
47 #else
48 #define inline __inline
49 #endif
50
51 #include <sys/param.h>
52 #include <sys/systm.h>
53 #include <sys/conf.h>
54 #include <sys/malloc.h>
55 #include <sys/mbuf.h>
56 #include <sys/time.h>
57 #include <sys/proc.h>
58 #include <sys/signalvar.h>
59 #include <sys/filio.h>
60 #include <sys/sockio.h>
61 #include <sys/ttycom.h>
62 #include <sys/filedesc.h>
63
64 #if defined(sparc) && BSD < 199103
65 #include <sys/stream.h>
66 #endif
67 #include <sys/poll.h>
68
69 #include <sys/socket.h>
70 #include <sys/vnode.h>
71
72 #include <net/if.h>
73 #include <net/bpf.h>
74 #include <net/bpfdesc.h>
75
76 #include <netinet/in.h>
77 #include <netinet/if_ether.h>
78 #include <sys/kernel.h>
79 #include <sys/sysctl.h>
80
81 #include "opt_devfs.h"
82
83 #ifdef DEVFS
84 #include <sys/devfsext.h>
85 #endif /*DEVFS*/
86
87 #if NBPFILTER > 0
88
89 /*
90  * Older BSDs don't have kernel malloc.
91  */
92 #if BSD < 199103
93 extern bcopy();
94 static caddr_t bpf_alloc();
95 #include <net/bpf_compat.h>
96 #define BPF_BUFSIZE (MCLBYTES-8)
97 #define UIOMOVE(cp, len, code, uio) uiomove(cp, len, code, uio)
98 #else
99 #define BPF_BUFSIZE 4096
100 #define UIOMOVE(cp, len, code, uio) uiomove(cp, len, uio)
101 #endif
102
103 #define PRINET  26                      /* interruptible */
104
105 /*
106  * The default read buffer size is patchable.
107  */
108 static int bpf_bufsize = BPF_BUFSIZE;
109 SYSCTL_INT(_debug, OID_AUTO, bpf_bufsize, CTLFLAG_RW, 
110         &bpf_bufsize, 0, "");
111
112 /*
113  *  bpf_iflist is the list of interfaces; each corresponds to an ifnet
114  *  bpf_dtab holds the descriptors, indexed by minor device #
115  */
116 static struct bpf_if    *bpf_iflist;
117 static struct bpf_d     bpf_dtab[NBPFILTER];
118 static int              bpf_dtab_init;
119
120 static int      bpf_allocbufs __P((struct bpf_d *));
121 static void     bpf_attachd __P((struct bpf_d *d, struct bpf_if *bp));
122 static void     bpf_detachd __P((struct bpf_d *d));
123 static void     bpf_freed __P((struct bpf_d *));
124 static void     bpf_ifname __P((struct ifnet *, struct ifreq *));
125 static void     bpf_mcopy __P((const void *, void *, size_t));
126 static int      bpf_movein __P((struct uio *, int,
127                     struct mbuf **, struct sockaddr *, int *));
128 static int      bpf_setif __P((struct bpf_d *, struct ifreq *));
129 static inline void
130                 bpf_wakeup __P((struct bpf_d *));
131 static void     catchpacket __P((struct bpf_d *, u_char *, u_int,
132                     u_int, void (*)(const void *, void *, size_t)));
133 static void     reset_d __P((struct bpf_d *));
134 static int       bpf_setf __P((struct bpf_d *, struct bpf_program *));
135
136 static  d_open_t        bpfopen;
137 static  d_close_t       bpfclose;
138 static  d_read_t        bpfread;
139 static  d_write_t       bpfwrite;
140 static  d_ioctl_t       bpfioctl;
141 static  d_poll_t        bpfpoll;
142
143 #define CDEV_MAJOR 23
144 static struct cdevsw bpf_cdevsw = 
145         { bpfopen,      bpfclose,       bpfread,        bpfwrite,       /*23*/
146           bpfioctl,     nostop,         nullreset,      nodevtotty,/* bpf */
147           bpfpoll,      nommap,         NULL,   "bpf",  NULL,   -1 };
148
149
150 static int
151 bpf_movein(uio, linktype, mp, sockp, datlen)
152         register struct uio *uio;
153         int linktype, *datlen;
154         register struct mbuf **mp;
155         register struct sockaddr *sockp;
156 {
157         struct mbuf *m;
158         int error;
159         int len;
160         int hlen;
161
162         /*
163          * Build a sockaddr based on the data link layer type.
164          * We do this at this level because the ethernet header
165          * is copied directly into the data field of the sockaddr.
166          * In the case of SLIP, there is no header and the packet
167          * is forwarded as is.
168          * Also, we are careful to leave room at the front of the mbuf
169          * for the link level header.
170          */
171         switch (linktype) {
172
173         case DLT_SLIP:
174                 sockp->sa_family = AF_INET;
175                 hlen = 0;
176                 break;
177
178         case DLT_EN10MB:
179                 sockp->sa_family = AF_UNSPEC;
180                 /* XXX Would MAXLINKHDR be better? */
181                 hlen = sizeof(struct ether_header);
182                 break;
183
184         case DLT_FDDI:
185 #if defined(__FreeBSD__) || defined(__bsdi__)
186                 sockp->sa_family = AF_IMPLINK;
187                 hlen = 0;
188 #else
189                 sockp->sa_family = AF_UNSPEC;
190                 /* XXX 4(FORMAC)+6(dst)+6(src)+3(LLC)+5(SNAP) */
191                 hlen = 24;
192 #endif
193                 break;
194
195         case DLT_RAW:
196         case DLT_NULL:
197                 sockp->sa_family = AF_UNSPEC;
198                 hlen = 0;
199                 break;
200
201 #ifdef __FreeBSD__
202         case DLT_ATM_RFC1483:
203                 /*
204                  * en atm driver requires 4-byte atm pseudo header.
205                  * though it isn't standard, vpi:vci needs to be
206                  * specified anyway.
207                  */
208                 sockp->sa_family = AF_UNSPEC;
209                 hlen = 12;      /* XXX 4(ATM_PH) + 3(LLC) + 5(SNAP) */
210                 break;
211 #endif
212
213         default:
214                 return (EIO);
215         }
216
217         len = uio->uio_resid;
218         *datlen = len - hlen;
219         if ((unsigned)len > MCLBYTES)
220                 return (EIO);
221
222         MGETHDR(m, M_WAIT, MT_DATA);
223         if (m == 0)
224                 return (ENOBUFS);
225         if (len > MHLEN) {
226 #if BSD >= 199103
227                 MCLGET(m, M_WAIT);
228                 if ((m->m_flags & M_EXT) == 0) {
229 #else
230                 MCLGET(m);
231                 if (m->m_len != MCLBYTES) {
232 #endif
233                         error = ENOBUFS;
234                         goto bad;
235                 }
236         }
237         m->m_pkthdr.len = m->m_len = len;
238         m->m_pkthdr.rcvif = NULL;
239         *mp = m;
240         /*
241          * Make room for link header.
242          */
243         if (hlen != 0) {
244                 m->m_pkthdr.len -= hlen;
245                 m->m_len -= hlen;
246 #if BSD >= 199103
247                 m->m_data += hlen; /* XXX */
248 #else
249                 m->m_off += hlen;
250 #endif
251                 error = UIOMOVE((caddr_t)sockp->sa_data, hlen, UIO_WRITE, uio);
252                 if (error)
253                         goto bad;
254         }
255         error = UIOMOVE(mtod(m, caddr_t), len - hlen, UIO_WRITE, uio);
256         if (!error)
257                 return (0);
258  bad:
259         m_freem(m);
260         return (error);
261 }
262
263 /*
264  * Attach file to the bpf interface, i.e. make d listen on bp.
265  * Must be called at splimp.
266  */
267 static void
268 bpf_attachd(d, bp)
269         struct bpf_d *d;
270         struct bpf_if *bp;
271 {
272         /*
273          * Point d at bp, and add d to the interface's list of listeners.
274          * Finally, point the driver's bpf cookie at the interface so
275          * it will divert packets to bpf.
276          */
277         d->bd_bif = bp;
278         d->bd_next = bp->bif_dlist;
279         bp->bif_dlist = d;
280
281         bp->bif_ifp->if_bpf = bp;
282 }
283
284 /*
285  * Detach a file from its interface.
286  */
287 static void
288 bpf_detachd(d)
289         struct bpf_d *d;
290 {
291         struct bpf_d **p;
292         struct bpf_if *bp;
293
294         bp = d->bd_bif;
295         /*
296          * Check if this descriptor had requested promiscuous mode.
297          * If so, turn it off.
298          */
299         if (d->bd_promisc) {
300                 d->bd_promisc = 0;
301                 if (ifpromisc(bp->bif_ifp, 0))
302                         /*
303                          * Something is really wrong if we were able to put
304                          * the driver into promiscuous mode, but can't
305                          * take it out.
306                          */
307                         panic("bpf: ifpromisc failed");
308         }
309         /* Remove d from the interface's descriptor list. */
310         p = &bp->bif_dlist;
311         while (*p != d) {
312                 p = &(*p)->bd_next;
313                 if (*p == 0)
314                         panic("bpf_detachd: descriptor not in list");
315         }
316         *p = (*p)->bd_next;
317         if (bp->bif_dlist == 0)
318                 /*
319                  * Let the driver know that there are no more listeners.
320                  */
321                 d->bd_bif->bif_ifp->if_bpf = 0;
322         d->bd_bif = 0;
323 }
324
325
326 /*
327  * Mark a descriptor free by making it point to itself.
328  * This is probably cheaper than marking with a constant since
329  * the address should be in a register anyway.
330  */
331 #define D_ISFREE(d) ((d) == (d)->bd_next)
332 #define D_MARKFREE(d) ((d)->bd_next = (d))
333 #define D_MARKUSED(d) ((d)->bd_next = 0)
334
335 /*
336  * Open ethernet device.  Returns ENXIO for illegal minor device number,
337  * EBUSY if file is open by another process.
338  */
339 /* ARGSUSED */
340 static  int
341 bpfopen(dev, flags, fmt, p)
342         dev_t dev;
343         int flags;
344         int fmt;
345         struct proc *p;
346 {
347         register struct bpf_d *d;
348
349         if (p->p_prison)
350                 return (EPERM);
351
352         if (minor(dev) >= NBPFILTER)
353                 return (ENXIO);
354         /*
355          * Each minor can be opened by only one process.  If the requested
356          * minor is in use, return EBUSY.
357          */
358         d = &bpf_dtab[minor(dev)];
359         if (!D_ISFREE(d))
360                 return (EBUSY);
361
362         /* Mark "free" and do most initialization. */
363         bzero((char *)d, sizeof(*d));
364         d->bd_bufsize = bpf_bufsize;
365         d->bd_sig = SIGIO;
366
367         return (0);
368 }
369
370 /*
371  * Close the descriptor by detaching it from its interface,
372  * deallocating its buffers, and marking it free.
373  */
374 /* ARGSUSED */
375 static  int
376 bpfclose(dev, flags, fmt, p)
377         dev_t dev;
378         int flags;
379         int fmt;
380         struct proc *p;
381 {
382         register struct bpf_d *d = &bpf_dtab[minor(dev)];
383         register int s;
384
385         funsetown(d->bd_sigio);
386         s = splimp();
387         if (d->bd_bif)
388                 bpf_detachd(d);
389         splx(s);
390         bpf_freed(d);
391
392         return (0);
393 }
394
395 /*
396  * Support for SunOS, which does not have tsleep.
397  */
398 #if BSD < 199103
399 static
400 bpf_timeout(arg)
401         caddr_t arg;
402 {
403         struct bpf_d *d = (struct bpf_d *)arg;
404         d->bd_timedout = 1;
405         wakeup(arg);
406 }
407
408 #define BPF_SLEEP(chan, pri, s, t) bpf_sleep((struct bpf_d *)chan)
409
410 int
411 bpf_sleep(d)
412         register struct bpf_d *d;
413 {
414         register int rto = d->bd_rtout;
415         register int st;
416
417         if (rto != 0) {
418                 d->bd_timedout = 0;
419                 timeout(bpf_timeout, (caddr_t)d, rto);
420         }
421         st = sleep((caddr_t)d, PRINET|PCATCH);
422         if (rto != 0) {
423                 if (d->bd_timedout == 0)
424                         untimeout(bpf_timeout, (caddr_t)d);
425                 else if (st == 0)
426                         return EWOULDBLOCK;
427         }
428         return (st != 0) ? EINTR : 0;
429 }
430 #else
431 #define BPF_SLEEP tsleep
432 #endif
433
434 /*
435  * Rotate the packet buffers in descriptor d.  Move the store buffer
436  * into the hold slot, and the free buffer into the store slot.
437  * Zero the length of the new store buffer.
438  */
439 #define ROTATE_BUFFERS(d) \
440         (d)->bd_hbuf = (d)->bd_sbuf; \
441         (d)->bd_hlen = (d)->bd_slen; \
442         (d)->bd_sbuf = (d)->bd_fbuf; \
443         (d)->bd_slen = 0; \
444         (d)->bd_fbuf = 0;
445 /*
446  *  bpfread - read next chunk of packets from buffers
447  */
448 static  int
449 bpfread(dev, uio, ioflag)
450         dev_t dev;
451         register struct uio *uio;
452         int ioflag;
453 {
454         register struct bpf_d *d = &bpf_dtab[minor(dev)];
455         int error;
456         int s;
457
458         /*
459          * Restrict application to use a buffer the same size as
460          * as kernel buffers.
461          */
462         if (uio->uio_resid != d->bd_bufsize)
463                 return (EINVAL);
464
465         s = splimp();
466         /*
467          * If the hold buffer is empty, then do a timed sleep, which
468          * ends when the timeout expires or when enough packets
469          * have arrived to fill the store buffer.
470          */
471         while (d->bd_hbuf == 0) {
472                 if (d->bd_immediate && d->bd_slen != 0) {
473                         /*
474                          * A packet(s) either arrived since the previous
475                          * read or arrived while we were asleep.
476                          * Rotate the buffers and return what's here.
477                          */
478                         ROTATE_BUFFERS(d);
479                         break;
480                 }
481                 if (ioflag & IO_NDELAY)
482                         error = EWOULDBLOCK;
483                 else
484                         error = BPF_SLEEP((caddr_t)d, PRINET|PCATCH, "bpf",
485                                           d->bd_rtout);
486                 if (error == EINTR || error == ERESTART) {
487                         splx(s);
488                         return (error);
489                 }
490                 if (error == EWOULDBLOCK) {
491                         /*
492                          * On a timeout, return what's in the buffer,
493                          * which may be nothing.  If there is something
494                          * in the store buffer, we can rotate the buffers.
495                          */
496                         if (d->bd_hbuf)
497                                 /*
498                                  * We filled up the buffer in between
499                                  * getting the timeout and arriving
500                                  * here, so we don't need to rotate.
501                                  */
502                                 break;
503
504                         if (d->bd_slen == 0) {
505                                 splx(s);
506                                 return (0);
507                         }
508                         ROTATE_BUFFERS(d);
509                         break;
510                 }
511         }
512         /*
513          * At this point, we know we have something in the hold slot.
514          */
515         splx(s);
516
517         /*
518          * Move data from hold buffer into user space.
519          * We know the entire buffer is transferred since
520          * we checked above that the read buffer is bpf_bufsize bytes.
521          */
522         error = UIOMOVE(d->bd_hbuf, d->bd_hlen, UIO_READ, uio);
523
524         s = splimp();
525         d->bd_fbuf = d->bd_hbuf;
526         d->bd_hbuf = 0;
527         d->bd_hlen = 0;
528         splx(s);
529
530         return (error);
531 }
532
533
534 /*
535  * If there are processes sleeping on this descriptor, wake them up.
536  */
537 static inline void
538 bpf_wakeup(d)
539         register struct bpf_d *d;
540 {
541         wakeup((caddr_t)d);
542         if (d->bd_async && d->bd_sig && d->bd_sigio)
543                 pgsigio(d->bd_sigio, d->bd_sig, 0);
544
545 #if BSD >= 199103
546         selwakeup(&d->bd_sel);
547         /* XXX */
548         d->bd_sel.si_pid = 0;
549 #else
550         if (d->bd_selproc) {
551                 selwakeup(d->bd_selproc, (int)d->bd_selcoll);
552                 d->bd_selcoll = 0;
553                 d->bd_selproc = 0;
554         }
555 #endif
556 }
557
558 static  int
559 bpfwrite(dev, uio, ioflag)
560         dev_t dev;
561         struct uio *uio;
562         int ioflag;
563 {
564         register struct bpf_d *d = &bpf_dtab[minor(dev)];
565         struct ifnet *ifp;
566         struct mbuf *m;
567         int error, s;
568         static struct sockaddr dst;
569         int datlen;
570
571         if (d->bd_bif == 0)
572                 return (ENXIO);
573
574         ifp = d->bd_bif->bif_ifp;
575
576         if (uio->uio_resid == 0)
577                 return (0);
578
579         error = bpf_movein(uio, (int)d->bd_bif->bif_dlt, &m, &dst, &datlen);
580         if (error)
581                 return (error);
582
583         if (datlen > ifp->if_mtu)
584                 return (EMSGSIZE);
585
586         s = splnet();
587 #if BSD >= 199103
588         error = (*ifp->if_output)(ifp, m, &dst, (struct rtentry *)0);
589 #else
590         error = (*ifp->if_output)(ifp, m, &dst);
591 #endif
592         splx(s);
593         /*
594          * The driver frees the mbuf.
595          */
596         return (error);
597 }
598
599 /*
600  * Reset a descriptor by flushing its packet buffer and clearing the
601  * receive and drop counts.  Should be called at splimp.
602  */
603 static void
604 reset_d(d)
605         struct bpf_d *d;
606 {
607         if (d->bd_hbuf) {
608                 /* Free the hold buffer. */
609                 d->bd_fbuf = d->bd_hbuf;
610                 d->bd_hbuf = 0;
611         }
612         d->bd_slen = 0;
613         d->bd_hlen = 0;
614         d->bd_rcount = 0;
615         d->bd_dcount = 0;
616 }
617
618 /*
619  *  FIONREAD            Check for read packet available.
620  *  SIOCGIFADDR         Get interface address - convenient hook to driver.
621  *  BIOCGBLEN           Get buffer len [for read()].
622  *  BIOCSETF            Set ethernet read filter.
623  *  BIOCFLUSH           Flush read packet buffer.
624  *  BIOCPROMISC         Put interface into promiscuous mode.
625  *  BIOCGDLT            Get link layer type.
626  *  BIOCGETIF           Get interface name.
627  *  BIOCSETIF           Set interface.
628  *  BIOCSRTIMEOUT       Set read timeout.
629  *  BIOCGRTIMEOUT       Get read timeout.
630  *  BIOCGSTATS          Get packet stats.
631  *  BIOCIMMEDIATE       Set immediate mode.
632  *  BIOCVERSION         Get filter language version.
633  */
634 /* ARGSUSED */
635 static  int
636 bpfioctl(dev, cmd, addr, flags, p)
637         dev_t dev;
638         u_long cmd;
639         caddr_t addr;
640         int flags;
641         struct proc *p;
642 {
643         register struct bpf_d *d = &bpf_dtab[minor(dev)];
644         int s, error = 0;
645
646         switch (cmd) {
647
648         default:
649                 error = EINVAL;
650                 break;
651
652         /*
653          * Check for read packet available.
654          */
655         case FIONREAD:
656                 {
657                         int n;
658
659                         s = splimp();
660                         n = d->bd_slen;
661                         if (d->bd_hbuf)
662                                 n += d->bd_hlen;
663                         splx(s);
664
665                         *(int *)addr = n;
666                         break;
667                 }
668
669         case SIOCGIFADDR:
670                 {
671                         struct ifnet *ifp;
672
673                         if (d->bd_bif == 0)
674                                 error = EINVAL;
675                         else {
676                                 ifp = d->bd_bif->bif_ifp;
677                                 error = (*ifp->if_ioctl)(ifp, cmd, addr);
678                         }
679                         break;
680                 }
681
682         /*
683          * Get buffer len [for read()].
684          */
685         case BIOCGBLEN:
686                 *(u_int *)addr = d->bd_bufsize;
687                 break;
688
689         /*
690          * Set buffer length.
691          */
692         case BIOCSBLEN:
693 #if BSD < 199103
694                 error = EINVAL;
695 #else
696                 if (d->bd_bif != 0)
697                         error = EINVAL;
698                 else {
699                         register u_int size = *(u_int *)addr;
700
701                         if (size > BPF_MAXBUFSIZE)
702                                 *(u_int *)addr = size = BPF_MAXBUFSIZE;
703                         else if (size < BPF_MINBUFSIZE)
704                                 *(u_int *)addr = size = BPF_MINBUFSIZE;
705                         d->bd_bufsize = size;
706                 }
707 #endif
708                 break;
709
710         /*
711          * Set link layer read filter.
712          */
713         case BIOCSETF:
714                 error = bpf_setf(d, (struct bpf_program *)addr);
715                 break;
716
717         /*
718          * Flush read packet buffer.
719          */
720         case BIOCFLUSH:
721                 s = splimp();
722                 reset_d(d);
723                 splx(s);
724                 break;
725
726         /*
727          * Put interface into promiscuous mode.
728          */
729         case BIOCPROMISC:
730                 if (d->bd_bif == 0) {
731                         /*
732                          * No interface attached yet.
733                          */
734                         error = EINVAL;
735                         break;
736                 }
737                 s = splimp();
738                 if (d->bd_promisc == 0) {
739                         error = ifpromisc(d->bd_bif->bif_ifp, 1);
740                         if (error == 0)
741                                 d->bd_promisc = 1;
742                 }
743                 splx(s);
744                 break;
745
746         /*
747          * Get device parameters.
748          */
749         case BIOCGDLT:
750                 if (d->bd_bif == 0)
751                         error = EINVAL;
752                 else
753                         *(u_int *)addr = d->bd_bif->bif_dlt;
754                 break;
755
756         /*
757          * Set interface name.
758          */
759         case BIOCGETIF:
760                 if (d->bd_bif == 0)
761                         error = EINVAL;
762                 else
763                         bpf_ifname(d->bd_bif->bif_ifp, (struct ifreq *)addr);
764                 break;
765
766         /*
767          * Set interface.
768          */
769         case BIOCSETIF:
770                 error = bpf_setif(d, (struct ifreq *)addr);
771                 break;
772
773         /*
774          * Set read timeout.
775          */
776         case BIOCSRTIMEOUT:
777                 {
778                         struct timeval *tv = (struct timeval *)addr;
779
780                         /*
781                          * Subtract 1 tick from tvtohz() since this isn't
782                          * a one-shot timer.
783                          */
784                         if ((error = itimerfix(tv)) == 0)
785                                 d->bd_rtout = tvtohz(tv) - 1;
786                         break;
787                 }
788
789         /*
790          * Get read timeout.
791          */
792         case BIOCGRTIMEOUT:
793                 {
794                         struct timeval *tv = (struct timeval *)addr;
795
796                         tv->tv_sec = d->bd_rtout / hz;
797                         tv->tv_usec = (d->bd_rtout % hz) * tick;
798                         break;
799                 }
800
801         /*
802          * Get packet stats.
803          */
804         case BIOCGSTATS:
805                 {
806                         struct bpf_stat *bs = (struct bpf_stat *)addr;
807
808                         bs->bs_recv = d->bd_rcount;
809                         bs->bs_drop = d->bd_dcount;
810                         break;
811                 }
812
813         /*
814          * Set immediate mode.
815          */
816         case BIOCIMMEDIATE:
817                 d->bd_immediate = *(u_int *)addr;
818                 break;
819
820         case BIOCVERSION:
821                 {
822                         struct bpf_version *bv = (struct bpf_version *)addr;
823
824                         bv->bv_major = BPF_MAJOR_VERSION;
825                         bv->bv_minor = BPF_MINOR_VERSION;
826                         break;
827                 }
828
829         case FIONBIO:           /* Non-blocking I/O */
830                 break;
831
832         case FIOASYNC:          /* Send signal on receive packets */
833                 d->bd_async = *(int *)addr;
834                 break;
835
836         case FIOSETOWN:
837                 error = fsetown(*(int *)addr, &d->bd_sigio);
838                 break;
839
840         case FIOGETOWN:
841                 *(int *)addr = fgetown(d->bd_sigio);
842                 break;
843
844         /* This is deprecated, FIOSETOWN should be used instead. */
845         case TIOCSPGRP:
846                 error = fsetown(-(*(int *)addr), &d->bd_sigio);
847                 break;
848
849         /* This is deprecated, FIOGETOWN should be used instead. */
850         case TIOCGPGRP:
851                 *(int *)addr = -fgetown(d->bd_sigio);
852                 break;
853
854         case BIOCSRSIG:         /* Set receive signal */
855                 {
856                         u_int sig;
857
858                         sig = *(u_int *)addr;
859
860                         if (sig >= NSIG)
861                                 error = EINVAL;
862                         else
863                                 d->bd_sig = sig;
864                         break;
865                 }
866         case BIOCGRSIG:
867                 *(u_int *)addr = d->bd_sig;
868                 break;
869         }
870         return (error);
871 }
872
873 /*
874  * Set d's packet filter program to fp.  If this file already has a filter,
875  * free it and replace it.  Returns EINVAL for bogus requests.
876  */
877 static int
878 bpf_setf(d, fp)
879         struct bpf_d *d;
880         struct bpf_program *fp;
881 {
882         struct bpf_insn *fcode, *old;
883         u_int flen, size;
884         int s;
885
886         old = d->bd_filter;
887         if (fp->bf_insns == 0) {
888                 if (fp->bf_len != 0)
889                         return (EINVAL);
890                 s = splimp();
891                 d->bd_filter = 0;
892                 reset_d(d);
893                 splx(s);
894                 if (old != 0)
895                         free((caddr_t)old, M_DEVBUF);
896                 return (0);
897         }
898         flen = fp->bf_len;
899         if (flen > BPF_MAXINSNS)
900                 return (EINVAL);
901
902         size = flen * sizeof(*fp->bf_insns);
903         fcode = (struct bpf_insn *)malloc(size, M_DEVBUF, M_WAITOK);
904         if (copyin((caddr_t)fp->bf_insns, (caddr_t)fcode, size) == 0 &&
905             bpf_validate(fcode, (int)flen)) {
906                 s = splimp();
907                 d->bd_filter = fcode;
908                 reset_d(d);
909                 splx(s);
910                 if (old != 0)
911                         free((caddr_t)old, M_DEVBUF);
912
913                 return (0);
914         }
915         free((caddr_t)fcode, M_DEVBUF);
916         return (EINVAL);
917 }
918
919 /*
920  * Detach a file from its current interface (if attached at all) and attach
921  * to the interface indicated by the name stored in ifr.
922  * Return an errno or 0.
923  */
924 static int
925 bpf_setif(d, ifr)
926         struct bpf_d *d;
927         struct ifreq *ifr;
928 {
929         struct bpf_if *bp;
930         int s, error;
931         struct ifnet *theywant;
932
933         theywant = ifunit(ifr->ifr_name);
934         if (theywant == 0)
935                 return ENXIO;
936
937         /*
938          * Look through attached interfaces for the named one.
939          */
940         for (bp = bpf_iflist; bp != 0; bp = bp->bif_next) {
941                 struct ifnet *ifp = bp->bif_ifp;
942
943                 if (ifp == 0 || ifp != theywant)
944                         continue;
945                 /*
946                  * We found the requested interface.
947                  * If it's not up, return an error.
948                  * Allocate the packet buffers if we need to.
949                  * If we're already attached to requested interface,
950                  * just flush the buffer.
951                  */
952                 if ((ifp->if_flags & IFF_UP) == 0)
953                         return (ENETDOWN);
954
955                 if (d->bd_sbuf == 0) {
956                         error = bpf_allocbufs(d);
957                         if (error != 0)
958                                 return (error);
959                 }
960                 s = splimp();
961                 if (bp != d->bd_bif) {
962                         if (d->bd_bif)
963                                 /*
964                                  * Detach if attached to something else.
965                                  */
966                                 bpf_detachd(d);
967
968                         bpf_attachd(d, bp);
969                 }
970                 reset_d(d);
971                 splx(s);
972                 return (0);
973         }
974         /* Not found. */
975         return (ENXIO);
976 }
977
978 /*
979  * Convert an interface name plus unit number of an ifp to a single
980  * name which is returned in the ifr.
981  */
982 static void
983 bpf_ifname(ifp, ifr)
984         struct ifnet *ifp;
985         struct ifreq *ifr;
986 {
987         char *s = ifp->if_name;
988         char *d = ifr->ifr_name;
989
990         while ((*d++ = *s++) != 0)
991                 continue;
992         d--; /* back to the null */
993         /* XXX Assume that unit number is less than 10. */
994         *d++ = ifp->if_unit + '0';
995         *d = '\0';
996 }
997
998 /*
999  * Support for select() and poll() system calls
1000  *
1001  * Return true iff the specific operation will not block indefinitely.
1002  * Otherwise, return false but make a note that a selwakeup() must be done.
1003  */
1004 int
1005 bpfpoll(dev, events, p)
1006         register dev_t dev;
1007         int events;
1008         struct proc *p;
1009 {
1010         register struct bpf_d *d;
1011         register int s;
1012         int revents = 0;
1013
1014         /*
1015          * An imitation of the FIONREAD ioctl code.
1016          */
1017         d = &bpf_dtab[minor(dev)];
1018
1019         s = splimp();
1020         if (events & (POLLIN | POLLRDNORM)) {
1021                 if (d->bd_hlen != 0 || (d->bd_immediate && d->bd_slen != 0))
1022                         revents |= events & (POLLIN | POLLRDNORM);
1023                 else
1024                         selrecord(p, &d->bd_sel);
1025         }
1026         splx(s);
1027         return (revents);
1028 }
1029
1030 /*
1031  * Incoming linkage from device drivers.  Process the packet pkt, of length
1032  * pktlen, which is stored in a contiguous buffer.  The packet is parsed
1033  * by each process' filter, and if accepted, stashed into the corresponding
1034  * buffer.
1035  */
1036 void
1037 bpf_tap(ifp, pkt, pktlen)
1038         struct ifnet *ifp;
1039         register u_char *pkt;
1040         register u_int pktlen;
1041 {
1042         struct bpf_if *bp;
1043         register struct bpf_d *d;
1044         register u_int slen;
1045         /*
1046          * Note that the ipl does not have to be raised at this point.
1047          * The only problem that could arise here is that if two different
1048          * interfaces shared any data.  This is not the case.
1049          */
1050         bp = ifp->if_bpf;
1051         for (d = bp->bif_dlist; d != 0; d = d->bd_next) {
1052                 ++d->bd_rcount;
1053                 slen = bpf_filter(d->bd_filter, pkt, pktlen, pktlen);
1054                 if (slen != 0)
1055                         catchpacket(d, pkt, pktlen, slen, bcopy);
1056         }
1057 }
1058
1059 /*
1060  * Copy data from an mbuf chain into a buffer.  This code is derived
1061  * from m_copydata in sys/uipc_mbuf.c.
1062  */
1063 static void
1064 bpf_mcopy(src_arg, dst_arg, len)
1065         const void *src_arg;
1066         void *dst_arg;
1067         register size_t len;
1068 {
1069         register const struct mbuf *m;
1070         register u_int count;
1071         u_char *dst;
1072
1073         m = src_arg;
1074         dst = dst_arg;
1075         while (len > 0) {
1076                 if (m == 0)
1077                         panic("bpf_mcopy");
1078                 count = min(m->m_len, len);
1079                 bcopy(mtod(m, void *), dst, count);
1080                 m = m->m_next;
1081                 dst += count;
1082                 len -= count;
1083         }
1084 }
1085
1086 /*
1087  * Incoming linkage from device drivers, when packet is in an mbuf chain.
1088  */
1089 void
1090 bpf_mtap(ifp, m)
1091         struct ifnet *ifp;
1092         struct mbuf *m;
1093 {
1094         struct bpf_if *bp = ifp->if_bpf;
1095         struct bpf_d *d;
1096         u_int pktlen, slen;
1097         struct mbuf *m0;
1098
1099         pktlen = 0;
1100         for (m0 = m; m0 != 0; m0 = m0->m_next)
1101                 pktlen += m0->m_len;
1102
1103         for (d = bp->bif_dlist; d != 0; d = d->bd_next) {
1104                 ++d->bd_rcount;
1105                 slen = bpf_filter(d->bd_filter, (u_char *)m, pktlen, 0);
1106                 if (slen != 0)
1107                         catchpacket(d, (u_char *)m, pktlen, slen, bpf_mcopy);
1108         }
1109 }
1110
1111 /*
1112  * Move the packet data from interface memory (pkt) into the
1113  * store buffer.  Return 1 if it's time to wakeup a listener (buffer full),
1114  * otherwise 0.  "copy" is the routine called to do the actual data
1115  * transfer.  bcopy is passed in to copy contiguous chunks, while
1116  * bpf_mcopy is passed in to copy mbuf chains.  In the latter case,
1117  * pkt is really an mbuf.
1118  */
1119 static void
1120 catchpacket(d, pkt, pktlen, snaplen, cpfn)
1121         register struct bpf_d *d;
1122         register u_char *pkt;
1123         register u_int pktlen, snaplen;
1124         register void (*cpfn) __P((const void *, void *, size_t));
1125 {
1126         register struct bpf_hdr *hp;
1127         register int totlen, curlen;
1128         register int hdrlen = d->bd_bif->bif_hdrlen;
1129         /*
1130          * Figure out how many bytes to move.  If the packet is
1131          * greater or equal to the snapshot length, transfer that
1132          * much.  Otherwise, transfer the whole packet (unless
1133          * we hit the buffer size limit).
1134          */
1135         totlen = hdrlen + min(snaplen, pktlen);
1136         if (totlen > d->bd_bufsize)
1137                 totlen = d->bd_bufsize;
1138
1139         /*
1140          * Round up the end of the previous packet to the next longword.
1141          */
1142         curlen = BPF_WORDALIGN(d->bd_slen);
1143         if (curlen + totlen > d->bd_bufsize) {
1144                 /*
1145                  * This packet will overflow the storage buffer.
1146                  * Rotate the buffers if we can, then wakeup any
1147                  * pending reads.
1148                  */
1149                 if (d->bd_fbuf == 0) {
1150                         /*
1151                          * We haven't completed the previous read yet,
1152                          * so drop the packet.
1153                          */
1154                         ++d->bd_dcount;
1155                         return;
1156                 }
1157                 ROTATE_BUFFERS(d);
1158                 bpf_wakeup(d);
1159                 curlen = 0;
1160         }
1161         else if (d->bd_immediate)
1162                 /*
1163                  * Immediate mode is set.  A packet arrived so any
1164                  * reads should be woken up.
1165                  */
1166                 bpf_wakeup(d);
1167
1168         /*
1169          * Append the bpf header.
1170          */
1171         hp = (struct bpf_hdr *)(d->bd_sbuf + curlen);
1172 #if BSD >= 199103
1173         microtime(&hp->bh_tstamp);
1174 #elif defined(sun)
1175         uniqtime(&hp->bh_tstamp);
1176 #else
1177         hp->bh_tstamp = time;
1178 #endif
1179         hp->bh_datalen = pktlen;
1180         hp->bh_hdrlen = hdrlen;
1181         /*
1182          * Copy the packet data into the store buffer and update its length.
1183          */
1184         (*cpfn)(pkt, (u_char *)hp + hdrlen, (hp->bh_caplen = totlen - hdrlen));
1185         d->bd_slen = curlen + totlen;
1186 }
1187
1188 /*
1189  * Initialize all nonzero fields of a descriptor.
1190  */
1191 static int
1192 bpf_allocbufs(d)
1193         register struct bpf_d *d;
1194 {
1195         d->bd_fbuf = (caddr_t)malloc(d->bd_bufsize, M_DEVBUF, M_WAITOK);
1196         if (d->bd_fbuf == 0)
1197                 return (ENOBUFS);
1198
1199         d->bd_sbuf = (caddr_t)malloc(d->bd_bufsize, M_DEVBUF, M_WAITOK);
1200         if (d->bd_sbuf == 0) {
1201                 free(d->bd_fbuf, M_DEVBUF);
1202                 return (ENOBUFS);
1203         }
1204         d->bd_slen = 0;
1205         d->bd_hlen = 0;
1206         return (0);
1207 }
1208
1209 /*
1210  * Free buffers currently in use by a descriptor.
1211  * Called on close.
1212  */
1213 static void
1214 bpf_freed(d)
1215         register struct bpf_d *d;
1216 {
1217         /*
1218          * We don't need to lock out interrupts since this descriptor has
1219          * been detached from its interface and it yet hasn't been marked
1220          * free.
1221          */
1222         if (d->bd_sbuf != 0) {
1223                 free(d->bd_sbuf, M_DEVBUF);
1224                 if (d->bd_hbuf != 0)
1225                         free(d->bd_hbuf, M_DEVBUF);
1226                 if (d->bd_fbuf != 0)
1227                         free(d->bd_fbuf, M_DEVBUF);
1228         }
1229         if (d->bd_filter)
1230                 free((caddr_t)d->bd_filter, M_DEVBUF);
1231
1232         D_MARKFREE(d);
1233 }
1234
1235 /*
1236  * Attach an interface to bpf.  driverp is a pointer to a (struct bpf_if *)
1237  * in the driver's softc; dlt is the link layer type; hdrlen is the fixed
1238  * size of the link header (variable length headers not yet supported).
1239  */
1240 void
1241 bpfattach(ifp, dlt, hdrlen)
1242         struct ifnet *ifp;
1243         u_int dlt, hdrlen;
1244 {
1245         struct bpf_if *bp;
1246         int i;
1247         bp = (struct bpf_if *)malloc(sizeof(*bp), M_DEVBUF, M_DONTWAIT);
1248         if (bp == 0)
1249                 panic("bpfattach");
1250
1251         bp->bif_dlist = 0;
1252         bp->bif_ifp = ifp;
1253         bp->bif_dlt = dlt;
1254
1255         bp->bif_next = bpf_iflist;
1256         bpf_iflist = bp;
1257
1258         bp->bif_ifp->if_bpf = 0;
1259
1260         /*
1261          * Compute the length of the bpf header.  This is not necessarily
1262          * equal to SIZEOF_BPF_HDR because we want to insert spacing such
1263          * that the network layer header begins on a longword boundary (for
1264          * performance reasons and to alleviate alignment restrictions).
1265          */
1266         bp->bif_hdrlen = BPF_WORDALIGN(hdrlen + SIZEOF_BPF_HDR) - hdrlen;
1267
1268         /*
1269          * Mark all the descriptors free if this hasn't been done.
1270          */
1271         if (!bpf_dtab_init) {
1272                 for (i = 0; i < NBPFILTER; ++i)
1273                         D_MARKFREE(&bpf_dtab[i]);
1274                 bpf_dtab_init = 1;
1275         }
1276
1277         if (bootverbose)
1278                 printf("bpf: %s%d attached\n", ifp->if_name, ifp->if_unit);
1279 }
1280
1281 #ifdef DEVFS
1282 static  void *bpf_devfs_token[NBPFILTER];
1283 #endif
1284
1285 static  int bpf_devsw_installed;
1286
1287 static void bpf_drvinit __P((void *unused));
1288 static void
1289 bpf_drvinit(unused)
1290         void *unused;
1291 {
1292         dev_t dev;
1293 #ifdef DEVFS
1294         int i;
1295 #endif
1296
1297         if( ! bpf_devsw_installed ) {
1298                 dev = makedev(CDEV_MAJOR, 0);
1299                 cdevsw_add(&dev,&bpf_cdevsw, NULL);
1300                 bpf_devsw_installed = 1;
1301 #ifdef DEVFS
1302
1303                 for ( i = 0 ; i < NBPFILTER ; i++ ) {
1304                         bpf_devfs_token[i] =
1305                                 devfs_add_devswf(&bpf_cdevsw, i, DV_CHR, 0, 0, 
1306                                                  0600, "bpf%d", i);
1307                 }
1308 #endif
1309         }
1310 }
1311
1312 SYSINIT(bpfdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,bpf_drvinit,NULL)
1313
1314 #else /* !BPFILTER */
1315 /*
1316  * NOP stubs to allow bpf-using drivers to load and function.
1317  *
1318  * A 'better' implementation would allow the core bpf functionality
1319  * to be loaded at runtime.
1320  */
1321
1322 void
1323 bpf_tap(ifp, pkt, pktlen)
1324         struct ifnet *ifp;
1325         register u_char *pkt;
1326         register u_int pktlen;
1327 {
1328 }
1329
1330 void
1331 bpf_mtap(ifp, m)
1332         struct ifnet *ifp;
1333         struct mbuf *m;
1334 {
1335 }
1336
1337 void
1338 bpfattach(ifp, dlt, hdrlen)
1339         struct ifnet *ifp;
1340         u_int dlt, hdrlen;
1341 {
1342 }
1343
1344 u_int
1345 bpf_filter(pc, p, wirelen, buflen)
1346         register struct bpf_insn *pc;
1347         register u_char *p;
1348         u_int wirelen;
1349         register u_int buflen;
1350 {
1351         return -1;      /* "no filter" behaviour */
1352 }
1353
1354 #endif