Lines Matching defs:d

144 bpf_movein(struct uio *uio, struct bpf_d *d, struct mbuf **mp,
166 linktype = d->bd_bif->bif_dlt;
245 bps = SMR_PTR_GET(&d->bd_wfilter);
290 * Attach file to the bpf interface, i.e. make d listen on bp.
293 bpf_attachd(struct bpf_d *d, struct bpf_if *bp)
295 MUTEX_ASSERT_LOCKED(&d->bd_mtx);
298 * Point d at bp, and add d to the interface's list of listeners.
303 d->bd_bif = bp;
306 SMR_SLIST_INSERT_HEAD_LOCKED(&bp->bif_dlist, d, bd_next);
315 bpf_detachd(struct bpf_d *d)
319 MUTEX_ASSERT_LOCKED(&d->bd_mtx);
321 bp = d->bd_bif;
326 /* Remove ``d'' from the interface's descriptor list. */
328 SMR_SLIST_REMOVE_LOCKED(&bp->bif_dlist, d, bpf_d, bd_next);
337 d->bd_bif = NULL;
343 if (d->bd_promisc) {
348 d->bd_promisc = 0;
350 bpf_get(d);
351 mtx_leave(&d->bd_mtx);
355 mtx_enter(&d->bd_mtx);
356 bpf_put(d);
420 struct bpf_d *d;
422 d = bpfilter_lookup(minor(dev));
423 mtx_enter(&d->bd_mtx);
424 bpf_detachd(d);
425 bpf_wakeup(d);
426 LIST_REMOVE(d, bd_list);
427 mtx_leave(&d->bd_mtx);
428 bpf_put(d);
434 * Rotate the packet buffers in descriptor d. Move the store buffer
438 #define ROTATE_BUFFERS(d) \
439 KASSERT(d->bd_in_uiomove == 0); \
440 MUTEX_ASSERT_LOCKED(&d->bd_mtx); \
441 (d)->bd_hbuf = (d)->bd_sbuf; \
442 (d)->bd_hlen = (d)->bd_slen; \
443 (d)->bd_sbuf = (d)->bd_fbuf; \
444 (d)->bd_state = BPF_S_IDLE; \
445 (d)->bd_slen = 0; \
446 (d)->bd_fbuf = NULL;
455 struct bpf_d *d;
461 d = bpfilter_lookup(minor(dev));
462 if (d->bd_bif == NULL)
465 bpf_get(d);
466 mtx_enter(&d->bd_mtx);
472 if (uio->uio_resid != d->bd_bufsize) {
480 if (d->bd_rtout != 0) {
482 end = now + d->bd_rtout;
492 while (d->bd_hbuf == NULL) {
493 if (d->bd_bif == NULL) {
495 if (d->bd_slen == 0) {
499 ROTATE_BUFFERS(d);
502 if (d->bd_state == BPF_S_DONE) {
508 ROTATE_BUFFERS(d);
514 } else if (d->bd_rtout == 0) {
516 d->bd_nreaders++;
517 error = msleep_nsec(d, &d->bd_mtx, PRINET|PCATCH,
519 d->bd_nreaders--;
522 d->bd_nreaders++;
523 error = msleep_nsec(d, &d->bd_mtx, PRINET|PCATCH,
525 d->bd_nreaders--;
538 if (d->bd_hbuf != NULL)
546 if (d->bd_slen == 0) {
550 ROTATE_BUFFERS(d);
557 hbuf = d->bd_hbuf;
558 hlen = d->bd_hlen;
559 d->bd_hbuf = NULL;
560 d->bd_hlen = 0;
561 d->bd_fbuf = NULL;
562 d->bd_in_uiomove = 1;
569 mtx_leave(&d->bd_mtx);
571 mtx_enter(&d->bd_mtx);
574 KASSERT(d->bd_fbuf == NULL);
575 KASSERT(d->bd_hbuf == NULL);
576 d->bd_fbuf = hbuf;
577 d->bd_in_uiomove = 0;
579 mtx_leave(&d->bd_mtx);
580 bpf_put(d);
589 bpf_wakeup(struct bpf_d *d)
591 MUTEX_ASSERT_LOCKED(&d->bd_mtx);
593 if (d->bd_nreaders)
594 wakeup(d);
596 knote_locked(&d->bd_klist, 0);
603 if (d->bd_async && d->bd_sig) {
604 bpf_get(d);
605 if (!task_add(systq, &d->bd_wake_task))
606 bpf_put(d);
613 struct bpf_d *d = xd;
615 if (d->bd_async && d->bd_sig)
616 pgsigio(&d->bd_sigio, d->bd_sig, 0);
618 bpf_put(d);
624 struct bpf_d *d = xd;
626 mtx_enter(&d->bd_mtx);
627 if (d->bd_state == BPF_S_WAIT) {
628 d->bd_state = BPF_S_DONE;
629 bpf_wakeup(d);
631 mtx_leave(&d->bd_mtx);
633 bpf_put(d);
639 struct bpf_d *d;
647 d = bpfilter_lookup(minor(dev));
648 if (d->bd_bif == NULL)
651 bpf_get(d);
652 ifp = d->bd_bif->bif_ifp;
664 error = bpf_movein(uio, d, &m, sstosa(&dst));
677 if (d->bd_hdrcmplt && dst.ss_family == AF_UNSPEC)
685 bpf_put(d);
694 bpf_resetd(struct bpf_d *d)
696 MUTEX_ASSERT_LOCKED(&d->bd_mtx);
697 KASSERT(d->bd_in_uiomove == 0);
699 if (timeout_del(&d->bd_wait_tmo))
700 bpf_put(d);
702 if (d->bd_hbuf != NULL) {
704 d->bd_fbuf = d->bd_hbuf;
705 d->bd_hbuf = NULL;
707 d->bd_state = BPF_S_IDLE;
708 d->bd_slen = 0;
709 d->bd_hlen = 0;
710 d->bd_rcount = 0;
711 d->bd_dcount = 0;
715 bpf_set_wtout(struct bpf_d *d, uint64_t wtout)
717 mtx_enter(&d->bd_mtx);
718 d->bd_wtout = wtout;
719 mtx_leave(&d->bd_mtx);
725 bpf_set_wtimeout(struct bpf_d *d, const struct timeval *tv)
738 return (bpf_set_wtout(d, nsec));
742 bpf_get_wtimeout(struct bpf_d *d, struct timeval *tv)
746 mtx_enter(&d->bd_mtx);
747 nsec = d->bd_wtout;
748 mtx_leave(&d->bd_mtx);
785 struct bpf_d *d;
788 d = bpfilter_lookup(minor(dev));
789 if (d->bd_locked && suser(p) != 0) {
817 bpf_get(d);
831 mtx_enter(&d->bd_mtx);
832 n = d->bd_slen;
833 if (d->bd_hbuf != NULL)
834 n += d->bd_hlen;
835 mtx_leave(&d->bd_mtx);
845 *(u_int *)addr = d->bd_bufsize;
852 if (d->bd_bif != NULL)
863 mtx_enter(&d->bd_mtx);
864 d->bd_bufsize = size;
865 mtx_leave(&d->bd_mtx);
875 error = bpf_setf(d, (struct bpf_program *)addr, cmd);
882 mtx_enter(&d->bd_mtx);
883 bpf_resetd(d);
884 mtx_leave(&d->bd_mtx);
891 if (d->bd_bif == NULL) {
896 } else if (d->bd_bif->bif_ifp != NULL) {
897 if (d->bd_promisc == 0) {
898 MUTEX_ASSERT_UNLOCKED(&d->bd_mtx);
900 error = ifpromisc(d->bd_bif->bif_ifp, 1);
903 d->bd_promisc = 1;
912 if (d->bd_bif == NULL)
915 error = bpf_getdltlist(d, (struct bpf_dltlist *)addr);
922 if (d->bd_bif == NULL)
925 *(u_int *)addr = d->bd_bif->bif_dlt;
932 if (d->bd_bif == NULL)
935 mtx_enter(&d->bd_mtx);
936 error = bpf_setdlt(d, *(u_int *)addr);
937 mtx_leave(&d->bd_mtx);
945 if (d->bd_bif == NULL)
948 bpf_ifname(d->bd_bif, (struct ifreq *)addr);
955 error = bpf_setif(d, (struct ifreq *)addr);
975 mtx_enter(&d->bd_mtx);
976 d->bd_rtout = rtout;
977 mtx_leave(&d->bd_mtx);
989 mtx_enter(&d->bd_mtx);
990 NSEC_TO_TIMEVAL(d->bd_rtout, tv);
991 mtx_leave(&d->bd_mtx);
1002 bs->bs_recv = d->bd_rcount;
1003 bs->bs_drop = d->bd_dcount;
1011 error = bpf_set_wtout(d, *(int *)addr ? 0 : INFSLP);
1018 error = bpf_set_wtimeout(d, (const struct timeval *)addr);
1021 error = bpf_get_wtimeout(d, (struct timeval *)addr);
1024 error = bpf_set_wtout(d, INFSLP);
1037 *(u_int *)addr = d->bd_hdrcmplt;
1041 d->bd_hdrcmplt = *(u_int *)addr ? 1 : 0;
1045 d->bd_locked = 1;
1049 *(u_int *)addr = d->bd_fildrop;
1058 d->bd_fildrop = fildrop;
1068 *(u_int *)addr = d->bd_dirfilt;
1072 d->bd_dirfilt = (*(u_int *)addr) &
1077 d->bd_async = *(int *)addr;
1082 error = sigio_setown(&d->bd_sigio, cmd, addr);
1087 sigio_getown(&d->bd_sigio, cmd, addr);
1099 d->bd_sig = sig;
1103 *(u_int *)addr = d->bd_sig;
1107 bpf_put(d);
1112 * Set d's packet filter program to fp. If this file already has a filter,
1116 bpf_setf(struct bpf_d *d, struct bpf_program *fp, u_long cmd)
1152 old_bps = SMR_PTR_GET_LOCKED(&d->bd_rfilter);
1153 SMR_PTR_SET_LOCKED(&d->bd_rfilter, bps);
1155 old_bps = SMR_PTR_GET_LOCKED(&d->bd_wfilter);
1156 SMR_PTR_SET_LOCKED(&d->bd_wfilter, bps);
1160 mtx_enter(&d->bd_mtx);
1161 bpf_resetd(d);
1162 mtx_leave(&d->bd_mtx);
1177 bpf_setif(struct bpf_d *d, struct ifreq *ifr)
1199 mtx_enter(&d->bd_mtx);
1200 if (d->bd_sbuf == NULL) {
1201 if ((error = bpf_allocbufs(d)))
1204 if (bp != d->bd_bif) {
1208 bpf_detachd(d);
1209 bpf_attachd(d, bp);
1211 bpf_resetd(d);
1213 mtx_leave(&d->bd_mtx);
1238 struct bpf_d *d;
1243 d = bpfilter_lookup(minor(dev));
1244 if (d == NULL)
1249 klist = &d->bd_klist;
1256 bpf_get(d);
1257 kn->kn_hook = d;
1266 struct bpf_d *d = kn->kn_hook;
1268 klist_remove(&d->bd_klist, kn);
1269 bpf_put(d);
1275 struct bpf_d *d = kn->kn_hook;
1277 MUTEX_ASSERT_LOCKED(&d->bd_mtx);
1279 kn->kn_data = d->bd_hlen;
1280 if (d->bd_state == BPF_S_DONE)
1281 kn->kn_data += d->bd_slen;
1289 struct bpf_d *d = kn->kn_hook;
1292 mtx_enter(&d->bd_mtx);
1294 mtx_leave(&d->bd_mtx);
1302 struct bpf_d *d = kn->kn_hook;
1305 mtx_enter(&d->bd_mtx);
1307 mtx_leave(&d->bd_mtx);
1347 struct bpf_d *d;
1365 SMR_SLIST_FOREACH(d, &bp->bif_dlist, bd_next) {
1369 atomic_inc_long(&d->bd_rcount);
1371 if (ISSET(d->bd_dirfilt, direction))
1374 bps = SMR_PTR_GET(&d->bd_rfilter);
1381 if (d->bd_fildrop != BPF_FILDROP_PASS)
1383 if (d->bd_fildrop != BPF_FILDROP_DROP) {
1409 mtx_enter(&d->bd_mtx);
1410 bpf_catchpacket(d, (u_char *)m, pktlen, slen, &tbh);
1411 mtx_leave(&d->bd_mtx);
1558 bpf_catchpacket(struct bpf_d *d, u_char *pkt, size_t pktlen, size_t snaplen,
1565 MUTEX_ASSERT_LOCKED(&d->bd_mtx);
1566 if (d->bd_bif == NULL)
1569 hdrlen = d->bd_bif->bif_hdrlen;
1578 if (totlen > d->bd_bufsize)
1579 totlen = d->bd_bufsize;
1584 curlen = BPF_WORDALIGN(d->bd_slen);
1585 if (curlen + totlen > d->bd_bufsize) {
1591 if (d->bd_fbuf == NULL) {
1596 ++d->bd_dcount;
1601 if (timeout_del(&d->bd_wait_tmo))
1602 bpf_put(d);
1604 ROTATE_BUFFERS(d);
1612 bh = (struct bpf_hdr *)(d->bd_sbuf + curlen);
1622 d->bd_slen = curlen + totlen;
1624 switch (d->bd_wtout) {
1630 if (d->bd_state == BPF_S_IDLE)
1631 d->bd_state = BPF_S_DONE;
1637 if (d->bd_state == BPF_S_IDLE) {
1638 d->bd_state = BPF_S_WAIT;
1640 bpf_get(d);
1641 if (!timeout_add_nsec(&d->bd_wait_tmo, d->bd_wtout))
1642 bpf_put(d);
1648 bpf_wakeup(d);
1655 bpf_allocbufs(struct bpf_d *d)
1657 MUTEX_ASSERT_LOCKED(&d->bd_mtx);
1659 d->bd_fbuf = malloc(d->bd_bufsize, M_DEVBUF, M_NOWAIT);
1660 if (d->bd_fbuf == NULL)
1663 d->bd_sbuf = malloc(d->bd_bufsize, M_DEVBUF, M_NOWAIT);
1664 if (d->bd_sbuf == NULL) {
1665 free(d->bd_fbuf, M_DEVBUF, d->bd_bufsize);
1666 d->bd_fbuf = NULL;
1670 d->bd_slen = 0;
1671 d->bd_hlen = 0;
1841 bpf_getdltlist(struct bpf_d *d, struct bpf_dltlist *bfl)
1847 name = d->bd_bif->bif_name;
1872 bpf_setdlt(struct bpf_d *d, u_int dlt)
1877 MUTEX_ASSERT_LOCKED(&d->bd_mtx);
1878 if (d->bd_bif->bif_dlt == dlt)
1880 name = d->bd_bif->bif_name;
1889 bpf_detachd(d);
1890 bpf_attachd(d, bp);
1891 bpf_resetd(d);