From bebf77f9c5748363f4761b164926a7202227e2c4 Mon Sep 17 00:00:00 2001 From: bofh Date: Sun, 29 May 2016 00:24:29 +0000 Subject: emulators/qemu-devel: Update version 2.5.0=>2.6.1 --- emulators/qemu-devel/Makefile | 13 +- emulators/qemu-devel/distinfo | 5 +- emulators/qemu-devel/files/patch-Makefile | 6 +- emulators/qemu-devel/files/patch-configure | 143 +++++++- .../files/patch-disas_libvixl_a64_disasm-a64.cc | 11 - .../patch-disas_libvixl_vixl_a64_disasm-a64.cc | 11 + .../qemu-devel/files/patch-include_qemu-common.h | 12 - emulators/qemu-devel/files/pcap-patch | 398 --------------------- emulators/qemu-devel/files/pcap-patch-net_net.c | 248 +++++++++++++ emulators/qemu-devel/pkg-plist | 4 +- 10 files changed, 411 insertions(+), 440 deletions(-) delete mode 100644 emulators/qemu-devel/files/patch-disas_libvixl_a64_disasm-a64.cc create mode 100644 emulators/qemu-devel/files/patch-disas_libvixl_vixl_a64_disasm-a64.cc delete mode 100644 emulators/qemu-devel/files/patch-include_qemu-common.h create mode 100644 emulators/qemu-devel/files/pcap-patch-net_net.c (limited to 'emulators') diff --git a/emulators/qemu-devel/Makefile b/emulators/qemu-devel/Makefile index a6617e1e6741..559a057ecb27 100644 --- a/emulators/qemu-devel/Makefile +++ b/emulators/qemu-devel/Makefile @@ -2,8 +2,7 @@ # $FreeBSD$ PORTNAME= qemu -DISTVERSION= 2.5.0 -PORTREVISION= 5 +DISTVERSION= 2.6.0 CATEGORIES= emulators MASTER_SITES= http://wiki.qemu.org/download/ PKGNAMESUFFIX= -devel @@ -16,8 +15,8 @@ LICENSE= GPLv2 HAS_CONFIGURE= yes USES= cpe gmake pkgconfig bison perl5 python:2,build tar:bzip2 USE_PERL5= build -USE_XORG= pixman -USE_GNOME+= glib20 +USE_XORG= pixman x11 xext +USE_GNOME+= cairo gdkpixbuf2 glib20 MAKE_ENV+= BSD_MAKE="${MAKE}" ONLY_FOR_ARCHS= amd64 i386 powerpc powerpc64 # XXX someone wants to debug sparc64 hosts? @@ -59,7 +58,7 @@ USBREDIR_BUILD_DEPENDS= usbredir>=0.6:net/usbredir USBREDIR_RUN_DEPENDS= usbredir>=0.6:net/usbredir USBREDIR_CONFIGURE_OFF= --disable-usb-redir PCAP_CONFIGURE_ON= --enable-pcap -PCAP_EXTRA_PATCHES= ${FILESDIR}/pcap-patch +PCAP_EXTRA_PATCHES= ${FILESDIR}/pcap-patch ${FILESDIR}/pcap-patch-net_net.c STATIC_LINK_CONFIGURE_ON= --static STATIC_LINK_PREVENTS= GTK2 X11 STATIC_LINK_PREVENTS_MSG= X11 ui cannot be built static @@ -79,6 +78,10 @@ CONFIGURE_ARGS+=--localstatedir=/var --extra-ldflags=-L\"${LOCALBASE}/lib\" \ --smbd=${LOCALBASE}/sbin/smbd --enable-debug-info --python=${PYTHON_CMD} \ --extra-cflags=-I${WRKSRC}\ -I${LOCALBASE}/include\ -DPREFIX=\\\"\"${PREFIX}\\\"\" +LIB_DEPENDS+= libnettle.so:security/nettle \ + libfontconfig.so:x11-fonts/fontconfig \ + libfreetype.so:print/freetype2 + .include .if !defined(STRIP) || ${STRIP} == "" diff --git a/emulators/qemu-devel/distinfo b/emulators/qemu-devel/distinfo index 33dd6f7bfc40..481a353cda72 100644 --- a/emulators/qemu-devel/distinfo +++ b/emulators/qemu-devel/distinfo @@ -1,2 +1,3 @@ -SHA256 (qemu-2.5.0.tar.bz2) = 3443887401619fe33bfa5d900a4f2d6a79425ae2b7e43d5b8c36eb7a683772d4 -SIZE (qemu-2.5.0.tar.bz2) = 25464996 +TIMESTAMP = 1464473023 +SHA256 (qemu-2.6.0.tar.bz2) = c9ac4a651b273233d21b8bec32e30507cb9cce7900841febc330956a1a8434ec +SIZE (qemu-2.6.0.tar.bz2) = 25755267 diff --git a/emulators/qemu-devel/files/patch-Makefile b/emulators/qemu-devel/files/patch-Makefile index d328b46686cd..6666e3e63d91 100644 --- a/emulators/qemu-devel/files/patch-Makefile +++ b/emulators/qemu-devel/files/patch-Makefile @@ -1,6 +1,6 @@ ---- Makefile.orig 2015-12-17 20:32:52 UTC +--- Makefile.orig 2016-04-14 20:19:53 UTC +++ Makefile -@@ -90,7 +90,11 @@ +@@ -90,7 +90,11 @@ LIBS+=-lz $(LIBS_TOOLS) HELPERS-$(CONFIG_LINUX) = qemu-bridge-helper$(EXESUF) ifdef BUILD_DOCS @@ -12,7 +12,7 @@ DOCS+=qmp-commands.txt ifdef CONFIG_LINUX DOCS+=kvm_stat.1 -@@ -407,8 +411,10 @@ +@@ -410,8 +414,10 @@ endif install-doc: $(DOCS) $(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)" diff --git a/emulators/qemu-devel/files/patch-configure b/emulators/qemu-devel/files/patch-configure index bd8305a19a7e..40a964f3df4e 100644 --- a/emulators/qemu-devel/files/patch-configure +++ b/emulators/qemu-devel/files/patch-configure @@ -1,6 +1,6 @@ ---- configure.orig 2015-12-16 20:50:32 UTC +--- configure.orig 2016-04-14 20:19:53 UTC +++ configure -@@ -276,7 +276,7 @@ DSOSUF=".so" +@@ -245,7 +245,7 @@ DSOSUF=".so" LDFLAGS_SHARED="-shared" modules="no" prefix="/usr/local" @@ -9,7 +9,38 @@ datadir="\${prefix}/share" qemu_docdir="\${prefix}/share/doc/qemu" bindir="\${prefix}/bin" -@@ -2241,7 +2241,7 @@ if test "$gtk" != "no"; then +@@ -316,6 +316,10 @@ virglrenderer="" + tpm="yes" + libssh2="" + vhdx="" ++quorum="no" ++pcap="no" ++pcap_create="no" ++bpf="no" + numa="" + tcmalloc="no" + jemalloc="no" +@@ -575,7 +579,7 @@ FreeBSD) + audio_drv_list="oss" + audio_possible_drivers="oss sdl pa" + # needed for kinfo_getvmmap(3) in libutil.h +- LIBS="-lutil $LIBS" ++ LIBS="-lprocstat -lkvm -lelf -lutil $LIBS" + netmap="" # enable netmap autodetect + HOST_VARIANT_DIR="freebsd" + ;; +@@ -878,6 +882,10 @@ for opt do + ;; + --enable-vnc-png) vnc_png="yes" + ;; ++ --enable-pcap) pcap="yes" ++ ;; ++ --disable-pcap) pcap="no" ++ ;; + --disable-slirp) slirp="no" + ;; + --disable-uuid) uuid="no" +@@ -2157,7 +2165,7 @@ if test "$gtk" != "no"; then gtk_cflags="$gtk_cflags $x11_cflags" gtk_libs="$gtk_libs $x11_libs" fi @@ -18,7 +49,73 @@ gtk="yes" elif test "$gtk" = "yes"; then feature_not_found "gtk" "Install gtk2 or gtk3 devel" -@@ -3864,14 +3864,7 @@ fi +@@ -2384,6 +2392,14 @@ if ! check_include "ifaddrs.h" ; then + fi + + ########################################## ++# getifaddrs (for tests/test-io-channel-socket ) ++ ++have_ifaddrs_h=yes ++if ! check_include "ifaddrs.h" ; then ++ have_ifaddrs_h=no ++fi ++ ++########################################## + # VTE probe + + if test "$vte" != "no"; then +@@ -2526,6 +2542,50 @@ EOF + fi + fi + ++########################################## ++# pcap probe ++ ++if test "$pcap" = "yes" -a "$pcap" != "no"; then ++ cat > $TMPC << EOF ++#include ++int main(void) { return (pcap_lib_version() == (char *)0 ? 1 : 0); } ++EOF ++ if test "$mingw32" = "no" ; then ++ libpcap=-lpcap ++ else ++ libpcap=-lwpcap ++ fi ++ if compile_prog "" "$libpcap" ; then ++ : ++ else ++ echo ++ echo "Error: Could not find pcap" ++ echo "Make sure to have the pcap libs and headers installed." ++ echo ++ exit 1 ++ fi ++ cat > $TMPC << EOF ++#include ++int main(void) ++{ ++ char errbuf[PCAP_ERRBUF_SIZE]; ++ return (pcap_create("foo", errbuf) == (pcap_t *)0 ? 1 : 0); ++} ++EOF ++ if compile_prog "" "$libpcap" ; then ++ pcap_create="yes" ++ fi ++ cat > $TMPC << EOF ++#define PCAP_DONT_INCLUDE_PCAP_BPF_H ++#include ++#include ++int main(void) { return (BPF_MAJOR_VERSION); } ++EOF ++ if compile_prog ; then ++ bpf="yes" ++ fi ++ libs_softmmu="$libpcap $libs_softmmu" ++fi # test "$pcap" + + ########################################## + # VNC SASL detection +@@ -3857,14 +3917,7 @@ fi # Check if tools are available to build documentation. if test "$docs" != "no" ; then @@ -33,7 +130,7 @@ fi # Search for bswap_32 function -@@ -3999,6 +3992,17 @@ fi +@@ -3992,6 +4045,17 @@ fi # check for libusb if test "$libusb" != "no" ; then @@ -51,7 +148,7 @@ if $pkg_config --atleast-version=1.0.13 libusb-1.0; then libusb="yes" libusb_cflags=$($pkg_config --cflags libusb-1.0) -@@ -4011,6 +4015,7 @@ if test "$libusb" != "no" ; then +@@ -4004,6 +4068,7 @@ if test "$libusb" != "no" ; then fi libusb="no" fi @@ -59,3 +156,37 @@ fi # check for usbredirparser for usb network redirection support +@@ -4769,6 +4834,7 @@ echo "Audio drivers $audio_drv_list" + echo "Block whitelist (rw) $block_drv_rw_whitelist" + echo "Block whitelist (ro) $block_drv_ro_whitelist" + echo "VirtFS support $virtfs" ++echo "pcap support $pcap" + echo "VNC support $vnc" + if test "$vnc" = "yes" ; then + echo "VNC SASL support $vnc_sasl" +@@ -4950,6 +5016,15 @@ fi + if test "$profiler" = "yes" ; then + echo "CONFIG_PROFILER=y" >> $config_host_mak + fi ++if test "$pcap" = "yes" ; then ++ echo "CONFIG_PCAP=y" >> $config_host_mak ++ if test "$pcap_create" = "yes" ; then ++ echo "CONFIG_PCAP_CREATE=y" >> $config_host_mak ++ fi ++ if test "$bpf" = "yes" ; then ++ echo "CONFIG_BPF=y" >> $config_host_mak ++ fi ++fi + if test "$slirp" = "yes" ; then + echo "CONFIG_SLIRP=y" >> $config_host_mak + echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak +@@ -5153,6 +5228,9 @@ fi + if test "$have_ifaddrs_h" = "yes" ; then + echo "HAVE_IFADDRS_H=y" >> $config_host_mak + fi ++if test "$have_ifaddrs_h" = "yes" ; then ++ echo "HAVE_IFADDRS_H=y" >> $config_host_mak ++fi + if test "$vte" = "yes" ; then + echo "CONFIG_VTE=y" >> $config_host_mak + echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak diff --git a/emulators/qemu-devel/files/patch-disas_libvixl_a64_disasm-a64.cc b/emulators/qemu-devel/files/patch-disas_libvixl_a64_disasm-a64.cc deleted file mode 100644 index 3544f6d34501..000000000000 --- a/emulators/qemu-devel/files/patch-disas_libvixl_a64_disasm-a64.cc +++ /dev/null @@ -1,11 +0,0 @@ ---- disas/libvixl/a64/disasm-a64.cc.orig 2015-11-03 20:01:31 UTC -+++ disas/libvixl/a64/disasm-a64.cc -@@ -1362,7 +1362,7 @@ void Disassembler::AppendPCRelativeOffse - int64_t offset) { - USE(instr); - char sign = (offset < 0) ? '-' : '+'; -- AppendToOutput("#%c0x%" PRIx64, sign, std::abs(offset)); -+ AppendToOutput("#%c0x%" PRIx64, sign, offset < 0 ? -offset : offset); - } - - diff --git a/emulators/qemu-devel/files/patch-disas_libvixl_vixl_a64_disasm-a64.cc b/emulators/qemu-devel/files/patch-disas_libvixl_vixl_a64_disasm-a64.cc new file mode 100644 index 000000000000..4e88b6b4a362 --- /dev/null +++ b/emulators/qemu-devel/files/patch-disas_libvixl_vixl_a64_disasm-a64.cc @@ -0,0 +1,11 @@ +--- disas/libvixl/vixl/a64/disasm-a64.cc.orig 2016-04-14 20:19:53 UTC ++++ disas/libvixl/vixl/a64/disasm-a64.cc +@@ -2693,7 +2693,7 @@ void Disassembler::AppendPCRelativeOffse + if (offset < 0) { + abs_offset = -abs_offset; + } +- AppendToOutput("#%c0x%" PRIx64, sign, abs_offset); ++ AppendToOutput("#%c0x%" PRIx64, sign, offset < 0 ? -offset : offset); + } + + diff --git a/emulators/qemu-devel/files/patch-include_qemu-common.h b/emulators/qemu-devel/files/patch-include_qemu-common.h deleted file mode 100644 index 035105bf95d3..000000000000 --- a/emulators/qemu-devel/files/patch-include_qemu-common.h +++ /dev/null @@ -1,12 +0,0 @@ ---- include/qemu-common.h.orig 2015-11-03 20:01:34 UTC -+++ include/qemu-common.h -@@ -469,7 +469,9 @@ void qemu_hexdump(const char *buf, FILE - #define VEC_OR(v1, v2) ((v1) | (v2)) - /* altivec.h may redefine the bool macro as vector type. - * Reset it to POSIX semantics. */ -+#ifndef __cplusplus - #define bool _Bool -+#endif - #elif defined __SSE2__ - #include - #define VECTYPE __m128i diff --git a/emulators/qemu-devel/files/pcap-patch b/emulators/qemu-devel/files/pcap-patch index 0c798e5b1ca5..c8b3c9d00689 100644 --- a/emulators/qemu-devel/files/pcap-patch +++ b/emulators/qemu-devel/files/pcap-patch @@ -1,150 +1,3 @@ -configure ---- configure 2015-12-17 04:04:48.000000000 +0600 -+++ configure 2015-12-25 01:32:09.000000000 +0600 -@@ -342,6 +342,10 @@ - tpm="yes" - libssh2="" - vhdx="" -+quorum="no" -+pcap="no" -+pcap_create="no" -+bpf="no" - numa="" - tcmalloc="no" - jemalloc="no" -@@ -602,7 +606,7 @@ - audio_drv_list="oss" - audio_possible_drivers="oss sdl pa" - # needed for kinfo_getvmmap(3) in libutil.h -- LIBS="-lutil $LIBS" -+ LIBS="-lprocstat -lkvm -lelf -lutil $LIBS" - netmap="" # enable netmap autodetect - HOST_VARIANT_DIR="freebsd" - ;; -@@ -905,6 +909,10 @@ - ;; - --enable-vnc-png) vnc_png="yes" - ;; -+ --enable-pcap) pcap="yes" -+ ;; -+ --disable-pcap) pcap="no" -+ ;; - --disable-slirp) slirp="no" - ;; - --disable-uuid) uuid="no" -@@ -2427,6 +2435,14 @@ - - - ########################################## -+# getifaddrs (for tests/test-io-channel-socket ) -+ -+have_ifaddrs_h=yes -+if ! check_include "ifaddrs.h" ; then -+ have_ifaddrs_h=no -+fi -+ -+########################################## - # VTE probe - - if test "$vte" != "no"; then -@@ -2569,6 +2585,50 @@ - fi - fi - -+########################################## -+# pcap probe -+ -+if test "$pcap" = "yes" -a "$pcap" != "no"; then -+ cat > $TMPC << EOF -+#include -+int main(void) { return (pcap_lib_version() == (char *)0 ? 1 : 0); } -+EOF -+ if test "$mingw32" = "no" ; then -+ libpcap=-lpcap -+ else -+ libpcap=-lwpcap -+ fi -+ if compile_prog "" "$libpcap" ; then -+ : -+ else -+ echo -+ echo "Error: Could not find pcap" -+ echo "Make sure to have the pcap libs and headers installed." -+ echo -+ exit 1 -+ fi -+ cat > $TMPC << EOF -+#include -+int main(void) -+{ -+ char errbuf[PCAP_ERRBUF_SIZE]; -+ return (pcap_create("foo", errbuf) == (pcap_t *)0 ? 1 : 0); -+} -+EOF -+ if compile_prog "" "$libpcap" ; then -+ pcap_create="yes" -+ fi -+ cat > $TMPC << EOF -+#define PCAP_DONT_INCLUDE_PCAP_BPF_H -+#include -+#include -+int main(void) { return (BPF_MAJOR_VERSION); } -+EOF -+ if compile_prog ; then -+ bpf="yes" -+ fi -+ libs_softmmu="$libpcap $libs_softmmu" -+fi # test "$pcap" - - ########################################## - # VNC SASL detection -@@ -4758,7 +4833,11 @@ - echo "GNUTLS support $gnutls" - echo "GNUTLS hash $gnutls_hash" - echo "libgcrypt $gcrypt" --echo "nettle $nettle ${nettle+($nettle_version)}" -+if test "$nettle" = "yes"; then -+ echo "nettle $nettle ($nettle_version)" -+else -+ echo "nettle $nettle" -+fi - echo "libtasn1 $tasn1" - echo "VTE support $vte" - echo "curses support $curses" -@@ -4769,6 +4848,7 @@ - echo "Block whitelist (rw) $block_drv_rw_whitelist" - echo "Block whitelist (ro) $block_drv_ro_whitelist" - echo "VirtFS support $virtfs" -+echo "pcap support $pcap" - echo "VNC support $vnc" - if test "$vnc" = "yes" ; then - echo "VNC SASL support $vnc_sasl" -@@ -4947,6 +5027,15 @@ - if test "$profiler" = "yes" ; then - echo "CONFIG_PROFILER=y" >> $config_host_mak - fi -+if test "$pcap" = "yes" ; then -+ echo "CONFIG_PCAP=y" >> $config_host_mak -+ if test "$pcap_create" = "yes" ; then -+ echo "CONFIG_PCAP_CREATE=y" >> $config_host_mak -+ fi -+ if test "$bpf" = "yes" ; then -+ echo "CONFIG_BPF=y" >> $config_host_mak -+ fi -+fi - if test "$slirp" = "yes" ; then - echo "CONFIG_SLIRP=y" >> $config_host_mak - echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak -@@ -5137,6 +5226,9 @@ - if test "$tasn1" = "yes" ; then - echo "CONFIG_TASN1=y" >> $config_host_mak - fi -+if test "$have_ifaddrs_h" = "yes" ; then -+ echo "HAVE_IFADDRS_H=y" >> $config_host_mak -+fi - if test "$vte" = "yes" ; then - echo "CONFIG_VTE=y" >> $config_host_mak - echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak diff -ruN net/clients.h net/clients.h --- net/clients.h 2015-12-17 04:04:50.000000000 +0600 +++ net/clients.h 2015-12-25 01:32:09.000000000 +0600 @@ -171,257 +24,6 @@ diff -ruN net/hub.c net/hub.c has_host_dev = 1; break; default: -diff -ruN net/net.c net/net.c ---- net/net.c 2015-12-17 04:04:50.000000000 +0600 -+++ net/net.c 2015-12-25 01:32:09.000000000 +0600 -@@ -46,6 +46,11 @@ - #include "sysemu/sysemu.h" - #include "net/filter.h" - -+#include -+#ifdef __FreeBSD__ -+#include -+#endif -+ - /* Net bridge is currently not supported for W32. */ - #if !defined(_WIN32) - # define CONFIG_NET_BRIDGE -@@ -942,8 +947,224 @@ - return idx; - } - -+#if defined(CONFIG_PCAP) -+#if defined(CONFIG_BPF) -+#define PCAP_DONT_INCLUDE_PCAP_BPF_H -+#include -+#endif -+#include -+ -+struct PCAPState { -+ NetClientState nc; -+ pcap_t *handle; -+ int max_eth_frame_size; -+}; -+ -+static ssize_t pcap_receive(NetClientState *nc, const uint8_t *buf, size_t size) -+{ -+ struct PCAPState *s = DO_UPCAST(struct PCAPState, nc, nc); -+ -+ return pcap_inject(s->handle, (u_char*)buf, size); -+} -+ -+static void pcap_callback(u_char *user, struct pcap_pkthdr *phdr, u_char *pdata -+ ) -+{ -+ NetClientState *nc = (NetClientState *)user; -+ -+ int len = phdr->len; -+#ifdef __FreeBSD__ -+ struct PCAPState *s = DO_UPCAST(struct PCAPState, nc, nc); -+ int max_eth_frame_size = s->max_eth_frame_size; -+ -+ if (len > max_eth_frame_size) { -+ fprintf(stderr, -+ "pcap_send: packet size > %d (%d), truncating\n", -+ max_eth_frame_size, len); -+ len = max_eth_frame_size; -+ } -+#endif -+ qemu_send_packet(nc, pdata, len); -+} -+ -+static void pcap_send(void *opaque) -+{ -+ struct PCAPState *s = (struct PCAPState *)opaque; -+ -+ for (;;) { -+ if (pcap_dispatch(s->handle, 0, (pcap_handler)&pcap_callback, (u_char *)&s->nc) >= 0) -+ break; -+ } -+} -+ -+static void pcap_cleanup(NetClientState *nc) -+{ -+ struct PCAPState *s = DO_UPCAST(struct PCAPState, nc, nc); -+ -+ qemu_purge_queued_packets(nc); -+ pcap_close(s->handle); -+} -+ -+static NetClientInfo net_pcap_info = { -+ .type = NET_CLIENT_OPTIONS_KIND_PCAP, -+ .size = sizeof(struct PCAPState), -+ .receive = pcap_receive, -+// .receive_raw = pcap_receive_raw, -+// .receive_iov = pcap_receive_iov, -+// .poll = pcap_poll, -+ .cleanup = pcap_cleanup, -+}; -+/* -+ * ... -net pcap,ifname="..." -+ */ -+ -+int net_init_pcap(const NetClientOptions *opts, -+ const char *name, NetClientState *peer, Error **errp) -+{ -+ const NetdevPcapOptions *pcap_opts = opts->u.pcap; -+ NetClientState *nc; -+ struct PCAPState *s; -+ const char *ifname; -+ char errbuf[PCAP_ERRBUF_SIZE]; -+#if defined(_WIN32) -+ HANDLE h; -+#endif -+ int i; -+ -+ if (!pcap_opts->has_ifname) -+ return -1; -+ -+ ifname = pcap_opts->ifname; -+ -+ /* create the object */ -+ nc = qemu_new_net_client(&net_pcap_info, peer, "pcap", ifname); -+ s = DO_UPCAST(struct PCAPState, nc, nc); -+ -+ if (ifname == NULL && (ifname = pcap_lookupdev(errbuf)) == NULL) { -+ fprintf(stderr, "qemu: pcap_create: %s\n", errbuf); -+ goto fail; -+ } -+ -+#ifdef __FreeBSD__ -+ /* -+ * We want to avoid passing oversize packets to the guest, which -+ * at least on FreeBSD can happen if the host interface uses tso -+ * (seen with an em(4) in this case) - so find out the host -+ * interface's mtu and assume the guest is configured the same. -+ */ -+ s->max_eth_frame_size = 1514; -+ i = socket(AF_INET, SOCK_DGRAM, 0); -+ if (i >= 0) { -+ struct ifreq ifr; -+ -+ (void) memset(&ifr, 0, sizeof(ifr)); -+ strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); -+ if (ioctl(i, SIOCGIFMTU, &ifr) != -1) -+ s->max_eth_frame_size = ifr.ifr_mtu + 14; -+ close(i); -+ } -+#endif -+ -+#if defined(CONFIG_PCAP_CREATE) || defined(_WIN32) -+ /* -+ * Create pcap handle for the device, set promiscuous mode and activate. -+ */ -+ s->handle = (void *)pcap_create(ifname, errbuf); -+ if (!s->handle) { -+ fprintf(stderr, "qemu: pcap_create: %s\n", errbuf); -+ goto fail; -+ } -+ if (pcap_set_promisc(s->handle, 1) != 0) { -+ pcap_perror(s->handle, (char *)"qemu: pcap_set_promisc:"); -+ goto fail; -+ } -+ if (pcap_activate(s->handle) != 0) { -+ pcap_perror(s->handle, (char *)"qemu: pcap_activate:"); -+ goto fail; -+ } -+#else -+ /* Attempt to connect device. */ -+ s->handle = (void *)pcap_open_live(ifname, 65535, 1, 0, errbuf); -+ if (!s->handle) { -+ fprintf(stderr, "qemu: pcap_open_live: %s\n", errbuf); -+ goto fail; -+ } -+#endif -+ -+ /* Set non-blocking mode. */ -+ if (pcap_setnonblock(s->handle, 1, errbuf) < 0) { -+ fprintf(stderr, "qemu: pcap_setnonblock: %s\n", errbuf); -+ goto fail; -+ } -+ -+#if defined(_WIN32) -+ /* -+ * Tell the kernel that the packet has to be seen immediately. -+ */ -+ if (pcap_setmintocopy(s->handle, 0) < 0) { -+ fprintf(stderr, "qemu: pcap failed to set immediate mode\n"); -+ goto fail; -+ } -+#else /* !_WIN32 */ -+#if defined(CONFIG_BPF) -+#if defined(BIOCIMMEDIATE) -+ /* -+ * Tell the kernel that the packet has to be seen immediately. -+ */ -+ { -+ unsigned int one = 1; -+ if (ioctl(pcap_fileno(s->handle), BIOCIMMEDIATE, &one) < 0) { -+ fprintf(stderr, "qemu: pcap failed to set immediate mode\n"); -+ goto fail; -+ } -+ } -+#endif /* BIOCIMMEDIATE */ -+#if defined(BIOCFEEDBACK) -+ /* -+ * Tell the kernel that the sent packet has to be fed back. -+ * This is necessary to connect host and guest. -+ */ -+ { -+ unsigned int one = 1; -+ if (ioctl(pcap_fileno(s->handle), BIOCFEEDBACK, &one) < 0) { -+ fprintf(stderr, "qemu: pcap failed to set feedback mode\n"); -+ goto fail; -+ } -+ } -+#endif /* BIOCFEEDBACK */ -+#endif /* CONFIG_BPF */ -+#endif /* _WIN32 */ -+ -+ snprintf(s->nc.info_str, sizeof(s->nc.info_str), "pcap redirector"); -+ -+#if defined(_WIN32) -+ if ((h = pcap_getevent(s->handle)) == NULL) { -+ fprintf(stderr, "qemu: pcap_getevent failed\n"); -+ goto fail; -+ } -+ qemu_add_wait_object(h, pcap_send, s); -+#else /* !_WIN32 */ -+ if ((i = pcap_get_selectable_fd(s->handle)) < 0) { -+ fprintf(stderr, "qemu: pcap_get_selectable_fd failed\n"); -+ goto fail; -+ } -+ qemu_set_fd_handler(i, pcap_send, NULL, s); -+#endif /* _WIN32 */ -+ -+ return 0; -+ -+fail: -+ if (s) { -+ if (s->handle) -+ pcap_close(s->handle); -+ } -+ -+ return -1; -+} -+ -+#endif - --static int (* const net_client_init_fun[NET_CLIENT_OPTIONS_KIND_MAX])( -+static int (* const net_client_init_fun[NET_CLIENT_OPTIONS_KIND_MAX])( - const NetClientOptions *opts, - const char *name, - NetClientState *peer, Error **errp) = { -@@ -963,6 +1184,9 @@ - #ifdef CONFIG_NET_BRIDGE - [NET_CLIENT_OPTIONS_KIND_BRIDGE] = net_init_bridge, - #endif -+#ifdef CONFIG_PCAP -+ [NET_CLIENT_OPTIONS_KIND_PCAP] = net_init_pcap, -+#endif - [NET_CLIENT_OPTIONS_KIND_HUBPORT] = net_init_hubport, - #ifdef CONFIG_VHOST_NET_USED - [NET_CLIENT_OPTIONS_KIND_VHOST_USER] = net_init_vhost_user, diff -ruN qapi-schema.json qapi-schema.json --- qapi-schema.json 2015-12-17 04:04:50.000000000 +0600 +++ qapi-schema.json 2015-12-25 01:32:09.000000000 +0600 diff --git a/emulators/qemu-devel/files/pcap-patch-net_net.c b/emulators/qemu-devel/files/pcap-patch-net_net.c new file mode 100644 index 000000000000..735ae04776d7 --- /dev/null +++ b/emulators/qemu-devel/files/pcap-patch-net_net.c @@ -0,0 +1,248 @@ +--- net/net.c.orig 2016-04-14 20:19:54 UTC ++++ net/net.c +@@ -48,6 +48,11 @@ + #include "net/filter.h" + #include "qapi/string-output-visitor.h" + ++#include ++#ifdef __FreeBSD__ ++#include ++#endif ++ + /* Net bridge is currently not supported for W32. */ + #if !defined(_WIN32) + # define CONFIG_NET_BRIDGE +@@ -931,7 +936,223 @@ static int net_init_nic(const NetClientO + return idx; + } + ++#if defined(CONFIG_PCAP) ++#if defined(CONFIG_BPF) ++#define PCAP_DONT_INCLUDE_PCAP_BPF_H ++#include ++#endif ++#include ++ ++struct PCAPState { ++ NetClientState nc; ++ pcap_t *handle; ++ int max_eth_frame_size; ++}; ++ ++static ssize_t pcap_receive(NetClientState *nc, const uint8_t *buf, size_t size) ++{ ++ struct PCAPState *s = DO_UPCAST(struct PCAPState, nc, nc); ++ ++ return pcap_inject(s->handle, (u_char*)buf, size); ++} ++ ++static void pcap_callback(u_char *user, struct pcap_pkthdr *phdr, u_char *pdata ++ ) ++{ ++ NetClientState *nc = (NetClientState *)user; ++ ++ int len = phdr->len; ++#ifdef __FreeBSD__ ++ struct PCAPState *s = DO_UPCAST(struct PCAPState, nc, nc); ++ int max_eth_frame_size = s->max_eth_frame_size; ++ ++ if (len > max_eth_frame_size) { ++ fprintf(stderr, ++ "pcap_send: packet size > %d (%d), truncating\n", ++ max_eth_frame_size, len); ++ len = max_eth_frame_size; ++ } ++#endif ++ qemu_send_packet(nc, pdata, len); ++} ++ ++static void pcap_send(void *opaque) ++{ ++ struct PCAPState *s = (struct PCAPState *)opaque; ++ ++ for (;;) { ++ if (pcap_dispatch(s->handle, 0, (pcap_handler)&pcap_callback, (u_char *)&s->nc) >= 0) ++ break; ++ } ++} ++ ++static void pcap_cleanup(NetClientState *nc) ++{ ++ struct PCAPState *s = DO_UPCAST(struct PCAPState, nc, nc); ++ ++ qemu_purge_queued_packets(nc); ++ pcap_close(s->handle); ++} ++ ++static NetClientInfo net_pcap_info = { ++ .type = NET_CLIENT_OPTIONS_KIND_PCAP, ++ .size = sizeof(struct PCAPState), ++ .receive = pcap_receive, ++// .receive_raw = pcap_receive_raw, ++// .receive_iov = pcap_receive_iov, ++// .poll = pcap_poll, ++ .cleanup = pcap_cleanup, ++}; ++/* ++ * ... -net pcap,ifname="..." ++ */ ++ ++int net_init_pcap(const NetClientOptions *opts, ++ const char *name, NetClientState *peer, Error **errp) ++{ ++ const NetdevPcapOptions *pcap_opts = opts->u.pcap.data; ++ NetClientState *nc; ++ struct PCAPState *s; ++ const char *ifname; ++ char errbuf[PCAP_ERRBUF_SIZE]; ++#if defined(_WIN32) ++ HANDLE h; ++#endif ++ int i; ++ ++ if (!pcap_opts->has_ifname) ++ return -1; ++ ++ ifname = pcap_opts->ifname; ++ ++ /* create the object */ ++ nc = qemu_new_net_client(&net_pcap_info, peer, "pcap", ifname); ++ s = DO_UPCAST(struct PCAPState, nc, nc); ++ ++ if (ifname == NULL && (ifname = pcap_lookupdev(errbuf)) == NULL) { ++ fprintf(stderr, "qemu: pcap_create: %s\n", errbuf); ++ goto fail; ++ } + ++#ifdef __FreeBSD__ ++ /* ++ * We want to avoid passing oversize packets to the guest, which ++ * at least on FreeBSD can happen if the host interface uses tso ++ * (seen with an em(4) in this case) - so find out the host ++ * interface's mtu and assume the guest is configured the same. ++ */ ++ s->max_eth_frame_size = 1514; ++ i = socket(AF_INET, SOCK_DGRAM, 0); ++ if (i >= 0) { ++ struct ifreq ifr; ++ ++ (void) memset(&ifr, 0, sizeof(ifr)); ++ strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); ++ if (ioctl(i, SIOCGIFMTU, &ifr) != -1) ++ s->max_eth_frame_size = ifr.ifr_mtu + 14; ++ close(i); ++ } ++#endif ++ ++#if defined(CONFIG_PCAP_CREATE) || defined(_WIN32) ++ /* ++ * Create pcap handle for the device, set promiscuous mode and activate. ++ */ ++ s->handle = (void *)pcap_create(ifname, errbuf); ++ if (!s->handle) { ++ fprintf(stderr, "qemu: pcap_create: %s\n", errbuf); ++ goto fail; ++ } ++ if (pcap_set_promisc(s->handle, 1) != 0) { ++ pcap_perror(s->handle, (char *)"qemu: pcap_set_promisc:"); ++ goto fail; ++ } ++ if (pcap_activate(s->handle) != 0) { ++ pcap_perror(s->handle, (char *)"qemu: pcap_activate:"); ++ goto fail; ++ } ++#else ++ /* Attempt to connect device. */ ++ s->handle = (void *)pcap_open_live(ifname, 65535, 1, 0, errbuf); ++ if (!s->handle) { ++ fprintf(stderr, "qemu: pcap_open_live: %s\n", errbuf); ++ goto fail; ++ } ++#endif ++ ++ /* Set non-blocking mode. */ ++ if (pcap_setnonblock(s->handle, 1, errbuf) < 0) { ++ fprintf(stderr, "qemu: pcap_setnonblock: %s\n", errbuf); ++ goto fail; ++ } ++ ++#if defined(_WIN32) ++ /* ++ * Tell the kernel that the packet has to be seen immediately. ++ */ ++ if (pcap_setmintocopy(s->handle, 0) < 0) { ++ fprintf(stderr, "qemu: pcap failed to set immediate mode\n"); ++ goto fail; ++ } ++#else /* !_WIN32 */ ++#if defined(CONFIG_BPF) ++#if defined(BIOCIMMEDIATE) ++ /* ++ * Tell the kernel that the packet has to be seen immediately. ++ */ ++ { ++ unsigned int one = 1; ++ if (ioctl(pcap_fileno(s->handle), BIOCIMMEDIATE, &one) < 0) { ++ fprintf(stderr, "qemu: pcap failed to set immediate mode\n"); ++ goto fail; ++ } ++ } ++#endif /* BIOCIMMEDIATE */ ++#if defined(BIOCFEEDBACK) ++ /* ++ * Tell the kernel that the sent packet has to be fed back. ++ * This is necessary to connect host and guest. ++ */ ++ { ++ unsigned int one = 1; ++ if (ioctl(pcap_fileno(s->handle), BIOCFEEDBACK, &one) < 0) { ++ fprintf(stderr, "qemu: pcap failed to set feedback mode\n"); ++ goto fail; ++ } ++ } ++#endif /* BIOCFEEDBACK */ ++#endif /* CONFIG_BPF */ ++#endif /* _WIN32 */ ++ ++ snprintf(s->nc.info_str, sizeof(s->nc.info_str), "pcap redirector"); ++ ++#if defined(_WIN32) ++ if ((h = pcap_getevent(s->handle)) == NULL) { ++ fprintf(stderr, "qemu: pcap_getevent failed\n"); ++ goto fail; ++ } ++ qemu_add_wait_object(h, pcap_send, s); ++#else /* !_WIN32 */ ++ if ((i = pcap_get_selectable_fd(s->handle)) < 0) { ++ fprintf(stderr, "qemu: pcap_get_selectable_fd failed\n"); ++ goto fail; ++ } ++ qemu_set_fd_handler(i, pcap_send, NULL, s); ++#endif /* _WIN32 */ ++ ++ return 0; ++ ++fail: ++ if (s) { ++ if (s->handle) ++ pcap_close(s->handle); ++ } ++ ++ return -1; ++} ++ ++#endif ++ + static int (* const net_client_init_fun[NET_CLIENT_OPTIONS_KIND__MAX])( + const NetClientOptions *opts, + const char *name, +@@ -952,6 +1172,9 @@ static int (* const net_client_init_fun[ + #ifdef CONFIG_NET_BRIDGE + [NET_CLIENT_OPTIONS_KIND_BRIDGE] = net_init_bridge, + #endif ++#ifdef CONFIG_PCAP ++ [NET_CLIENT_OPTIONS_KIND_PCAP] = net_init_pcap, ++#endif + [NET_CLIENT_OPTIONS_KIND_HUBPORT] = net_init_hubport, + #ifdef CONFIG_VHOST_NET_USED + [NET_CLIENT_OPTIONS_KIND_VHOST_USER] = net_init_vhost_user, diff --git a/emulators/qemu-devel/pkg-plist b/emulators/qemu-devel/pkg-plist index 200aa0cb95d3..3c2a40c70542 100644 --- a/emulators/qemu-devel/pkg-plist +++ b/emulators/qemu-devel/pkg-plist @@ -45,7 +45,6 @@ man/man8/qemu-nbd.8.gz %%DATADIR%%/QEMU,tcx.bin %%DATADIR%%/QEMU,cgthree.bin %%DATADIR%%/acpi-dsdt.aml -%%DATADIR%%/q35-acpi-dsdt.aml %%DATADIR%%/bios-256k.bin %%DATADIR%%/bios.bin %%DATADIR%%/efi-e1000.rom @@ -54,7 +53,6 @@ man/man8/qemu-nbd.8.gz %%DATADIR%%/efi-pcnet.rom %%DATADIR%%/efi-rtl8139.rom %%DATADIR%%/efi-virtio.rom -%%DATADIR%%/s390-ccw.img %%DATADIR%%/vgabios.bin %%DATADIR%%/vgabios-cirrus.bin %%DATADIR%%/vgabios-qxl.bin @@ -75,7 +73,7 @@ man/man8/qemu-nbd.8.gz %%DATADIR%%/petalogix-ml605.dtb %%DATADIR%%/spapr-rtas.bin %%DATADIR%%/slof.bin -%%DATADIR%%/s390-zipl.rom +%%DATADIR%%/s390-ccw.img %%DATADIR%%/linuxboot.bin %%DATADIR%%/multiboot.bin %%DATADIR%%/sgabios.bin -- cgit