X-Git-Url: https://git.tcpdump.org/libpcap/blobdiff_plain/44c022be2d653987552155e00624417a94abe702..HEAD:/pcap-netmap.c diff --git a/pcap-netmap.c b/pcap-netmap.c index f1505633..56a6bc41 100644 --- a/pcap-netmap.c +++ b/pcap-netmap.c @@ -24,18 +24,16 @@ * SUCH DAMAGE. */ -#ifdef HAVE_CONFIG_H #include -#endif #include -#include #include #include #include #include #include #include +#include #define NETMAP_WITH_LIBS #include @@ -67,7 +65,7 @@ pcap_netmap_stats(pcap_t *p, struct pcap_stat *ps) { struct pcap_netmap *pn = p->priv; - ps->ps_recv = pn->rx_pkts; + ps->ps_recv = (u_int)pn->rx_pkts; ps->ps_drop = 0; ps->ps_ifdrop = 0; return 0; @@ -82,7 +80,7 @@ pcap_netmap_filter(u_char *arg, struct pcap_pkthdr *h, const u_char *buf) const struct bpf_insn *pc = p->fcode.bf_insns; ++pn->rx_pkts; - if (pc == NULL || bpf_filter(pc, buf, h->len, h->caplen)) + if (pc == NULL || pcapint_filter(pc, buf, h->len, h->caplen)) pn->cb(pn->cb_arg, h, buf); } @@ -117,7 +115,7 @@ pcap_netmap_dispatch(pcap_t *p, int cnt, pcap_handler cb, u_char *user) /* XXX need to check the NIOCTXSYNC/poll */ static int -pcap_netmap_inject(pcap_t *p, const void *buf, size_t size) +pcap_netmap_inject(pcap_t *p, const void *buf, int size) { struct pcap_netmap *pn = p->priv; struct nm_desc *d = pn->d; @@ -134,15 +132,19 @@ pcap_netmap_ioctl(pcap_t *p, u_long what, uint32_t *if_flags) struct ifreq ifr; int error, fd = d->fd; -#ifdef linux +#ifdef __linux__ fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { fprintf(stderr, "Error: cannot get device control socket.\n"); return -1; } -#endif /* linux */ +#endif /* __linux__ */ bzero(&ifr, sizeof(ifr)); - strncpy(ifr.ifr_name, d->req.nr_name, sizeof(ifr.ifr_name)); + /* + * ifreq.ifr_name and nmreq.nr_name have the same size and both + * contain a NUL-terminated string. + */ + (void)pcapint_strlcpy(ifr.ifr_name, d->req.nr_name, sizeof(ifr.ifr_name)); switch (what) { case SIOCSIFFLAGS: /* @@ -195,9 +197,9 @@ pcap_netmap_ioctl(pcap_t *p, u_long what, uint32_t *if_flags) #endif /* __FreeBSD__ */ } } -#ifdef linux +#ifdef __linux__ close(fd); -#endif /* linux */ +#endif /* __linux__ */ return error ? -1 : 0; } @@ -217,7 +219,7 @@ pcap_netmap_close(pcap_t *p) } } nm_close(d); - pcap_cleanup_live_common(p); + pcapint_cleanup_live_common(p); } @@ -230,15 +232,15 @@ pcap_netmap_activate(pcap_t *p) d = nm_open(p->opt.device, NULL, 0, NULL); if (d == NULL) { - pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, + pcapint_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE, errno, "netmap open: cannot access %s", p->opt.device); - pcap_cleanup_live_common(p); + pcapint_cleanup_live_common(p); return (PCAP_ERROR); } #if 0 fprintf(stderr, "%s device %s priv %p fd %d ports %d..%d\n", - __FUNCTION__, p->opt.device, d, d->fd, + __func__, p->opt.device, d, d->fd, d->first_rx_ring, d->last_rx_ring); #endif pn->d = d; @@ -267,11 +269,11 @@ pcap_netmap_activate(pcap_t *p) p->selectable_fd = p->fd; p->read_op = pcap_netmap_dispatch; p->inject_op = pcap_netmap_inject; - p->setfilter_op = install_bpf_program; + p->setfilter_op = pcapint_install_bpf_program; p->setdirection_op = NULL; p->set_datalink_op = NULL; - p->getnonblock_op = pcap_getnonblock_fd; - p->setnonblock_op = pcap_setnonblock_fd; + p->getnonblock_op = pcapint_getnonblock_fd; + p->setnonblock_op = pcapint_setnonblock_fd; p->stats_op = pcap_netmap_stats; p->cleanup_op = pcap_netmap_close; @@ -287,7 +289,7 @@ pcap_netmap_create(const char *device, char *ebuf, int *is_ours) *is_ours = (!strncmp(device, "netmap:", 7) || !strncmp(device, "vale", 4)); if (! *is_ours) return NULL; - p = pcap_create_common(ebuf, sizeof (struct pcap_netmap)); + p = PCAP_CREATE_COMMON(ebuf, struct pcap_netmap); if (p == NULL) return (NULL); p->activate_op = pcap_netmap_activate;