bpf.c revision 1.1 1 /*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * 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 of Lawrence Berkeley Laboratory.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by the University of
20 * California, Berkeley and its contributors.
21 * 4. Neither the name of the University nor the names of its contributors
22 * may be used to endorse or promote products derived from this software
23 * without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 *
37 * @(#)bpf.c 7.4 (Berkeley) 6/17/91
38 *
39 * static char rcsid[] =
40 * "$Header: /tank/opengrok/rsync2/NetBSD/src/sys/net/bpf.c,v 1.1 1993/03/21 09:45:37 cgd Exp $";
41 */
42
43 #include "bpfilter.h"
44
45 #if (NBPFILTER > 0)
46
47 #include <sys/param.h>
48 #include <sys/systm.h>
49 #include <sys/mbuf.h>
50 #include <sys/buf.h>
51 #include <sys/dir.h>
52 #include <sys/proc.h>
53 #include <sys/user.h>
54 #include <sys/ioctl.h>
55
56 #include <sys/file.h>
57 #ifdef sparc
58 #include <sys/stream.h>
59 #endif
60 #include <sys/tty.h>
61 #include <sys/uio.h>
62
63 #include <sys/protosw.h>
64 #include <sys/socket.h>
65 #include <net/if.h>
66
67 #include <net/bpf.h>
68 #include <net/bpfdesc.h>
69
70 #include <sys/errno.h>
71
72 #include <netinet/in.h>
73 #include <netinet/if_ether.h>
74 #include <sys/kernel.h>
75
76 #define PRINET 26 /* interruptible */
77
78 /*
79 * The default read buffer size is patchable.
80 */
81 int bpf_bufsize = MCLBYTES;
82
83 /*
84 * bpf_iflist is the list of interfaces; each corresponds to an ifnet
85 * bpf_dtab holds the descriptors, indexed by minor device #
86 *
87 * We really don't need NBPFILTER bpf_if entries, but this eliminates
88 * the need to account for all possible drivers here.
89 * This problem will go away when these structures are allocated dynamically.
90 */
91 static struct bpf_if *bpf_iflist;
92 static struct bpf_d bpf_dtab[NBPFILTER];
93
94 static void bpf_ifname();
95 static void catchpacket();
96 static int bpf_setif();
97 static int bpf_initd();
98
99 static int
100 bpf_movein(uio, linktype, mp, sockp)
101 register struct uio *uio;
102 int linktype;
103 register struct mbuf **mp;
104 register struct sockaddr *sockp;
105 {
106 struct mbuf *m;
107 int error;
108 int len;
109 int hlen;
110
111 /*
112 * Build a sockaddr based on the data link layer type.
113 * We do this at this level because the ethernet header
114 * is copied directly into the data field of the sockaddr.
115 * In the case of SLIP, there is no header and the packet
116 * is forwarded as is.
117 * Also, we are careful to leave room at the front of the mbuf
118 * for the link level header.
119 */
120 switch (linktype) {
121 case DLT_SLIP:
122 sockp->sa_family = AF_INET;
123 hlen = 0;
124 break;
125
126 case DLT_EN10MB:
127 sockp->sa_family = AF_UNSPEC;
128 /* XXX Would MAXLINKHDR be better? */
129 hlen = sizeof(struct ether_header);
130 break;
131
132 case DLT_FDDI:
133 sockp->sa_family = AF_UNSPEC;
134 /* XXX 4(FORMAC)+6(dst)+6(src)+3(LLC)+5(SNAP) */
135 hlen = 24;
136 break;
137
138 default:
139 return (EIO);
140 }
141
142 len = uio->uio_resid;
143 if ((unsigned)len > MCLBYTES)
144 return (EIO);
145
146 MGET(m, M_WAIT, MT_DATA);
147 if (m == 0)
148 return (ENOBUFS);
149 if (len > MLEN) {
150 MCLGET(m, M_WAIT);
151 if ((m->m_flags & M_EXT) == 0) {
152 error = ENOBUFS;
153 goto bad;
154 }
155 }
156 m->m_len = len;
157 *mp = m;
158 /*
159 * Make room for link header.
160 */
161 if (hlen) {
162 m->m_len -= hlen;
163 m->m_data += hlen; /* XXX */
164
165 error = uiomove((caddr_t)sockp->sa_data, hlen, uio);
166 if (error)
167 goto bad;
168 }
169 error = uiomove(mtod(m, caddr_t), len - hlen, uio);
170 if (!error)
171 return (0);
172 bad:
173 m_freem(m);
174 return (error);
175 }
176
177 /*
178 * Attach 'd' to the bpf interface 'bp', i.e. make 'd' listen on 'bp'.
179 * Must be called at splimp.
180 */
181 static void
182 bpf_attachd(d, bp)
183 struct bpf_d *d;
184 struct bpf_if *bp;
185 {
186 /* Point d at bp. */
187 d->bd_bif = bp;
188
189 /* Add d to bp's list of listeners. */
190 d->bd_next = bp->bif_dlist;
191 bp->bif_dlist = d;
192
193 /*
194 * Let the driver know we're here (if it doesn't already).
195 */
196 *bp->bif_driverp = bp;
197 }
198
199 static void
200 bpf_detachd(d)
201 struct bpf_d *d;
202 {
203 struct bpf_d **p;
204 struct bpf_if *bp;
205
206 bp = d->bd_bif;
207 /*
208 * Check if this descriptor had requested promiscuous mode.
209 * If so, turn it off.
210 */
211 if (d->bd_promisc) {
212 d->bd_promisc = 0;
213 if (ifpromisc(bp->bif_ifp, 0))
214 /*
215 * Something is really wrong if we were able to put
216 * the driver into promiscuous mode, but can't
217 * take it out.
218 */
219 panic("bpf_detachd: ifpromisc failed");
220 }
221 /* Remove 'd' from the interface's descriptor list. */
222 p = &bp->bif_dlist;
223 while (*p != d) {
224 p = &(*p)->bd_next;
225 if (*p == 0)
226 panic("bpf_detachd: descriptor not in list");
227 }
228 *p = (*p)->bd_next;
229 if (bp->bif_dlist == 0)
230 /*
231 * Let the driver know that there are no more listeners.
232 */
233 *d->bd_bif->bif_driverp = 0;
234 d->bd_bif = 0;
235 }
236
237
238 /*
239 * Mark a descriptor free by making it point to itself.
240 * This is probably cheaper than marking with a constant since
241 * the address should be in a register anyway.
242 */
243 #define D_ISFREE(d) ((d) == (d)->bd_next)
244 #define D_MARKFREE(d) ((d)->bd_next = (d))
245 #define D_MARKUSED(d) ((d)->bd_next = 0)
246
247 /*
248 * bpfopen - open ethernet device
249 *
250 * Errors: ENXIO - illegal minor device number
251 * EBUSY - too many files open
252 */
253 /* ARGSUSED */
254 int
255 bpfopen(dev, flag)
256 dev_t dev;
257 int flag;
258 {
259 int error, s;
260 register struct bpf_d *d;
261
262 if (minor(dev) >= NBPFILTER)
263 return (ENXIO);
264
265 /*
266 * Each minor can be opened by only one process. If the requested
267 * minor is in use, return EBUSY.
268 */
269 s = splimp();
270 d = &bpf_dtab[minor(dev)];
271 if (!D_ISFREE(d)) {
272 splx(s);
273 return (EBUSY);
274 } else
275 /* Mark "free" and do most initialization. */
276 bzero((char *)d, sizeof(*d));
277 splx(s);
278
279 error = bpf_initd(d);
280 if (error) {
281 D_MARKFREE(d);
282 return (error);
283 }
284 return (0);
285 }
286
287 /*
288 * Close the descriptor by detaching it from its interface,
289 * deallocating its buffers, and marking it free.
290 */
291 /* ARGSUSED */
292 bpfclose(dev, flag)
293 dev_t dev;
294 int flag;
295 {
296 register struct bpf_d *d = &bpf_dtab[minor(dev)];
297 int s;
298
299 s = splimp();
300 if (d->bd_bif)
301 bpf_detachd(d);
302 splx(s);
303
304 /* Free the buffer space. */
305 if (d->bd_hbuf)
306 free(d->bd_hbuf, M_DEVBUF);
307 if (d->bd_fbuf)
308 free(d->bd_fbuf, M_DEVBUF);
309 free(d->bd_sbuf, M_DEVBUF);
310 if (d->bd_filter)
311 free((caddr_t)d->bd_filter, M_DEVBUF);
312
313 D_MARKFREE(d);
314 }
315
316 /*
317 * Rotate the packet buffers in descriptor d. Move the store buffer
318 * into the hold slot, and the free buffer into the store slot.
319 * Zero the length of the new store buffer.
320 */
321 #define ROTATE_BUFFERS(d) \
322 (d)->bd_hbuf = (d)->bd_sbuf; \
323 (d)->bd_hlen = (d)->bd_slen; \
324 (d)->bd_sbuf = (d)->bd_fbuf; \
325 (d)->bd_slen = 0; \
326 (d)->bd_fbuf = 0;
327 /*
328 * bpfread - read next chunk of packets from buffers
329 */
330 int
331 bpfread(dev, uio)
332 dev_t dev;
333 register struct uio *uio;
334 {
335 register struct bpf_d *d = &bpf_dtab[minor(dev)];
336 int error;
337 int s;
338
339 /*
340 * Restrict application to use a buffer the same size as
341 * as kernel buffers.
342 */
343 if (uio->uio_resid != d->bd_bufsize)
344 return (EINVAL);
345
346 s = splimp();
347 /*
348 * If the hold buffer is empty, then set a timer and sleep
349 * until either the timeout has occurred or enough packets have
350 * arrived to fill the store buffer.
351 */
352 while (d->bd_hbuf == 0) {
353 if (d->bd_immediate && d->bd_slen != 0) {
354 /*
355 * A packet(s) either arrived since the previous
356 * read or arrived while we were asleep.
357 * Rotate the buffers and return what's here.
358 */
359 ROTATE_BUFFERS(d);
360 break;
361 }
362 error = tsleep((caddr_t)d, PRINET|PCATCH, "bpf", d->bd_rtout);
363 if (error == EINTR || error == ERESTART) {
364 splx(s);
365 return (error);
366 }
367 if (error == EWOULDBLOCK) {
368 /*
369 * On a timeout, return what's in the buffer,
370 * which may be nothing. If there is something
371 * in the store buffer, we can rotate the buffers.
372 */
373 if (d->bd_hbuf)
374 /*
375 * We filled up the buffer in between
376 * getting the timeout and arriving
377 * here, so we don't need to rotate.
378 */
379 break;
380
381 if (d->bd_slen == 0) {
382 splx(s);
383 return (0);
384 }
385 ROTATE_BUFFERS(d);
386 break;
387 }
388 }
389 /*
390 * At this point, we know we have something in the hold slot.
391 */
392 splx(s);
393
394 /*
395 * Move data from hold buffer into user space.
396 * We know the entire buffer is transferred since
397 * we checked above that the read buffer is bpf_bufsize bytes.
398 */
399 error = uiomove(d->bd_hbuf, d->bd_hlen, uio);
400
401 s = splimp();
402 d->bd_fbuf = d->bd_hbuf;
403 d->bd_hbuf = 0;
404 splx(s);
405
406 return (error);
407 }
408
409
410 /*
411 * If there are processes sleeping on this descriptor, wake them up.
412 */
413 static inline void
414 bpf_wakeup(d)
415 register struct bpf_d *d;
416 {
417 wakeup((caddr_t)d);
418 if (d->bd_selproc) {
419 selwakeup(d->bd_selproc, (int)d->bd_selcoll);
420 d->bd_selcoll = 0;
421 d->bd_selproc = 0;
422 }
423 }
424
425 int
426 bpfwrite(dev, uio)
427 dev_t dev;
428 struct uio *uio;
429 {
430 register struct bpf_d *d = &bpf_dtab[minor(dev)];
431 struct ifnet *ifp;
432 struct mbuf *m;
433 int error, s;
434 static struct sockaddr dst;
435
436 if (d->bd_bif == 0)
437 return (ENXIO);
438
439 ifp = d->bd_bif->bif_ifp;
440
441 if (uio->uio_resid == 0)
442 return (0);
443 if (uio->uio_resid > ifp->if_mtu)
444 return (EMSGSIZE);
445
446 error = bpf_movein(uio, (int)d->bd_bif->bif_dlt, &m, &dst);
447 if (error)
448 return (error);
449
450 s = splnet();
451 error = (*ifp->if_output)(ifp, m, &dst);
452 splx(s);
453 /*
454 * The driver frees the mbuf.
455 */
456 return (error);
457 }
458
459 /*
460 * Reset a descriptor by flushing its packet bufferand clearing the receive
461 * and drop counts. Should be called at splimp.
462 */
463 static void
464 reset_d(d)
465 struct bpf_d *d;
466 {
467 if (d->bd_hbuf) {
468 /* Free the hold buffer. */
469 d->bd_fbuf = d->bd_hbuf;
470 d->bd_hbuf = 0;
471 }
472 d->bd_slen = 0;
473 d->bd_rcount = 0;
474 d->bd_dcount = 0;
475 }
476
477 /*
478 * FIONREAD Check for read packet available.
479 * SIOCGIFADDR Get interface address - convenient hook to driver.
480 * BIOCGFLEN Get max filter len.
481 * BIOCGBLEN Get buffer len [for read()].
482 * BIOCSETF Set ethernet read filter.
483 * BIOCFLUSH Flush read packet buffer.
484 * BIOCPROMISC Put interface into promiscuous mode.
485 * BIOCGDLT Get link layer type.
486 * BIOCGETIF Get interface name.
487 * BIOCSETIF Set interface.
488 * BIOCSRTIMEOUT Set read timeout.
489 * BIOCGRTIMEOUT Get read timeout.
490 * BIOCGSTATS Get packet stats.
491 * BIOCIMMEDIATE Set immediate mode.
492 */
493 /* ARGSUSED */
494 int
495 bpfioctl(dev, cmd, addr, flag)
496 dev_t dev;
497 int cmd;
498 caddr_t addr;
499 int flag;
500 {
501 register struct bpf_d *d = &bpf_dtab[minor(dev)];
502 int s, error = 0;
503
504 switch (cmd) {
505
506 default:
507 error = EINVAL;
508 break;
509
510 /*
511 * Check for read packet available.
512 */
513 case FIONREAD:
514 {
515 int n;
516
517 s = splimp();
518 n = d->bd_slen;
519 if (d->bd_hbuf)
520 n += d->bd_hlen;
521 splx(s);
522
523 *(int *)addr = n;
524 break;
525 }
526
527 case SIOCGIFADDR:
528 {
529 struct ifnet *ifp;
530
531 if (d->bd_bif == 0)
532 error = EINVAL;
533 else {
534 ifp = d->bd_bif->bif_ifp;
535 error = (*ifp->if_ioctl)(ifp, cmd, addr);
536 }
537 break;
538 }
539
540 /*
541 * Get max filter len.
542 */
543 case BIOCGFLEN:
544 *(u_int *)addr = BPF_MAXINSNS;
545 break;
546 /*
547 * Get buffer len [for read()].
548 */
549 case BIOCGBLEN:
550 *(u_int *)addr = d->bd_bufsize;
551 break;
552
553 /*
554 * Set ethernet read filter.
555 */
556 case BIOCSETF:
557 error = bpf_setf(d, (struct bpf_program *)addr);
558 break;
559
560 /*
561 * Flush read packet buffer.
562 */
563 case BIOCFLUSH:
564 s = splimp();
565 reset_d(d);
566 splx(s);
567 break;
568
569 /*
570 * Put interface into promiscuous mode.
571 */
572 case BIOCPROMISC:
573 if (d->bd_bif == 0) {
574 /*
575 * No interface attached yet.
576 */
577 error = EINVAL;
578 break;
579 }
580 s = splimp();
581 if (d->bd_promisc == 0) {
582 d->bd_promisc = 1;
583 error = ifpromisc(d->bd_bif->bif_ifp, 1);
584 }
585 splx(s);
586 break;
587
588 /*
589 * Get device parameters.
590 */
591 case BIOCGDLT:
592 if (d->bd_bif == 0)
593 error = EINVAL;
594 else
595 *(u_int *)addr = d->bd_bif->bif_dlt;
596 break;
597
598 /*
599 * Set interface name.
600 */
601 case BIOCGETIF:
602 if (d->bd_bif == 0)
603 error = EINVAL;
604 else
605 bpf_ifname(d->bd_bif->bif_ifp, (struct ifreq *)addr);
606 break;
607
608 /*
609 * Set interface.
610 */
611 case BIOCSETIF:
612 error = bpf_setif(d, (struct ifreq *)addr);
613 break;
614
615 /*
616 * Set read timeout.
617 */
618 case BIOCSRTIMEOUT:
619 {
620 struct timeval *tv = (struct timeval *)addr;
621 u_long msec;
622
623 /* Compute number of milliseconds. */
624 msec = tv->tv_sec * 1000 + tv->tv_usec / 1000;
625 /* Scale milliseconds to ticks. Assume hard
626 clock has millisecond or greater resolution
627 (i.e. tick >= 1000). For 10ms hardclock,
628 tick/1000 = 10, so rtout<-msec/10. */
629 d->bd_rtout = msec / (tick / 1000);
630 break;
631 }
632
633 /*
634 * Get read timeout.
635 */
636 case BIOCGRTIMEOUT:
637 {
638 struct timeval *tv = (struct timeval *)addr;
639 u_long msec = d->bd_rtout;
640
641 msec *= tick / 1000;
642 tv->tv_sec = msec / 1000;
643 tv->tv_usec = msec % 1000;
644 break;
645 }
646
647 /*
648 * Get packet stats.
649 */
650 case BIOCGSTATS:
651 {
652 struct bpf_stat *bs = (struct bpf_stat *)addr;
653
654 bs->bs_recv = d->bd_rcount;
655 bs->bs_drop = d->bd_dcount;
656 break;
657 }
658
659 /*
660 * Set immediate mode.
661 */
662 case BIOCIMMEDIATE:
663 d->bd_immediate = *(u_int *)addr;
664 break;
665 }
666 return (error);
667 }
668
669 /*
670 * Set d's packet filter program to 'fp'. If 'd' already has a filter,
671 * free it and replace it. Returns EINVAL for bogus requests.
672 */
673 int
674 bpf_setf(d, fp)
675 struct bpf_d *d;
676 struct bpf_program *fp;
677 {
678 struct bpf_insn *fcode, *old;
679 u_int flen, size;
680 int s;
681
682 old = d->bd_filter;
683 if (fp->bf_insns == 0) {
684 if (fp->bf_len != 0)
685 return (EINVAL);
686 s = splimp();
687 d->bd_filter = 0;
688 reset_d(d);
689 splx(s);
690 if (old != 0)
691 free((caddr_t)old, M_DEVBUF);
692 return (0);
693 }
694 flen = fp->bf_len;
695 if (flen > BPF_MAXINSNS)
696 return (EINVAL);
697
698 size = flen * sizeof(*fp->bf_insns);
699 fcode = (struct bpf_insn *)malloc(size, M_DEVBUF, M_WAITOK);
700 if (copyin((caddr_t)fp->bf_insns, (caddr_t)fcode, size))
701 return (EINVAL);
702
703 if (bpf_validate(fcode, (int)flen)) {
704 s = splimp();
705 d->bd_filter = fcode;
706 reset_d(d);
707 splx(s);
708 if (old != 0)
709 free((caddr_t)old, M_DEVBUF);
710
711 return (0);
712 }
713 free((caddr_t)fcode, M_DEVBUF);
714 return (EINVAL);
715 }
716
717 /*
718 * Detach 'd' from its current interface (if attached at all) and attach to
719 * the interface named 'name'. Return ioctl error code or 0.
720 */
721 static int
722 bpf_setif(d, ifr)
723 struct bpf_d *d;
724 struct ifreq *ifr;
725 {
726 struct bpf_if *bp;
727 char *cp;
728 int unit, s;
729
730 /*
731 * Separate string into name part and unit number. Put a null
732 * byte at the end of the name part, and compute the number.
733 * If the a unit number is unspecified, the default is 0,
734 * as initialized above. XXX This should be common code.
735 */
736 unit = 0;
737 cp = ifr->ifr_name;
738 cp[sizeof(ifr->ifr_name) - 1] = '\0';
739 while (*cp++) {
740 if (*cp >= '0' && *cp <= '9') {
741 unit = *cp - '0';
742 *cp++ = '\0';
743 while (*cp)
744 unit = 10 * unit + *cp++ - '0';
745 break;
746 }
747 }
748 /*
749 * Look through attached interfaces for the named one.
750 */
751 for (bp = bpf_iflist; bp != 0; bp = bp->bif_next) {
752 struct ifnet *ifp = bp->bif_ifp;
753
754 if (ifp == 0 || unit != ifp->if_unit
755 || strcmp(ifp->if_name, ifr->ifr_name) != 0)
756 continue;
757 /*
758 * We found the requested interface. If we're
759 * already attached to it, just flush the buffer.
760 * If it's not up, return an error.
761 */
762 if ((ifp->if_flags & IFF_UP) == 0)
763 return (ENETDOWN);
764 s = splimp();
765 if (bp != d->bd_bif) {
766 if (d->bd_bif)
767 /*
768 * Detach if attached to something else.
769 */
770 bpf_detachd(d);
771
772 bpf_attachd(d, bp);
773 }
774 reset_d(d);
775 splx(s);
776 return (0);
777 }
778 /* Not found. */
779 return (ENXIO);
780 }
781
782 /*
783 * Lookup the name of the 'ifp' interface and return it in 'ifr->ifr_name'.
784 * We augment the ifp's base name with its unit number.
785 */
786 static void
787 bpf_ifname(ifp, ifr)
788 struct ifnet *ifp;
789 struct ifreq *ifr;
790 {
791 char *s = ifp->if_name;
792 char *d = ifr->ifr_name;
793
794 while (*d++ = *s++)
795 ;
796 /* XXX Assume that unit number is less than 10. */
797 *d++ = ifp->if_unit + '0';
798 *d = '\0';
799 }
800
801 /*
802 * Support for select() system call
803 * Inspired by the code in tty.c for the same purpose.
804 *
805 * bpfselect - returns true iff the specific operation
806 * will not block indefinitely. Otherwise, return
807 * false but make a note that a selwakeup() must be done.
808 */
809 int
810 bpfselect(dev, rw, p)
811 register dev_t dev;
812 int rw;
813 struct proc *p;
814 {
815 register struct bpf_d *d;
816 register int s;
817
818 if (rw != FREAD)
819 return (0);
820 /*
821 * An imitation of the FIONREAD ioctl code.
822 */
823 d = &bpf_dtab[minor(dev)];
824
825 s = splimp();
826 if (d->bd_hlen != 0 || (d->bd_immediate && d->bd_slen != 0)) {
827 /*
828 * There is data waiting.
829 */
830 splx(s);
831 return (1);
832 }
833 /*
834 * No data ready. If there's already a select() waiting on this
835 * minor device then this is a collision. This shouldn't happen
836 * because minors really should not be shared, but if a process
837 * forks while one of these is open, it is possible that both
838 * processes could select on the same descriptor.
839 */
840 if (d->bd_selproc && d->bd_selproc->p_wchan == (caddr_t)&selwait)
841 d->bd_selcoll = 1;
842 else
843 d->bd_selproc = p;
844
845 splx(s);
846 return (0);
847 }
848
849 /*
850 * bpf_tap - incoming linkage from device drivers
851 */
852 void
853 bpf_tap(arg, pkt, pktlen)
854 caddr_t arg;
855 register u_char *pkt;
856 register u_int pktlen;
857 {
858 struct bpf_if *bp;
859 register struct bpf_d *d;
860 register u_int slen;
861 /*
862 * Note that the ipl does not have to be raised at this point.
863 * The only problem that could arise here is that if two different
864 * interfaces shared any data. This is not the case.
865 */
866 bp = (struct bpf_if *)arg;
867 for (d = bp->bif_dlist; d != 0; d = d->bd_next) {
868 ++d->bd_rcount;
869 slen = bpf_filter(d->bd_filter, pkt, pktlen, pktlen);
870 if (slen != 0)
871 catchpacket(d, pkt, pktlen, slen, bcopy);
872 }
873 }
874
875 /*
876 * Copy data from an mbuf chain into a buffer. This code is derived
877 * from m_copydata in sys/uipc_mbuf.c.
878 */
879 static void
880 bpf_mcopy(src, dst, len)
881 u_char *src;
882 u_char *dst;
883 register int len;
884 {
885 register struct mbuf *m = (struct mbuf *)src;
886 register unsigned count;
887
888 while (len > 0) {
889 if (m == 0)
890 panic("bpf_mcopy");
891 count = MIN(m->m_len, len);
892 bcopy(mtod(m, caddr_t), (caddr_t)dst, count);
893 m = m->m_next;
894 dst += count;
895 len -= count;
896 }
897 }
898
899 /*
900 * bpf_mtap - incoming linkage from device drivers, when packet
901 * is in an mbuf chain
902 */
903 void
904 bpf_mtap(arg, m)
905 caddr_t arg;
906 struct mbuf *m;
907 {
908 struct bpf_if *bp = (struct bpf_if *)arg;
909 struct bpf_d *d;
910 u_int pktlen, slen;
911 struct mbuf *m0;
912
913 pktlen = 0;
914 for (m0 = m; m0 != m; m0 = m0->m_next)
915 pktlen += m0->m_len;
916
917 for (d = bp->bif_dlist; d != 0; d = d->bd_next) {
918 ++d->bd_rcount;
919 slen = bpf_filter(d->bd_filter, (u_char *)m, pktlen, 0);
920 if (slen != 0)
921 catchpacket(d, (u_char *)m, pktlen, slen, bpf_mcopy);
922 }
923 }
924
925 /*
926 * Move the packet data from interface memory (pkt) into the
927 * store buffer. Return 1 if it's time to wakeup a listener (buffer full),
928 * otherwise 0. 'copy' is the routine called to do the actual data
929 * transfer. 'bcopy' is passed in to copy contiguous chunks, while
930 * 'bpf_mcopy' is passed in to copy mbuf chains. In the latter
931 * case, 'pkt' is really an mbuf.
932 */
933 static void
934 catchpacket(d, pkt, pktlen, snaplen, cpfn)
935 register struct bpf_d *d;
936 register u_char *pkt;
937 register u_int pktlen, snaplen;
938 register void (*cpfn)();
939 {
940 register struct bpf_hdr *hp;
941 register int totlen, curlen;
942 register int hdrlen = d->bd_bif->bif_hdrlen;
943 /*
944 * Figure out how many bytes to move. If the packet is
945 * greater or equal to the snapshot length, transfer that
946 * much. Otherwise, transfer the whole packet (unless
947 * we hit the buffer size limit).
948 */
949 totlen = hdrlen + MIN(snaplen, pktlen);
950 if (totlen > d->bd_bufsize)
951 totlen = d->bd_bufsize;
952
953 /*
954 * Round up the end of the previous packet to the next longword.
955 */
956 curlen = BPF_WORDALIGN(d->bd_slen);
957 if (curlen + totlen > d->bd_bufsize) {
958 /*
959 * This packet will overflow the storage buffer.
960 * Rotate the buffers if we can, then wakeup any
961 * pending reads.
962 */
963 if (d->bd_fbuf == 0) {
964 /*
965 * We haven't completed the previous read yet,
966 * so drop the packet.
967 */
968 ++d->bd_dcount;
969 return;
970 }
971 ROTATE_BUFFERS(d);
972 bpf_wakeup(d);
973 curlen = 0;
974 }
975 else if (d->bd_immediate)
976 /*
977 * Immediate mode is set. A packet arrived so any
978 * reads should be woken up.
979 */
980 bpf_wakeup(d);
981
982 /*
983 * Append the bpf header.
984 */
985 hp = (struct bpf_hdr *)(d->bd_sbuf + curlen);
986 #ifdef sun
987 uniqtime(&hp->bh_tstamp);
988 #else
989 #ifdef hp300
990 microtime(&hp->bh_tstamp);
991 #else
992 hp->bh_tstamp = time;
993 #endif
994 #endif
995 hp->bh_datalen = pktlen;
996 hp->bh_hdrlen = hdrlen;
997 /*
998 * Copy the packet data into the store buffer and update its length.
999 */
1000 (*cpfn)(pkt, (u_char *)hp + hdrlen, (hp->bh_caplen = totlen - hdrlen));
1001 d->bd_slen = curlen + totlen;
1002 }
1003
1004 /*
1005 * Initialize all nonzero fields of a descriptor.
1006 */
1007 static int
1008 bpf_initd(d)
1009 register struct bpf_d *d;
1010 {
1011 d->bd_bufsize = bpf_bufsize;
1012 d->bd_fbuf = (caddr_t)malloc(d->bd_bufsize, M_DEVBUF, M_WAITOK);
1013 if (d->bd_fbuf == 0)
1014 return (ENOBUFS);
1015
1016 d->bd_sbuf = (caddr_t)malloc(d->bd_bufsize, M_DEVBUF, M_WAITOK);
1017 if (d->bd_sbuf == 0) {
1018 free(d->bd_fbuf, M_DEVBUF);
1019 return (ENOBUFS);
1020 }
1021 d->bd_slen = 0;
1022 d->bd_hlen = 0;
1023 return (0);
1024 }
1025
1026 /*
1027 * Register 'ifp' with bpf. XXX
1028 * and 'driverp' is a pointer to the 'struct bpf_if *' in the driver's softc.
1029 */
1030 void
1031 bpfattach(driverp, ifp, dlt, hdrlen)
1032 caddr_t *driverp;
1033 struct ifnet *ifp;
1034 u_int dlt, hdrlen;
1035 {
1036 struct bpf_if *bp;
1037 int i;
1038
1039 bp = (struct bpf_if *)malloc(sizeof(*bp), M_DEVBUF, M_DONTWAIT);
1040 if (bp == 0)
1041 panic("bpfattach");
1042
1043 bp->bif_dlist = 0;
1044 bp->bif_driverp = (struct bpf_if **)driverp;
1045 bp->bif_ifp = ifp;
1046 bp->bif_dlt = dlt;
1047
1048 bp->bif_next = bpf_iflist;
1049 bpf_iflist = bp;
1050
1051 *bp->bif_driverp = 0;
1052
1053 /*
1054 * Compute the length of the bpf header. This is not necessarily
1055 * equal to SIZEOF_BPF_HDR because we want to insert spacing such
1056 * that the network layer header begins on a longword boundary (for
1057 * performance reasons and to alleviate alignment restrictions).
1058 */
1059 bp->bif_hdrlen = BPF_WORDALIGN(hdrlen + SIZEOF_BPF_HDR) - hdrlen;
1060
1061 /*
1062 * Mark all the descriptors free if this hasn't been done.
1063 */
1064 if (!D_ISFREE(&bpf_dtab[0]))
1065 for (i = 0; i < NBPFILTER; ++i)
1066 D_MARKFREE(&bpf_dtab[i]);
1067
1068 printf("bpf: %s%d attached\n", ifp->if_name, ifp->if_unit);
1069 }
1070
1071 /* XXX This routine belongs in net/if.c. */
1072 /*
1073 * Set/clear promiscuous mode on interface ifp based on the truth value`
1074 * of pswitch. The calls are reference counted so that only the first
1075 * on request actually has an effect, as does the final off request.
1076 * Results are undefined if the off and on requests are not matched.
1077 */
1078 int
1079 ifpromisc(ifp, pswitch)
1080 struct ifnet *ifp;
1081 int pswitch;
1082 {
1083 struct ifreq ifr;
1084 /*
1085 * If the device is not configured up, we cannot put it in
1086 * promiscuous mode.
1087 */
1088 if ((ifp->if_flags & IFF_UP) == 0)
1089 return (ENETDOWN);
1090
1091 if (pswitch) {
1092 if (ifp->if_pcount++ != 0)
1093 return (0);
1094 ifp->if_flags |= IFF_PROMISC;
1095 } else {
1096 if (--ifp->if_pcount > 0)
1097 return (0);
1098 ifp->if_flags &= ~IFF_PROMISC;
1099 }
1100 ifr.ifr_flags = ifp->if_flags;
1101 return ((*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr));
1102 }
1103
1104 #endif (NBPFILTER > 0)
1105