]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/net/bpf.c
This commit was generated by cvs2svn to compensate for changes in r41118,
[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.44 1998/10/08 00:32:08 alex Exp $
41  */
42
43 #include "bpfilter.h"
44
45 #if NBPFILTER > 0
46
47 #ifndef __GNUC__
48 #define inline
49 #else
50 #define inline __inline
51 #endif
52
53 #include <sys/param.h>
54 #include <sys/systm.h>
55 #include <sys/conf.h>
56 #include <sys/malloc.h>
57 #include <sys/mbuf.h>
58 #include <sys/time.h>
59 #include <sys/proc.h>
60 #include <sys/signalvar.h>
61 #include <sys/filio.h>
62 #include <sys/sockio.h>
63 #include <sys/ttycom.h>
64 #include <sys/filedesc.h>
65
66 #if defined(sparc) && BSD < 199103
67 #include <sys/stream.h>
68 #endif
69 #include <sys/poll.h>
70
71 #include <sys/socket.h>
72 #include <sys/vnode.h>
73
74 #include <net/if.h>
75 #include <net/bpf.h>
76 #include <net/bpfdesc.h>
77
78 #include <netinet/in.h>
79 #include <netinet/if_ether.h>
80 #include <sys/kernel.h>
81 #include <sys/sysctl.h>
82
83 #include "opt_devfs.h"
84
85 #ifdef DEVFS
86 #include <sys/devfsext.h>
87 #endif /*DEVFS*/
88
89
90 /*
91  * Older BSDs don't have kernel malloc.
92  */
93 #if BSD < 199103
94 extern bcopy();
95 static caddr_t bpf_alloc();
96 #include <net/bpf_compat.h>
97 #define BPF_BUFSIZE (MCLBYTES-8)
98 #define UIOMOVE(cp, len, code, uio) uiomove(cp, len, code, uio)
99 #else
100 #define BPF_BUFSIZE 4096
101 #define UIOMOVE(cp, len, code, uio) uiomove(cp, len, uio)
102 #endif
103
104 #define PRINET  26                      /* interruptible */
105
106 /*
107  * The default read buffer size is patchable.
108  */
109 static int bpf_bufsize = BPF_BUFSIZE;
110 SYSCTL_INT(_debug, OID_AUTO, bpf_bufsize, CTLFLAG_RW, 
111         &bpf_bufsize, 0, "");
112
113 /*
114  *  bpf_iflist is the list of interfaces; each corresponds to an ifnet
115  *  bpf_dtab holds the descriptors, indexed by minor device #
116  */
117 static struct bpf_if    *bpf_iflist;
118 static struct bpf_d     bpf_dtab[NBPFILTER];
119 static int              bpf_dtab_init;
120
121 static int      bpf_allocbufs __P((struct bpf_d *));
122 static void     bpf_attachd __P((struct bpf_d *d, struct bpf_if *bp));
123 static void     bpf_detachd __P((struct bpf_d *d));
124 static void     bpf_freed __P((struct bpf_d *));
125 static void     bpf_ifname __P((struct ifnet *, struct ifreq *));
126 static void     bpf_mcopy __P((const void *, void *, size_t));
127 static int      bpf_movein __P((struct uio *, int,
128                     struct mbuf **, struct sockaddr *, int *));
129 static int      bpf_setif __P((struct bpf_d *, struct ifreq *));
130 static inline void
131                 bpf_wakeup __P((struct bpf_d *));
132 static void     catchpacket __P((struct bpf_d *, u_char *, u_int,
133                     u_int, void (*)(const void *, void *, size_t)));
134 static void     reset_d __P((struct bpf_d *));
135 static int       bpf_setf __P((struct bpf_d *, struct bpf_program *));
136
137 static  d_open_t        bpfopen;
138 static  d_close_t       bpfclose;
139 static  d_read_t        bpfread;
140 static  d_write_t       bpfwrite;
141 static  d_ioctl_t       bpfioctl;
142 static  d_poll_t        bpfpoll;
143
144 #define CDEV_MAJOR 23
145 static struct cdevsw bpf_cdevsw = 
146         { bpfopen,      bpfclose,       bpfread,        bpfwrite,       /*23*/
147           bpfioctl,     nostop,         nullreset,      nodevtotty,/* bpf */
148           bpfpoll,      nommap,         NULL,   "bpf",  NULL,   -1 };
149
150
151 static int
152 bpf_movein(uio, linktype, mp, sockp, datlen)
153         register struct uio *uio;
154         int linktype, *datlen;
155         register struct mbuf **mp;
156         register struct sockaddr *sockp;
157 {
158         struct mbuf *m;
159         int error;
160         int len;
161         int hlen;
162
163         /*
164          * Build a sockaddr based on the data link layer type.
165          * We do this at this level because the ethernet header
166          * is copied directly into the data field of the sockaddr.
167          * In the case of SLIP, there is no header and the packet
168          * is forwarded as is.
169          * Also, we are careful to leave room at the front of the mbuf
170          * for the link level header.
171          */
172         switch (linktype) {
173
174         case DLT_SLIP:
175                 sockp->sa_family = AF_INET;
176                 hlen = 0;
177                 break;
178
179         case DLT_EN10MB:
180                 sockp->sa_family = AF_UNSPEC;
181                 /* XXX Would MAXLINKHDR be better? */
182                 hlen = sizeof(struct ether_header);
183                 break;
184
185         case DLT_FDDI:
186 #if defined(__FreeBSD__) || defined(__bsdi__)
187                 sockp->sa_family = AF_IMPLINK;
188                 hlen = 0;
189 #else
190                 sockp->sa_family = AF_UNSPEC;
191                 /* XXX 4(FORMAC)+6(dst)+6(src)+3(LLC)+5(SNAP) */
192                 hlen = 24;
193 #endif
194                 break;
195
196         case DLT_RAW:
197         case DLT_NULL:
198                 sockp->sa_family = AF_UNSPEC;
199                 hlen = 0;
200                 break;
201
202 #ifdef __FreeBSD__
203         case DLT_ATM_RFC1483:
204                 /*
205                  * en atm driver requires 4-byte atm pseudo header.
206                  * though it isn't standard, vpi:vci needs to be
207                  * specified anyway.
208                  */
209                 sockp->sa_family = AF_UNSPEC;
210                 hlen = 12;      /* XXX 4(ATM_PH) + 3(LLC) + 5(SNAP) */
211                 break;
212 #endif
213
214         default:
215                 return (EIO);
216         }
217
218         len = uio->uio_resid;
219         *datlen = len - hlen;
220         if ((unsigned)len > MCLBYTES)
221                 return (EIO);
222
223         MGETHDR(m, M_WAIT, MT_DATA);
224         if (m == 0)
225                 return (ENOBUFS);
226         if (len > MHLEN) {
227 #if BSD >= 199103
228                 MCLGET(m, M_WAIT);
229                 if ((m->m_flags & M_EXT) == 0) {
230 #else
231                 MCLGET(m);
232                 if (m->m_len != MCLBYTES) {
233 #endif
234                         error = ENOBUFS;
235                         goto bad;
236                 }
237         }
238         m->m_pkthdr.len = m->m_len = len;
239         m->m_pkthdr.rcvif = NULL;
240         *mp = m;
241         /*
242          * Make room for link header.
243          */
244         if (hlen != 0) {
245                 m->m_pkthdr.len -= hlen;
246                 m->m_len -= hlen;
247 #if BSD >= 199103
248                 m->m_data += hlen; /* XXX */
249 #else
250                 m->m_off += hlen;
251 #endif
252                 error = UIOMOVE((caddr_t)sockp->sa_data, hlen, UIO_WRITE, uio);
253                 if (error)
254                         goto bad;
255         }
256         error = UIOMOVE(mtod(m, caddr_t), len - hlen, UIO_WRITE, uio);
257         if (!error)
258                 return (0);
259  bad:
260         m_freem(m);
261         return (error);
262 }
263
264 /*
265  * Attach file to the bpf interface, i.e. make d listen on bp.
266  * Must be called at splimp.
267  */
268 static void
269 bpf_attachd(d, bp)
270         struct bpf_d *d;
271         struct bpf_if *bp;
272 {
273         /*
274          * Point d at bp, and add d to the interface's list of listeners.
275          * Finally, point the driver's bpf cookie at the interface so
276          * it will divert packets to bpf.
277          */
278         d->bd_bif = bp;
279         d->bd_next = bp->bif_dlist;
280         bp->bif_dlist = d;
281
282         bp->bif_ifp->if_bpf = bp;
283 }
284
285 /*
286  * Detach a file from its interface.
287  */
288 static void
289 bpf_detachd(d)
290         struct bpf_d *d;
291 {
292         struct bpf_d **p;
293         struct bpf_if *bp;
294
295         bp = d->bd_bif;
296         /*
297          * Check if this descriptor had requested promiscuous mode.
298          * If so, turn it off.
299          */
300         if (d->bd_promisc) {
301                 d->bd_promisc = 0;
302                 if (ifpromisc(bp->bif_ifp, 0))
303                         /*
304                          * Something is really wrong if we were able to put
305                          * the driver into promiscuous mode, but can't
306                          * take it out.
307                          */
308                         panic("bpf: ifpromisc failed");
309         }
310         /* Remove d from the interface's descriptor list. */
311         p = &bp->bif_dlist;
312         while (*p != d) {
313                 p = &(*p)->bd_next;
314                 if (*p == 0)
315                         panic("bpf_detachd: descriptor not in list");
316         }
317         *p = (*p)->bd_next;
318         if (bp->bif_dlist == 0)
319                 /*
320                  * Let the driver know that there are no more listeners.
321                  */
322                 d->bd_bif->bif_ifp->if_bpf = 0;
323         d->bd_bif = 0;
324 }
325
326
327 /*
328  * Mark a descriptor free by making it point to itself.
329  * This is probably cheaper than marking with a constant since
330  * the address should be in a register anyway.
331  */
332 #define D_ISFREE(d) ((d) == (d)->bd_next)
333 #define D_MARKFREE(d) ((d)->bd_next = (d))
334 #define D_MARKUSED(d) ((d)->bd_next = 0)
335
336 /*
337  * Open ethernet device.  Returns ENXIO for illegal minor device number,
338  * EBUSY if file is open by another process.
339  */
340 /* ARGSUSED */
341 static  int
342 bpfopen(dev, flags, fmt, p)
343         dev_t dev;
344         int flags;
345         int fmt;
346         struct proc *p;
347 {
348         register struct bpf_d *d;
349
350         if (minor(dev) >= NBPFILTER)
351                 return (ENXIO);
352         /*
353          * Each minor can be opened by only one process.  If the requested
354          * minor is in use, return EBUSY.
355          */
356         d = &bpf_dtab[minor(dev)];
357         if (!D_ISFREE(d))
358                 return (EBUSY);
359
360         /* Mark "free" and do most initialization. */
361         bzero((char *)d, sizeof(*d));
362         d->bd_bufsize = bpf_bufsize;
363         d->bd_sig = SIGIO;
364
365         return (0);
366 }
367
368 /*
369  * Close the descriptor by detaching it from its interface,
370  * deallocating its buffers, and marking it free.
371  */
372 /* ARGSUSED */
373 static  int
374 bpfclose(dev, flags, fmt, p)
375         dev_t dev;
376         int flags;
377         int fmt;
378         struct proc *p;
379 {
380         register struct bpf_d *d = &bpf_dtab[minor(dev)];
381         register int s;
382
383         funsetown(d->bd_sigio);
384         s = splimp();
385         if (d->bd_bif)
386                 bpf_detachd(d);
387         splx(s);
388         bpf_freed(d);
389
390         return (0);
391 }
392
393 /*
394  * Support for SunOS, which does not have tsleep.
395  */
396 #if BSD < 199103
397 static
398 bpf_timeout(arg)
399         caddr_t arg;
400 {
401         struct bpf_d *d = (struct bpf_d *)arg;
402         d->bd_timedout = 1;
403         wakeup(arg);
404 }
405
406 #define BPF_SLEEP(chan, pri, s, t) bpf_sleep((struct bpf_d *)chan)
407
408 int
409 bpf_sleep(d)
410         register struct bpf_d *d;
411 {
412         register int rto = d->bd_rtout;
413         register int st;
414
415         if (rto != 0) {
416                 d->bd_timedout = 0;
417                 timeout(bpf_timeout, (caddr_t)d, rto);
418         }
419         st = sleep((caddr_t)d, PRINET|PCATCH);
420         if (rto != 0) {
421                 if (d->bd_timedout == 0)
422                         untimeout(bpf_timeout, (caddr_t)d);
423                 else if (st == 0)
424                         return EWOULDBLOCK;
425         }
426         return (st != 0) ? EINTR : 0;
427 }
428 #else
429 #define BPF_SLEEP tsleep
430 #endif
431
432 /*
433  * Rotate the packet buffers in descriptor d.  Move the store buffer
434  * into the hold slot, and the free buffer into the store slot.
435  * Zero the length of the new store buffer.
436  */
437 #define ROTATE_BUFFERS(d) \
438         (d)->bd_hbuf = (d)->bd_sbuf; \
439         (d)->bd_hlen = (d)->bd_slen; \
440         (d)->bd_sbuf = (d)->bd_fbuf; \
441         (d)->bd_slen = 0; \
442         (d)->bd_fbuf = 0;
443 /*
444  *  bpfread - read next chunk of packets from buffers
445  */
446 static  int
447 bpfread(dev, uio, ioflag)
448         dev_t dev;
449         register struct uio *uio;
450         int ioflag;
451 {
452         register struct bpf_d *d = &bpf_dtab[minor(dev)];
453         int error;
454         int s;
455
456         /*
457          * Restrict application to use a buffer the same size as
458          * as kernel buffers.
459          */
460         if (uio->uio_resid != d->bd_bufsize)
461                 return (EINVAL);
462
463         s = splimp();
464         /*
465          * If the hold buffer is empty, then do a timed sleep, which
466          * ends when the timeout expires or when enough packets
467          * have arrived to fill the store buffer.
468          */
469         while (d->bd_hbuf == 0) {
470                 if (d->bd_immediate && d->bd_slen != 0) {
471                         /*
472                          * A packet(s) either arrived since the previous
473                          * read or arrived while we were asleep.
474                          * Rotate the buffers and return what's here.
475                          */
476                         ROTATE_BUFFERS(d);
477                         break;
478                 }
479                 if (ioflag & IO_NDELAY)
480                         error = EWOULDBLOCK;
481                 else
482                         error = BPF_SLEEP((caddr_t)d, PRINET|PCATCH, "bpf",
483                                           d->bd_rtout);
484                 if (error == EINTR || error == ERESTART) {
485                         splx(s);
486                         return (error);
487                 }
488                 if (error == EWOULDBLOCK) {
489                         /*
490                          * On a timeout, return what's in the buffer,
491                          * which may be nothing.  If there is something
492                          * in the store buffer, we can rotate the buffers.
493                          */
494                         if (d->bd_hbuf)
495                                 /*
496                                  * We filled up the buffer in between
497                                  * getting the timeout and arriving
498                                  * here, so we don't need to rotate.
499                                  */
500                                 break;
501
502                         if (d->bd_slen == 0) {
503                                 splx(s);
504                                 return (0);
505                         }
506                         ROTATE_BUFFERS(d);
507                         break;
508                 }
509         }
510         /*
511          * At this point, we know we have something in the hold slot.
512          */
513         splx(s);
514
515         /*
516          * Move data from hold buffer into user space.
517          * We know the entire buffer is transferred since
518          * we checked above that the read buffer is bpf_bufsize bytes.
519          */
520         error = UIOMOVE(d->bd_hbuf, d->bd_hlen, UIO_READ, uio);
521
522         s = splimp();
523         d->bd_fbuf = d->bd_hbuf;
524         d->bd_hbuf = 0;
525         d->bd_hlen = 0;
526         splx(s);
527
528         return (error);
529 }
530
531
532 /*
533  * If there are processes sleeping on this descriptor, wake them up.
534  */
535 static inline void
536 bpf_wakeup(d)
537         register struct bpf_d *d;
538 {
539         struct proc *p;
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++)
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 #endif