summaryrefslogtreecommitdiff
path: root/lib/libpcap
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2018-05-28 08:12:18 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2018-05-28 08:12:18 +0000
commitb00ab7548b418624b6719ab8a2e8aaeade767a70 (patch)
treea300b8fb3f3e9cbbd48c47fde148dcb40453e7de /lib/libpcap
parent7e3d9013f2ff9291970339df66a18ad9343ed433 (diff)
parentd109bf9e4b609b5a0626b433e56db4a47dc530bb (diff)
downloadsrc-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/Makefile85
-rw-r--r--lib/libpcap/config.h196
-rw-r--r--lib/libpcap/pcap-netmap.c246
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);
-}