diff options
author | Hans Petter Selasky <hselasky@FreeBSD.org> | 2018-05-28 08:12:18 +0000 |
---|---|---|
committer | Hans Petter Selasky <hselasky@FreeBSD.org> | 2018-05-28 08:12:18 +0000 |
commit | b00ab7548b418624b6719ab8a2e8aaeade767a70 (patch) | |
tree | a300b8fb3f3e9cbbd48c47fde148dcb40453e7de /lib/libpcap | |
parent | 7e3d9013f2ff9291970339df66a18ad9343ed433 (diff) | |
parent | d109bf9e4b609b5a0626b433e56db4a47dc530bb (diff) | |
download | src-test-b00ab7548b418624b6719ab8a2e8aaeade767a70.tar.gz src-test-b00ab7548b418624b6719ab8a2e8aaeade767a70.zip |
MFV r333789: libpcap 1.9.0 (pre-release)
MFC after: 1 month
Sponsored by: Mellanox Technologies
Notes
Notes:
svn path=/head/; revision=334277
Diffstat (limited to 'lib/libpcap')
-rw-r--r-- | lib/libpcap/Makefile | 85 | ||||
-rw-r--r-- | lib/libpcap/config.h | 196 | ||||
-rw-r--r-- | lib/libpcap/pcap-netmap.c | 246 |
3 files changed, 93 insertions, 434 deletions
diff --git a/lib/libpcap/Makefile b/lib/libpcap/Makefile index e402e7ffea585..1ce5495605fc2 100644 --- a/lib/libpcap/Makefile +++ b/lib/libpcap/Makefile @@ -7,16 +7,51 @@ SHLIBDIR?= /lib PACKAGE=lib${LIB} LIB= pcap -SRCS= grammar.y tokdefs.h pcap_version.h pcap-bpf.c \ - pcap-netmap.c fad-helpers.c \ - pcap.c pcap-common.c inet.c fad-getad.c gencode.c optimize.c nametoaddr.c \ - etherent.c savefile.c bpf_filter.c bpf_image.c bpf_dump.c \ - scanner.l sf-pcap.c sf-pcap-ng.c version.c + +SRCS= bpf_dump.c \ + bpf_filter.c \ + bpf_image.c \ + etherent.c \ + fad-getad.c \ + fmtutils.c \ + gencode.c \ + grammar.y \ + nametoaddr.c \ + optimize.c \ + pcap-bpf.c \ + pcap-common.c \ + pcap-netmap.c \ + pcap-netmap.h \ + pcap.c \ + savefile.c \ + scanner.l \ + sf-pcap.c \ + sf-pcapng.c \ + tokdefs.h # Old compatibility headers -INCS= pcap.h pcap-namedb.h pcap-bpf.h +INCS= fmtutils.h \ + pcap-bpf.h \ + pcap-namedb.h \ + pcap-netmap.h \ + pcap.h + +PCAPINCS= \ + pcap/bluetooth.h \ + pcap/bpf.h \ + pcap/can_socketcan.h \ + pcap/compiler-tests.h \ + pcap/dlt.h \ + pcap/funcattrs.h \ + pcap/ipnet.h \ + pcap/namedb.h \ + pcap/nflog.h \ + pcap/pcap-inttypes.h \ + pcap/pcap.h \ + pcap/sll.h \ + pcap/usb.h \ + pcap/vlan.h -PCAPINCS= pcap/pcap.h pcap/namedb.h pcap/bpf.h pcap/dlt.h pcap/export-defs.h PCAPINCSDIR= ${INCLUDEDIR}/pcap INCSGROUPS= INCS PCAPINCS @@ -40,6 +75,7 @@ MAN= pcap.3 \ pcap_fileno.3 \ pcap_findalldevs.3 \ pcap_freecode.3 \ + pcap_get_required_select_timeout.3 \ pcap_get_selectable_fd.3 \ pcap_get_tstamp_precision.3 \ pcap_geterr.3 \ @@ -61,6 +97,7 @@ MAN= pcap.3 \ pcap_set_datalink.3 \ pcap_set_immediate_mode.3 \ pcap_set_promisc.3 \ + pcap_set_protocol.3 \ pcap_set_rfmon.3 \ pcap_set_snaplen.3 \ pcap_set_timeout.3 \ @@ -73,12 +110,11 @@ MAN= pcap.3 \ pcap_stats.3 \ pcap_statustostr.3 \ pcap_strerror.3 \ - pcap-savefile.5 \ pcap_tstamp_type_name_to_val.3 \ - pcap_tstamp_type_val_to_name.3 \ - pcap-filter.7 \ - pcap-linktype.7 -MLINKS= pcap_datalink_val_to_name.3 pcap_datalink_val_to_description.3 \ + pcap_tstamp_type_val_to_name.3 + +MLINKS= \ + pcap_datalink_val_to_name.3 pcap_datalink_val_to_description.3 \ pcap_dump_open.3 pcap_dump_fopen.3 \ pcap_findalldevs.3 pcap_freealldevs.3 \ pcap_geterr.3 pcap_perror.3 \ @@ -93,7 +129,7 @@ MLINKS= pcap_datalink_val_to_name.3 pcap_datalink_val_to_description.3 \ # Our man pages are a special copy from the distdir. See below. CLEANFILES+=${MAN} -CLEANFILES+=tokdefs.h scanner.h pcap_version.h version.c +CLEANFILES+=tokdefs.h scanner.h YFLAGS+=-p pcap_ LFLAGS+=-Ppcap_ --header-file=${.OBJDIR}/scanner.h --nounput @@ -108,6 +144,15 @@ CFLAGS+=-DINET6 CFLAGS+=-DHAVE_NET_PFVAR_H .endif +CFLAGS+= -DPCAP_SUPPORT_NETMAP + +.if ${MK_OFED} != "no" +SRCS+= pcap-rdmasniff.c +LIBADD+= ibverbs +LIBADD+= mlx5 +CFLAGS+= -DPCAP_SUPPORT_RDMASNIFF +.endif + WARNS?= 0 SHLIB_MAJOR= 8 @@ -120,14 +165,6 @@ CFLAGS+=-I${PCAP_DISTDIR} .PATH: ${PCAP_DISTDIR} .PATH: ${PCAP_DISTDIR}/bpf/net -version.c: ${PCAP_DISTDIR}/VERSION - @rm -f $@ - sed 's/.*/char pcap_version[] = "&";/' ${PCAP_DISTDIR}/VERSION > $@ - -pcap_version.h: ${PCAP_DISTDIR}/VERSION - @rm -f $@ - sed 's/.*/char pcap_version_string[] = "libpcap version &";/' ${PCAP_DISTDIR}/VERSION > $@ - tokdefs.h: grammar.h .NOMETA ln -sf ${.ALLSRC} ${.TARGET} @@ -138,10 +175,14 @@ tokdefs.h: grammar.h .NOMETA ${_page}: if [ -f ${PCAP_DISTDIR}/${_page:S/3$/3pcap/} ]; then \ F=${_page:S/3$/3pcap/}; \ + elif [ -f ${PCAP_DISTDIR}/${_page:S/3$/3pcap.in/} ]; then \ + F=${_page:S/3$/3pcap.in/}; \ + elif [ -f ${PCAP_DISTDIR}/${_page:S/5$/manfile.in/} ]; then \ + F=${_page:S/5$/manfile.in/}; \ elif [ -f ${PCAP_DISTDIR}/${_page:S/5$/manfile/} ]; then \ F=${_page:S/5$/manfile/}; \ else \ - F=${_page:S/7$/manmisc/}; \ + F=${_page:S/7$/manmisc.in/}; \ fi; \ sed -e 's/3PCAP/3/g' ${PCAP_DISTDIR}/$$F > ${_page} .endfor diff --git a/lib/libpcap/config.h b/lib/libpcap/config.h index de0ad67d0b647..c4e9814938c7f 100644 --- a/lib/libpcap/config.h +++ b/lib/libpcap/config.h @@ -4,40 +4,12 @@ /* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ -/* Enable optimizer debugging */ -/* #undef BDEBUG */ - -/* define if you have a cloning BPF device */ -#define HAVE_CLONING_BPF 1 - -/* define if you have the DAG API */ -/* #undef HAVE_DAG_API */ - -/* define if you have dag_get_erf_types() */ -/* #undef HAVE_DAG_GET_ERF_TYPES */ - -/* define if you have dag_get_stream_erf_types() */ -/* #undef HAVE_DAG_GET_STREAM_ERF_TYPES */ - -/* define if you have streams capable DAG API */ -/* #undef HAVE_DAG_STREAMS_API */ - -/* define if you have vdag_set_device_info() */ -/* #undef HAVE_DAG_VDAG */ - -/* Define to 1 if you have the declaration of `ether_hostton', and to 0 if you - don't. */ -#define HAVE_DECL_ETHER_HOSTTON 1 - -/* define if you have a /dev/dlpi */ -/* #undef HAVE_DEV_DLPI */ - -/* if passive_req_t primitive exists */ -/* #undef HAVE_DLPI_PASSIVE */ - /* Define to 1 if you have the `ether_hostton' function. */ #define HAVE_ETHER_HOSTTON 1 +/* Define to 1 if you have the `ffs' function. */ +#define HAVE_FFS 1 + /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #define HAVE_FSEEKO 1 @@ -47,9 +19,6 @@ /* on HP-UX 9.x */ /* #undef HAVE_HPUX9 */ -/* if ppa_info_t_dl_module_id exists */ -/* #undef HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1 */ - /* Define to 1 if you have the <inttypes.h> header file. */ #define HAVE_INTTYPES_H 1 @@ -80,45 +49,15 @@ /* Define to 1 if you have the <linux/ethtool.h> header file. */ /* #undef HAVE_LINUX_ETHTOOL_H */ -/* Define to 1 if you have the <linux/if_bonding.h> header file. */ -/* #undef HAVE_LINUX_IF_BONDING_H */ - -/* Define to 1 if you have the <linux/if_packet.h> header file. */ -/* #undef HAVE_LINUX_IF_PACKET_H */ - -/* Define to 1 if you have the <linux/net_tstamp.h> header file. */ -/* #undef HAVE_LINUX_NET_TSTAMP_H */ - -/* Define to 1 if you have the <linux/sockios.h> header file. */ -/* #undef HAVE_LINUX_SOCKIOS_H */ - -/* if tp_vlan_tci exists */ -/* #undef HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI */ - -/* Define to 1 if you have the <linux/types.h> header file. */ -/* #undef HAVE_LINUX_TYPES_H */ - -/* Define to 1 if you have the <linux/usbdevice_fs.h> header file. */ -/* #undef HAVE_LINUX_USBDEVICE_FS_H */ - -/* Define to 1 if you have the <linux/wireless.h> header file. */ -/* #undef HAVE_LINUX_WIRELESS_H */ - /* Define to 1 if you have the <memory.h> header file. */ #define HAVE_MEMORY_H 1 -/* Define to 1 if you have the <netinet/ether.h> header file. */ -/* #undef HAVE_NETINET_ETHER_H */ - -/* Define to 1 if you have the <netinet/if_ether.h> header file. */ -#define HAVE_NETINET_IF_ETHER_H 1 - -/* Define to 1 if you have the <netpacket/if_packet.h> header file. */ -/* #undef HAVE_NETPACKET_IF_PACKET_H */ - /* Define to 1 if you have the <netpacket/packet.h> header file. */ /* #undef HAVE_NETPACKET_PACKET_H */ +/* Define to 1 if you have the <net/bpf.h> header file. */ +#define HAVE_NET_BPF_H 1 + /* Define to 1 if you have the <net/if_media.h> header file. */ #define HAVE_NET_IF_MEDIA_H 1 @@ -141,18 +80,9 @@ /* Define to 1 if you have the `snprintf' function. */ #define HAVE_SNPRINTF 1 -/* if struct sockaddr has the sa_len member */ -#define HAVE_SOCKADDR_SA_LEN 1 - -/* if struct sockaddr_storage exists */ -#define HAVE_SOCKADDR_STORAGE 1 - -/* define if socklen_t is defined */ +/* Define to 1 if the system has the type `socklen_t'. */ #define HAVE_SOCKLEN_T 1 -/* On solaris */ -/* #undef HAVE_SOLARIS */ - /* Define to 1 if you have the <stdint.h> header file. */ #define HAVE_STDINT_H 1 @@ -162,12 +92,21 @@ /* Define to 1 if you have the `strerror' function. */ #define HAVE_STRERROR 1 +/* Define to 1 if you have the `strerror_r' function. */ +#define HAVE_STRERROR_R 1 + +/* Define to 1 if you have the `strerror_s' function. */ +/* #undef HAVE_STRERROR_S */ + /* Define to 1 if you have the <strings.h> header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the <string.h> header file. */ #define HAVE_STRING_H 1 +/* Define to 1 if you have the `strlcat' function. */ +#define HAVE_STRLCAT 1 + /* Define to 1 if you have the `strlcpy' function. */ #define HAVE_STRLCPY 1 @@ -180,8 +119,11 @@ /* Define to 1 if the system has the type `struct ether_addr'. */ /* #undef HAVE_STRUCT_ETHER_ADDR */ -/* Define to 1 if you have the <sys/bitypes.h> header file. */ -/* #undef HAVE_SYS_BITYPES_H */ +/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */ +#define HAVE_STRUCT_SOCKADDR_SA_LEN 1 + +/* Define to 1 if the system has the type `struct sockaddr_storage'. */ +#define HAVE_STRUCT_SOCKADDR_STORAGE 1 /* Define to 1 if you have the <sys/bufmod.h> header file. */ /* #undef HAVE_SYS_BUFMOD_H */ @@ -207,24 +149,12 @@ /* define if you have the TurboCap API */ /* #undef HAVE_TC_API */ -/* if if_packet.h has tpacket_stats defined */ -/* #undef HAVE_TPACKET_STATS */ - /* Define to 1 if you have the <unistd.h> header file. */ #define HAVE_UNISTD_H 1 -/* if struct usbdevfs_ctrltransfer has bRequestType */ -/* #undef HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE */ - /* Define to 1 if you have the `vsnprintf' function. */ #define HAVE_VSNPRINTF 1 -/* define if the system supports zerocopy BPF */ -#define HAVE_ZEROCOPY_BPF 1 - -/* define if your compiler has __attribute__ */ -#define HAVE___ATTRIBUTE__ 1 - /* IPv6 */ /* See Makefile */ /* #undef INET6 */ @@ -248,53 +178,32 @@ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ -#define PACKAGE_NAME "" +#define PACKAGE_NAME "pcap" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "" +#define PACKAGE_STRING "pcap 1.9.0" /* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "" +#define PACKAGE_TARNAME "pcap" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "" - -/* /dev/dlpi directory */ -/* #undef PCAP_DEV_PREFIX */ - -/* target host supports Bluetooth sniffing */ -/* #undef PCAP_SUPPORT_BT */ - -/* target host supports Bluetooth Monitor */ -/* #undef PCAP_SUPPORT_BT_MONITOR */ - -/* support D-Bus sniffing */ -/* #undef PCAP_SUPPORT_DBUS */ - -/* target host supports netfilter sniffing */ -/* #undef PCAP_SUPPORT_NETFILTER */ - -/* use Linux packet ring capture if available */ -#define PCAP_SUPPORT_PACKET_RING 1 - -/* target host supports USB sniffing */ -/* #undef PCAP_SUPPORT_USB */ +#define PACKAGE_VERSION "1.9.0" /* target host supports netmap */ #define PCAP_SUPPORT_NETMAP 1 -/* include ACN support */ -/* #undef SITA */ - -/* if struct sockaddr_hci has hci_channel member */ -/* #undef SOCKADDR_HCI_HAS_HCI_CHANNEL */ +/* use packet ring capture support on Linux if available */ +#define PCAP_SUPPORT_PACKET_RING 1 /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 +/* Define to 1 if strings.h declares `ffs' */ +#define STRINGS_H_DECLARES_FFS /**/ + /* Enable parser debugging */ /* #undef YYDEBUG */ @@ -307,50 +216,5 @@ # define _DARWIN_USE_64_BIT_INODE 1 #endif -/* Number of bits in a file offset, on hosts where this is settable. */ -/* #undef _FILE_OFFSET_BITS */ - -/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ -/* #undef _LARGEFILE_SOURCE */ - -/* Define for large files, on AIX-style hosts. */ -/* #undef _LARGE_FILES */ - -/* define on AIX to get certain functions */ -/* #undef _SUN */ - -/* define if your compiler allows __attribute__((format)) without a warning */ -#define __ATTRIBUTE___FORMAT_OK 1 - -/* to handle Ultrix compilers that don't support const in prototypes */ -/* #undef const */ - /* Define as token for inline if inlining supported */ #define inline inline - -/* Define to `short' if int16_t not defined. */ -/* #undef int16_t */ - -/* Define to `int' if int32_t not defined. */ -/* #undef int32_t */ - -/* Define to `long long' if int64_t not defined. */ -/* #undef int64_t */ - -/* Define to `signed char' if int8_t not defined. */ -/* #undef int8_t */ - -/* on sinix */ -/* #undef sinix */ - -/* Define to `unsigned short' if u_int16_t not defined. */ -/* #undef u_int16_t */ - -/* Define to `unsigned int' if u_int32_t not defined. */ -/* #undef u_int32_t */ - -/* Define to `unsigned long long' if u_int64_t not defined. */ -/* #undef u_int64_t */ - -/* Define to `unsigned char' if u_int8_t not defined. */ -/* #undef u_int8_t */ diff --git a/lib/libpcap/pcap-netmap.c b/lib/libpcap/pcap-netmap.c deleted file mode 100644 index 7d8cc7e381bb4..0000000000000 --- a/lib/libpcap/pcap-netmap.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (C) 2014 Luigi Rizzo. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <poll.h> -#include <ctype.h> -#include <errno.h> -#include <netdb.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#define NETMAP_WITH_LIBS -#include <net/netmap_user.h> - -#include "pcap-int.h" - -#define NM_PRIV(p) ((struct pcap_netmap *)(p->priv)) - -#if defined (linux) -/* On FreeBSD we use IFF_PPROMISC which is in ifr_flagshigh. - * remap to IFF_PROMISC on linux - */ -#define IFF_PPROMISC IFF_PROMISC -#endif /* linux */ - -struct pcap_netmap { - struct nm_desc *d; /* pointer returned by nm_open() */ - pcap_handler cb; /* callback and argument */ - u_char *cb_arg; - int must_clear_promisc; /* flag */ - uint64_t rx_pkts; /* # of pkts received before the filter */ -}; - - -static int -pcap_netmap_stats(pcap_t *p, struct pcap_stat *ps) -{ - struct pcap_netmap *pn = NM_PRIV(p); - - ps->ps_recv = pn->rx_pkts; - ps->ps_drop = 0; - ps->ps_ifdrop = 0; - return 0; -} - - -static void -pcap_netmap_filter(u_char *arg, struct pcap_pkthdr *h, const u_char *buf) -{ - pcap_t *p = (pcap_t *)arg; - struct pcap_netmap *pn = NM_PRIV(p); - const struct bpf_insn *pc = p->fcode.bf_insns; - - ++pn->rx_pkts; - if (pc == NULL || bpf_filter(pc, buf, h->len, h->caplen)) - pn->cb(pn->cb_arg, h, buf); -} - - -static int -pcap_netmap_dispatch(pcap_t *p, int cnt, pcap_handler cb, u_char *user) -{ - int ret; - struct pcap_netmap *pn = NM_PRIV(p); - struct nm_desc *d = pn->d; - struct pollfd pfd = { .fd = p->fd, .events = POLLIN, .revents = 0 }; - - pn->cb = cb; - pn->cb_arg = user; - - for (;;) { - if (p->break_loop) { - p->break_loop = 0; - return PCAP_ERROR_BREAK; - } - /* nm_dispatch won't run forever */ - - ret = nm_dispatch((void *)d, cnt, (void *)pcap_netmap_filter, (void *)p); - if (ret != 0) - break; - errno = 0; - ret = poll(&pfd, 1, p->opt.timeout); - } - return ret; -} - - -/* XXX need to check the NIOCTXSYNC/poll */ -static int -pcap_netmap_inject(pcap_t *p, const void *buf, size_t size) -{ - struct nm_desc *d = NM_PRIV(p)->d; - - return nm_inject(d, buf, size); -} - - -static int -pcap_netmap_ioctl(pcap_t *p, u_long what, uint32_t *if_flags) -{ - struct pcap_netmap *pn = NM_PRIV(p); - struct nm_desc *d = pn->d; - struct ifreq ifr; - int error, fd = d->fd; - -#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 */ - bzero(&ifr, sizeof(ifr)); - strncpy(ifr.ifr_name, d->req.nr_name, sizeof(ifr.ifr_name)); - switch (what) { - case SIOCSIFFLAGS: - ifr.ifr_flags = *if_flags; -#ifdef __FreeBSD__ - ifr.ifr_flagshigh = *if_flags >> 16; -#endif /* __FreeBSD__ */ - break; - } - error = ioctl(fd, what, &ifr); - if (!error) { - switch (what) { - case SIOCGIFFLAGS: - *if_flags = ifr.ifr_flags; -#ifdef __FreeBSD__ - *if_flags |= (ifr.ifr_flagshigh << 16); -#endif /* __FreeBSD__ */ - } - } -#ifdef linux - close(fd); -#endif /* linux */ - return error ? -1 : 0; -} - - -static void -pcap_netmap_close(pcap_t *p) -{ - struct pcap_netmap *pn = NM_PRIV(p); - struct nm_desc *d = pn->d; - uint32_t if_flags = 0; - - if (pn->must_clear_promisc) { - pcap_netmap_ioctl(p, SIOCGIFFLAGS, &if_flags); /* fetch flags */ - if (if_flags & IFF_PPROMISC) { - if_flags &= ~IFF_PPROMISC; - pcap_netmap_ioctl(p, SIOCSIFFLAGS, &if_flags); - } - } - nm_close(d); - pcap_cleanup_live_common(p); -} - - -static int -pcap_netmap_activate(pcap_t *p) -{ - struct pcap_netmap *pn = NM_PRIV(p); - struct nm_desc *d = nm_open(p->opt.device, NULL, 0, NULL); - uint32_t if_flags = 0; - - if (d == NULL) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, - "netmap open: cannot access %s: %s\n", - p->opt.device, pcap_strerror(errno)); - pcap_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, - d->first_rx_ring, d->last_rx_ring); - pn->d = d; - p->fd = d->fd; - if (p->opt.promisc && !(d->req.nr_ringid & NETMAP_SW_RING)) { - pcap_netmap_ioctl(p, SIOCGIFFLAGS, &if_flags); /* fetch flags */ - if (!(if_flags & IFF_PPROMISC)) { - pn->must_clear_promisc = 1; - if_flags |= IFF_PPROMISC; - pcap_netmap_ioctl(p, SIOCSIFFLAGS, &if_flags); - } - } - p->linktype = DLT_EN10MB; - p->selectable_fd = p->fd; - p->read_op = pcap_netmap_dispatch; - p->inject_op = pcap_netmap_inject; - p->setfilter_op = 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->stats_op = pcap_netmap_stats; - p->cleanup_op = pcap_netmap_close; - - return (0); -} - - -pcap_t * -pcap_netmap_create(const char *device, char *ebuf, int *is_ours) -{ - pcap_t *p; - - *is_ours = (!strncmp(device, "netmap:", 7) || !strncmp(device, "vale", 4)); - if (! *is_ours) - return NULL; - p = pcap_create_common(ebuf, sizeof (struct pcap_netmap)); - if (p == NULL) - return (NULL); - p->activate_op = pcap_netmap_activate; - return (p); -} |