Lines Matching +full:open +full:- +full:circuit
63 #include "pcap-int.h"
66 #include "os-proto.h"
100 struct pcap_pf *pf = pc->priv; in pcap_read_pf()
108 cc = pc->cc; in pcap_read_pf()
110 cc = read(pc->fd, (char *)pc->buffer + pc->offset, pc->bufsize); in pcap_read_pf()
115 lseek(pc->fd, 0L, SEEK_CUR) + pc->bufsize < 0) { in pcap_read_pf()
122 (void)lseek(pc->fd, 0L, SEEK_SET); in pcap_read_pf()
125 pcapint_fmt_errmsg_for_errno(pc->errbuf, in pcap_read_pf()
126 sizeof(pc->errbuf), errno, "pf read"); in pcap_read_pf()
127 return (-1); in pcap_read_pf()
129 bp = (u_char *)pc->buffer + pc->offset; in pcap_read_pf()
131 bp = pc->bp; in pcap_read_pf()
139 pad = pc->fddipad; in pcap_read_pf()
143 * If so, return immediately - if we haven't read any in pcap_read_pf()
144 * packets, clear the flag and return -2 to indicate in pcap_read_pf()
150 if (pc->break_loop) { in pcap_read_pf()
152 pc->break_loop = 0; in pcap_read_pf()
153 return (-2); in pcap_read_pf()
155 pc->cc = cc; in pcap_read_pf()
156 pc->bp = bp; in pcap_read_pf()
161 snprintf(pc->errbuf, sizeof(pc->errbuf), in pcap_read_pf()
163 return (-1); in pcap_read_pf()
170 if (sp->ens_stamplen != sizeof(*sp)) { in pcap_read_pf()
171 snprintf(pc->errbuf, sizeof(pc->errbuf), in pcap_read_pf()
173 sp->ens_stamplen); in pcap_read_pf()
174 return (-1); in pcap_read_pf()
177 p = bp + sp->ens_stamplen; in pcap_read_pf()
178 buflen = sp->ens_count; in pcap_read_pf()
179 if (buflen > pc->snapshot) in pcap_read_pf()
180 buflen = pc->snapshot; in pcap_read_pf()
183 inc = ENALIGN(buflen + sp->ens_stamplen); in pcap_read_pf()
184 cc -= inc; in pcap_read_pf()
186 pf->TotPkts++; in pcap_read_pf()
187 pf->TotDrops += sp->ens_dropped; in pcap_read_pf()
188 pf->TotMissed = sp->ens_ifoverflows; in pcap_read_pf()
189 if (pf->OrigMissed < 0) in pcap_read_pf()
190 pf->OrigMissed = pf->TotMissed; in pcap_read_pf()
193 * Short-circuit evaluation: if using BPF filter in pcap_read_pf()
194 * in kernel, no need to do it now - we already know in pcap_read_pf()
198 * that pc->fddipad was the amount of padding in pcap_read_pf()
203 if (pf->filtering_in_kernel || in pcap_read_pf()
204 pcapint_filter(pc->fcode.bf_insns, p, sp->ens_count, buflen)) { in pcap_read_pf()
206 pf->TotAccepted++; in pcap_read_pf()
207 h.ts = sp->ens_tstamp; in pcap_read_pf()
208 h.len = sp->ens_count - pad; in pcap_read_pf()
210 buflen -= pad; in pcap_read_pf()
214 pc->cc = cc; in pcap_read_pf()
215 pc->bp = bp; in pcap_read_pf()
220 pc->cc = 0; in pcap_read_pf()
229 ret = write(p->fd, buf, size); in pcap_inject_pf()
230 if (ret == -1) { in pcap_inject_pf()
231 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_inject_pf()
233 return (-1); in pcap_inject_pf()
241 struct pcap_pf *pf = p->priv; in pcap_stats_pf()
248 * ran out of buffer space. (XXX - perhaps it should, in pcap_stats_pf()
279 ps->ps_recv = pf->TotAccepted; in pcap_stats_pf()
280 ps->ps_drop = pf->TotDrops; in pcap_stats_pf()
281 ps->ps_ifdrop = pf->TotMissed - pf->OrigMissed; in pcap_stats_pf()
296 struct pcap_pf *pf = p->priv; in pcap_activate_pf()
298 int backlog = -1; /* request the most */ in pcap_activate_pf()
304 * Initially try a read/write open (to allow the inject in pcap_activate_pf()
306 * issues, fall back to read-only. This allows a in pcap_activate_pf()
307 * non-root user to be granted specific access to pcap in pcap_activate_pf()
310 * XXX - we should have an API that has a flag that in pcap_activate_pf()
311 * controls whether to open read-only or read-write, in pcap_activate_pf()
314 * the device in question) can be indicated at open in pcap_activate_pf()
317 * XXX - we assume here that "pfopen()" does not, in fact, modify in pcap_activate_pf()
322 * XXX - is there an error that means "no such device"? Is in pcap_activate_pf()
325 p->fd = pfopen(p->opt.device, O_RDWR); in pcap_activate_pf()
326 if (p->fd == -1 && errno == EACCES) in pcap_activate_pf()
327 p->fd = pfopen(p->opt.device, O_RDONLY); in pcap_activate_pf()
328 if (p->fd < 0) { in pcap_activate_pf()
330 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
331 "pf open: %s: Permission denied\n" in pcap_activate_pf()
333 p->opt.device); in pcap_activate_pf()
336 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
337 errno, "pf open: %s", p->opt.device); in pcap_activate_pf()
351 if (p->snapshot <= 0 || p->snapshot > MAXIMUM_SNAPLEN) in pcap_activate_pf()
352 p->snapshot = MAXIMUM_SNAPLEN; in pcap_activate_pf()
354 pf->OrigMissed = -1; in pcap_activate_pf()
356 if (!p->opt.immediate) in pcap_activate_pf()
358 if (p->opt.promisc) in pcap_activate_pf()
360 if (ioctl(p->fd, EIOCMBIS, (caddr_t)&enmode) < 0) { in pcap_activate_pf()
361 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
369 (void)ioctl(p->fd, EIOCMBIS, (caddr_t)&enmode);/* OK if this fails */ in pcap_activate_pf()
372 if (ioctl(p->fd, EIOCSETW, (caddr_t)&backlog) < 0) { in pcap_activate_pf()
373 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
379 if (ioctl(p->fd, EIOCDEVP, (caddr_t)&devparams) < 0) { in pcap_activate_pf()
380 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
392 p->linktype = DLT_EN10MB; in pcap_activate_pf()
393 p->offset = 2; in pcap_activate_pf()
396 * link-layer-type list with DLT_EN10MB and DLT_DOCSIS, so in pcap_activate_pf()
401 * DOCSIS frames out on the wire inside the low-level in pcap_activate_pf()
404 p->dlt_list = (u_int *) malloc(sizeof(u_int) * 2); in pcap_activate_pf()
405 if (p->dlt_list == NULL) { in pcap_activate_pf()
406 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
411 p->dlt_list[0] = DLT_EN10MB; in pcap_activate_pf()
412 p->dlt_list[1] = DLT_DOCSIS; in pcap_activate_pf()
413 p->dlt_count = 2; in pcap_activate_pf()
417 p->linktype = DLT_FDDI; in pcap_activate_pf()
422 p->linktype = DLT_SLIP; in pcap_activate_pf()
428 p->linktype = DLT_PPP; in pcap_activate_pf()
438 p->linktype = DLT_EN10MB; in pcap_activate_pf()
439 p->offset = 2; in pcap_activate_pf()
445 p->linktype = DLT_IEEE802; in pcap_activate_pf()
451 * XXX - what about ENDT_IEEE802? The pfilt.h header in pcap_activate_pf()
452 * file calls this "IEEE 802 networks (non-Ethernet)", in pcap_activate_pf()
459 * XXX - what about ENDT_HDLC and ENDT_NULL? in pcap_activate_pf()
464 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
465 "unknown data-link type %u", devparams.end_dev_type); in pcap_activate_pf()
470 if (p->linktype == DLT_FDDI) { in pcap_activate_pf()
471 p->fddipad = PCAP_FDDIPAD; in pcap_activate_pf()
474 p->snapshot += PCAP_FDDIPAD; in pcap_activate_pf()
476 p->fddipad = 0; in pcap_activate_pf()
477 if (ioctl(p->fd, EIOCTRUNCATE, (caddr_t)&p->snapshot) < 0) { in pcap_activate_pf()
478 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
487 if (ioctl(p->fd, EIOCSETF, (caddr_t)&Filter) < 0) { in pcap_activate_pf()
488 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
494 if (p->opt.timeout != 0) { in pcap_activate_pf()
496 timeout.tv_sec = p->opt.timeout / 1000; in pcap_activate_pf()
497 timeout.tv_usec = (p->opt.timeout * 1000) % 1000000; in pcap_activate_pf()
498 if (ioctl(p->fd, EIOCSRTIMEOUT, (caddr_t)&timeout) < 0) { in pcap_activate_pf()
499 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
506 p->bufsize = BUFSPACE; in pcap_activate_pf()
507 p->buffer = malloc(p->bufsize + p->offset); in pcap_activate_pf()
508 if (p->buffer == NULL) { in pcap_activate_pf()
509 pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, in pcap_activate_pf()
518 p->selectable_fd = p->fd; in pcap_activate_pf()
520 p->read_op = pcap_read_pf; in pcap_activate_pf()
521 p->inject_op = pcap_inject_pf; in pcap_activate_pf()
522 p->setfilter_op = pcap_setfilter_pf; in pcap_activate_pf()
523 p->setdirection_op = NULL; /* Not implemented. */ in pcap_activate_pf()
524 p->set_datalink_op = NULL; /* can't change data link type */ in pcap_activate_pf()
525 p->getnonblock_op = pcapint_getnonblock_fd; in pcap_activate_pf()
526 p->setnonblock_op = pcapint_setnonblock_fd; in pcap_activate_pf()
527 p->stats_op = pcap_stats_pf; in pcap_activate_pf()
544 p->activate_op = pcap_activate_pf; in pcapint_create_interface()
549 * XXX - is there an error from pfopen() that means "no such device"?
565 * XXX - is there a way to find out whether an adapter has in get_if_flags()
589 struct pcap_pf *pf = p->priv; in pcap_setfilter_pf()
594 * support BPF-style filters (it's not documented in the bpf(7) in pcap_setfilter_pf()
600 if (ioctl(p->fd, BIOCVERSION, (caddr_t)&bv) >= 0) { in pcap_setfilter_pf()
611 if (ioctl(p->fd, BIOCSETF, (caddr_t)fp) < 0) { in pcap_setfilter_pf()
612 pcapint_fmt_errmsg_for_errno(p->errbuf, in pcap_setfilter_pf()
613 sizeof(p->errbuf), errno, "BIOCSETF"); in pcap_setfilter_pf()
614 return (-1); in pcap_setfilter_pf()
620 * userland filter installed - that'd require in pcap_setfilter_pf()
624 * XXX - this message should be supplied to the in pcap_setfilter_pf()
631 pf->filtering_in_kernel = 1; in pcap_setfilter_pf()
634 * Discard any previously-received packets, in pcap_setfilter_pf()
641 p->cc = 0; in pcap_setfilter_pf()
649 * XXX - this should really be supplied to the application in pcap_setfilter_pf()
662 return (-1); in pcap_setfilter_pf()
665 * XXX - this message should be supplied by the application as in pcap_setfilter_pf()
669 pf->filtering_in_kernel = 0; in pcap_setfilter_pf()