configure | 10 +- net/Makefile.objs | 2 +- net/clients.h | 8 + net/gre.c | 314 +++++++++++++++++++++++++++++++ net/l2tpv3.c | 531 ++++++++--------------------------------------------- net/net.c | 19 +- net/queue.c | 21 +-- net/raw.c | 123 +++++++++++++ net/unified.c | 406 ++++++++++++++++++++++++++++++++++++++++ net/unified.h | 118 ++++++++++++ net/vxlan-static.c | 229 +++++++++++++++++++++++ qapi-schema.json | 91 ++++++++- 12 files changed, 1392 insertions(+), 480 deletions(-) create mode 100644 net/gre.c create mode 100644 net/raw.c create mode 100644 net/unified.c create mode 100644 net/unified.h create mode 100644 net/vxlan-static.c
From: Anton Ivanov <anton.ivanov@cambridgegreys.com>
1. Creates a common recvmmsg backend for socket transports
2. Migrates L2TPv3 to the new backend
3. Adds gre socket transport - a vm can attach directly to GRE
4. Adds raw socket transport - a vm can attach directly to an
Ethernet interface
5. Adds simplistic static VXLAN tunnel transport (no
control plane).
6. Sets up some of the infrastructure for future addition of
sendmmsg
Signed-off-by: Anton Ivanov <anton.ivanov@cambridgegreys.com>
---
configure | 10 +-
net/Makefile.objs | 2 +-
net/clients.h | 8 +
net/gre.c | 314 +++++++++++++++++++++++++++++++
net/l2tpv3.c | 531 ++++++++---------------------------------------------
net/net.c | 19 +-
net/queue.c | 21 +--
net/raw.c | 123 +++++++++++++
net/unified.c | 406 ++++++++++++++++++++++++++++++++++++++++
net/unified.h | 118 ++++++++++++
net/vxlan-static.c | 229 +++++++++++++++++++++++
qapi-schema.json | 91 ++++++++-
12 files changed, 1392 insertions(+), 480 deletions(-)
create mode 100644 net/gre.c
create mode 100644 net/raw.c
create mode 100644 net/unified.c
create mode 100644 net/unified.h
create mode 100644 net/vxlan-static.c
diff --git a/configure b/configure
index a3f0522e8f..99a60b723c 100755
--- a/configure
+++ b/configure
@@ -1862,7 +1862,7 @@ if ! compile_object -Werror ; then
fi
##########################################
-# L2TPV3 probe
+# UNIFIED probe
cat > $TMPC <<EOF
#include <sys/socket.h>
@@ -1870,9 +1870,9 @@ cat > $TMPC <<EOF
int main(void) { return sizeof(struct mmsghdr); }
EOF
if compile_prog "" "" ; then
- l2tpv3=yes
+ unified=yes
else
- l2tpv3=no
+ unified=no
fi
##########################################
@@ -5458,8 +5458,8 @@ fi
if test "$netmap" = "yes" ; then
echo "CONFIG_NETMAP=y" >> $config_host_mak
fi
-if test "$l2tpv3" = "yes" ; then
- echo "CONFIG_L2TPV3=y" >> $config_host_mak
+if test "$unified" = "yes" ; then
+ echo "CONFIG_UNIFIED=y" >> $config_host_mak
fi
if test "$cap_ng" = "yes" ; then
echo "CONFIG_LIBCAP=y" >> $config_host_mak
diff --git a/net/Makefile.objs b/net/Makefile.objs
index 67ba5e26fb..440360f714 100644
--- a/net/Makefile.objs
+++ b/net/Makefile.objs
@@ -2,7 +2,7 @@ common-obj-y = net.o queue.o checksum.o util.o hub.o
common-obj-y += socket.o
common-obj-y += dump.o
common-obj-y += eth.o
-common-obj-$(CONFIG_L2TPV3) += l2tpv3.o
+common-obj-$(CONFIG_UNIFIED) += l2tpv3.o unified.o raw.o gre.o vxlan-static.o
common-obj-$(CONFIG_POSIX) += vhost-user.o
common-obj-$(CONFIG_SLIRP) += slirp.o
common-obj-$(CONFIG_VDE) += vde.o
diff --git a/net/clients.h b/net/clients.h
index 5cae479730..f91b879101 100644
--- a/net/clients.h
+++ b/net/clients.h
@@ -49,6 +49,14 @@ int net_init_bridge(const Netdev *netdev, const char *name,
int net_init_l2tpv3(const Netdev *netdev, const char *name,
NetClientState *peer, Error **errp);
+
+int net_init_raw(const Netdev *netdev, const char *name,
+ NetClientState *peer, Error **errp);
+
+int net_init_gre(const Netdev *netdev, const char *name,
+ NetClientState *peer, Error **errp);
+int net_init_vxlan(const Netdev *netdev, const char *name,
+ NetClientState *peer, Error **errp);
#ifdef CONFIG_VDE
int net_init_vde(const Netdev *netdev, const char *name,
NetClientState *peer, Error **errp);
diff --git a/net/gre.c b/net/gre.c
new file mode 100644
index 0000000000..2197b7581d
--- /dev/null
+++ b/net/gre.c
@@ -0,0 +1,314 @@
+/*
+ * QEMU System Emulator
+ *
+ * Copyright (c) 2015-2017 Cambridge GREys Limited
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ * Copyright (c) 2012-2014 Cisco Systems
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "qemu/osdep.h"
+#include <linux/ip.h>
+#include <netdb.h>
+#include "net/net.h"
+#include "clients.h"
+#include "qemu-common.h"
+#include "qemu/error-report.h"
+#include "qemu/option.h"
+#include "qemu/sockets.h"
+#include "qemu/iov.h"
+#include "qemu/main-loop.h"
+#include "unified.h"
+
+/* IANA-assigned IP protocol ID for GRE */
+
+
+#ifndef IPPROTO_GRE
+#define IPPROTO_GRE 0x2F
+#endif
+
+#define GRE_MODE_CHECKSUM htons(8 << 12) /* checksum */
+#define GRE_MODE_RESERVED htons(4 << 12) /* unused */
+#define GRE_MODE_KEY htons(2 << 12) /* KEY present */
+#define GRE_MODE_SEQUENCE htons(1 << 12) /* no sequence */
+
+
+/* GRE TYPE for Ethernet in GRE aka GRETAP */
+
+#define GRE_IRB htons(0x6558)
+
+struct gre_minimal_header {
+ uint16_t header;
+ uint16_t arptype;
+};
+
+typedef struct GRETunnelParams {
+ /*
+ * GRE parameters
+ */
+
+ uint32_t rx_key;
+ uint32_t tx_key;
+ uint32_t sequence;
+
+ /* Flags */
+
+ bool ipv6;
+ bool udp;
+ bool has_sequence;
+ bool pin_sequence;
+ bool checksum;
+ bool key;
+
+ /* Precomputed GRE specific offsets */
+
+ uint32_t key_offset;
+ uint32_t sequence_offset;
+ uint32_t checksum_offset;
+
+ struct gre_minimal_header header_bits;
+
+} GRETunnelParams;
+
+
+
+static void gre_form_header(void *us)
+{
+ NetUnifiedState *s = (NetUnifiedState *) us;
+ GRETunnelParams *p = (GRETunnelParams *) s->params;
+
+ uint32_t *sequence;
+
+ *((uint32_t *) s->header_buf) = *((uint32_t *) &p->header_bits);
+
+ if (p->key) {
+ stl_be_p(
+ (uint32_t *) (s->header_buf + p->key_offset),
+ p->tx_key
+ );
+ }
+ if (p->has_sequence) {
+ sequence = (uint32_t *)(s->header_buf + p->sequence_offset);
+ if (p->pin_sequence) {
+ *sequence = 0;
+ } else {
+ stl_be_p(sequence, ++p->sequence);
+ }
+ }
+}
+
+static int gre_verify_header(void *us, uint8_t *buf)
+{
+
+ NetUnifiedState *s = (NetUnifiedState *) us;
+ GRETunnelParams *p = (GRETunnelParams *) s->params;
+ uint32_t key;
+
+
+ if (!p->ipv6) {
+ buf += sizeof(struct iphdr) /* fix for ipv4 raw */;
+ }
+
+ if (*((uint32_t *) buf) != *((uint32_t *) &p->header_bits)) {
+ if (!s->header_mismatch) {
+ error_report("header type disagreement, expecting %0x, got %0x",
+ *((uint32_t *) &p->header_bits), *((uint32_t *) buf));
+ }
+ return -1;
+ }
+
+ if (p->key) {
+ key = ldl_be_p(buf + p->key_offset);
+ if (key != p->rx_key) {
+ if (!s->header_mismatch) {
+ error_report("unknown key id %0x, expecting %0x",
+ key, p->rx_key);
+ }
+ return -1;
+ }
+ }
+ return 0;
+}
+
+int net_init_gre(const Netdev *netdev,
+ const char *name,
+ NetClientState *peer, Error **errp)
+{
+ /* FIXME error_setg(errp, ...) on failure */
+ const NetdevGREOptions *gre;
+ NetUnifiedState *s;
+ NetClientState *nc;
+ GRETunnelParams *p;
+
+ int fd = -1, gairet;
+ struct addrinfo hints;
+ struct addrinfo *result = NULL;
+
+ nc = qemu_new_unified_net_client(name, peer);
+
+ s = DO_UPCAST(NetUnifiedState, nc, nc);
+
+ p = g_malloc(sizeof(GRETunnelParams));
+
+ s->params = p;
+ p->header_bits.arptype = GRE_IRB;
+ p->header_bits.header = 0;
+
+ s->form_header = &gre_form_header;
+ s->verify_header = &gre_verify_header;
+ s->queue_head = 0;
+ s->queue_tail = 0;
+ s->header_mismatch = false;
+
+ assert(netdev->type == NET_CLIENT_DRIVER_GRE);
+ gre = &netdev->u.gre;
+
+ if (gre->has_ipv6 && gre->ipv6) {
+ p->ipv6 = gre->ipv6;
+ } else {
+ p->ipv6 = false;
+ }
+
+ s->offset = 4;
+ p->key_offset = 4;
+ p->sequence_offset = 4;
+ p->checksum_offset = 4;
+
+ if (gre->has_rxkey || gre->has_txkey) {
+ if (gre->has_rxkey && gre->has_txkey) {
+ p->key = true;
+ p->header_bits.header |= GRE_MODE_KEY;
+ } else {
+ goto outerr;
+ }
+ } else {
+ p->key = false;
+ }
+
+ if (p->key) {
+ p->rx_key = gre->rxkey;
+ p->tx_key = gre->txkey;
+ s->offset += 4;
+ p->sequence_offset += 4;
+ }
+
+
+ if (gre->has_sequence && gre->sequence) {
+ s->offset += 4;
+ p->has_sequence = true;
+ p->header_bits.header |= GRE_MODE_SEQUENCE;
+ } else {
+ p->sequence = false;
+ }
+
+ if (gre->has_pinsequence && gre->pinsequence) {
+ /* pin sequence implies that there is sequence */
+ p->has_sequence = true;
+ p->pin_sequence = true;
+ } else {
+ p->pin_sequence = false;
+ }
+
+ memset(&hints, 0, sizeof(hints));
+
+ if (p->ipv6) {
+ hints.ai_family = AF_INET6;
+ } else {
+ hints.ai_family = AF_INET;
+ }
+
+ hints.ai_socktype = SOCK_RAW;
+ hints.ai_protocol = IPPROTO_GRE;
+
+ gairet = getaddrinfo(gre->src, NULL, &hints, &result);
+
+ if ((gairet != 0) || (result == NULL)) {
+ error_report(
+ "gre_open : could not resolve src, errno = %s",
+ gai_strerror(gairet)
+ );
+ goto outerr;
+ }
+ fd = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
+ if (fd == -1) {
+ fd = -errno;
+ error_report("gre_open : socket creation failed, errno = %d", -fd);
+ goto outerr;
+ }
+ if (bind(fd, (struct sockaddr *) result->ai_addr, result->ai_addrlen)) {
+ error_report("gre_open : could not bind socket err=%i", errno);
+ goto outerr;
+ }
+ if (result) {
+ freeaddrinfo(result);
+ }
+
+ memset(&hints, 0, sizeof(hints));
+
+ if (p->ipv6) {
+ hints.ai_family = AF_INET6;
+ } else {
+ hints.ai_family = AF_INET;
+ }
+ hints.ai_socktype = SOCK_RAW;
+ hints.ai_protocol = IPPROTO_GRE;
+
+ result = NULL;
+ gairet = getaddrinfo(gre->dst, NULL, &hints, &result);
+ if ((gairet != 0) || (result == NULL)) {
+ error_report(
+ "gre_open : could not resolve dst, error = %s",
+ gai_strerror(gairet)
+ );
+ goto outerr;
+ }
+
+ s->dgram_dst = g_new0(struct sockaddr_storage, 1);
+ memcpy(s->dgram_dst, result->ai_addr, result->ai_addrlen);
+ s->dst_size = result->ai_addrlen;
+
+ if (result) {
+ freeaddrinfo(result);
+ }
+
+ if ((p->ipv6) || (p->udp)) {
+ s->header_size = s->offset;
+ } else {
+ s->header_size = s->offset + sizeof(struct iphdr);
+ }
+
+ qemu_net_finalize_unified_init(s, fd);
+
+ p->sequence = 0;
+
+ snprintf(s->nc.info_str, sizeof(s->nc.info_str),
+ "gre: connected");
+ return 0;
+outerr:
+ qemu_del_net_client(nc);
+ if (fd >= 0) {
+ close(fd);
+ }
+ if (result) {
+ freeaddrinfo(result);
+ }
+ return -1;
+}
+
diff --git a/net/l2tpv3.c b/net/l2tpv3.c
index 6745b78990..05413c9cbd 100644
--- a/net/l2tpv3.c
+++ b/net/l2tpv3.c
@@ -1,6 +1,7 @@
/*
* QEMU System Emulator
*
+ * Copyright (c) 2015-2017 Cambridge Greys Limited
* Copyright (c) 2003-2008 Fabrice Bellard
* Copyright (c) 2012-2014 Cisco Systems
*
@@ -34,19 +35,9 @@
#include "qemu/sockets.h"
#include "qemu/iov.h"
#include "qemu/main-loop.h"
+#include "unified.h"
-/* The buffer size needs to be investigated for optimum numbers and
- * optimum means of paging in on different systems. This size is
- * chosen to be sufficient to accommodate one packet with some headers
- */
-
-#define BUFFER_ALIGN sysconf(_SC_PAGESIZE)
-#define BUFFER_SIZE 2048
-#define IOVSIZE 2
-#define MAX_L2TPV3_MSGCNT 64
-#define MAX_L2TPV3_IOVCNT (MAX_L2TPV3_MSGCNT * IOVSIZE)
-
/* Header set to 0x30000 signifies a data packet */
#define L2TPV3_DATA_PACKET 0x30000
@@ -57,31 +48,7 @@
#define IPPROTO_L2TP 0x73
#endif
-typedef struct NetL2TPV3State {
- NetClientState nc;
- int fd;
-
- /*
- * these are used for xmit - that happens packet a time
- * and for first sign of life packet (easier to parse that once)
- */
-
- uint8_t *header_buf;
- struct iovec *vec;
-
- /*
- * these are used for receive - try to "eat" up to 32 packets at a time
- */
-
- struct mmsghdr *msgvec;
-
- /*
- * peer address
- */
-
- struct sockaddr_storage *dgram_dst;
- uint32_t dst_size;
-
+typedef struct L2TPV3TunnelParams {
/*
* L2TPv3 parameters
*/
@@ -90,37 +57,8 @@ typedef struct NetL2TPV3State {
uint64_t tx_cookie;
uint32_t rx_session;
uint32_t tx_session;
- uint32_t header_size;
uint32_t counter;
- /*
- * DOS avoidance in error handling
- */
-
- bool header_mismatch;
-
- /*
- * Ring buffer handling
- */
-
- int queue_head;
- int queue_tail;
- int queue_depth;
-
- /*
- * Precomputed offsets
- */
-
- uint32_t offset;
- uint32_t cookie_offset;
- uint32_t counter_offset;
- uint32_t session_offset;
-
- /* Poll Control */
-
- bool read_poll;
- bool write_poll;
-
/* Flags */
bool ipv6;
@@ -130,189 +68,62 @@ typedef struct NetL2TPV3State {
bool cookie;
bool cookie_is_64;
-} NetL2TPV3State;
-
-static void net_l2tpv3_send(void *opaque);
-static void l2tpv3_writable(void *opaque);
-
-static void l2tpv3_update_fd_handler(NetL2TPV3State *s)
-{
- qemu_set_fd_handler(s->fd,
- s->read_poll ? net_l2tpv3_send : NULL,
- s->write_poll ? l2tpv3_writable : NULL,
- s);
-}
-
-static void l2tpv3_read_poll(NetL2TPV3State *s, bool enable)
-{
- if (s->read_poll != enable) {
- s->read_poll = enable;
- l2tpv3_update_fd_handler(s);
- }
-}
+ /* Precomputed L2TPV3 specific offsets */
+ uint32_t cookie_offset;
+ uint32_t counter_offset;
+ uint32_t session_offset;
-static void l2tpv3_write_poll(NetL2TPV3State *s, bool enable)
-{
- if (s->write_poll != enable) {
- s->write_poll = enable;
- l2tpv3_update_fd_handler(s);
- }
-}
+} L2TPV3TunnelParams;
-static void l2tpv3_writable(void *opaque)
-{
- NetL2TPV3State *s = opaque;
- l2tpv3_write_poll(s, false);
- qemu_flush_queued_packets(&s->nc);
-}
-static void l2tpv3_send_completed(NetClientState *nc, ssize_t len)
-{
- NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc);
- l2tpv3_read_poll(s, true);
-}
-static void l2tpv3_poll(NetClientState *nc, bool enable)
+static void l2tpv3_form_header(void *us)
{
- NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc);
- l2tpv3_write_poll(s, enable);
- l2tpv3_read_poll(s, enable);
-}
+ NetUnifiedState *s = (NetUnifiedState *) us;
+ L2TPV3TunnelParams *p = (L2TPV3TunnelParams *) s->params;
-static void l2tpv3_form_header(NetL2TPV3State *s)
-{
uint32_t *counter;
- if (s->udp) {
+ if (p->udp) {
stl_be_p((uint32_t *) s->header_buf, L2TPV3_DATA_PACKET);
}
stl_be_p(
- (uint32_t *) (s->header_buf + s->session_offset),
- s->tx_session
+ (uint32_t *) (s->header_buf + p->session_offset),
+ p->tx_session
);
- if (s->cookie) {
- if (s->cookie_is_64) {
+ if (p->cookie) {
+ if (p->cookie_is_64) {
stq_be_p(
- (uint64_t *)(s->header_buf + s->cookie_offset),
- s->tx_cookie
+ (uint64_t *)(s->header_buf + p->cookie_offset),
+ p->tx_cookie
);
} else {
stl_be_p(
- (uint32_t *) (s->header_buf + s->cookie_offset),
- s->tx_cookie
+ (uint32_t *) (s->header_buf + p->cookie_offset),
+ p->tx_cookie
);
}
}
- if (s->has_counter) {
- counter = (uint32_t *)(s->header_buf + s->counter_offset);
- if (s->pin_counter) {
+ if (p->has_counter) {
+ counter = (uint32_t *)(s->header_buf + p->counter_offset);
+ if (p->pin_counter) {
*counter = 0;
} else {
- stl_be_p(counter, ++s->counter);
- }
- }
-}
-
-static ssize_t net_l2tpv3_receive_dgram_iov(NetClientState *nc,
- const struct iovec *iov,
- int iovcnt)
-{
- NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc);
-
- struct msghdr message;
- int ret;
-
- if (iovcnt > MAX_L2TPV3_IOVCNT - 1) {
- error_report(
- "iovec too long %d > %d, change l2tpv3.h",
- iovcnt, MAX_L2TPV3_IOVCNT
- );
- return -1;
- }
- l2tpv3_form_header(s);
- memcpy(s->vec + 1, iov, iovcnt * sizeof(struct iovec));
- s->vec->iov_base = s->header_buf;
- s->vec->iov_len = s->offset;
- message.msg_name = s->dgram_dst;
- message.msg_namelen = s->dst_size;
- message.msg_iov = s->vec;
- message.msg_iovlen = iovcnt + 1;
- message.msg_control = NULL;
- message.msg_controllen = 0;
- message.msg_flags = 0;
- do {
- ret = sendmsg(s->fd, &message, 0);
- } while ((ret == -1) && (errno == EINTR));
- if (ret > 0) {
- ret -= s->offset;
- } else if (ret == 0) {
- /* belt and braces - should not occur on DGRAM
- * we should get an error and never a 0 send
- */
- ret = iov_size(iov, iovcnt);
- } else {
- /* signal upper layer that socket buffer is full */
- ret = -errno;
- if (ret == -EAGAIN || ret == -ENOBUFS) {
- l2tpv3_write_poll(s, true);
- ret = 0;
+ stl_be_p(counter, ++p->counter);
}
}
- return ret;
}
-static ssize_t net_l2tpv3_receive_dgram(NetClientState *nc,
- const uint8_t *buf,
- size_t size)
-{
- NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc);
-
- struct iovec *vec;
- struct msghdr message;
- ssize_t ret = 0;
-
- l2tpv3_form_header(s);
- vec = s->vec;
- vec->iov_base = s->header_buf;
- vec->iov_len = s->offset;
- vec++;
- vec->iov_base = (void *) buf;
- vec->iov_len = size;
- message.msg_name = s->dgram_dst;
- message.msg_namelen = s->dst_size;
- message.msg_iov = s->vec;
- message.msg_iovlen = 2;
- message.msg_control = NULL;
- message.msg_controllen = 0;
- message.msg_flags = 0;
- do {
- ret = sendmsg(s->fd, &message, 0);
- } while ((ret == -1) && (errno == EINTR));
- if (ret > 0) {
- ret -= s->offset;
- } else if (ret == 0) {
- /* belt and braces - should not occur on DGRAM
- * we should get an error and never a 0 send
- */
- ret = size;
- } else {
- ret = -errno;
- if (ret == -EAGAIN || ret == -ENOBUFS) {
- /* signal upper layer that socket buffer is full */
- l2tpv3_write_poll(s, true);
- ret = 0;
- }
- }
- return ret;
-}
-static int l2tpv3_verify_header(NetL2TPV3State *s, uint8_t *buf)
+static int l2tpv3_verify_header(void *us, uint8_t *buf)
{
+ NetUnifiedState *s = (NetUnifiedState *) us;
+ L2TPV3TunnelParams *p = (L2TPV3TunnelParams *) s->params;
uint32_t *session;
uint64_t cookie;
- if ((!s->udp) && (!s->ipv6)) {
+ if ((!p->udp) && (!p->ipv6)) {
buf += sizeof(struct iphdr) /* fix for ipv4 raw */;
}
@@ -321,21 +132,21 @@ static int l2tpv3_verify_header(NetL2TPV3State *s, uint8_t *buf)
* that anyway.
*/
- if (s->cookie) {
- if (s->cookie_is_64) {
- cookie = ldq_be_p(buf + s->cookie_offset);
+ if (p->cookie) {
+ if (p->cookie_is_64) {
+ cookie = ldq_be_p(buf + p->cookie_offset);
} else {
- cookie = ldl_be_p(buf + s->cookie_offset) & 0xffffffffULL;
+ cookie = ldl_be_p(buf + p->cookie_offset) & 0xffffffffULL;
}
- if (cookie != s->rx_cookie) {
+ if (cookie != p->rx_cookie) {
if (!s->header_mismatch) {
error_report("unknown cookie id");
}
return -1;
}
}
- session = (uint32_t *) (buf + s->session_offset);
- if (ldl_be_p(session) != s->rx_session) {
+ session = (uint32_t *) (buf + p->session_offset);
+ if (ldl_be_p(session) != p->rx_session) {
if (!s->header_mismatch) {
error_report("session mismatch");
}
@@ -344,203 +155,31 @@ static int l2tpv3_verify_header(NetL2TPV3State *s, uint8_t *buf)
return 0;
}
-static void net_l2tpv3_process_queue(NetL2TPV3State *s)
-{
- int size = 0;
- struct iovec *vec;
- bool bad_read;
- int data_size;
- struct mmsghdr *msgvec;
-
- /* go into ring mode only if there is a "pending" tail */
- if (s->queue_depth > 0) {
- do {
- msgvec = s->msgvec + s->queue_tail;
- if (msgvec->msg_len > 0) {
- data_size = msgvec->msg_len - s->header_size;
- vec = msgvec->msg_hdr.msg_iov;
- if ((data_size > 0) &&
- (l2tpv3_verify_header(s, vec->iov_base) == 0)) {
- vec++;
- /* Use the legacy delivery for now, we will
- * switch to using our own ring as a queueing mechanism
- * at a later date
- */
- size = qemu_send_packet_async(
- &s->nc,
- vec->iov_base,
- data_size,
- l2tpv3_send_completed
- );
- if (size == 0) {
- l2tpv3_read_poll(s, false);
- }
- bad_read = false;
- } else {
- bad_read = true;
- if (!s->header_mismatch) {
- /* report error only once */
- error_report("l2tpv3 header verification failed");
- s->header_mismatch = true;
- }
- }
- } else {
- bad_read = true;
- }
- s->queue_tail = (s->queue_tail + 1) % MAX_L2TPV3_MSGCNT;
- s->queue_depth--;
- } while (
- (s->queue_depth > 0) &&
- qemu_can_send_packet(&s->nc) &&
- ((size > 0) || bad_read)
- );
- }
-}
-
-static void net_l2tpv3_send(void *opaque)
-{
- NetL2TPV3State *s = opaque;
- int target_count, count;
- struct mmsghdr *msgvec;
-
- /* go into ring mode only if there is a "pending" tail */
-
- if (s->queue_depth) {
-
- /* The ring buffer we use has variable intake
- * count of how much we can read varies - adjust accordingly
- */
-
- target_count = MAX_L2TPV3_MSGCNT - s->queue_depth;
-
- /* Ensure we do not overrun the ring when we have
- * a lot of enqueued packets
- */
-
- if (s->queue_head + target_count > MAX_L2TPV3_MSGCNT) {
- target_count = MAX_L2TPV3_MSGCNT - s->queue_head;
- }
- } else {
-
- /* we do not have any pending packets - we can use
- * the whole message vector linearly instead of using
- * it as a ring
- */
-
- s->queue_head = 0;
- s->queue_tail = 0;
- target_count = MAX_L2TPV3_MSGCNT;
- }
-
- msgvec = s->msgvec + s->queue_head;
- if (target_count > 0) {
- do {
- count = recvmmsg(
- s->fd,
- msgvec,
- target_count, MSG_DONTWAIT, NULL);
- } while ((count == -1) && (errno == EINTR));
- if (count < 0) {
- /* Recv error - we still need to flush packets here,
- * (re)set queue head to current position
- */
- count = 0;
- }
- s->queue_head = (s->queue_head + count) % MAX_L2TPV3_MSGCNT;
- s->queue_depth += count;
- }
- net_l2tpv3_process_queue(s);
-}
-
-static void destroy_vector(struct mmsghdr *msgvec, int count, int iovcount)
-{
- int i, j;
- struct iovec *iov;
- struct mmsghdr *cleanup = msgvec;
- if (cleanup) {
- for (i = 0; i < count; i++) {
- if (cleanup->msg_hdr.msg_iov) {
- iov = cleanup->msg_hdr.msg_iov;
- for (j = 0; j < iovcount; j++) {
- g_free(iov->iov_base);
- iov++;
- }
- g_free(cleanup->msg_hdr.msg_iov);
- }
- cleanup++;
- }
- g_free(msgvec);
- }
-}
-
-static struct mmsghdr *build_l2tpv3_vector(NetL2TPV3State *s, int count)
-{
- int i;
- struct iovec *iov;
- struct mmsghdr *msgvec, *result;
-
- msgvec = g_new(struct mmsghdr, count);
- result = msgvec;
- for (i = 0; i < count ; i++) {
- msgvec->msg_hdr.msg_name = NULL;
- msgvec->msg_hdr.msg_namelen = 0;
- iov = g_new(struct iovec, IOVSIZE);
- msgvec->msg_hdr.msg_iov = iov;
- iov->iov_base = g_malloc(s->header_size);
- iov->iov_len = s->header_size;
- iov++ ;
- iov->iov_base = qemu_memalign(BUFFER_ALIGN, BUFFER_SIZE);
- iov->iov_len = BUFFER_SIZE;
- msgvec->msg_hdr.msg_iovlen = 2;
- msgvec->msg_hdr.msg_control = NULL;
- msgvec->msg_hdr.msg_controllen = 0;
- msgvec->msg_hdr.msg_flags = 0;
- msgvec++;
- }
- return result;
-}
-
-static void net_l2tpv3_cleanup(NetClientState *nc)
-{
- NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc);
- qemu_purge_queued_packets(nc);
- l2tpv3_read_poll(s, false);
- l2tpv3_write_poll(s, false);
- if (s->fd >= 0) {
- close(s->fd);
- }
- destroy_vector(s->msgvec, MAX_L2TPV3_MSGCNT, IOVSIZE);
- g_free(s->vec);
- g_free(s->header_buf);
- g_free(s->dgram_dst);
-}
-
-static NetClientInfo net_l2tpv3_info = {
- .type = NET_CLIENT_DRIVER_L2TPV3,
- .size = sizeof(NetL2TPV3State),
- .receive = net_l2tpv3_receive_dgram,
- .receive_iov = net_l2tpv3_receive_dgram_iov,
- .poll = l2tpv3_poll,
- .cleanup = net_l2tpv3_cleanup,
-};
-
int net_init_l2tpv3(const Netdev *netdev,
const char *name,
NetClientState *peer, Error **errp)
{
/* FIXME error_setg(errp, ...) on failure */
const NetdevL2TPv3Options *l2tpv3;
- NetL2TPV3State *s;
+ NetUnifiedState *s;
NetClientState *nc;
+ L2TPV3TunnelParams *p;
+
int fd = -1, gairet;
struct addrinfo hints;
struct addrinfo *result = NULL;
char *srcport, *dstport;
- nc = qemu_new_net_client(&net_l2tpv3_info, peer, "l2tpv3", name);
+ nc = qemu_new_unified_net_client(name, peer);
+
+ s = DO_UPCAST(NetUnifiedState, nc, nc);
+
+ p = g_malloc(sizeof(L2TPV3TunnelParams));
- s = DO_UPCAST(NetL2TPV3State, nc, nc);
+ s->params = p;
+ s->form_header = &l2tpv3_form_header;
+ s->verify_header = &l2tpv3_verify_header;
s->queue_head = 0;
s->queue_tail = 0;
s->header_mismatch = false;
@@ -549,9 +188,9 @@ int net_init_l2tpv3(const Netdev *netdev,
l2tpv3 = &netdev->u.l2tpv3;
if (l2tpv3->has_ipv6 && l2tpv3->ipv6) {
- s->ipv6 = l2tpv3->ipv6;
+ p->ipv6 = l2tpv3->ipv6;
} else {
- s->ipv6 = false;
+ p->ipv6 = false;
}
if ((l2tpv3->has_offset) && (l2tpv3->offset > 256)) {
@@ -561,22 +200,22 @@ int net_init_l2tpv3(const Netdev *netdev,
if (l2tpv3->has_rxcookie || l2tpv3->has_txcookie) {
if (l2tpv3->has_rxcookie && l2tpv3->has_txcookie) {
- s->cookie = true;
+ p->cookie = true;
} else {
goto outerr;
}
} else {
- s->cookie = false;
+ p->cookie = false;
}
if (l2tpv3->has_cookie64 || l2tpv3->cookie64) {
- s->cookie_is_64 = true;
+ p->cookie_is_64 = true;
} else {
- s->cookie_is_64 = false;
+ p->cookie_is_64 = false;
}
if (l2tpv3->has_udp && l2tpv3->udp) {
- s->udp = true;
+ p->udp = true;
if (!(l2tpv3->has_srcport && l2tpv3->has_dstport)) {
error_report("l2tpv3_open : need both src and dst port for udp");
goto outerr;
@@ -585,52 +224,52 @@ int net_init_l2tpv3(const Netdev *netdev,
dstport = l2tpv3->dstport;
}
} else {
- s->udp = false;
+ p->udp = false;
srcport = NULL;
dstport = NULL;
}
s->offset = 4;
- s->session_offset = 0;
- s->cookie_offset = 4;
- s->counter_offset = 4;
+ p->session_offset = 0;
+ p->cookie_offset = 4;
+ p->counter_offset = 4;
- s->tx_session = l2tpv3->txsession;
+ p->tx_session = l2tpv3->txsession;
if (l2tpv3->has_rxsession) {
- s->rx_session = l2tpv3->rxsession;
+ p->rx_session = l2tpv3->rxsession;
} else {
- s->rx_session = s->tx_session;
+ p->rx_session = p->tx_session;
}
- if (s->cookie) {
- s->rx_cookie = l2tpv3->rxcookie;
- s->tx_cookie = l2tpv3->txcookie;
- if (s->cookie_is_64 == true) {
+ if (p->cookie) {
+ p->rx_cookie = l2tpv3->rxcookie;
+ p->tx_cookie = l2tpv3->txcookie;
+ if (p->cookie_is_64 == true) {
/* 64 bit cookie */
s->offset += 8;
- s->counter_offset += 8;
+ p->counter_offset += 8;
} else {
/* 32 bit cookie */
s->offset += 4;
- s->counter_offset += 4;
+ p->counter_offset += 4;
}
}
memset(&hints, 0, sizeof(hints));
- if (s->ipv6) {
+ if (p->ipv6) {
hints.ai_family = AF_INET6;
} else {
hints.ai_family = AF_INET;
}
- if (s->udp) {
+ if (p->udp) {
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = 0;
s->offset += 4;
- s->counter_offset += 4;
- s->session_offset += 4;
- s->cookie_offset += 4;
+ p->counter_offset += 4;
+ p->session_offset += 4;
+ p->cookie_offset += 4;
} else {
hints.ai_socktype = SOCK_RAW;
hints.ai_protocol = IPPROTO_L2TP;
@@ -661,12 +300,12 @@ int net_init_l2tpv3(const Netdev *netdev,
memset(&hints, 0, sizeof(hints));
- if (s->ipv6) {
+ if (p->ipv6) {
hints.ai_family = AF_INET6;
} else {
hints.ai_family = AF_INET;
}
- if (s->udp) {
+ if (p->udp) {
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = 0;
} else {
@@ -693,17 +332,17 @@ int net_init_l2tpv3(const Netdev *netdev,
}
if (l2tpv3->has_counter && l2tpv3->counter) {
- s->has_counter = true;
+ p->has_counter = true;
s->offset += 4;
} else {
- s->has_counter = false;
+ p->has_counter = false;
}
if (l2tpv3->has_pincounter && l2tpv3->pincounter) {
- s->has_counter = true; /* pin counter implies that there is counter */
- s->pin_counter = true;
+ p->has_counter = true; /* pin counter implies that there is counter */
+ p->pin_counter = true;
} else {
- s->pin_counter = false;
+ p->pin_counter = false;
}
if (l2tpv3->has_offset) {
@@ -711,22 +350,14 @@ int net_init_l2tpv3(const Netdev *netdev,
s->offset += l2tpv3->offset;
}
- if ((s->ipv6) || (s->udp)) {
+ if ((p->ipv6) || (p->udp)) {
s->header_size = s->offset;
} else {
s->header_size = s->offset + sizeof(struct iphdr);
}
- s->msgvec = build_l2tpv3_vector(s, MAX_L2TPV3_MSGCNT);
- s->vec = g_new(struct iovec, MAX_L2TPV3_IOVCNT);
- s->header_buf = g_malloc(s->header_size);
-
- qemu_set_nonblock(fd);
-
- s->fd = fd;
- s->counter = 0;
-
- l2tpv3_read_poll(s, true);
+ qemu_net_finalize_unified_init(s, fd);
+ p->counter = 0;
snprintf(s->nc.info_str, sizeof(s->nc.info_str),
"l2tpv3: connected");
diff --git a/net/net.c b/net/net.c
index 6235aabed8..4d9f0deb06 100644
--- a/net/net.c
+++ b/net/net.c
@@ -959,8 +959,11 @@ static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
#ifdef CONFIG_VHOST_NET_USED
[NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user,
#endif
-#ifdef CONFIG_L2TPV3
- [NET_CLIENT_DRIVER_L2TPV3] = net_init_l2tpv3,
+#ifdef CONFIG_UNIFIED
+ [NET_CLIENT_DRIVER_RAW] = net_init_raw,
+ [NET_CLIENT_DRIVER_GRE] = net_init_gre,
+ [NET_CLIENT_DRIVER_VXLAN] = net_init_vxlan,
+ [NET_CLIENT_DRIVER_L2TPV3] = net_init_l2tpv3,
#endif
};
@@ -1008,6 +1011,18 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
legacy.type = NET_CLIENT_DRIVER_TAP;
legacy.u.tap = opts->u.tap;
break;
+ case NET_LEGACY_OPTIONS_TYPE_RAW:
+ legacy.type = NET_CLIENT_DRIVER_RAW;
+ legacy.u.raw = opts->u.raw;
+ break;
+ case NET_LEGACY_OPTIONS_TYPE_GRE:
+ legacy.type = NET_CLIENT_DRIVER_GRE;
+ legacy.u.gre = opts->u.gre;
+ break;
+ case NET_LEGACY_OPTIONS_TYPE_VXLAN:
+ legacy.type = NET_CLIENT_DRIVER_VXLAN;
+ legacy.u.vxlan = opts->u.vxlan;
+ break;
case NET_LEGACY_OPTIONS_TYPE_L2TPV3:
legacy.type = NET_CLIENT_DRIVER_L2TPV3;
legacy.u.l2tpv3 = opts->u.l2tpv3;
diff --git a/net/queue.c b/net/queue.c
index 9c32abdb8f..1825fa06e8 100644
--- a/net/queue.c
+++ b/net/queue.c
@@ -25,6 +25,7 @@
#include "net/queue.h"
#include "qemu/queue.h"
#include "net/net.h"
+#include "packet.h"
/* The delivery handler may only return zero if it will call
* qemu_net_queue_flush() when it determines that it is once again able
@@ -40,26 +41,6 @@
* unbounded queueing.
*/
-struct NetPacket {
- QTAILQ_ENTRY(NetPacket) entry;
- NetClientState *sender;
- unsigned flags;
- int size;
- NetPacketSent *sent_cb;
- uint8_t data[0];
-};
-
-struct NetQueue {
- void *opaque;
- uint32_t nq_maxlen;
- uint32_t nq_count;
- NetQueueDeliverFunc *deliver;
-
- QTAILQ_HEAD(packets, NetPacket) packets;
-
- unsigned delivering : 1;
-};
-
NetQueue *qemu_new_net_queue(NetQueueDeliverFunc *deliver, void *opaque)
{
NetQueue *queue;
diff --git a/net/raw.c b/net/raw.c
new file mode 100644
index 0000000000..73e2fd9fe3
--- /dev/null
+++ b/net/raw.c
@@ -0,0 +1,123 @@
+/*
+ * QEMU System Emulator
+ *
+ * Copyright (c) 2015-2017 Cambridge Greys Limited
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ * Copyright (c) 2012-2014 Cisco Systems
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "qemu/osdep.h"
+#include <linux/ip.h>
+#include <netdb.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include "net/net.h"
+ #include <sys/socket.h>
+#include <linux/if_packet.h>
+#include <net/ethernet.h>
+#include "clients.h"
+#include "qemu-common.h"
+#include "qemu/error-report.h"
+#include "qemu/option.h"
+#include "qemu/sockets.h"
+#include "qemu/iov.h"
+#include "qemu/main-loop.h"
+#include "unified.h"
+
+static int noop(void *us, uint8_t *buf)
+{
+ return 0;
+}
+
+int net_init_raw(const Netdev *netdev,
+ const char *name,
+ NetClientState *peer, Error **errp)
+{
+
+ const NetdevRawOptions *raw;
+ NetUnifiedState *s;
+ NetClientState *nc;
+
+ int fd = -1;
+ int err;
+
+ struct ifreq ifr;
+ struct sockaddr_ll sock;
+
+
+ nc = qemu_new_unified_net_client(name, peer);
+
+ s = DO_UPCAST(NetUnifiedState, nc, nc);
+
+ fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
+ if (fd == -1) {
+ err = -errno;
+ error_report("raw_open : raw socket creation failed, errno = %d", -err);
+ goto outerr;
+ }
+
+
+ s->form_header = NULL;
+ s->verify_header = &noop;
+ s->queue_head = 0;
+ s->queue_tail = 0;
+ s->header_mismatch = false;
+ s->dgram_dst = NULL;
+ s->dst_size = 0;
+
+ assert(netdev->type == NET_CLIENT_DRIVER_RAW);
+ raw = &netdev->u.raw;
+
+ memset(&ifr, 0, sizeof(struct ifreq));
+ strncpy((char *) &ifr.ifr_name, raw->ifname, sizeof(ifr.ifr_name) - 1);
+
+ if (ioctl(fd, SIOCGIFINDEX, (void *) &ifr) < 0) {
+ err = -errno;
+ error_report("SIOCGIFINDEX, failed to get raw interface index for %s",
+ raw->ifname);
+ goto outerr;
+ }
+
+ sock.sll_family = AF_PACKET;
+ sock.sll_protocol = htons(ETH_P_ALL);
+ sock.sll_ifindex = ifr.ifr_ifindex;
+
+ if (bind(fd, (struct sockaddr *) &sock, sizeof(struct sockaddr_ll)) < 0) {
+ error_report("raw: failed to bind raw socket");
+ err = -errno;
+ goto outerr;
+ }
+
+ s->offset = 0;
+
+ qemu_net_finalize_unified_init(s, fd);
+
+ snprintf(s->nc.info_str, sizeof(s->nc.info_str),
+ "raw: connected");
+ return 0;
+outerr:
+ qemu_del_net_client(nc);
+ if (fd >= 0) {
+ close(fd);
+ }
+ return -1;
+}
+
diff --git a/net/unified.c b/net/unified.c
new file mode 100644
index 0000000000..f15d1e1eed
--- /dev/null
+++ b/net/unified.c
@@ -0,0 +1,406 @@
+/*
+ * QEMU System Emulator
+ *
+ * Copyright (c) 2015-2017 Cambridge Greys Limited
+ * Copyright (c) 2012-2014 Cisco Systems
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "qemu/osdep.h"
+#include <linux/ip.h>
+#include <netdb.h>
+#include "net/net.h"
+#include "clients.h"
+#include "qemu-common.h"
+#include "qemu/error-report.h"
+#include "qemu/option.h"
+#include "qemu/sockets.h"
+#include "qemu/iov.h"
+#include "qemu/main-loop.h"
+#include "unified.h"
+
+static void net_unified_send(void *opaque);
+static void unified_writable(void *opaque);
+
+static void unified_update_fd_handler(NetUnifiedState *s)
+{
+ qemu_set_fd_handler(s->fd,
+ s->read_poll ? net_unified_send : NULL,
+ s->write_poll ? unified_writable : NULL,
+ s);
+}
+
+static void unified_read_poll(NetUnifiedState *s, bool enable)
+{
+ if (s->read_poll != enable) {
+ s->read_poll = enable;
+ unified_update_fd_handler(s);
+ }
+}
+
+static void unified_write_poll(NetUnifiedState *s, bool enable)
+{
+ if (s->write_poll != enable) {
+ s->write_poll = enable;
+ unified_update_fd_handler(s);
+ }
+}
+
+static void unified_writable(void *opaque)
+{
+ NetUnifiedState *s = opaque;
+ unified_write_poll(s, false);
+ qemu_flush_queued_packets(&s->nc);
+}
+
+static void unified_send_completed(NetClientState *nc, ssize_t len)
+{
+ NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc);
+ unified_read_poll(s, true);
+}
+
+static void unified_poll(NetClientState *nc, bool enable)
+{
+ NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc);
+ unified_write_poll(s, enable);
+ unified_read_poll(s, enable);
+}
+
+static ssize_t net_unified_receive_dgram_iov(NetClientState *nc,
+ const struct iovec *iov,
+ int iovcnt)
+{
+ NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc);
+
+ struct msghdr message;
+ int ret;
+
+ if (iovcnt > MAX_UNIFIED_IOVCNT - 1) {
+ error_report(
+ "iovec too long %d > %d, change unified.h",
+ iovcnt, MAX_UNIFIED_IOVCNT
+ );
+ return -1;
+ }
+ if (s->offset > 0) {
+ s->form_header(s);
+ memcpy(s->vec + 1, iov, iovcnt * sizeof(struct iovec));
+ s->vec->iov_base = s->header_buf;
+ s->vec->iov_len = s->offset;
+ message.msg_iovlen = iovcnt + 1;
+ } else {
+ memcpy(s->vec, iov, iovcnt * sizeof(struct iovec));
+ message.msg_iovlen = iovcnt;
+ }
+ message.msg_name = s->dgram_dst;
+ message.msg_namelen = s->dst_size;
+ message.msg_iov = s->vec;
+ message.msg_control = NULL;
+ message.msg_controllen = 0;
+ message.msg_flags = 0;
+ do {
+ ret = sendmsg(s->fd, &message, 0);
+ } while ((ret == -1) && (errno == EINTR));
+ if (ret > 0) {
+ ret -= s->offset;
+ } else if (ret == 0) {
+ /* belt and braces - should not occur on DGRAM
+ * we should get an error and never a 0 send
+ */
+ ret = iov_size(iov, iovcnt);
+ } else {
+ /* signal upper layer that socket buffer is full */
+ ret = -errno;
+ if (ret == -EAGAIN || ret == -ENOBUFS) {
+ unified_write_poll(s, true);
+ ret = 0;
+ }
+ }
+ return ret;
+}
+
+static ssize_t net_unified_receive_dgram(NetClientState *nc,
+ const uint8_t *buf,
+ size_t size)
+{
+ NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc);
+
+ struct iovec *vec;
+ struct msghdr message;
+ ssize_t ret = 0;
+
+ vec = s->vec;
+ if (s->offset > 0) {
+ s->form_header(s);
+ vec->iov_base = s->header_buf;
+ vec->iov_len = s->offset;
+ message.msg_iovlen = 2;
+ vec++;
+ } else {
+ message.msg_iovlen = 1;
+ }
+ vec->iov_base = (void *) buf;
+ vec->iov_len = size;
+ message.msg_name = s->dgram_dst;
+ message.msg_namelen = s->dst_size;
+ message.msg_iov = s->vec;
+ message.msg_control = NULL;
+ message.msg_controllen = 0;
+ message.msg_flags = 0;
+ do {
+ ret = sendmsg(s->fd, &message, 0);
+ } while ((ret == -1) && (errno == EINTR));
+ if (ret > 0) {
+ ret -= s->offset;
+ } else if (ret == 0) {
+ /* belt and braces - should not occur on DGRAM
+ * we should get an error and never a 0 send
+ */
+ ret = size;
+ } else {
+ ret = -errno;
+ if (ret == -EAGAIN || ret == -ENOBUFS) {
+ /* signal upper layer that socket buffer is full */
+ unified_write_poll(s, true);
+ ret = 0;
+ }
+ }
+ return ret;
+}
+
+
+static void net_unified_process_queue(NetUnifiedState *s)
+{
+ int size = 0;
+ struct iovec *vec;
+ bool bad_read;
+ int data_size;
+ struct mmsghdr *msgvec;
+
+ /* go into ring mode only if there is a "pending" tail */
+ if (s->queue_depth > 0) {
+ do {
+ msgvec = s->msgvec + s->queue_tail;
+ if (msgvec->msg_len > 0) {
+ data_size = msgvec->msg_len - s->header_size;
+ vec = msgvec->msg_hdr.msg_iov;
+ if ((data_size > 0) &&
+ (s->verify_header(s, vec->iov_base) == 0)) {
+ if (s->header_size > 0) {
+ vec++;
+ }
+ /* Use the legacy delivery for now, we will
+ * switch to using our own ring as a queueing mechanism
+ * at a later date
+ */
+ size = qemu_send_packet_async(
+ &s->nc,
+ vec->iov_base,
+ data_size,
+ unified_send_completed
+ );
+ if (size == 0) {
+ unified_read_poll(s, false);
+ }
+ bad_read = false;
+ } else {
+ bad_read = true;
+ if (!s->header_mismatch) {
+ /* report error only once */
+ error_report("unified header verification failed");
+ s->header_mismatch = true;
+ }
+ }
+ } else {
+ bad_read = true;
+ }
+ s->queue_tail = (s->queue_tail + 1) % MAX_UNIFIED_MSGCNT;
+ s->queue_depth--;
+ } while (
+ (s->queue_depth > 0) &&
+ qemu_can_send_packet(&s->nc) &&
+ ((size > 0) || bad_read)
+ );
+ }
+}
+
+static void net_unified_send(void *opaque)
+{
+ NetUnifiedState *s = opaque;
+ int target_count, count;
+ struct mmsghdr *msgvec;
+
+ /* go into ring mode only if there is a "pending" tail */
+
+ if (s->queue_depth) {
+
+ /* The ring buffer we use has variable intake
+ * count of how much we can read varies - adjust accordingly
+ */
+
+ target_count = MAX_UNIFIED_MSGCNT - s->queue_depth;
+
+ /* Ensure we do not overrun the ring when we have
+ * a lot of enqueued packets
+ */
+
+ if (s->queue_head + target_count > MAX_UNIFIED_MSGCNT) {
+ target_count = MAX_UNIFIED_MSGCNT - s->queue_head;
+ }
+ } else {
+
+ /* we do not have any pending packets - we can use
+ * the whole message vector linearly instead of using
+ * it as a ring
+ */
+
+ s->queue_head = 0;
+ s->queue_tail = 0;
+ target_count = MAX_UNIFIED_MSGCNT;
+ }
+
+ msgvec = s->msgvec + s->queue_head;
+ if (target_count > 0) {
+ do {
+ count = recvmmsg(
+ s->fd,
+ msgvec,
+ target_count, MSG_DONTWAIT, NULL);
+ } while ((count == -1) && (errno == EINTR));
+ if (count < 0) {
+ /* Recv error - we still need to flush packets here,
+ * (re)set queue head to current position
+ */
+ count = 0;
+ }
+ s->queue_head = (s->queue_head + count) % MAX_UNIFIED_MSGCNT;
+ s->queue_depth += count;
+ }
+ net_unified_process_queue(s);
+}
+
+static void destroy_vector(struct mmsghdr *msgvec, int count, int iovcount)
+{
+ int i, j;
+ struct iovec *iov;
+ struct mmsghdr *cleanup = msgvec;
+ if (cleanup) {
+ for (i = 0; i < count; i++) {
+ if (cleanup->msg_hdr.msg_iov) {
+ iov = cleanup->msg_hdr.msg_iov;
+ for (j = 0; j < iovcount; j++) {
+ g_free(iov->iov_base);
+ iov++;
+ }
+ g_free(cleanup->msg_hdr.msg_iov);
+ }
+ cleanup++;
+ }
+ g_free(msgvec);
+ }
+}
+
+
+
+static struct mmsghdr *build_unified_vector(NetUnifiedState *s, int count)
+{
+ int i;
+ struct iovec *iov;
+ struct mmsghdr *msgvec, *result;
+
+ msgvec = g_new(struct mmsghdr, count);
+ result = msgvec;
+ for (i = 0; i < count ; i++) {
+ msgvec->msg_hdr.msg_name = NULL;
+ msgvec->msg_hdr.msg_namelen = 0;
+ iov = g_new(struct iovec, IOVSIZE);
+ msgvec->msg_hdr.msg_iov = iov;
+ if (s->header_size > 0) {
+ iov->iov_base = g_malloc(s->header_size);
+ iov->iov_len = s->header_size;
+ iov++ ;
+ }
+ iov->iov_base = qemu_memalign(BUFFER_ALIGN, BUFFER_SIZE);
+ iov->iov_len = BUFFER_SIZE;
+ msgvec->msg_hdr.msg_iovlen = 2;
+ msgvec->msg_hdr.msg_control = NULL;
+ msgvec->msg_hdr.msg_controllen = 0;
+ msgvec->msg_hdr.msg_flags = 0;
+ msgvec++;
+ }
+ return result;
+}
+
+static void net_unified_cleanup(NetClientState *nc)
+{
+ NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc);
+ qemu_purge_queued_packets(nc);
+ unified_read_poll(s, false);
+ unified_write_poll(s, false);
+ if (s->fd >= 0) {
+ close(s->fd);
+ }
+ if (s->header_size > 0) {
+ destroy_vector(s->msgvec, MAX_UNIFIED_MSGCNT, IOVSIZE);
+ } else {
+ destroy_vector(s->msgvec, MAX_UNIFIED_MSGCNT, 1);
+ }
+ g_free(s->vec);
+ if (s->header_buf != NULL) {
+ g_free(s->header_buf);
+ }
+ if (s->dgram_dst != NULL) {
+ g_free(s->dgram_dst);
+ }
+}
+
+static NetClientInfo net_unified_info = {
+ /* we share this one for all types for now, wrong I know :) */
+ .type = NET_CLIENT_DRIVER_L2TPV3,
+ .size = sizeof(NetUnifiedState),
+ .receive = net_unified_receive_dgram,
+ .receive_iov = net_unified_receive_dgram_iov,
+ .poll = unified_poll,
+ .cleanup = net_unified_cleanup,
+};
+
+NetClientState *qemu_new_unified_net_client(const char *name,
+ NetClientState *peer) {
+ return qemu_new_net_client(&net_unified_info, peer, "unified", name);
+}
+
+void qemu_net_finalize_unified_init(NetUnifiedState *s, int fd)
+{
+
+ s->msgvec = build_unified_vector(s, MAX_UNIFIED_MSGCNT);
+ s->vec = g_new(struct iovec, MAX_UNIFIED_IOVCNT);
+ if (s->header_size > 0) {
+ s->header_buf = g_malloc(s->header_size);
+ } else {
+ s->header_buf = NULL;
+ }
+ qemu_set_nonblock(fd);
+
+ s->fd = fd;
+ unified_read_poll(s, true);
+
+}
+
diff --git a/net/unified.h b/net/unified.h
new file mode 100644
index 0000000000..97ec743f0e
--- /dev/null
+++ b/net/unified.h
@@ -0,0 +1,118 @@
+/*
+ * QEMU System Emulator
+ *
+ * Copyright (c) 2015-2017 Cambridge Greys Limited
+ * Copyright (c) 2012-2014 Cisco Systems
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "qemu/osdep.h"
+
+
+#define BUFFER_ALIGN sysconf(_SC_PAGESIZE)
+#define BUFFER_SIZE 2048
+#define IOVSIZE 2
+#define MAX_UNIFIED_MSGCNT 64
+#define MAX_UNIFIED_IOVCNT (MAX_UNIFIED_MSGCNT * IOVSIZE)
+
+#ifndef QEMU_NET_UNIFIED_H
+#define QEMU_NET_UNIFIED_H
+
+typedef struct NetUnifiedState {
+ NetClientState nc;
+
+ int fd;
+
+ /*
+ * these are used for xmit - that happens packet a time
+ * and for first sign of life packet (easier to parse that once)
+ */
+
+ uint8_t *header_buf;
+ struct iovec *vec;
+
+ /*
+ * these are used for receive - try to "eat" up to 32 packets at a time
+ */
+
+ struct mmsghdr *msgvec;
+
+ /*
+ * peer address
+ */
+
+ struct sockaddr_storage *dgram_dst;
+ uint32_t dst_size;
+
+ /*
+ * Internal Queue
+ */
+
+ /*
+ * DOS avoidance in error handling
+ */
+
+ /* Easier to keep l2tpv3 specific */
+
+ bool header_mismatch;
+
+ /*
+ *
+ * Ring buffer handling
+ *
+ */
+
+ int queue_head;
+ int queue_tail;
+ int queue_depth;
+
+ /*
+ * Offset to data - common for all protocols
+ */
+
+ uint32_t offset;
+
+ /*
+ * Header size - common for all protocols
+ */
+
+ uint32_t header_size;
+ /* Poll Control */
+
+ bool read_poll;
+ bool write_poll;
+
+ /* Parameters */
+
+ void *params;
+
+ /* header forming functions */
+
+ int (*verify_header)(void *s, uint8_t *buf);
+ void (*form_header)(void *s);
+
+} NetUnifiedState;
+
+extern NetClientState *qemu_new_unified_net_client(const char *name,
+ NetClientState *peer);
+
+extern void qemu_net_finalize_unified_init(NetUnifiedState *s, int fd);
+#endif
diff --git a/net/vxlan-static.c b/net/vxlan-static.c
new file mode 100644
index 0000000000..11265897fb
--- /dev/null
+++ b/net/vxlan-static.c
@@ -0,0 +1,229 @@
+/*
+ * QEMU System Emulator
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ * Copyright (c) 2012-2014 Cisco Systems
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "qemu/osdep.h"
+#include <linux/ip.h>
+#include <netdb.h>
+#include "net/net.h"
+#include "clients.h"
+#include "qemu-common.h"
+#include "qemu/error-report.h"
+#include "qemu/option.h"
+#include "qemu/sockets.h"
+#include "qemu/iov.h"
+#include "qemu/main-loop.h"
+#include "unified.h"
+
+
+/* vxlan header RRRRIRRR in top byte, 3 bytes reserved */
+#define HEADER_RESERVED 24
+#define VNID_RESERVED 8
+#define VXLAN_BIT 3
+#define VXLAN_DATA_PACKET (1 << (HEADER_RESERVED + VXLAN_BIT))
+#define VNID_OFFSET 4
+#define VXLAN_HEADER_SIZE 8
+
+typedef struct VXLANTunnelParams {
+
+ /* Rather skimpy - VXLAN is very simple at present */
+
+ uint32_t vnid;
+
+} VXLANTunnelParams;
+
+
+
+static void vxlan_form_header(void *us)
+{
+ NetUnifiedState *s = (NetUnifiedState *) us;
+ VXLANTunnelParams *p = (VXLANTunnelParams *) s->params;
+
+ stl_be_p((uint32_t *) s->header_buf, VXLAN_DATA_PACKET);
+ stl_be_p(
+ (uint32_t *) (s->header_buf + VNID_OFFSET),
+ p->vnid
+ );
+}
+static int vxlan_verify_header(void *us, uint8_t *buf)
+{
+
+ NetUnifiedState *s = (NetUnifiedState *) us;
+ VXLANTunnelParams *p = (VXLANTunnelParams *) s->params;
+ uint32_t header;
+ uint32_t vnid;
+
+ header = ldl_be_p(buf);
+ if ((header & VXLAN_DATA_PACKET) == 0) {
+ if (!s->header_mismatch) {
+ error_report(
+ "header type disagreement, expecting %0x, got %0x",
+ VXLAN_DATA_PACKET, header
+ );
+ }
+ return -1;
+ }
+
+ vnid = ldl_be_p(buf + VNID_OFFSET);
+ if (vnid != p->vnid) {
+ if (!s->header_mismatch) {
+ error_report("unknown vnid id %0x, expecting %0x", vnid, p->vnid);
+ }
+ return -1;
+ }
+ return 0;
+}
+
+int net_init_vxlan(const Netdev *netdev,
+ const char *name,
+ NetClientState *peer, Error **errp)
+{
+ /* FIXME error_setg(errp, ...) on failure */
+ const NetdevVXLANOptions *vxlan;
+ NetUnifiedState *s;
+ NetClientState *nc;
+ VXLANTunnelParams *p;
+
+ int fd = -1, gairet;
+ struct addrinfo hints;
+ struct addrinfo *result = NULL;
+ const char *default_port = "4789";
+ const char *srcport;
+ const char *dstport;
+
+ nc = qemu_new_unified_net_client(name, peer);
+
+ s = DO_UPCAST(NetUnifiedState, nc, nc);
+
+ p = g_malloc(sizeof(VXLANTunnelParams));
+
+ s->params = p;
+
+ s->form_header = &vxlan_form_header;
+ s->verify_header = &vxlan_verify_header;
+ s->queue_head = 0;
+ s->queue_tail = 0;
+ s->header_mismatch = false;
+ s->header_size = VXLAN_HEADER_SIZE;
+
+ assert(netdev->type == NET_CLIENT_DRIVER_VXLAN);
+ vxlan = &netdev->u.vxlan;
+
+ if (vxlan->has_srcport) {
+ srcport = vxlan->srcport;
+ } else {
+ srcport = default_port;
+ }
+
+ if (vxlan->has_dstport) {
+ dstport = vxlan->dstport;
+ } else {
+ dstport = default_port;
+ }
+ s->offset = VXLAN_HEADER_SIZE;
+
+ /* we store it shifted to the correct position, so we do not need
+ * to recompute it each time
+ */
+
+ p->vnid = vxlan->vnid << VNID_RESERVED;
+
+ memset(&hints, 0, sizeof(hints));
+
+ if (vxlan->has_ipv6) {
+ hints.ai_family = AF_INET6;
+ } else {
+ hints.ai_family = AF_INET;
+ }
+
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = 0;
+
+ gairet = getaddrinfo(vxlan->src, srcport, &hints, &result);
+
+ if ((gairet != 0) || (result == NULL)) {
+ error_report(
+ "vxlan_open : could not resolve src, errno = %s",
+ gai_strerror(gairet)
+ );
+ goto outerr;
+ }
+ fd = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
+ if (fd == -1) {
+ fd = -errno;
+ error_report("vxlan_open : socket creation failed, errno = %d", -fd);
+ goto outerr;
+ }
+ if (bind(fd, (struct sockaddr *) result->ai_addr, result->ai_addrlen)) {
+ error_report("vxlan_open : could not bind socket err=%i", errno);
+ goto outerr;
+ }
+ if (result) {
+ freeaddrinfo(result);
+ }
+
+ memset(&hints, 0, sizeof(hints));
+
+ if (vxlan->has_ipv6) {
+ hints.ai_family = AF_INET6;
+ } else {
+ hints.ai_family = AF_INET;
+ }
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = 0;
+
+ result = NULL;
+ gairet = getaddrinfo(vxlan->dst, dstport, &hints, &result);
+ if ((gairet != 0) || (result == NULL)) {
+ error_report(
+ "vxlan_open : could not resolve dst, error = %s",
+ gai_strerror(gairet)
+ );
+ goto outerr;
+ }
+
+ s->dgram_dst = g_new0(struct sockaddr_storage, 1);
+ memcpy(s->dgram_dst, result->ai_addr, result->ai_addrlen);
+ s->dst_size = result->ai_addrlen;
+
+ if (result) {
+ freeaddrinfo(result);
+ }
+
+ qemu_net_finalize_unified_init(s, fd);
+
+ snprintf(s->nc.info_str, sizeof(s->nc.info_str),
+ "vxlan: connected");
+ return 0;
+outerr:
+ qemu_del_net_client(nc);
+ if (fd >= 0) {
+ close(fd);
+ }
+ if (result) {
+ freeaddrinfo(result);
+ }
+ return -1;
+}
+
diff --git a/qapi-schema.json b/qapi-schema.json
index ab438ead70..40ef09dded 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -2785,6 +2785,57 @@
##
{ 'command': 'migrate_set_speed', 'data': {'value': 'int'} }
+
+##
+# @NetdevRawOptions:
+#
+# Connect the VLAN to an network interface using raw sockets
+#
+# @ifname: network interface name
+#
+
+# Since 2.9
+##
+{ 'struct': 'NetdevRawOptions',
+ 'data': {
+ 'ifname': 'str'
+} }
+
+##
+# @NetdevGREOptions:
+#
+# Connect the VLAN to Ethernet over Ethernet over GRE (GRETAP) tunnel
+#
+# @src: source address
+#
+# @dst: destination address
+#
+# @ipv6: force the use of ipv6
+#
+# @sequence: have sequence counter
+#
+# @pinsequence: pin sequence counter to zero -
+# workaround for buggy implementations or
+# networks with packet reorder
+#
+# @txkey: 32 bit transmit key
+#
+# @rxkey: 32 bit receive key
+#
+# Note - gre checksums are not supported at present
+#
+#
+# Since 2.9
+##
+{ 'struct': 'NetdevGREOptions',
+ 'data': {
+ 'src': 'str',
+ 'dst': 'str',
+ '*ipv6': 'bool',
+ '*sequence': 'bool',
+ '*pinsequence': 'bool',
+ '*txkey': 'uint32',
+ '*rxkey': 'uint32' } }
##
# @migrate-set-cache-size:
#
@@ -3849,6 +3900,33 @@
'*offset': 'uint32' } }
##
+# @NetdevVXLANOptions:
+#
+# Connect the VLAN to a VXLAN Static Tunnel
+#
+# @src: source address
+#
+# @dst: destination address
+#
+# @vnid: Virtual Network Identifier
+#
+# @srcport: source port
+#
+# @dstport: destination port
+#
+# @ipv6: force the use of ipv6
+##
+# Since 2.9
+{ 'struct': 'NetdevVXLANOptions',
+ 'data': {
+ 'src': 'str',
+ 'dst': 'str',
+ '*srcport': 'str',
+ '*dstport': 'str',
+ '*ipv6': 'bool',
+ 'vnid': 'uint32' } }
+
+##
# @NetdevVdeOptions:
#
# Connect the VLAN to a vde switch running on the host.
@@ -3965,7 +4043,8 @@
# Since: 2.7
##
{ 'enum': 'NetClientDriver',
- 'data': [ 'none', 'nic', 'user', 'tap', 'l2tpv3', 'socket', 'vde', 'dump',
+ 'data': [ 'none', 'nic', 'user', 'tap', 'l2tpv3', 'raw', 'gre',
+ 'vxlan', 'socket', 'vde', 'dump',
'bridge', 'hubport', 'netmap', 'vhost-user' ] }
##
@@ -3980,6 +4059,8 @@
# Since: 1.2
#
# 'l2tpv3' - since 2.1
+# 'gre' - since 2.9
+# 'raw' - since 2.9
##
{ 'union': 'Netdev',
'base': { 'id': 'str', 'type': 'NetClientDriver' },
@@ -3990,6 +4071,9 @@
'user': 'NetdevUserOptions',
'tap': 'NetdevTapOptions',
'l2tpv3': 'NetdevL2TPv3Options',
+ 'raw': 'NetdevRawOptions',
+ 'gre': 'NetdevGREOptions',
+ 'vxlan': 'NetdevVXLANOptions',
'socket': 'NetdevSocketOptions',
'vde': 'NetdevVdeOptions',
'dump': 'NetdevDumpOptions',
@@ -4027,7 +4111,7 @@
##
{ 'enum': 'NetLegacyOptionsType',
'data': ['none', 'nic', 'user', 'tap', 'l2tpv3', 'socket', 'vde',
- 'dump', 'bridge', 'netmap', 'vhost-user'] }
+ 'raw', 'gre', 'vxlan', 'dump', 'bridge', 'netmap', 'vhost-user'] }
##
# @NetLegacyOptions:
@@ -4045,6 +4129,9 @@
'user': 'NetdevUserOptions',
'tap': 'NetdevTapOptions',
'l2tpv3': 'NetdevL2TPv3Options',
+ 'raw': 'NetdevRawOptions',
+ 'gre': 'NetdevGREOptions',
+ 'vxlan': 'NetdevVXLANOptions',
'socket': 'NetdevSocketOptions',
'vde': 'NetdevVdeOptions',
'dump': 'NetdevDumpOptions',
--
2.11.0
Hi, This series failed build test on FreeBSD host. Please find the details below. Type: series Subject: [Qemu-devel] [PATCH] Unified Socket Transport Message-id: 20170718060627.2107-1-anton.ivanov@cambridgegreys.com === TEST SCRIPT BEGIN === #!/bin/sh # Testing script will be invoked under the git checkout with # HEAD pointing to a commit that has the patches applied on top of "base" # branch set -e echo "=== ENV ===" env echo "=== PACKAGES ===" pkg info echo "=== TEST BEGIN ===" CC=/usr/local/libexec/ccache/cc INSTALL=$PWD/install BUILD=$PWD/build echo -n "Using CC: " realpath $CC mkdir -p $BUILD $INSTALL SRC=$PWD cd $BUILD $SRC/configure --cc=$CC --prefix=$INSTALL --target-list=x86_64-softmmu gmake -j4 # XXX: we need reliable clean up # make check -j4 V=1 gmake install === TEST SCRIPT END === Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384 From https://github.com/patchew-project/qemu * [new tag] patchew/20170718060627.2107-1-anton.ivanov@cambridgegreys.com -> patchew/20170718060627.2107-1-anton.ivanov@cambridgegreys.com Switched to a new branch 'test' 6ed90464d7 Unified Socket Transport === OUTPUT BEGIN === === ENV === LOGNAME=patchew-tester PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin PWD=/var/tmp/patchew-tester-tmp-t_taanhq/src HOME=/home/patchew-tester USER=patchew-tester SHELL=/bin/sh PATCHEW=/home/patchew-tester/patchew/patchew-cli -s http://patchew.org --nodebug === PACKAGES === bash-4.4.12_2 GNU Project's Bourne Again SHell binutils-2.28,1 GNU binary tools bison-3.0.4,1 Parser generator from FSF, (mostly) compatible with Yacc ca_root_nss-3.30.2 Root certificate bundle from the Mozilla Project ccache-3.3.4_3 Tool to minimize the compile time of C/C++ programs curl-7.54.0 Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers cvsps-2.1_2 Create patchset information from CVS dtc-1.4.2_1 Device Tree Compiler expat-2.2.0_1 XML 1.0 parser written in C gcc-5.4.0 GNU Compiler Collection 5 gcc-ecj-4.5 Eclipse Java Compiler used to build GCC Java gettext-runtime-0.19.8.1_1 GNU gettext runtime libraries and programs git-2.13.0 Distributed source code management tool glib-2.46.2_5 Some useful routines of C programming (current stable version) gmake-4.2.1_1 GNU version of 'make' utility gmp-6.1.2 Free library for arbitrary precision arithmetic indexinfo-0.2.6 Utility to regenerate the GNU info page index libffi-3.2.1 Foreign Function Interface libiconv-1.14_10 Character set conversion library libnghttp2-1.21.0 HTTP/2.0 C Library m4-1.4.18,1 GNU M4 mpc-1.0.3 Library of complex numbers with arbitrarily high precision mpfr-3.1.5_1 Library for multiple-precision floating-point computations p5-Authen-SASL-2.16_1 Perl5 module for SASL authentication p5-Digest-HMAC-1.03_1 Perl5 interface to HMAC Message-Digest Algorithms p5-Error-0.17024 Error/exception handling in object-oriented programming style p5-GSSAPI-0.28_1 Perl extension providing access to the GSSAPIv2 library pcre-8.40 Perl Compatible Regular Expressions library perl5-5.24.1 Practical Extraction and Report Language pixman-0.34.0 Low-level pixel manipulation library pkg-1.10.1 Package manager pkgconf-1.3.0,1 Utility to help to configure compiler and linker flags python-2.7_3,2 "meta-port" for the default version of Python interpreter python2-2_3 The "meta-port" for version 2 of the Python interpreter python27-2.7.13_3 Interpreted object-oriented programming language python3-3_3 The "meta-port" for version 3 of the Python interpreter python35-3.5.3_1 Interpreted object-oriented programming language readline-6.3.8 Library for editing command lines as they are typed sudo-1.8.20p1 Allow others to run commands as root === TEST BEGIN === Using CC: /usr/local/bin/ccache Install prefix /var/tmp/patchew-tester-tmp-t_taanhq/src/install BIOS directory /var/tmp/patchew-tester-tmp-t_taanhq/src/install/share/qemu binary directory /var/tmp/patchew-tester-tmp-t_taanhq/src/install/bin library directory /var/tmp/patchew-tester-tmp-t_taanhq/src/install/lib module directory /var/tmp/patchew-tester-tmp-t_taanhq/src/install/lib/qemu libexec directory /var/tmp/patchew-tester-tmp-t_taanhq/src/install/libexec include directory /var/tmp/patchew-tester-tmp-t_taanhq/src/install/include config directory /var/tmp/patchew-tester-tmp-t_taanhq/src/install/etc local state directory /var/tmp/patchew-tester-tmp-t_taanhq/src/install/var Manual directory /var/tmp/patchew-tester-tmp-t_taanhq/src/install/share/man ELF interp prefix /usr/gnemul/qemu-%M Source path /var/tmp/patchew-tester-tmp-t_taanhq/src C compiler /usr/local/libexec/ccache/cc Host C compiler cc C++ compiler c++ Objective-C compiler clang ARFLAGS rv CFLAGS -O2 -g QEMU_CFLAGS -I/usr/local/include/pixman-1 -pthread -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -I/usr/local/include -DNCURSES_WIDECHAR -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wno-string-plus-int -Wno-initializer-overrides -Wendif-labels -Wno-shift-negative-value -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-definition -Wtype-limits -fstack-protector-strong LDFLAGS -Wl,--warn-common -m64 -g make gmake install install python python -B smbd /usr/sbin/smbd module support no host CPU x86_64 host big endian no target list x86_64-softmmu gprof enabled no sparse enabled no strip binaries yes profiler no static build no pixman system SDL support no GTK support no GTK GL support no VTE support no TLS priority NORMAL GNUTLS support no GNUTLS rnd no libgcrypt no libgcrypt kdf no nettle no nettle kdf no libtasn1 no curses support yes virgl support no curl support yes mingw32 support no Audio drivers oss Block whitelist (rw) Block whitelist (ro) VirtFS support no VNC support yes VNC SASL support no VNC JPEG support no VNC PNG support no xen support no brlapi support no bluez support no Documentation no PIE no vde support no netmap support yes Linux AIO support no ATTR/XATTR support no Install blobs yes KVM support no HAX support no TCG support yes TCG debug enabled no TCG interpreter no RDMA support no fdt support no preadv support yes fdatasync no madvise yes posix_madvise yes libcap-ng support no vhost-net support no vhost-scsi support no vhost-vsock support no Trace backends log spice support no rbd support no xfsctl support no smartcard support no libusb yes usb net redir no OpenGL support no OpenGL dmabufs no libiscsi support no libnfs support no build guest agent yes QGA VSS support no QGA w32 disk info no QGA MSI support no seccomp support no coroutine backend ucontext coroutine pool yes debug stack usage no GlusterFS support no gcov gcov gcov enabled no TPM support yes libssh2 support no TPM passthrough no QOM debugging yes Live block migration yes lzo support no snappy support no bzip2 support yes NUMA host support no tcmalloc support no jemalloc support no avx2 optimization no replication support yes VxHS block device no GEN x86_64-softmmu/config-devices.mak.tmp GEN config-host.h GEN qemu-options.def GEN qmp-commands.h GEN qapi-types.h GEN qapi-visit.h GEN x86_64-softmmu/config-devices.mak GEN qapi-event.h GEN qmp-marshal.c GEN qapi-types.c GEN qapi-visit.c GEN qapi-event.c GEN qmp-introspect.h GEN qmp-introspect.c GEN trace/generated-tcg-tracers.h GEN trace/generated-helpers-wrappers.h GEN trace/generated-helpers.h GEN trace/generated-helpers.c GEN module_block.h GEN tests/test-qapi-types.h GEN tests/test-qapi-visit.h GEN tests/test-qmp-commands.h GEN tests/test-qapi-event.h GEN tests/test-qmp-introspect.h GEN trace-root.h GEN util/trace.h GEN crypto/trace.h GEN io/trace.h GEN migration/trace.h GEN block/trace.h GEN chardev/trace.h GEN hw/block/trace.h GEN hw/block/dataplane/trace.h GEN hw/char/trace.h GEN hw/intc/trace.h GEN hw/net/trace.h GEN hw/virtio/trace.h GEN hw/audio/trace.h GEN hw/misc/trace.h GEN hw/usb/trace.h GEN hw/scsi/trace.h GEN hw/nvram/trace.h GEN hw/display/trace.h GEN hw/input/trace.h GEN hw/timer/trace.h GEN hw/dma/trace.h GEN hw/sparc/trace.h GEN hw/sd/trace.h GEN hw/isa/trace.h GEN hw/mem/trace.h GEN hw/i386/trace.h GEN hw/i386/xen/trace.h GEN hw/9pfs/trace.h GEN hw/ppc/trace.h GEN hw/pci/trace.h GEN hw/s390x/trace.h GEN hw/vfio/trace.h GEN hw/acpi/trace.h GEN hw/arm/trace.h GEN hw/alpha/trace.h GEN hw/xen/trace.h GEN ui/trace.h GEN audio/trace.h GEN net/trace.h GEN target/arm/trace.h GEN target/i386/trace.h GEN target/mips/trace.h GEN target/sparc/trace.h GEN target/s390x/trace.h GEN target/ppc/trace.h GEN qom/trace.h GEN linux-user/trace.h GEN qapi/trace.h GEN accel/tcg/trace.h GEN accel/kvm/trace.h GEN nbd/trace.h GEN trace-root.c GEN util/trace.c GEN crypto/trace.c GEN io/trace.c GEN migration/trace.c GEN block/trace.c GEN chardev/trace.c GEN hw/block/trace.c GEN hw/block/dataplane/trace.c GEN hw/char/trace.c GEN hw/intc/trace.c GEN hw/net/trace.c GEN hw/virtio/trace.c GEN hw/audio/trace.c GEN hw/misc/trace.c GEN hw/usb/trace.c GEN hw/scsi/trace.c GEN hw/nvram/trace.c GEN hw/display/trace.c GEN hw/input/trace.c GEN hw/timer/trace.c GEN hw/dma/trace.c GEN hw/sparc/trace.c GEN hw/sd/trace.c GEN hw/isa/trace.c GEN hw/mem/trace.c GEN hw/i386/trace.c GEN hw/i386/xen/trace.c GEN hw/9pfs/trace.c GEN hw/ppc/trace.c GEN hw/pci/trace.c GEN hw/s390x/trace.c GEN hw/vfio/trace.c GEN hw/acpi/trace.c GEN hw/arm/trace.c GEN hw/alpha/trace.c GEN hw/xen/trace.c GEN ui/trace.c GEN audio/trace.c GEN net/trace.c GEN target/arm/trace.c GEN target/i386/trace.c GEN target/mips/trace.c GEN target/sparc/trace.c GEN target/s390x/trace.c GEN target/ppc/trace.c GEN qom/trace.c GEN linux-user/trace.c GEN qapi/trace.c GEN accel/tcg/trace.c GEN accel/kvm/trace.c GEN nbd/trace.c GEN config-all-devices.mak GEN qga/qapi-generated/qga-qapi-types.h GEN qga/qapi-generated/qga-qapi-visit.h GEN qga/qapi-generated/qga-qmp-commands.h GEN qga/qapi-generated/qga-qapi-types.c GEN qga/qapi-generated/qga-qapi-visit.c GEN qga/qapi-generated/qga-qmp-marshal.c CC qmp-introspect.o CC qapi-types.o CC qapi-visit.o CC qapi-event.o CC qapi/qapi-visit-core.o CC qapi/qapi-dealloc-visitor.o CC qapi/qobject-input-visitor.o CC qapi/qobject-output-visitor.o CC qapi/qmp-registry.o CC qapi/qmp-dispatch.o CC qapi/string-input-visitor.o CC qapi/string-output-visitor.o CC qapi/opts-visitor.o CC qapi/qapi-clone-visitor.o CC qapi/qmp-event.o CC qapi/qapi-util.o CC qobject/qnull.o CC qobject/qnum.o CC qobject/qstring.o CC qobject/qdict.o CC qobject/qlist.o CC qobject/qbool.o CC qobject/qjson.o CC qobject/qobject.o CC qobject/json-lexer.o CC qobject/json-streamer.o CC qobject/json-parser.o CC trace/control.o CC trace/qmp.o CC util/osdep.o CC util/cutils.o CC util/unicode.o CC util/qemu-timer-common.o CC util/bufferiszero.o CC util/lockcnt.o CC util/aiocb.o CC util/async.o CC util/thread-pool.o CC util/qemu-timer.o CC util/main-loop.o CC util/iohandler.o CC util/aio-posix.o CC util/compatfd.o CC util/event_notifier-posix.o CC util/mmap-alloc.o CC util/oslib-posix.o CC util/qemu-openpty.o CC util/qemu-thread-posix.o CC util/memfd.o CC util/envlist.o CC util/path.o CC util/module.o CC util/host-utils.o CC util/bitmap.o CC util/bitops.o CC util/hbitmap.o CC util/fifo8.o CC util/acl.o CC util/cacheinfo.o CC util/error.o CC util/qemu-error.o CC util/id.o CC util/iov.o CC util/qemu-config.o CC util/qemu-sockets.o CC util/uri.o CC util/notify.o CC util/qemu-option.o CC util/qemu-progress.o CC util/keyval.o CC util/hexdump.o CC util/crc32c.o CC util/uuid.o CC util/throttle.o CC util/getauxval.o CC util/readline.o CC util/rcu.o CC util/qemu-coroutine.o CC util/qemu-coroutine-lock.o CC util/qemu-coroutine-io.o CC util/qemu-coroutine-sleep.o CC util/coroutine-ucontext.o CC util/buffer.o CC util/timed-average.o CC util/base64.o CC util/log.o CC util/qdist.o CC util/qht.o CC util/range.o CC util/stats64.o CC util/systemd.o CC trace-root.o CC util/trace.o CC crypto/trace.o CC io/trace.o CC migration/trace.o CC block/trace.o CC chardev/trace.o CC hw/block/trace.o CC hw/block/dataplane/trace.o CC hw/char/trace.o CC hw/intc/trace.o CC hw/net/trace.o CC hw/virtio/trace.o CC hw/audio/trace.o CC hw/misc/trace.o CC hw/usb/trace.o CC hw/scsi/trace.o CC hw/nvram/trace.o CC hw/display/trace.o CC hw/input/trace.o CC hw/timer/trace.o CC hw/dma/trace.o CC hw/sparc/trace.o CC hw/sd/trace.o CC hw/isa/trace.o CC hw/mem/trace.o CC hw/i386/trace.o CC hw/i386/xen/trace.o CC hw/9pfs/trace.o CC hw/ppc/trace.o CC hw/pci/trace.o CC hw/s390x/trace.o CC hw/vfio/trace.o CC hw/acpi/trace.o CC hw/arm/trace.o CC hw/alpha/trace.o CC hw/xen/trace.o CC ui/trace.o CC audio/trace.o CC net/trace.o CC target/arm/trace.o CC target/i386/trace.o CC target/mips/trace.o CC target/sparc/trace.o CC target/s390x/trace.o CC target/ppc/trace.o CC qom/trace.o CC linux-user/trace.o CC qapi/trace.o CC accel/tcg/trace.o CC accel/kvm/trace.o CC nbd/trace.o CC crypto/pbkdf-stub.o CC stubs/arch-query-cpu-def.o CC stubs/arch-query-cpu-model-expansion.o CC stubs/arch-query-cpu-model-comparison.o CC stubs/arch-query-cpu-model-baseline.o CC stubs/bdrv-next-monitor-owned.o CC stubs/blk-commit-all.o CC stubs/blockdev-close-all-bdrv-states.o CC stubs/clock-warp.o CC stubs/cpu-get-clock.o CC stubs/cpu-get-icount.o CC stubs/dump.o CC stubs/error-printf.o CC stubs/fdset.o CC stubs/gdbstub.o CC stubs/get-vm-name.o CC stubs/iothread.o CC stubs/iothread-lock.o CC stubs/is-daemonized.o CC stubs/machine-init-done.o CC stubs/migr-blocker.o CC stubs/monitor.o CC stubs/notify-event.o CC stubs/qtest.o CC stubs/replay.o CC stubs/runstate-check.o CC stubs/set-fd-handler.o CC stubs/slirp.o CC stubs/sysbus.o CC stubs/trace-control.o CC stubs/uuid.o CC stubs/vm-stop.o CC stubs/vmstate.o CC stubs/qmp_pc_dimm_device_list.o CC stubs/target-monitor-defs.o CC stubs/target-get-monitor-def.o CC stubs/pc_madt_cpu_entry.o CC stubs/vmgenid.o CC stubs/xen-common.o CC stubs/xen-hvm.o CC contrib/ivshmem-client/ivshmem-client.o CC contrib/ivshmem-client/main.o CC contrib/ivshmem-server/ivshmem-server.o CC contrib/ivshmem-server/main.o CC qemu-nbd.o CC block.o CC blockjob.o CC qemu-io-cmds.o CC replication.o CC block/raw-format.o CC block/qcow.o CC block/vdi.o CC block/vmdk.o CC block/cloop.o CC block/bochs.o CC block/vpc.o CC block/vvfat.o CC block/dmg.o CC block/qcow2.o CC block/qcow2-refcount.o CC block/qcow2-cluster.o CC block/qcow2-snapshot.o CC block/qcow2-cache.o CC block/qcow2-bitmap.o CC block/qed.o CC block/qed-l2-cache.o CC block/qed-table.o CC block/qed-cluster.o CC block/qed-check.o CC block/vhdx.o CC block/vhdx-endian.o CC block/vhdx-log.o CC block/quorum.o CC block/parallels.o CC block/blkdebug.o CC block/blkverify.o CC block/blkreplay.o CC block/block-backend.o CC block/snapshot.o CC block/qapi.o CC block/file-posix.o CC block/null.o CC block/mirror.o CC block/commit.o CC block/io.o CC block/throttle-groups.o CC block/nbd.o CC block/nbd-client.o CC block/sheepdog.o CC block/accounting.o CC block/dirty-bitmap.o CC block/write-threshold.o CC block/backup.o CC block/replication.o CC block/crypto.o CC nbd/server.o CC nbd/client.o CC nbd/common.o CC block/curl.o CC block/dmg-bz2.o CC crypto/init.o CC crypto/hash.o CC crypto/hash-glib.o CC crypto/hmac.o CC crypto/hmac-glib.o CC crypto/aes.o CC crypto/desrfb.o CC crypto/cipher.o CC crypto/tlscreds.o CC crypto/tlscredsanon.o CC crypto/tlscredsx509.o CC crypto/tlssession.o CC crypto/secret.o CC crypto/random-platform.o CC crypto/pbkdf.o CC crypto/ivgen.o CC crypto/ivgen-essiv.o CC crypto/ivgen-plain.o CC crypto/ivgen-plain64.o CC crypto/afsplit.o CC crypto/xts.o CC crypto/block.o CC crypto/block-qcow.o CC crypto/block-luks.o CC io/channel.o CC io/channel-buffer.o CC io/channel-command.o CC io/channel-file.o CC io/channel-socket.o CC io/channel-tls.o CC io/channel-watch.o CC io/channel-websock.o CC io/channel-util.o CC io/dns-resolver.o CC io/task.o CC qom/object.o CC qom/container.o CC qom/qom-qobject.o CC qom/object_interfaces.o GEN qemu-img-cmds.h CC qemu-io.o CC blockdev.o CC blockdev-nbd.o CC bootdevice.o CC iothread.o CC qdev-monitor.o CC device-hotplug.o CC os-posix.o CC bt-host.o CC bt-vhci.o CC dma-helpers.o CC vl.o CC tpm.o CC qmp-marshal.o CC qmp.o CC hmp.o CC cpus-common.o CC audio/audio.o CC audio/noaudio.o CC audio/wavaudio.o CC audio/mixeng.o CC audio/ossaudio.o CC audio/wavcapture.o CC backends/rng.o CC backends/rng-egd.o CC backends/rng-random.o CC backends/tpm.o CC backends/hostmem.o CC backends/hostmem-ram.o CC backends/cryptodev.o CC backends/cryptodev-builtin.o CC block/stream.o CC chardev/msmouse.o CC chardev/wctablet.o CC chardev/testdev.o CC disas/i386.o CC hw/acpi/core.o CC hw/acpi/piix4.o CC hw/acpi/pcihp.o CC hw/acpi/ich9.o CC hw/acpi/tco.o CC hw/acpi/cpu_hotplug.o CC hw/acpi/memory_hotplug.o CC hw/acpi/cpu.o CC hw/acpi/nvdimm.o CC hw/acpi/vmgenid.o CC hw/acpi/acpi_interface.o CC hw/acpi/bios-linker-loader.o CC hw/acpi/aml-build.o CC hw/acpi/ipmi.o CC hw/acpi/acpi-stub.o CC hw/acpi/ipmi-stub.o CC hw/audio/sb16.o CC hw/audio/es1370.o CC hw/audio/ac97.o CC hw/audio/fmopl.o CC hw/audio/adlib.o CC hw/audio/gus.o CC hw/audio/gusemu_hal.o CC hw/audio/gusemu_mixer.o CC hw/audio/cs4231a.o CC hw/audio/intel-hda.o CC hw/audio/hda-codec.o CC hw/audio/pcspk.o CC hw/audio/soundhw.o CC hw/block/block.o CC hw/block/cdrom.o CC hw/block/hd-geometry.o CC hw/block/fdc.o CC hw/block/pflash_cfi01.o CC hw/block/nvme.o CC hw/bt/core.o CC hw/bt/l2cap.o CC hw/bt/sdp.o CC hw/bt/hci.o CC hw/bt/hid.o CC hw/bt/hci-csr.o CC hw/char/ipoctal232.o CC hw/char/parallel.o CC hw/char/serial.o CC hw/char/serial-isa.o CC hw/char/serial-pci.o CC hw/char/virtio-console.o CC hw/char/debugcon.o CC hw/core/qdev.o CC hw/core/qdev-properties.o CC hw/core/bus.o CC hw/core/reset.o CC hw/core/fw-path-provider.o CC hw/core/irq.o CC hw/core/hotplug.o CC hw/core/nmi.o CC hw/core/sysbus.o CC hw/core/machine.o CC hw/core/loader.o CC hw/core/qdev-properties-system.o CC hw/core/register.o CC hw/core/or-irq.o CC hw/cpu/core.o CC hw/display/cirrus_vga.o CC hw/display/vga-pci.o CC hw/display/vga-isa.o CC hw/display/vmware_vga.o CC hw/dma/i8257.o CC hw/i2c/core.o CC hw/i2c/smbus.o CC hw/i2c/smbus_eeprom.o CC hw/i2c/smbus_ich9.o CC hw/i2c/pm_smbus.o CC hw/ide/core.o CC hw/ide/atapi.o CC hw/ide/qdev.o CC hw/ide/pci.o CC hw/ide/isa.o CC hw/ide/piix.o CC hw/ide/ahci.o CC hw/ide/ich.o CC hw/input/hid.o CC hw/input/pckbd.o CC hw/input/ps2.o CC hw/input/vmmouse.o CC hw/input/virtio-input.o CC hw/input/virtio-input-hid.o CC hw/intc/i8259_common.o CC hw/intc/i8259.o CC hw/intc/ioapic_common.o CC hw/intc/intc.o CC hw/ipack/ipack.o CC hw/ipack/tpci200.o CC hw/ipmi/ipmi.o CC hw/ipmi/ipmi_bmc_sim.o CC hw/ipmi/ipmi_bmc_extern.o CC hw/ipmi/isa_ipmi_kcs.o CC hw/ipmi/isa_ipmi_bt.o CC hw/isa/isa-bus.o CC hw/isa/apm.o CC hw/mem/pc-dimm.o CC hw/mem/nvdimm.o CC hw/misc/applesmc.o CC hw/misc/debugexit.o CC hw/misc/sga.o CC hw/misc/pc-testdev.o CC hw/misc/pci-testdev.o CC hw/misc/edu.o CC hw/misc/unimp.o CC hw/net/ne2000.o CC hw/net/eepro100.o CC hw/net/pcnet-pci.o CC hw/net/pcnet.o CC hw/net/e1000.o CC hw/net/e1000x_common.o CC hw/net/net_tx_pkt.o CC hw/net/net_rx_pkt.o CC hw/net/e1000e.o CC hw/net/e1000e_core.o CC hw/net/rtl8139.o CC hw/net/vmxnet3.o CC hw/net/ne2000-isa.o CC hw/net/rocker/rocker.o CC hw/net/rocker/rocker_fp.o CC hw/net/rocker/rocker_desc.o CC hw/net/rocker/rocker_world.o CC hw/net/rocker/rocker_of_dpa.o CC hw/nvram/eeprom93xx.o CC hw/nvram/fw_cfg.o CC hw/nvram/chrp_nvram.o CC hw/pci-bridge/pci_bridge_dev.o CC hw/pci-bridge/pcie_root_port.o CC hw/pci-bridge/gen_pcie_root_port.o CC hw/pci-bridge/pci_expander_bridge.o CC hw/pci-bridge/xio3130_upstream.o CC hw/pci-bridge/xio3130_downstream.o CC hw/pci-bridge/ioh3420.o CC hw/pci-bridge/i82801b11.o CC hw/pci-host/pam.o CC hw/pci-host/piix.o CC hw/pci-host/q35.o CC hw/pci/pci.o CC hw/pci/pci_bridge.o CC hw/pci/msix.o CC hw/pci/msi.o CC hw/pci/shpc.o CC hw/pci/slotid_cap.o CC hw/pci/pci_host.o CC hw/pci/pcie_host.o CC hw/pci/pcie.o CC hw/pci/pcie_aer.o CC hw/pci/pcie_port.o CC hw/pci/pci-stub.o CC hw/pcmcia/pcmcia.o CC hw/scsi/scsi-disk.o CC hw/scsi/scsi-generic.o CC hw/scsi/scsi-bus.o CC hw/scsi/lsi53c895a.o CC hw/scsi/mptsas.o CC hw/scsi/mptconfig.o CC hw/scsi/mptendian.o CC hw/scsi/megasas.o CC hw/scsi/vmw_pvscsi.o CC hw/scsi/esp.o CC hw/scsi/esp-pci.o CC hw/sd/sd.o CC hw/sd/core.o CC hw/sd/sdhci.o CC hw/smbios/smbios.o CC hw/smbios/smbios_type_38.o CC hw/smbios/smbios-stub.o CC hw/smbios/smbios_type_38-stub.o CC hw/timer/hpet.o CC hw/timer/i8254_common.o CC hw/timer/i8254.o CC hw/tpm/tpm_tis.o CC hw/usb/core.o CC hw/usb/combined-packet.o CC hw/usb/bus.o CC hw/usb/libhw.o CC hw/usb/desc.o CC hw/usb/desc-msos.o CC hw/usb/hcd-uhci.o CC hw/usb/hcd-ohci.o CC hw/usb/hcd-ehci.o CC hw/usb/hcd-ehci-pci.o CC hw/usb/hcd-xhci.o CC hw/usb/hcd-xhci-nec.o CC hw/usb/dev-hub.o CC hw/usb/dev-hid.o CC hw/usb/dev-wacom.o CC hw/usb/dev-storage.o CC hw/usb/dev-uas.o CC hw/usb/dev-audio.o CC hw/usb/dev-serial.o CC hw/usb/dev-network.o CC hw/usb/dev-bluetooth.o CC hw/usb/dev-smartcard-reader.o CC hw/usb/dev-mtp.o CC hw/usb/host-libusb.o CC hw/usb/host-legacy.o CC hw/virtio/virtio-rng.o CC hw/virtio/virtio-pci.o CC hw/virtio/virtio-bus.o CC hw/virtio/virtio-mmio.o CC hw/virtio/vhost-stub.o CC hw/watchdog/watchdog.o CC hw/watchdog/wdt_i6300esb.o CC hw/watchdog/wdt_ib700.o CC migration/migration.o CC migration/socket.o CC migration/fd.o CC migration/exec.o CC migration/tls.o CC migration/channel.o CC migration/savevm.o CC migration/colo-comm.o CC migration/colo.o CC migration/colo-failover.o CC migration/vmstate.o CC migration/vmstate-types.o CC migration/page_cache.o CC migration/qemu-file.o CC migration/global_state.o CC migration/qemu-file-channel.o CC migration/xbzrle.o CC migration/postcopy-ram.o CC migration/qjson.o CC migration/block.o CC net/net.o CC net/queue.o CC net/checksum.o /var/tmp/patchew-tester-tmp-t_taanhq/src/net/queue.c:28:10: fatal error: 'packet.h' file not found #include "packet.h" ^ 1 error generated. gmake: *** [/var/tmp/patchew-tester-tmp-t_taanhq/src/rules.mak:66: net/queue.o] Error 1 gmake: *** Waiting for unfinished jobs.... === OUTPUT END === Test command exited with code: 2 --- Email generated automatically by Patchew [http://patchew.org/]. Please send your feedback to patchew-devel@freelists.org
Hi, This series failed build test on s390x host. Please find the details below. Type: series Message-id: 20170718060627.2107-1-anton.ivanov@cambridgegreys.com Subject: [Qemu-devel] [PATCH] Unified Socket Transport === TEST SCRIPT BEGIN === #!/bin/bash # Testing script will be invoked under the git checkout with # HEAD pointing to a commit that has the patches applied on top of "base" # branch set -e echo "=== ENV ===" env echo "=== PACKAGES ===" rpm -qa echo "=== TEST BEGIN ===" CC=$HOME/bin/cc INSTALL=$PWD/install BUILD=$PWD/build echo -n "Using CC: " realpath $CC mkdir -p $BUILD $INSTALL SRC=$PWD cd $BUILD $SRC/configure --cc=$CC --prefix=$INSTALL make -j4 # XXX: we need reliable clean up # make check -j4 V=1 make install === TEST SCRIPT END === Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384 From https://github.com/patchew-project/qemu * [new tag] patchew/20170718060627.2107-1-anton.ivanov@cambridgegreys.com -> patchew/20170718060627.2107-1-anton.ivanov@cambridgegreys.com Switched to a new branch 'test' 6ed9046 Unified Socket Transport === OUTPUT BEGIN === === ENV === XDG_SESSION_ID=156248 SHELL=/bin/sh USER=fam PATCHEW=/home/fam/patchew/patchew-cli -s http://patchew.org --nodebug PATH=/usr/bin:/bin PWD=/var/tmp/patchew-tester-tmp-akl3dh_3/src LANG=en_US.UTF-8 HOME=/home/fam SHLVL=2 LOGNAME=fam DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1012/bus XDG_RUNTIME_DIR=/run/user/1012 _=/usr/bin/env === PACKAGES === gpg-pubkey-873529b8-54e386ff xz-libs-5.2.2-2.fc24.s390x libxshmfence-1.2-3.fc24.s390x giflib-4.1.6-15.fc24.s390x trousers-lib-0.3.13-6.fc24.s390x ncurses-base-6.0-6.20160709.fc25.noarch gmp-6.1.1-1.fc25.s390x libidn-1.33-1.fc25.s390x slang-2.3.0-7.fc25.s390x libsemanage-2.5-8.fc25.s390x pkgconfig-0.29.1-1.fc25.s390x alsa-lib-1.1.1-2.fc25.s390x yum-metadata-parser-1.1.4-17.fc25.s390x python3-slip-dbus-0.6.4-4.fc25.noarch python2-cssselect-0.9.2-1.fc25.noarch python-fedora-0.8.0-2.fc25.noarch createrepo_c-libs-0.10.0-6.fc25.s390x initscripts-9.69-1.fc25.s390x wget-1.18-2.fc25.s390x dhcp-client-4.3.5-1.fc25.s390x parted-3.2-21.fc25.s390x flex-2.6.0-3.fc25.s390x colord-libs-1.3.4-1.fc25.s390x python-osbs-client-0.33-3.fc25.noarch perl-Pod-Simple-3.35-1.fc25.noarch python2-simplejson-3.10.0-1.fc25.s390x brltty-5.4-2.fc25.s390x librados2-10.2.4-2.fc25.s390x tcp_wrappers-7.6-83.fc25.s390x libcephfs_jni1-10.2.4-2.fc25.s390x nettle-devel-3.3-1.fc25.s390x bzip2-devel-1.0.6-21.fc25.s390x libuuid-2.28.2-2.fc25.s390x pango-1.40.4-1.fc25.s390x python3-dnf-1.1.10-6.fc25.noarch cryptsetup-libs-1.7.4-1.fc25.s390x texlive-kpathsea-doc-svn41139-33.fc25.1.noarch netpbm-10.77.00-3.fc25.s390x openssh-7.4p1-4.fc25.s390x texlive-kpathsea-bin-svn40473-33.20160520.fc25.1.s390x texlive-graphics-svn41015-33.fc25.1.noarch texlive-dvipdfmx-def-svn40328-33.fc25.1.noarch texlive-mfware-svn40768-33.fc25.1.noarch texlive-texlive-scripts-svn41433-33.fc25.1.noarch texlive-euro-svn22191.1.1-33.fc25.1.noarch texlive-etex-svn37057.0-33.fc25.1.noarch texlive-iftex-svn29654.0.2-33.fc25.1.noarch texlive-palatino-svn31835.0-33.fc25.1.noarch texlive-texlive-docindex-svn41430-33.fc25.1.noarch texlive-xunicode-svn30466.0.981-33.fc25.1.noarch texlive-koma-script-svn41508-33.fc25.1.noarch texlive-pst-grad-svn15878.1.06-33.fc25.1.noarch texlive-pst-blur-svn15878.2.0-33.fc25.1.noarch texlive-jknapltx-svn19440.0-33.fc25.1.noarch netpbm-progs-10.77.00-3.fc25.s390x texinfo-6.1-4.fc25.s390x openssl-devel-1.0.2k-1.fc25.s390x python2-sssdconfig-1.15.2-1.fc25.noarch gdk-pixbuf2-2.36.6-1.fc25.s390x mesa-libEGL-13.0.4-3.fc25.s390x pcre-cpp-8.40-6.fc25.s390x pcre-utf16-8.40-6.fc25.s390x glusterfs-extra-xlators-3.10.1-1.fc25.s390x mesa-libGL-devel-13.0.4-3.fc25.s390x nss-devel-3.29.3-1.1.fc25.s390x libaio-0.3.110-6.fc24.s390x libfontenc-1.1.3-3.fc24.s390x lzo-2.08-8.fc24.s390x isl-0.14-5.fc24.s390x libXau-1.0.8-6.fc24.s390x linux-atm-libs-2.5.1-14.fc24.s390x libXext-1.3.3-4.fc24.s390x libXxf86vm-1.1.4-3.fc24.s390x bison-3.0.4-4.fc24.s390x perl-srpm-macros-1-20.fc25.noarch gawk-4.1.3-8.fc25.s390x libwayland-client-1.12.0-1.fc25.s390x perl-Exporter-5.72-366.fc25.noarch perl-version-0.99.17-1.fc25.s390x fftw-libs-double-3.3.5-3.fc25.s390x libssh2-1.8.0-1.fc25.s390x ModemManager-glib-1.6.4-1.fc25.s390x newt-python3-0.52.19-2.fc25.s390x python-munch-2.0.4-3.fc25.noarch python-bugzilla-1.2.2-4.fc25.noarch libedit-3.1-16.20160618cvs.fc25.s390x python-pycurl-7.43.0-4.fc25.s390x createrepo_c-0.10.0-6.fc25.s390x device-mapper-multipath-libs-0.4.9-83.fc25.s390x yum-3.4.3-510.fc25.noarch dhcp-common-4.3.5-1.fc25.noarch dracut-config-rescue-044-78.fc25.s390x teamd-1.26-1.fc25.s390x mozjs17-17.0.0-16.fc25.s390x libselinux-2.5-13.fc25.s390x libgo-devel-6.3.1-1.fc25.s390x NetworkManager-libnm-1.4.4-3.fc25.s390x python2-pyparsing-2.1.10-1.fc25.noarch cairo-gobject-1.14.8-1.fc25.s390x ethtool-4.8-1.fc25.s390x xorg-x11-proto-devel-7.7-20.fc25.noarch brlapi-0.6.5-2.fc25.s390x librados-devel-10.2.4-2.fc25.s390x libXinerama-devel-1.1.3-6.fc24.s390x quota-4.03-7.fc25.s390x lua-posix-33.3.1-3.fc25.s390x usbredir-devel-0.7.1-2.fc24.s390x python-libs-2.7.13-1.fc25.s390x libX11-devel-1.6.4-4.fc25.s390x python-devel-2.7.13-1.fc25.s390x libepoxy-1.4.1-1.fc25.s390x freetype-devel-2.6.5-3.fc25.s390x python3-dnf-plugins-core-0.1.21-5.fc25.noarch perl-macros-5.24.1-385.fc25.s390x texlive-pdftex-doc-svn41149-33.fc25.1.noarch mariadb-config-10.1.21-3.fc25.s390x openssh-clients-7.4p1-4.fc25.s390x iptables-1.6.0-3.fc25.s390x texlive-texlive.infra-svn41280-33.fc25.1.noarch texlive-graphics-cfg-svn40269-33.fc25.1.noarch texlive-bibtex-svn40768-33.fc25.1.noarch texlive-mfware-bin-svn40473-33.20160520.fc25.1.s390x texlive-texlive-scripts-bin-svn29741.0-33.20160520.fc25.1.noarch texlive-sauerj-svn15878.0-33.fc25.1.noarch texlive-enctex-svn34957.0-33.fc25.1.noarch texlive-ifetex-svn24853.1.2-33.fc25.1.noarch texlive-ntgclass-svn15878.2.1a-33.fc25.1.noarch texlive-tex-gyre-math-svn41264-33.fc25.1.noarch texlive-bera-svn20031.0-33.fc25.1.noarch texlive-ms-svn29849.0-33.fc25.1.noarch texlive-pst-fill-svn15878.1.01-33.fc25.1.noarch texlive-ctable-svn38672-33.fc25.1.noarch texlive-extsizes-svn17263.1.4a-33.fc25.1.noarch texlive-collection-latexrecommended-svn35765.0-33.20160520.fc25.1.noarch perl-Filter-1.57-1.fc25.s390x krb5-workstation-1.14.4-7.fc25.s390x python2-rpm-macros-3-12.fc25.noarch audit-libs-2.7.4-1.fc25.s390x libglvnd-egl-0.2.999-14.20170308git8e6e102.fc25.s390x libglvnd-opengl-0.2.999-14.20170308git8e6e102.fc25.s390x pcre-devel-8.40-6.fc25.s390x gdbm-1.13-1.fc25.s390x mesa-libGLES-devel-13.0.4-3.fc25.s390x java-1.8.0-openjdk-1.8.0.121-10.b14.fc25.s390x gpg-pubkey-efe550f5-5220ba41 gpg-pubkey-81b46521-55b3ca9a filesystem-3.2-37.fc24.s390x libffi-3.1-9.fc24.s390x keyutils-libs-1.5.9-8.fc24.s390x libnfnetlink-1.0.1-8.fc24.s390x libtheora-1.1.1-14.fc24.s390x xml-common-0.6.3-44.fc24.noarch autoconf-2.69-22.fc24.noarch libXt-1.1.5-3.fc24.s390x kbd-legacy-2.0.3-3.fc24.noarch ghostscript-fonts-5.50-35.fc24.noarch libXevie-1.0.3-11.fc24.s390x libcap-2.25-2.fc25.s390x mpfr-3.1.5-1.fc25.s390x perl-Carp-1.40-365.fc25.noarch libmnl-1.0.4-1.fc25.s390x perl-Unicode-EastAsianWidth-1.33-8.fc25.noarch libwayland-cursor-1.12.0-1.fc25.s390x python-krbV-1.0.90-12.fc25.s390x python2-urllib3-1.15.1-3.fc25.noarch fipscheck-1.4.1-11.fc25.s390x libndp-1.6-1.fc25.s390x gnupg2-2.1.13-2.fc25.s390x libXfixes-5.0.3-1.fc25.s390x adwaita-icon-theme-3.22.0-1.fc25.noarch dconf-0.26.0-1.fc25.s390x ncurses-devel-6.0-6.20160709.fc25.s390x dejagnu-1.6-1.fc25.noarch libstdc++-devel-6.3.1-1.fc25.s390x python-beautifulsoup4-4.5.3-1.fc25.noarch device-mapper-1.02.136-3.fc25.s390x subversion-1.9.5-1.fc25.s390x libtool-ltdl-2.4.6-13.fc25.s390x libevent-2.0.22-1.fc25.s390x atk-devel-2.22.0-1.fc25.s390x libev-4.24-1.fc25.s390x xorg-x11-fonts-Type1-7.5-16.fc24.noarch libtasn1-devel-4.10-1.fc25.s390x vte291-devel-0.46.1-1.fc25.s390x brlapi-devel-0.6.5-2.fc25.s390x pulseaudio-libs-10.0-2.fc25.s390x libnl3-cli-3.2.29-2.fc25.s390x perl-libs-5.24.1-385.fc25.s390x glib2-2.50.3-1.fc25.s390x python3-firewall-0.4.4.4-1.fc25.noarch python2-rpm-4.13.0.1-1.fc25.s390x gnutls-3.5.10-1.fc25.s390x pango-devel-1.40.4-1.fc25.s390x dnf-1.1.10-6.fc25.noarch texlive-metafont-bin-svn40987-33.20160520.fc25.1.s390x texlive-xkeyval-svn35741.2.7a-33.fc25.1.noarch texlive-euler-svn17261.2.5-33.fc25.1.noarch texlive-mptopdf-svn41282-33.fc25.1.noarch texlive-wasy-svn35831.0-33.fc25.1.noarch texlive-avantgar-svn31835.0-33.fc25.1.noarch texlive-eurosym-svn17265.1.4_subrfix-33.fc25.1.noarch texlive-knuth-lib-svn35820.0-33.fc25.1.noarch texlive-parallel-svn15878.0-33.fc25.1.noarch texlive-texlive-msg-translations-svn41431-33.fc25.1.noarch texlive-latex-svn40218-33.fc25.1.noarch texlive-lualatex-math-svn40621-33.fc25.1.noarch texlive-auto-pst-pdf-svn23723.0.6-33.fc25.1.noarch texlive-powerdot-svn38984-33.fc25.1.noarch texlive-wasysym-svn15878.2.0-33.fc25.1.noarch ImageMagick-libs-6.9.3.0-6.fc25.s390x geoclue2-2.4.5-1.fc25.s390x perl-IO-Socket-IP-0.39-1.fc25.noarch gdb-7.12.1-47.fc25.s390x python2-pyasn1-0.2.3-1.fc25.noarch libglvnd-0.2.999-14.20170308git8e6e102.fc25.s390x libglvnd-gles-0.2.999-14.20170308git8e6e102.fc25.s390x gdk-pixbuf2-devel-2.36.6-1.fc25.s390x libidn2-2.0.0-1.fc25.s390x system-python-libs-3.5.3-4.fc25.s390x GeoIP-1.6.10-1.fc25.s390x at-spi2-core-devel-2.22.1-1.fc25.s390x gpg-pubkey-34ec9cba-54e38751 gpg-pubkey-030d5aed-55b577f0 basesystem-11-2.fc24.noarch libmpc-1.0.2-5.fc24.s390x libunistring-0.9.4-3.fc24.s390x libmodman-2.0.1-12.fc24.s390x lsscsi-0.28-3.fc24.s390x kbd-misc-2.0.3-3.fc24.noarch rpmconf-base-1.0.18-2.fc25.noarch libxml2-2.9.3-4.fc25.s390x kmod-23-1.fc25.s390x newt-0.52.19-2.fc25.s390x perl-Text-Unidecode-1.27-3.fc25.noarch plymouth-core-libs-0.9.3-0.6.20160620git0e65b86c.fc25.s390x which-2.21-1.fc25.s390x python3-slip-0.6.4-4.fc25.noarch python3-systemd-232-1.fc25.s390x python-lockfile-0.11.0-4.fc25.noarch python2-requests-2.10.0-4.fc25.noarch libarchive-3.2.2-1.fc25.s390x libnghttp2-1.13.0-2.fc25.s390x python-urlgrabber-3.10.1-9.fc25.noarch iputils-20161105-1.fc25.s390x rest-0.8.0-1.fc25.s390x adwaita-cursor-theme-3.22.0-1.fc25.noarch authconfig-6.2.10-14.fc25.s390x expat-devel-2.2.0-1.fc25.s390x automake-1.15-7.fc25.noarch shared-mime-info-1.8-1.fc25.s390x pigz-2.3.4-1.fc25.s390x device-mapper-libs-1.02.136-3.fc25.s390x dnsmasq-2.76-2.fc25.s390x fedora-packager-0.6.0.1-1.fc25.noarch gcc-c++-6.3.1-1.fc25.s390x libwebp-0.5.2-1.fc25.s390x boost-system-1.60.0-10.fc25.s390x libasyncns-0.8-10.fc24.s390x libXau-devel-1.0.8-6.fc24.s390x libverto-libev-0.2.6-6.fc24.s390x python3-html5lib-0.999-9.fc25.noarch ttmkfdir-3.0.9-48.fc24.s390x pulseaudio-libs-glib2-10.0-2.fc25.s390x wpa_supplicant-2.6-1.fc25.s390x texlive-lib-2016-33.20160520.fc25.s390x libXi-devel-1.7.9-1.fc25.s390x python3-distro-1.0.3-1.fc25.noarch rpm-plugin-systemd-inhibit-4.13.0.1-1.fc25.s390x gnutls-c++-3.5.10-1.fc25.s390x texlive-texlive-common-doc-svn40682-33.fc25.1.noarch packagedb-cli-2.14.1-1.fc25.noarch rpcbind-0.2.4-5.fc25.s390x texlive-metafont-svn40793-33.fc25.1.noarch texlive-tools-svn40934-33.fc25.1.noarch texlive-enumitem-svn24146.3.5.2-33.fc25.1.noarch texlive-mptopdf-bin-svn18674.0-33.20160520.fc25.1.noarch texlive-underscore-svn18261.0-33.fc25.1.noarch texlive-anysize-svn15878.0-33.fc25.1.noarch texlive-euenc-svn19795.0.1h-33.fc25.1.noarch texlive-kastrup-svn15878.0-33.fc25.1.noarch texlive-paralist-svn39247-33.fc25.1.noarch texlive-texlive-en-svn41185-33.fc25.1.noarch texlive-tipa-svn29349.1.3-33.fc25.1.noarch texlive-currfile-svn40725-33.fc25.1.noarch texlive-pst-node-svn40743-33.fc25.1.noarch texlive-pst-slpe-svn24391.1.31-33.fc25.1.noarch texlive-typehtml-svn17134.0-33.fc25.1.noarch SDL2-devel-2.0.5-3.fc25.s390x perl-Module-CoreList-5.20170320-1.fc25.noarch libcroco-0.6.11-3.fc25.s390x publicsuffix-list-dafsa-20170206-1.fc25.noarch pcre-8.40-6.fc25.s390x cups-libs-2.2.0-8.fc25.s390x gtk-update-icon-cache-3.22.11-1.fc25.s390x libcurl-7.51.0-6.fc25.s390x python3-libs-3.5.3-4.fc25.s390x bluez-libs-devel-5.44-1.fc25.s390x kernel-4.10.8-200.fc25.s390x fontpackages-filesystem-1.44-17.fc24.noarch groff-base-1.22.3-8.fc24.s390x ilmbase-2.2.0-5.fc24.s390x OpenEXR-libs-2.2.0-5.fc24.s390x hesiod-3.2.1-6.fc24.s390x sysfsutils-2.1.0-19.fc24.s390x ocaml-srpm-macros-2-4.fc24.noarch mailx-12.5-19.fc24.s390x ncurses-libs-6.0-6.20160709.fc25.s390x ipset-libs-6.29-1.fc25.s390x gmp-devel-6.1.1-1.fc25.s390x python-pip-8.1.2-2.fc25.noarch harfbuzz-1.3.2-1.fc25.s390x python2-iniparse-0.4-20.fc25.noarch python3-iniparse-0.4-20.fc25.noarch python3-kickstart-2.32-1.fc25.noarch perl-Net-SSLeay-1.78-1.fc25.s390x drpm-0.3.0-3.fc25.s390x glib-networking-2.50.0-1.fc25.s390x webkitgtk3-2.4.11-3.fc25.s390x libXaw-1.0.13-4.fc25.s390x xorg-x11-font-utils-7.5-32.fc25.s390x hardlink-1.1-1.fc25.s390x libcom_err-1.43.3-1.fc25.s390x python2-dateutil-2.6.0-1.fc25.noarch libXpm-3.5.12-1.fc25.s390x python2-smmap-2.0.1-1.fc25.noarch poppler-data-0.4.7-6.fc25.noarch nspr-devel-4.13.1-1.fc25.s390x librbd1-10.2.4-2.fc25.s390x libsndfile-1.0.27-1.fc25.s390x perl-Digest-MD5-2.55-2.fc25.s390x wayland-protocols-devel-1.7-1.fc25.noarch libacl-devel-2.2.52-11.fc24.s390x texi2html-5.0-4.fc24.noarch libxkbcommon-0.7.1-1.fc25.s390x freetype-2.6.5-3.fc25.s390x libuuid-devel-2.28.2-2.fc25.s390x coreutils-common-8.25-16.fc25.s390x gdb-headless-7.12.1-47.fc25.s390x libcacard-2.5.3-1.fc25.s390x perl-threads-shared-1.55-1.fc25.s390x python2-rpkg-1.49-2.fc25.noarch libwmf-lite-0.2.8.4-50.fc25.s390x unbound-libs-1.6.0-6.fc25.s390x texlive-tetex-svn41059-33.fc25.1.noarch texlive-thumbpdf-svn34621.3.16-33.fc25.1.noarch texlive-carlisle-svn18258.0-33.fc25.1.noarch texlive-makeindex-bin-svn40473-33.20160520.fc25.1.s390x texlive-pdftex-svn41149-33.fc25.1.noarch texlive-csquotes-svn39538-33.fc25.1.noarch texlive-courier-svn35058.0-33.fc25.1.noarch texlive-helvetic-svn31835.0-33.fc25.1.noarch texlive-mfnfss-svn19410.0-33.fc25.1.noarch texlive-sepnum-svn20186.2.0-33.fc25.1.noarch texlive-utopia-svn15878.0-33.fc25.1.noarch texlive-luatexbase-svn38550-33.fc25.1.noarch texlive-pst-3d-svn17257.1.10-33.fc25.1.noarch texlive-latex-bin-bin-svn14050.0-33.20160520.fc25.1.noarch texlive-l3experimental-svn41163-33.fc25.1.noarch bind99-libs-9.9.9-4.P6.fc25.s390x net-tools-2.0-0.40.20160329git.fc25.s390x perl-Pod-Perldoc-3.28-1.fc25.noarch openssl-1.0.2k-1.fc25.s390x man-pages-4.06-4.fc25.noarch libdrm-2.4.77-1.fc25.s390x p11-kit-0.23.2-3.fc25.s390x glusterfs-cli-3.10.1-1.fc25.s390x git-core-2.9.3-3.fc25.s390x python3-3.5.3-4.fc25.s390x python3-magic-5.29-4.fc25.noarch p11-kit-trust-0.23.2-3.fc25.s390x gpg-pubkey-95a43f54-5284415a dejavu-fonts-common-2.35-3.fc24.noarch libSM-1.2.2-4.fc24.s390x diffutils-3.3-13.fc24.s390x libogg-1.3.2-5.fc24.s390x hunspell-en-US-0.20140811.1-5.fc24.noarch libdaemon-0.14-10.fc24.s390x patch-2.7.5-3.fc24.s390x libsysfs-2.1.0-19.fc24.s390x procmail-3.22-39.fc24.s390x libXdamage-1.1.4-8.fc24.s390x libotf-0.9.13-7.fc24.s390x urw-fonts-2.4-22.fc24.noarch crontabs-1.11-12.20150630git.fc24.noarch ppp-2.4.7-9.fc24.s390x polkit-0.113-5.fc24.s390x cyrus-sasl-2.1.26-26.2.fc24.s390x zlib-devel-1.2.8-10.fc24.s390x time-1.7-49.fc24.s390x gpg-pubkey-fdb19c98-56fd6333 fedora-release-25-1.noarch libcap-ng-0.7.8-1.fc25.s390x binutils-2.26.1-1.fc25.s390x lcms2-2.8-2.fc25.s390x libcomps-0.1.7-5.fc25.s390x less-481-6.fc25.s390x apr-1.5.2-4.fc25.s390x perl-constant-1.33-367.fc25.noarch perl-Data-Dumper-2.161-1.fc25.s390x ipcalc-0.1.8-1.fc25.s390x libteam-1.26-1.fc25.s390x gmp-c++-6.1.1-1.fc25.s390x fontconfig-2.12.1-1.fc25.s390x enchant-1.6.0-14.fc25.s390x pyliblzma-0.5.3-16.fc25.s390x libsepol-devel-2.5-10.fc25.s390x python3-ordered-set-2.0.0-4.fc25.noarch python3-rpmconf-1.0.18-2.fc25.noarch python-ipaddress-1.0.16-3.fc25.noarch python2-kerberos-1.2.5-1.fc25.s390x python2-pysocks-1.5.6-5.fc25.noarch fipscheck-lib-1.4.1-11.fc25.s390x libatomic_ops-7.4.4-1.fc25.s390x net-snmp-agent-libs-5.7.3-13.fc25.s390x dracut-044-78.fc25.s390x python2-pygpgme-0.3-18.fc25.s390x libsoup-2.56.0-2.fc25.s390x orc-0.4.26-1.fc25.s390x yum-utils-1.1.31-511.fc25.noarch libXrender-0.9.10-1.fc25.s390x libXrandr-1.5.1-1.fc25.s390x go-srpm-macros-2-7.fc25.noarch gnupg2-smime-2.1.13-2.fc25.s390x guile-devel-2.0.13-1.fc25.s390x uboot-tools-2016.09.01-2.fc25.s390x pykickstart-2.32-1.fc25.noarch python-bunch-1.0.1-9.fc25.noarch perl-generators-1.10-1.fc25.noarch perl-Mozilla-CA-20160104-3.fc25.noarch glibc-all-langpacks-2.24-4.fc25.s390x bzip2-libs-1.0.6-21.fc25.s390x libpng-1.6.27-1.fc25.s390x desktop-file-utils-0.23-2.fc25.s390x python2-cccolutils-1.4-1.fc25.s390x python2-lxml-3.7.2-1.fc25.s390x redhat-rpm-config-45-1.fc25.noarch elfutils-libs-0.168-1.fc25.s390x device-mapper-event-libs-1.02.136-3.fc25.s390x lvm2-libs-2.02.167-3.fc25.s390x elfutils-0.168-1.fc25.s390x python2-gitdb-2.0.0-1.fc25.noarch gcc-gfortran-6.3.1-1.fc25.s390x libselinux-python-2.5-13.fc25.s390x openjpeg2-2.1.2-3.fc25.s390x js-jquery-2.2.4-1.fc25.noarch boost-thread-1.60.0-10.fc25.s390x json-c-0.12-7.fc24.s390x librbd-devel-10.2.4-2.fc25.s390x libXcursor-devel-1.1.14-6.fc24.s390x python3-beautifulsoup4-4.5.3-1.fc25.noarch latex2html-2012-7.fc24.noarch lksctp-tools-1.0.16-5.fc24.s390x vte291-0.46.1-1.fc25.s390x libfdt-1.4.2-1.fc25.s390x libXft-devel-2.3.2-4.fc24.s390x libattr-devel-2.4.47-16.fc24.s390x libiscsi-devel-1.15.0-2.fc24.s390x gettext-0.19.8.1-3.fc25.s390x libjpeg-turbo-devel-1.5.1-0.fc25.s390x libX11-1.6.4-4.fc25.s390x pulseaudio-libs-devel-10.0-2.fc25.s390x ccache-3.3.3-1.fc25.s390x systemd-libs-231-14.fc25.s390x nss-softokn-freebl-3.29.3-1.0.fc25.s390x libepoxy-devel-1.4.1-1.fc25.s390x krb5-libs-1.14.4-7.fc25.s390x libmount-2.28.2-2.fc25.s390x python3-decorator-4.0.11-1.fc25.noarch rpm-plugin-selinux-4.13.0.1-1.fc25.s390x perl-threads-2.15-1.fc25.s390x tzdata-java-2017b-1.fc25.noarch python-srpm-macros-3-12.fc25.noarch libsmartcols-2.28.2-2.fc25.s390x kernel-core-4.10.5-200.fc25.s390x kernel-modules-4.10.5-200.fc25.s390x texlive-kpathsea-svn41139-33.fc25.1.noarch texlive-amsmath-svn41561-33.fc25.1.noarch texlive-thumbpdf-bin-svn6898.0-33.20160520.fc25.1.noarch texlive-psnfss-svn33946.9.2a-33.fc25.1.noarch texlive-subfig-svn15878.1.3-33.fc25.1.noarch texlive-fancybox-svn18304.1.4-33.fc25.1.noarch texlive-lua-alt-getopt-svn29349.0.7.0-33.fc25.1.noarch texlive-natbib-svn20668.8.31b-33.fc25.1.noarch texlive-pdftex-bin-svn40987-33.20160520.fc25.1.s390x texlive-xdvi-svn40768-33.fc25.1.noarch texlive-crop-svn15878.1.5-33.fc25.1.noarch texlive-babel-english-svn30264.3.3p-33.fc25.1.noarch texlive-cmextra-svn32831.0-33.fc25.1.noarch texlive-fancyhdr-svn15878.3.1-33.fc25.1.noarch texlive-luatex-svn40963-33.fc25.1.noarch texlive-knuth-local-svn38627-33.fc25.1.noarch texlive-mflogo-font-svn36898.1.002-33.fc25.1.noarch texlive-parskip-svn19963.2.0-33.fc25.1.noarch texlive-section-svn20180.0-33.fc25.1.noarch texlive-textcase-svn15878.0-33.fc25.1.noarch texlive-updmap-map-svn41159-33.fc25.1.noarch texlive-attachfile-svn38830-33.fc25.1.noarch nss-3.29.3-1.1.fc25.s390x glusterfs-client-xlators-3.10.1-1.fc25.s390x libglvnd-glx-0.2.999-14.20170308git8e6e102.fc25.s390x libtiff-4.0.7-4.fc25.s390x dbus-devel-1.11.12-1.fc25.s390x java-1.8.0-openjdk-headless-1.8.0.121-10.b14.fc25.s390x pcre2-utf16-10.23-5.fc25.s390x git-core-doc-2.9.3-3.fc25.s390x iproute-4.10.0-1.fc25.s390x nfs-utils-2.1.1-3.rc1.fc25.s390x libglvnd-core-devel-0.2.999-14.20170308git8e6e102.fc25.s390x python-magic-5.29-4.fc25.noarch pcre2-devel-10.23-5.fc25.s390x p11-kit-devel-0.23.2-3.fc25.s390x texlive-luaotfload-svn40902-33.fc25.1.noarch texlive-unicode-math-svn38462-33.fc25.1.noarch texlive-fancyvrb-svn18492.2.8-33.fc25.1.noarch texlive-pst-pdf-bin-svn7838.0-33.20160520.fc25.1.noarch texlive-amscls-svn36804.0-33.fc25.1.noarch texlive-ltxmisc-svn21927.0-33.fc25.1.noarch texlive-breqn-svn38099.0.98d-33.fc25.1.noarch texlive-xetex-def-svn40327-33.fc25.1.noarch openssh-server-7.4p1-4.fc25.s390x sendmail-8.15.2-8.fc25.s390x python-firewall-0.4.4.4-1.fc25.noarch python3-sssdconfig-1.15.2-1.fc25.noarch tzdata-2017b-1.fc25.noarch hunspell-1.4.1-2.fc25.s390x gpg-pubkey-8e1431d5-53bcbac7 zlib-1.2.8-10.fc24.s390x sed-4.2.2-15.fc24.s390x psmisc-22.21-8.fc24.s390x gpm-libs-1.20.7-9.fc24.s390x zip-3.0-16.fc24.s390x hostname-3.15-7.fc24.s390x libyubikey-1.13-2.fc24.s390x sg3_utils-libs-1.41-3.fc24.s390x polkit-pkla-compat-0.1-7.fc24.s390x passwd-0.79-8.fc24.s390x trousers-0.3.13-6.fc24.s390x grubby-8.40-3.fc24.s390x rootfiles-8.1-19.fc24.noarch nettle-3.3-1.fc25.s390x jansson-2.9-1.fc25.s390x libksba-1.3.5-1.fc25.s390x perl-Text-ParseWords-3.30-365.fc25.noarch perl-PathTools-3.63-366.fc25.s390x perl-File-Temp-0.23.04-365.fc25.noarch fuse-libs-2.9.7-1.fc25.s390x perl-Pod-Escapes-1.07-365.fc25.noarch perl-Term-ANSIColor-4.05-2.fc25.noarch perl-URI-1.71-5.fc25.noarch libXfont-1.5.2-1.fc25.s390x python-six-1.10.0-3.fc25.noarch dbus-glib-0.108-1.fc25.s390x gobject-introspection-1.50.0-1.fc25.s390x libpwquality-1.3.0-6.fc25.s390x python-gobject-base-3.22.0-1.fc25.s390x python-html5lib-0.999-9.fc25.noarch python3-dbus-1.2.4-2.fc25.s390x python3-chardet-2.3.0-1.fc25.noarch python3-urllib3-1.15.1-3.fc25.noarch python-offtrac-0.1.0-7.fc25.noarch python2-cryptography-1.5.3-3.fc25.s390x python2-requests-kerberos-0.10.0-2.fc25.noarch libserf-1.3.9-1.fc25.s390x libdatrie-0.2.9-3.fc25.s390x s390utils-base-1.36.0-1.fc25.s390x kpartx-0.4.9-83.fc25.s390x s390utils-cpuplugd-1.36.0-1.fc25.s390x rpmconf-1.0.18-2.fc25.noarch s390utils-osasnmpd-1.36.0-1.fc25.s390x python-dnf-plugins-extras-common-0.0.12-4.fc25.noarch fpc-srpm-macros-1.0-1.fc25.noarch libuser-0.62-4.fc25.s390x man-db-2.7.5-3.fc25.s390x sqlite-3.14.2-1.fc25.s390x python-systemd-doc-232-1.fc25.s390x libdb-5.3.28-16.fc25.s390x lz4-1.7.5-1.fc25.s390x tar-1.29-3.fc25.s390x emacs-common-25.1-3.fc25.s390x unzip-6.0-31.fc25.s390x bodhi-client-0.9.12.2-6.fc25.noarch glibc-headers-2.24-4.fc25.s390x cairo-1.14.8-1.fc25.s390x ca-certificates-2017.2.11-1.0.fc25.noarch NetworkManager-glib-1.4.4-3.fc25.s390x gcc-go-6.3.1-1.fc25.s390x cracklib-dicts-2.9.6-4.fc25.s390x libselinux-python3-2.5-13.fc25.s390x python2-enchant-1.6.8-1.fc25.noarch boost-iostreams-1.60.0-10.fc25.s390x userspace-rcu-0.9.2-2.fc25.s390x libXext-devel-1.3.3-4.fc24.s390x libXrandr-devel-1.5.1-1.fc25.s390x perl-XML-XPath-1.39-1.fc25.noarch python3-lxml-3.7.2-1.fc25.s390x vte-profile-0.46.1-1.fc25.s390x sqlite-devel-3.14.2-1.fc25.s390x libiscsi-1.15.0-2.fc24.s390x fontconfig-devel-2.12.1-1.fc25.s390x libfdt-devel-1.4.2-1.fc25.s390x ceph-devel-compat-10.2.4-2.fc25.s390x zlib-static-1.2.8-10.fc24.s390x chrpath-0.16-3.fc24.s390x python-2.7.13-1.fc25.s390x kernel-core-4.9.5-200.fc25.s390x info-6.1-4.fc25.s390x iptables-libs-1.6.0-3.fc25.s390x bind-license-9.10.4-4.P6.fc25.noarch lua-5.3.4-1.fc25.s390x libfdisk-2.28.2-2.fc25.s390x dnf-plugins-core-0.1.21-5.fc25.noarch selinux-policy-3.13.1-225.11.fc25.noarch perl-Errno-1.25-385.fc25.s390x perl-Storable-2.56-368.fc25.s390x python2-decorator-4.0.11-1.fc25.noarch mariadb-common-10.1.21-3.fc25.s390x systemtap-client-3.1-2.fc25.s390x libnetfilter_conntrack-1.0.6-2.fc25.s390x texlive-texlive.infra-bin-svn40312-33.20160520.fc25.1.s390x texlive-ifluatex-svn41346-33.fc25.1.noarch texlive-fp-svn15878.0-33.fc25.1.noarch texlive-latex-fonts-svn28888.0-33.fc25.1.noarch texlive-bibtex-bin-svn40473-33.20160520.fc25.1.s390x texlive-glyphlist-svn28576.0-33.fc25.1.noarch texlive-marvosym-svn29349.2.2a-33.fc25.1.noarch texlive-tex-bin-svn40987-33.20160520.fc25.1.s390x texlive-texconfig-svn40768-33.fc25.1.noarch texlive-wasy2-ps-svn35830.0-33.fc25.1.noarch texlive-psfrag-svn15878.3.04-33.fc25.1.noarch texlive-charter-svn15878.0-33.fc25.1.noarch texlive-ec-svn25033.1.0-33.fc25.1.noarch texlive-lineno-svn21442.4.41-33.fc25.1.noarch texlive-hyphen-base-svn41138-33.fc25.1.noarch texlive-manfnt-font-svn35799.0-33.fc25.1.noarch texlive-ncntrsbk-svn31835.0-33.fc25.1.noarch texlive-pst-math-svn34786.0.63-33.fc25.1.noarch texlive-symbol-svn31835.0-33.fc25.1.noarch texlive-environ-svn33821.0.3-33.fc25.1.noarch texlive-algorithms-svn38085.0.1-33.fc25.1.noarch glusterfs-libs-3.10.1-1.fc25.s390x mesa-libwayland-egl-13.0.4-3.fc25.s390x glusterfs-api-3.10.1-1.fc25.s390x kernel-core-4.10.8-200.fc25.s390x mesa-libwayland-egl-devel-13.0.4-3.fc25.s390x nss-tools-3.29.3-1.1.fc25.s390x pcre2-10.23-5.fc25.s390x perl-Git-2.9.3-3.fc25.noarch gssproxy-0.7.0-3.fc25.s390x glusterfs-server-3.10.1-1.fc25.s390x libglvnd-devel-0.2.999-14.20170308git8e6e102.fc25.s390x python3-hawkey-0.6.4-3.fc25.s390x vim-enhanced-8.0.514-1.fc25.s390x mesa-libgbm-devel-13.0.4-3.fc25.s390x texlive-ifplatform-svn21156.0.4-33.fc25.1.noarch texlive-eso-pic-svn37925.2.0g-33.fc25.1.noarch texlive-xcolor-svn41044-33.fc25.1.noarch texlive-pst-eps-svn15878.1.0-33.fc25.1.noarch texlive-pst-text-svn15878.1.00-33.fc25.1.noarch texlive-rotating-svn16832.2.16b-33.fc25.1.noarch texlive-pdfpages-svn40638-33.fc25.1.noarch texlive-cm-super-svn15878.0-33.fc25.1.noarch texlive-xetex-svn41438-33.fc25.1.noarch dnf-yum-1.1.10-6.fc25.noarch mariadb-libs-10.1.21-3.fc25.s390x rpmlint-1.9-8.fc25.noarch systemtap-sdt-devel-3.1-2.fc25.s390x libseccomp-devel-2.3.2-1.fc25.s390x telnet-0.17-67.fc25.s390x gpgme-1.8.0-10.fc25.s390x apr-util-1.5.4-3.fc24.s390x rsync-3.1.2-2.fc24.s390x jbigkit-libs-2.1-5.fc24.s390x pixman-0.34.0-2.fc24.s390x dwz-0.12-2.fc24.s390x expect-5.45-22.fc24.s390x libsigsegv-2.10-10.fc24.s390x fakeroot-libs-1.20.2-4.fc24.s390x m17n-lib-1.7.0-5.fc24.s390x libverto-0.2.6-6.fc24.s390x libXmu-1.1.2-4.fc24.s390x libXcursor-1.1.14-6.fc24.s390x python-kitchen-1.2.4-2.fc24.noarch polkit-libs-0.113-5.fc24.s390x fakeroot-1.20.2-4.fc24.s390x blktrace-1.1.0-3.fc24.s390x usermode-1.111-8.fc24.s390x kbd-2.0.3-3.fc24.s390x libaio-devel-0.3.110-6.fc24.s390x web-assets-filesystem-5-4.fc24.noarch expat-2.2.0-1.fc25.s390x libgpg-error-1.24-1.fc25.s390x libgcrypt-1.6.6-1.fc25.s390x findutils-4.6.0-8.fc25.s390x libassuan-2.4.3-1.fc25.s390x libusbx-1.0.21-1.fc25.s390x libxslt-1.1.28-13.fc25.s390x libmetalink-0.1.3-1.fc25.s390x perl-File-Path-2.12-365.fc25.noarch perl-MIME-Base64-3.15-365.fc25.s390x ncurses-6.0-6.20160709.fc25.s390x libwayland-server-1.12.0-1.fc25.s390x perl-Fedora-VSP-0.001-4.fc25.noarch perl-libintl-perl-1.26-1.fc25.s390x shadow-utils-4.2.1-11.fc25.s390x atk-2.22.0-1.fc25.s390x pam-1.3.0-1.fc25.s390x harfbuzz-icu-1.3.2-1.fc25.s390x libsecret-0.18.5-2.fc25.s390x s390utils-iucvterm-1.36.0-1.fc25.s390x python3-requests-2.10.0-4.fc25.noarch pyusb-1.0.0-2.fc25.noarch python-enum34-1.0.4-6.fc25.noarch pyOpenSSL-16.0.0-2.fc25.noarch pyxattr-0.5.3-8.fc25.s390x libbabeltrace-1.4.0-3.fc25.s390x libthai-0.1.25-1.fc25.s390x deltarpm-3.6-17.fc25.s390x s390utils-mon_statd-1.36.0-1.fc25.s390x device-mapper-multipath-0.4.9-83.fc25.s390x python3-pygpgme-0.3-18.fc25.s390x libreport-filesystem-2.8.0-1.fc25.s390x ghc-srpm-macros-1.4.2-4.fc25.noarch rpmdevtools-8.9-1.fc25.noarch python-dnf-plugins-extras-migrate-0.0.12-4.fc25.noarch perl-IO-Socket-SSL-2.038-1.fc25.noarch perl-File-ShareDir-1.102-7.fc25.noarch tcl-8.6.6-1.fc25.s390x glibc-2.24-4.fc25.s390x elfutils-libelf-0.168-1.fc25.s390x perl-Scalar-List-Utils-1.47-1.fc25.s390x bzip2-1.0.6-21.fc25.s390x libss-1.43.3-1.fc25.s390x libselinux-utils-2.5-13.fc25.s390x koji-1.11.0-1.fc25.noarch python3-enchant-1.6.8-1.fc25.noarch python2-dockerfile-parse-0.0.5-7.fc25.noarch systemd-bootchart-231-2.fc25.s390x gcc-objc-6.3.1-1.fc25.s390x e2fsprogs-1.43.3-1.fc25.s390x libstdc++-static-6.3.1-1.fc25.s390x libpng-devel-1.6.27-1.fc25.s390x perl-XML-Parser-2.44-5.fc25.s390x lttng-ust-2.8.1-2.fc25.s390x libXfixes-devel-5.0.3-1.fc25.s390x libXcomposite-devel-0.4.4-8.fc24.s390x quota-nls-4.03-7.fc25.noarch python3-javapackages-4.7.0-6.1.fc25.noarch libcephfs_jni-devel-10.2.4-2.fc25.s390x keyutils-libs-devel-1.5.9-8.fc24.s390x libicu-devel-57.1-4.fc25.s390x harfbuzz-devel-1.3.2-1.fc25.s390x libidn-devel-1.33-1.fc25.s390x libnfs-1.9.8-2.fc24.s390x libssh2-devel-1.8.0-1.fc25.s390x qemu-sanity-check-nodeps-1.1.5-5.fc24.s390x alsa-lib-devel-1.1.1-2.fc25.s390x libnl3-3.2.29-2.fc25.s390x kernel-modules-4.9.5-200.fc25.s390x libpsl-0.17.0-1.fc25.s390x lua-libs-5.3.4-1.fc25.s390x libseccomp-2.3.2-1.fc25.s390x nss-softokn-freebl-devel-3.29.3-1.0.fc25.s390x copy-jdk-configs-2.2-2.fc25.noarch json-glib-1.2.6-1.fc25.s390x python2-dnf-1.1.10-6.fc25.noarch bind-libs-lite-9.10.4-4.P6.fc25.s390x perl-IO-1.36-385.fc25.s390x python2-GitPython-2.1.3-1.fc25.noarch linux-firmware-20170313-72.git695f2d6d.fc25.noarch systemd-container-231-14.fc25.s390x gnutls-dane-3.5.10-1.fc25.s390x texlive-tetex-bin-svn36770.0-33.20160520.fc25.1.noarch texlive-amsfonts-svn29208.3.04-33.fc25.1.noarch texlive-babel-svn40706-33.fc25.1.noarch texlive-colortbl-svn29803.v1.0a-33.fc25.1.noarch texlive-babelbib-svn25245.1.31-33.fc25.1.noarch texlive-footmisc-svn23330.5.5b-33.fc25.1.noarch texlive-makeindex-svn40768-33.fc25.1.noarch texlive-plain-svn40274-33.fc25.1.noarch texlive-texconfig-bin-svn29741.0-33.20160520.fc25.1.noarch texlive-zapfding-svn31835.0-33.fc25.1.noarch texlive-microtype-svn41127-33.fc25.1.noarch texlive-bookman-svn31835.0-33.fc25.1.noarch texlive-dvisvgm-def-svn41011-33.fc25.1.noarch texlive-finstrut-svn21719.0.5-33.fc25.1.noarch texlive-hyph-utf8-svn41189-33.fc25.1.noarch texlive-lualibs-svn40370-33.fc25.1.noarch glusterfs-3.10.1-1.fc25.s390x mesa-libglapi-13.0.4-3.fc25.s390x mesa-libgbm-13.0.4-3.fc25.s390x kernel-modules-4.10.8-200.fc25.s390x glusterfs-fuse-3.10.1-1.fc25.s390x openldap-2.4.44-10.fc25.s390x pcre-utf32-8.40-6.fc25.s390x git-2.9.3-3.fc25.s390x python2-gluster-3.10.1-1.fc25.s390x glusterfs-devel-3.10.1-1.fc25.s390x mesa-libEGL-devel-13.0.4-3.fc25.s390x glusterfs-api-devel-3.10.1-1.fc25.s390x sudo-1.8.19p2-1.fc25.s390x python2-hawkey-0.6.4-3.fc25.s390x texlive-mparhack-svn15878.1.4-33.fc25.1.noarch texlive-pspicture-svn15878.0-33.fc25.1.noarch texlive-soul-svn15878.2.4-33.fc25.1.noarch texlive-trimspaces-svn15878.1.1-33.fc25.1.noarch texlive-varwidth-svn24104.0.92-33.fc25.1.noarch texlive-geometry-svn19716.5.6-33.fc25.1.noarch texlive-memoir-svn41203-33.fc25.1.noarch texlive-pgf-svn40966-33.fc25.1.noarch texlive-pst-coil-svn37377.1.07-33.fc25.1.noarch texlive-pst-plot-svn41242-33.fc25.1.noarch texlive-latex-bin-svn41438-33.fc25.1.noarch texlive-ucs-svn35853.2.2-33.fc25.1.noarch texlive-ae-svn15878.1.4-33.fc25.1.noarch texlive-xetex-bin-svn41091-33.20160520.fc25.1.s390x fedora-upgrade-26.1-1.fc25.noarch fedpkg-1.28-1.fc25.noarch perl-Thread-Queue-3.12-1.fc25.noarch gstreamer1-plugins-base-1.10.4-1.fc25.s390x screen-4.5.1-1.fc25.s390x strace-4.16-1.fc25.s390x fedora-repos-25-3.noarch libacl-2.2.52-11.fc24.s390x cdparanoia-libs-10.2-21.fc24.s390x ustr-1.0.4-21.fc24.s390x libusb-0.1.5-7.fc24.s390x readline-devel-6.3-8.fc24.s390x chkconfig-1.8-1.fc25.s390x avahi-libs-0.6.32-4.fc25.s390x perl-Unicode-Normalize-1.25-365.fc25.s390x perl-libnet-3.10-1.fc25.noarch perl-podlators-4.09-1.fc25.noarch graphite2-1.3.6-1.fc25.s390x dbus-python-1.2.4-2.fc25.s390x libgnome-keyring-3.12.0-7.fc25.s390x python-backports-1.0-8.fc25.s390x python-pycparser-2.14-7.fc25.noarch plymouth-scripts-0.9.3-0.6.20160620git0e65b86c.fc25.s390x cronie-1.5.1-2.fc25.s390x python2-librepo-1.7.18-3.fc25.s390x libXv-1.0.11-1.fc25.s390x python2-ndg_httpsclient-0.4.0-4.fc25.noarch btrfs-progs-4.6.1-1.fc25.s390x libgcc-6.3.1-1.fc25.s390x libgomp-6.3.1-1.fc25.s390x perl-Encode-2.88-5.fc25.s390x cracklib-2.9.6-4.fc25.s390x libobjc-6.3.1-1.fc25.s390x gcc-6.3.1-1.fc25.s390x python3-dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch NetworkManager-1.4.4-3.fc25.s390x glibc-static-2.24-4.fc25.s390x boost-random-1.60.0-10.fc25.s390x libref_array-0.1.5-29.fc25.s390x libXrender-devel-0.9.10-1.fc25.s390x javapackages-tools-4.7.0-6.1.fc25.noarch keyutils-1.5.9-8.fc24.s390x libcom_err-devel-1.43.3-1.fc25.s390x graphite2-devel-1.3.6-1.fc25.s390x lzo-minilzo-2.08-8.fc24.s390x libusbx-devel-1.0.21-1.fc25.s390x virglrenderer-devel-0.5.0-1.20160411git61846f92f.fc25.s390x acpica-tools-20160831-1.fc25.s390x grep-2.27-2.fc25.s390x dnf-conf-1.1.10-6.fc25.noarch crypto-policies-20160921-4.gitf3018dd.fc25.noarch rpm-build-libs-4.13.0.1-1.fc25.s390x libnfsidmap-0.27-1.fc25.s390x systemtap-devel-3.1-2.fc25.s390x systemd-231-14.fc25.s390x SDL2-2.0.5-3.fc25.s390x texlive-etex-pkg-svn39355-33.fc25.1.noarch texlive-multido-svn18302.1.42-33.fc25.1.noarch texlive-gsftopk-svn40768-33.fc25.1.noarch texlive-pst-ovl-svn40873-33.fc25.1.noarch texlive-ltabptch-svn17533.1.74d-33.fc25.1.noarch texlive-cite-svn36428.5.5-33.fc25.1.noarch texlive-fpl-svn15878.1.002-33.fc25.1.noarch texlive-mathpazo-svn15878.1.003-33.fc25.1.noarch texlive-rcs-svn15878.0-33.fc25.1.noarch texlive-type1cm-svn21820.0-33.fc25.1.noarch texlive-l3kernel-svn41246-33.fc25.1.noarch texlive-hyperref-svn41396-33.fc25.1.noarch texlive-pst-tree-svn24142.1.12-33.fc25.1.noarch texlive-sansmathaccent-svn30187.0-33.fc25.1.noarch texlive-dvipdfmx-bin-svn40273-33.20160520.fc25.1.s390x texlive-zapfchan-svn31835.0-33.fc25.1.noarch firewalld-0.4.4.4-1.fc25.noarch glib2-static-2.50.3-1.fc25.s390x libmicrohttpd-0.9.52-3.fc25.s390x perl-open-1.10-385.fc25.noarch bash-completion-2.5-1.fc25.noarch libsolv-0.6.26-3.fc25.s390x ghostscript-core-9.20-7.fc25.s390x nss-util-devel-3.29.3-1.1.fc25.s390x kernel-headers-4.10.8-200.fc25.s390x system-python-3.5.3-4.fc25.s390x iproute-tc-4.10.0-1.fc25.s390x audit-2.7.4-1.fc25.s390x gpg-pubkey-a29cb19c-53bcbba6 m4-1.4.17-9.fc24.s390x liblockfile-1.09-4.fc24.s390x sg3_utils-1.41-3.fc24.s390x libXinerama-1.1.3-6.fc24.s390x libXft-2.3.2-4.fc24.s390x tcp_wrappers-libs-7.6-83.fc25.s390x perl-Text-Tabs+Wrap-2013.0523-365.fc25.noarch perl-Error-0.17024-7.fc25.noarch perl-Term-Cap-1.17-365.fc25.noarch perl-Pod-Usage-1.69-1.fc25.noarch device-mapper-persistent-data-0.6.3-1.fc25.s390x net-snmp-libs-5.7.3-13.fc25.s390x libgusb-0.2.9-1.fc25.s390x python3-six-1.10.0-3.fc25.noarch python3-pysocks-1.5.6-5.fc25.noarch python-chardet-2.3.0-1.fc25.noarch python2-cffi-1.7.0-2.fc25.s390x gc-devel-7.4.4-1.fc25.s390x plymouth-0.9.3-0.6.20160620git0e65b86c.fc25.s390x ebtables-2.0.10-21.fc25.s390x python3-librepo-1.7.18-3.fc25.s390x net-snmp-5.7.3-13.fc25.s390x at-spi2-atk-2.22.0-1.fc25.s390x avahi-autoipd-0.6.32-4.fc25.s390x libcrypt-nss-2.24-4.fc25.s390x libgo-6.3.1-1.fc25.s390x cpp-6.3.1-1.fc25.s390x glibc-devel-2.24-4.fc25.s390x emacs-25.1-3.fc25.s390x pyparsing-2.1.10-1.fc25.noarch libproxy-0.4.14-1.fc25.s390x python3-pyparsing-2.1.10-1.fc25.noarch libcollection-0.7.0-29.fc25.s390x libcephfs-devel-10.2.4-2.fc25.s390x libXdamage-devel-1.1.4-8.fc24.s390x libverto-devel-0.2.6-6.fc24.s390x snappy-1.1.3-2.fc24.s390x cairo-gobject-devel-1.14.8-1.fc25.s390x cyrus-sasl-devel-2.1.26-26.2.fc24.s390x kernel-devel-4.9.5-200.fc25.s390x libXi-1.7.9-1.fc25.s390x distribution-gpg-keys-1.11-1.fc25.noarch texlive-base-2016-33.20160520.fc25.noarch gstreamer1-1.10.4-1.fc25.s390x python3-rpm-4.13.0.1-1.fc25.s390x systemtap-runtime-3.1-2.fc25.s390x perl-SelfLoader-1.23-385.fc25.noarch bind99-license-9.9.9-4.P6.fc25.noarch texlive-booktabs-svn40846-33.fc25.1.noarch texlive-lm-svn28119.2.004-33.fc25.1.noarch texlive-gsftopk-bin-svn40473-33.20160520.fc25.1.s390x texlive-tex-svn40793-33.fc25.1.noarch texlive-fancyref-svn15878.0.9c-33.fc25.1.noarch texlive-chngcntr-svn17157.1.0a-33.fc25.1.noarch texlive-fix2col-svn38770-33.fc25.1.noarch texlive-marginnote-svn41382-33.fc25.1.noarch texlive-pxfonts-svn15878.0-33.fc25.1.noarch texlive-txfonts-svn15878.0-33.fc25.1.noarch texlive-l3packages-svn41246-33.fc25.1.noarch texlive-oberdiek-svn41346-33.fc25.1.noarch texlive-pst-tools-svn34067.0.05-33.fc25.1.noarch texlive-tex-gyre-svn18651.2.004-33.fc25.1.noarch texlive-dvipdfmx-svn41149-33.fc25.1.noarch texlive-collection-fontsrecommended-svn35830.0-33.20160520.fc25.1.noarch gnutls-devel-3.5.10-1.fc25.s390x libcacard-devel-2.5.3-1.fc25.s390x selinux-policy-targeted-3.13.1-225.11.fc25.noarch ykpers-1.18.0-2.fc25.s390x python2-idna-2.5-1.fc25.noarch dbus-libs-1.11.12-1.fc25.s390x ghostscript-x11-9.20-7.fc25.s390x vim-minimal-8.0.514-1.fc25.s390x libdrm-devel-2.4.77-1.fc25.s390x file-libs-5.29-4.fc25.s390x gtk3-devel-3.22.11-1.fc25.s390x policycoreutils-2.5-20.fc25.s390x python-async-0.6.1-9.fc22.s390x dejavu-sans-mono-fonts-2.35-3.fc24.noarch popt-1.16-7.fc24.s390x cyrus-sasl-lib-2.1.26-26.2.fc24.s390x xz-5.2.2-2.fc24.s390x libpipeline-1.4.1-2.fc24.s390x pinentry-0.9.7-2.fc24.s390x pth-2.0.7-27.fc24.s390x libsepol-2.5-10.fc25.s390x sqlite-libs-3.14.2-1.fc25.s390x libxcb-1.12-1.fc25.s390x libicu-57.1-4.fc25.s390x perl-Getopt-Long-2.49.1-1.fc25.noarch avahi-glib-0.6.32-4.fc25.s390x python3-pip-8.1.2-2.fc25.noarch python3-libcomps-0.1.7-5.fc25.s390x python-slip-0.6.4-4.fc25.noarch python2-libcomps-0.1.7-5.fc25.s390x gc-7.4.4-1.fc25.s390x s390utils-cmsfs-1.36.0-1.fc25.s390x newt-python-0.52.19-2.fc25.s390x valgrind-3.12.0-1.fc25.s390x emacs-filesystem-25.1-3.fc25.noarch libdb-utils-5.3.28-16.fc25.s390x qt5-srpm-macros-5.7.1-1.fc25.noarch elfutils-default-yama-scope-0.168-1.fc25.noarch device-mapper-event-1.02.136-3.fc25.s390x perl-Class-Inspector-1.31-2.fc25.noarch poppler-0.45.0-2.fc25.s390x libbasicobjects-0.1.1-29.fc25.s390x libradosstriper1-10.2.4-2.fc25.s390x libXxf86vm-devel-1.1.4-3.fc24.s390x gsm-1.0.16-1.fc25.s390x zziplib-0.13.62-7.fc24.s390x libpaper-1.1.24-12.fc24.s390x libini_config-1.3.0-29.fc25.s390x snappy-devel-1.1.3-2.fc24.s390x libcap-ng-devel-0.7.8-1.fc25.s390x libxkbcommon-devel-0.7.1-1.fc25.s390x kernel-4.9.5-200.fc25.s390x nss-softokn-3.29.3-1.0.fc25.s390x openssl-libs-1.0.2k-1.fc25.s390x libkadm5-1.14.4-7.fc25.s390x rpm-libs-4.13.0.1-1.fc25.s390x perl-5.24.1-385.fc25.s390x util-linux-2.28.2-2.fc25.s390x libICE-1.0.9-8.fc25.s390x texlive-etoolbox-svn38031.2.2a-33.fc25.1.noarch texlive-dvips-svn41149-33.fc25.1.noarch texlive-latexconfig-svn40274-33.fc25.1.noarch texlive-tex-ini-files-svn40533-33.fc25.1.noarch texlive-qstest-svn15878.0-33.fc25.1.noarch texlive-cmap-svn41168-33.fc25.1.noarch texlive-luatex-bin-svn41091-33.20160520.fc25.1.s390x texlive-mflogo-svn38628-33.fc25.1.noarch texlive-sansmath-svn17997.1.1-33.fc25.1.noarch texlive-unicode-data-svn39808-33.fc25.1.noarch texlive-luaotfload-bin-svn34647.0-33.20160520.fc25.1.noarch texlive-listings-svn37534.1.6-33.fc25.1.noarch texlive-pstricks-svn41321-33.fc25.1.noarch texlive-metalogo-svn18611.0.12-33.fc25.1.noarch texlive-collection-latex-svn41011-33.20160520.fc25.1.noarch kernel-4.10.5-200.fc25.s390x python2-dnf-plugins-core-0.1.21-5.fc25.noarch xkeyboard-config-2.20-2.fc25.noarch nss-util-3.29.3-1.1.fc25.s390x dbus-1.11.12-1.fc25.s390x ghostscript-9.20-7.fc25.s390x vim-filesystem-8.0.514-1.fc25.s390x jasper-libs-1.900.13-3.fc25.s390x file-5.29-4.fc25.s390x curl-7.51.0-6.fc25.s390x perl-Test-Harness-3.39-1.fc25.noarch libattr-2.4.47-16.fc24.s390x acl-2.2.52-11.fc24.s390x libvisual-0.4.0-20.fc24.s390x libpcap-1.7.4-2.fc24.s390x libutempter-1.1.6-8.fc24.s390x libgudev-230-3.fc24.s390x popt-devel-1.16-7.fc24.s390x make-4.1-5.fc24.s390x hicolor-icon-theme-0.15-3.fc24.noarch setup-2.10.4-1.fc25.noarch bash-4.3.43-4.fc25.s390x nspr-4.13.1-1.fc25.s390x libjpeg-turbo-1.5.1-0.fc25.s390x perl-Socket-2.024-1.fc25.s390x perl-HTTP-Tiny-0.070-1.fc25.noarch ipset-6.29-1.fc25.s390x python2-setuptools-25.1.1-1.fc25.noarch gsettings-desktop-schemas-3.22.0-1.fc25.s390x python3-setuptools-25.1.1-1.fc25.noarch python-slip-dbus-0.6.4-4.fc25.noarch python2-ply-3.8-2.fc25.noarch dtc-1.4.2-1.fc25.s390x guile-2.0.13-1.fc25.s390x cronie-anacron-1.5.1-2.fc25.s390x libXtst-1.2.3-1.fc25.s390x iso-codes-3.70-1.fc25.noarch s390utils-1.36.0-1.fc25.s390x python-backports-ssl_match_hostname-3.5.0.1-3.fc25.noarch fedora-cert-0.6.0.1-1.fc25.noarch libstdc++-6.3.1-1.fc25.s390x subversion-libs-1.9.5-1.fc25.s390x libgfortran-6.3.1-1.fc25.s390x libtasn1-4.10-1.fc25.s390x dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch lvm2-2.02.167-3.fc25.s390x libselinux-devel-2.5-13.fc25.s390x perl-Time-Local-1.250-1.fc25.noarch libtirpc-1.0.1-3.rc3.fc25.s390x libradosstriper-devel-10.2.4-2.fc25.s390x flac-libs-1.3.2-1.fc25.s390x perl-Digest-1.17-366.fc25.noarch teckit-2.5.1-15.fc24.s390x libpath_utils-0.2.1-29.fc25.s390x attr-2.4.47-16.fc24.s390x usbredir-0.7.1-2.fc24.s390x cairo-devel-1.14.8-1.fc25.s390x lzo-devel-2.08-8.fc24.s390x libcap-devel-2.25-2.fc25.s390x opus-1.1.3-2.fc25.s390x firewalld-filesystem-0.4.4.4-1.fc25.noarch coreutils-8.25-16.fc25.s390x krb5-devel-1.14.4-7.fc25.s390x rpm-4.13.0.1-1.fc25.s390x kernel-devel-4.10.5-200.fc25.s390x systemd-pam-231-14.fc25.s390x libbsd-0.8.3-1.fc25.s390x texlive-url-svn32528.3.4-33.fc25.1.noarch texlive-dvips-bin-svn40987-33.20160520.fc25.1.s390x texlive-index-svn24099.4.1beta-33.fc25.1.noarch texlive-setspace-svn24881.6.7a-33.fc25.1.noarch texlive-mathtools-svn38833-33.fc25.1.noarch texlive-cm-svn32865.0-33.fc25.1.noarch texlive-graphics-def-svn41879-33.fc25.1.noarch texlive-mdwtools-svn15878.1.05.4-33.fc25.1.noarch texlive-rsfs-svn15878.0-33.fc25.1.noarch texlive-ucharcat-svn38907-33.fc25.1.noarch texlive-fontspec-svn41262-33.fc25.1.noarch texlive-showexpl-svn32737.v0.3l-33.fc25.1.noarch texlive-pstricks-add-svn40744-33.fc25.1.noarch texlive-beamer-svn36461.3.36-33.fc25.1.noarch texlive-collection-basic-svn41149-33.20160520.fc25.1.noarch mock-1.3.4-1.fc25.noarch rpm-build-4.13.0.1-1.fc25.s390x xemacs-filesystem-21.5.34-20.20170124hgf412e9f093d4.fc25.noarch nss-sysinit-3.29.3-1.1.fc25.s390x hawkey-0.6.4-3.fc25.s390x mesa-libGLES-13.0.4-3.fc25.s390x vim-common-8.0.514-1.fc25.s390x gdk-pixbuf2-modules-2.36.6-1.fc25.s390x bluez-libs-5.44-1.fc25.s390x libcurl-devel-7.51.0-6.fc25.s390x mc-4.8.19-1.fc25.s390x gpg-pubkey-a0a7badb-52844296 readline-6.3-8.fc24.s390x cpio-2.12-3.fc24.s390x qrencode-libs-3.4.2-6.fc24.s390x libXcomposite-0.4.4-8.fc24.s390x procps-ng-3.3.10-11.fc24.s390x GConf2-3.2.6-16.fc24.s390x xz-devel-5.2.2-2.fc24.s390x fedora-logos-22.0.0-3.fc24.s390x gpg-pubkey-e372e838-56fd7943 kmod-libs-23-1.fc25.s390x perl-parent-0.236-1.fc25.noarch perl-TermReadKey-2.37-1.fc25.s390x dhcp-libs-4.3.5-1.fc25.s390x ncurses-c++-libs-6.0-6.20160709.fc25.s390x gzip-1.8-1.fc25.s390x python3-gobject-base-3.22.0-1.fc25.s390x python2-yubico-1.3.2-3.fc25.noarch s390utils-ziomon-1.36.0-1.fc25.s390x librepo-1.7.18-3.fc25.s390x librsvg2-2.40.16-2.fc25.s390x gnat-srpm-macros-4-1.fc25.noarch python-decoratortools-1.8-12.fc25.noarch m17n-db-1.7.0-7.fc25.noarch glibc-common-2.24-4.fc25.s390x e2fsprogs-libs-1.43.3-1.fc25.s390x libvorbis-1.3.5-1.fc25.s390x gcc-gdb-plugin-6.3.1-1.fc25.s390x perl-Time-HiRes-1.9741-1.fc25.s390x npth-1.3-1.fc25.s390x libcephfs1-10.2.4-2.fc25.s390x wayland-devel-1.12.0-1.fc25.s390x libxcb-devel-1.12-1.fc25.s390x perl-encoding-2.19-5.fc25.s390x python3-cssselect-0.9.2-1.fc25.noarch gettext-libs-0.19.8.1-3.fc25.s390x at-spi2-atk-devel-2.22.0-1.fc25.s390x virglrenderer-0.5.0-1.20160411git61846f92f.fc25.s390x pixman-devel-0.34.0-2.fc24.s390x libnfs-devel-1.9.8-2.fc24.s390x libX11-common-1.6.4-4.fc25.noarch nss-softokn-devel-3.29.3-1.0.fc25.s390x libblkid-2.28.2-2.fc25.s390x bind-libs-9.10.4-4.P6.fc25.s390x glib2-devel-2.50.3-1.fc25.s390x systemd-udev-231-14.fc25.s390x texlive-ifxetex-svn19685.0.5-33.fc25.1.noarch texlive-caption-svn41409-33.fc25.1.noarch texlive-float-svn15878.1.3d-33.fc25.1.noarch texlive-pdftex-def-svn22653.0.06d-33.fc25.1.noarch texlive-xdvi-bin-svn40750-33.20160520.fc25.1.s390x texlive-beton-svn15878.0-33.fc25.1.noarch texlive-filecontents-svn24250.1.3-33.fc25.1.noarch texlive-lm-math-svn36915.1.959-33.fc25.1.noarch texlive-pslatex-svn16416.0-33.fc25.1.noarch texlive-times-svn35058.0-33.fc25.1.noarch texlive-breakurl-svn29901.1.40-33.fc25.1.noarch texlive-filehook-svn24280.0.5d-33.fc25.1.noarch texlive-pst-pdf-svn31660.1.1v-33.fc25.1.noarch texlive-seminar-svn34011.1.62-33.fc25.1.noarch texlive-xetexconfig-svn41133-33.fc25.1.noarch systemtap-3.1-2.fc25.s390x python-rpm-macros-3-12.fc25.noarch rpm-devel-4.13.0.1-1.fc25.s390x nss-pem-1.0.3-3.fc25.s390x mesa-libGL-13.0.4-3.fc25.s390x at-spi2-core-2.22.1-1.fc25.s390x pcre2-utf32-10.23-5.fc25.s390x gtk3-3.22.11-1.fc25.s390x GeoIP-GeoLite-data-2017.04-1.fc25.noarch pcre-static-8.40-6.fc25.s390x kernel-devel-4.10.8-200.fc25.s390x === TEST BEGIN === Using CC: /home/fam/bin/cc Install prefix /var/tmp/patchew-tester-tmp-akl3dh_3/src/install BIOS directory /var/tmp/patchew-tester-tmp-akl3dh_3/src/install/share/qemu binary directory /var/tmp/patchew-tester-tmp-akl3dh_3/src/install/bin library directory /var/tmp/patchew-tester-tmp-akl3dh_3/src/install/lib module directory /var/tmp/patchew-tester-tmp-akl3dh_3/src/install/lib/qemu libexec directory /var/tmp/patchew-tester-tmp-akl3dh_3/src/install/libexec include directory /var/tmp/patchew-tester-tmp-akl3dh_3/src/install/include config directory /var/tmp/patchew-tester-tmp-akl3dh_3/src/install/etc local state directory /var/tmp/patchew-tester-tmp-akl3dh_3/src/install/var Manual directory /var/tmp/patchew-tester-tmp-akl3dh_3/src/install/share/man ELF interp prefix /usr/gnemul/qemu-%M Source path /var/tmp/patchew-tester-tmp-akl3dh_3/src C compiler /home/fam/bin/cc Host C compiler cc C++ compiler c++ Objective-C compiler /home/fam/bin/cc ARFLAGS rv CFLAGS -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g QEMU_CFLAGS -I/usr/include/pixman-1 -Werror -DHAS_LIBSSH2_SFTP_FSYNC -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -DNCURSES_WIDECHAR -D_GNU_SOURCE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wendif-labels -Wno-shift-negative-value -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -I/usr/include/p11-kit-1 -I/usr/include/libpng16 -I/usr/include/libdrm -I/usr/include/cacard -I/usr/include/nss3 -I/usr/include/nspr4 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/libusb-1.0 LDFLAGS -Wl,--warn-common -m64 -g make make install install python python -B smbd /usr/sbin/smbd module support no host CPU s390x host big endian yes target list aarch64-softmmu alpha-softmmu arm-softmmu cris-softmmu i386-softmmu lm32-softmmu m68k-softmmu microblazeel-softmmu microblaze-softmmu mips64el-softmmu mips64-softmmu mipsel-softmmu mips-softmmu moxie-softmmu nios2-softmmu or1k-softmmu ppc64-softmmu ppcemb-softmmu ppc-softmmu s390x-softmmu sh4eb-softmmu sh4-softmmu sparc64-softmmu sparc-softmmu tricore-softmmu unicore32-softmmu x86_64-softmmu xtensaeb-softmmu xtensa-softmmu aarch64-linux-user alpha-linux-user armeb-linux-user arm-linux-user cris-linux-user hppa-linux-user i386-linux-user m68k-linux-user microblazeel-linux-user microblaze-linux-user mips64el-linux-user mips64-linux-user mipsel-linux-user mips-linux-user mipsn32el-linux-user mipsn32-linux-user nios2-linux-user or1k-linux-user ppc64abi32-linux-user ppc64le-linux-user ppc64-linux-user ppc-linux-user s390x-linux-user sh4eb-linux-user sh4-linux-user sparc32plus-linux-user sparc64-linux-user sparc-linux-user tilegx-linux-user x86_64-linux-user gprof enabled no sparse enabled no strip binaries yes profiler no static build no pixman system SDL support yes (2.0.5) GTK support yes (3.22.11) GTK GL support yes VTE support yes (0.46.1) TLS priority NORMAL GNUTLS support yes GNUTLS rnd yes libgcrypt no libgcrypt kdf no nettle yes (3.3) nettle kdf yes libtasn1 yes curses support yes virgl support yes curl support yes mingw32 support no Audio drivers oss Block whitelist (rw) Block whitelist (ro) VirtFS support yes VNC support yes VNC SASL support yes VNC JPEG support yes VNC PNG support yes xen support no brlapi support yes bluez support yes Documentation yes PIE no vde support no netmap support no Linux AIO support yes ATTR/XATTR support yes Install blobs yes KVM support yes HAX support no TCG support yes TCG debug enabled no TCG interpreter no RDMA support no fdt support yes preadv support yes fdatasync yes madvise yes posix_madvise yes libcap-ng support yes vhost-net support yes vhost-scsi support yes vhost-vsock support yes Trace backends log spice support no rbd support yes xfsctl support no smartcard support yes libusb yes usb net redir yes OpenGL support yes OpenGL dmabufs yes libiscsi support yes libnfs support yes build guest agent yes QGA VSS support no QGA w32 disk info no QGA MSI support no seccomp support no coroutine backend ucontext coroutine pool yes debug stack usage no GlusterFS support yes gcov gcov gcov enabled no TPM support yes libssh2 support yes TPM passthrough no QOM debugging yes Live block migration yes lzo support yes snappy support yes bzip2 support yes NUMA host support no tcmalloc support no jemalloc support no avx2 optimization no replication support yes VxHS block device no GEN aarch64-softmmu/config-devices.mak.tmp GEN alpha-softmmu/config-devices.mak.tmp GEN arm-softmmu/config-devices.mak.tmp GEN cris-softmmu/config-devices.mak.tmp GEN cris-softmmu/config-devices.mak GEN i386-softmmu/config-devices.mak.tmp GEN alpha-softmmu/config-devices.mak GEN lm32-softmmu/config-devices.mak.tmp GEN arm-softmmu/config-devices.mak GEN aarch64-softmmu/config-devices.mak GEN m68k-softmmu/config-devices.mak.tmp GEN microblazeel-softmmu/config-devices.mak.tmp GEN lm32-softmmu/config-devices.mak GEN i386-softmmu/config-devices.mak GEN microblaze-softmmu/config-devices.mak.tmp GEN m68k-softmmu/config-devices.mak GEN mips64el-softmmu/config-devices.mak.tmp GEN mips64-softmmu/config-devices.mak.tmp GEN microblazeel-softmmu/config-devices.mak GEN mipsel-softmmu/config-devices.mak.tmp GEN microblaze-softmmu/config-devices.mak GEN mips-softmmu/config-devices.mak.tmp GEN mips64el-softmmu/config-devices.mak GEN mips64-softmmu/config-devices.mak GEN moxie-softmmu/config-devices.mak.tmp GEN mipsel-softmmu/config-devices.mak GEN nios2-softmmu/config-devices.mak.tmp GEN or1k-softmmu/config-devices.mak.tmp GEN mips-softmmu/config-devices.mak GEN nios2-softmmu/config-devices.mak GEN ppcemb-softmmu/config-devices.mak.tmp GEN ppc64-softmmu/config-devices.mak.tmp GEN or1k-softmmu/config-devices.mak GEN moxie-softmmu/config-devices.mak GEN ppc-softmmu/config-devices.mak.tmp GEN s390x-softmmu/config-devices.mak.tmp GEN s390x-softmmu/config-devices.mak GEN ppcemb-softmmu/config-devices.mak GEN ppc64-softmmu/config-devices.mak GEN sh4eb-softmmu/config-devices.mak.tmp GEN sparc64-softmmu/config-devices.mak.tmp GEN sh4-softmmu/config-devices.mak.tmp GEN ppc-softmmu/config-devices.mak GEN sparc-softmmu/config-devices.mak.tmp GEN sh4-softmmu/config-devices.mak GEN sh4eb-softmmu/config-devices.mak GEN sparc-softmmu/config-devices.mak GEN tricore-softmmu/config-devices.mak.tmp GEN unicore32-softmmu/config-devices.mak.tmp GEN x86_64-softmmu/config-devices.mak.tmp GEN sparc64-softmmu/config-devices.mak GEN tricore-softmmu/config-devices.mak GEN unicore32-softmmu/config-devices.mak GEN xtensaeb-softmmu/config-devices.mak.tmp GEN xtensa-softmmu/config-devices.mak.tmp GEN aarch64-linux-user/config-devices.mak.tmp GEN x86_64-softmmu/config-devices.mak GEN xtensaeb-softmmu/config-devices.mak GEN xtensa-softmmu/config-devices.mak GEN armeb-linux-user/config-devices.mak.tmp GEN alpha-linux-user/config-devices.mak.tmp GEN aarch64-linux-user/config-devices.mak GEN arm-linux-user/config-devices.mak.tmp GEN cris-linux-user/config-devices.mak.tmp GEN armeb-linux-user/config-devices.mak GEN alpha-linux-user/config-devices.mak GEN hppa-linux-user/config-devices.mak.tmp GEN arm-linux-user/config-devices.mak GEN cris-linux-user/config-devices.mak GEN i386-linux-user/config-devices.mak.tmp GEN m68k-linux-user/config-devices.mak.tmp GEN microblazeel-linux-user/config-devices.mak.tmp GEN m68k-linux-user/config-devices.mak GEN microblazeel-linux-user/config-devices.mak GEN hppa-linux-user/config-devices.mak GEN microblaze-linux-user/config-devices.mak.tmp GEN mips64el-linux-user/config-devices.mak.tmp GEN i386-linux-user/config-devices.mak GEN mips64-linux-user/config-devices.mak.tmp GEN mipsel-linux-user/config-devices.mak.tmp GEN mips64el-linux-user/config-devices.mak GEN mips64-linux-user/config-devices.mak GEN microblaze-linux-user/config-devices.mak GEN mipsn32el-linux-user/config-devices.mak.tmp GEN mips-linux-user/config-devices.mak.tmp GEN mipsn32-linux-user/config-devices.mak.tmp GEN mipsel-linux-user/config-devices.mak GEN nios2-linux-user/config-devices.mak.tmp GEN mipsn32el-linux-user/config-devices.mak GEN mips-linux-user/config-devices.mak GEN or1k-linux-user/config-devices.mak.tmp GEN mipsn32-linux-user/config-devices.mak GEN ppc64abi32-linux-user/config-devices.mak.tmp GEN nios2-linux-user/config-devices.mak GEN ppc64le-linux-user/config-devices.mak.tmp GEN ppc64-linux-user/config-devices.mak.tmp GEN or1k-linux-user/config-devices.mak GEN ppc64abi32-linux-user/config-devices.mak GEN s390x-linux-user/config-devices.mak.tmp GEN ppc-linux-user/config-devices.mak.tmp GEN ppc64le-linux-user/config-devices.mak GEN ppc64-linux-user/config-devices.mak GEN sh4eb-linux-user/config-devices.mak.tmp GEN s390x-linux-user/config-devices.mak GEN sh4-linux-user/config-devices.mak.tmp GEN ppc-linux-user/config-devices.mak GEN sh4eb-linux-user/config-devices.mak GEN sparc32plus-linux-user/config-devices.mak.tmp GEN sparc64-linux-user/config-devices.mak.tmp GEN sparc-linux-user/config-devices.mak.tmp GEN sh4-linux-user/config-devices.mak GEN tilegx-linux-user/config-devices.mak.tmp GEN sparc32plus-linux-user/config-devices.mak GEN sparc64-linux-user/config-devices.mak GEN x86_64-linux-user/config-devices.mak.tmp GEN tilegx-linux-user/config-devices.mak GEN config-host.h GEN sparc-linux-user/config-devices.mak GEN qemu-options.def GEN x86_64-linux-user/config-devices.mak GEN qmp-commands.h GEN qapi-types.h GEN qapi-visit.h GEN qapi-event.h GEN qmp-marshal.c GEN qapi-types.c GEN qapi-visit.c GEN qapi-event.c GEN qmp-introspect.h GEN qmp-introspect.c GEN trace/generated-tcg-tracers.h GEN trace/generated-helpers-wrappers.h GEN trace/generated-helpers.h GEN trace/generated-helpers.c GEN module_block.h GEN tests/test-qapi-types.h GEN tests/test-qmp-commands.h GEN tests/test-qapi-visit.h GEN tests/test-qapi-event.h GEN tests/test-qmp-introspect.h GEN trace-root.h GEN util/trace.h GEN io/trace.h GEN crypto/trace.h GEN migration/trace.h GEN block/trace.h GEN chardev/trace.h GEN hw/block/trace.h GEN hw/block/dataplane/trace.h GEN hw/char/trace.h GEN hw/intc/trace.h GEN hw/net/trace.h GEN hw/virtio/trace.h GEN hw/audio/trace.h GEN hw/usb/trace.h GEN hw/misc/trace.h GEN hw/nvram/trace.h GEN hw/scsi/trace.h GEN hw/display/trace.h GEN hw/input/trace.h GEN hw/timer/trace.h GEN hw/dma/trace.h GEN hw/sparc/trace.h GEN hw/sd/trace.h GEN hw/isa/trace.h GEN hw/mem/trace.h GEN hw/i386/trace.h GEN hw/i386/xen/trace.h GEN hw/9pfs/trace.h GEN hw/ppc/trace.h GEN hw/pci/trace.h GEN hw/s390x/trace.h GEN hw/vfio/trace.h GEN hw/acpi/trace.h GEN hw/arm/trace.h GEN hw/alpha/trace.h GEN hw/xen/trace.h GEN ui/trace.h GEN audio/trace.h GEN net/trace.h GEN target/i386/trace.h GEN target/arm/trace.h GEN target/mips/trace.h GEN target/sparc/trace.h GEN target/s390x/trace.h GEN target/ppc/trace.h GEN qom/trace.h GEN linux-user/trace.h GEN qapi/trace.h GEN accel/tcg/trace.h GEN nbd/trace.h GEN accel/kvm/trace.h GEN trace-root.c GEN util/trace.c GEN crypto/trace.c GEN io/trace.c GEN migration/trace.c GEN block/trace.c GEN chardev/trace.c GEN hw/block/dataplane/trace.c GEN hw/block/trace.c GEN hw/char/trace.c GEN hw/intc/trace.c GEN hw/net/trace.c GEN hw/audio/trace.c GEN hw/virtio/trace.c GEN hw/misc/trace.c GEN hw/usb/trace.c GEN hw/scsi/trace.c GEN hw/nvram/trace.c GEN hw/display/trace.c GEN hw/input/trace.c GEN hw/timer/trace.c GEN hw/dma/trace.c GEN hw/sparc/trace.c GEN hw/sd/trace.c GEN hw/isa/trace.c GEN hw/mem/trace.c GEN hw/i386/trace.c GEN hw/i386/xen/trace.c GEN hw/9pfs/trace.c GEN hw/ppc/trace.c GEN hw/pci/trace.c GEN hw/s390x/trace.c GEN hw/vfio/trace.c GEN hw/acpi/trace.c GEN hw/arm/trace.c GEN hw/alpha/trace.c GEN hw/xen/trace.c GEN ui/trace.c GEN audio/trace.c GEN net/trace.c GEN target/arm/trace.c GEN target/i386/trace.c GEN target/mips/trace.c GEN target/sparc/trace.c GEN target/s390x/trace.c GEN target/ppc/trace.c GEN qom/trace.c GEN linux-user/trace.c GEN qapi/trace.c GEN accel/tcg/trace.c GEN accel/kvm/trace.c GEN nbd/trace.c GEN config-all-devices.mak GEN docs/version.texi GEN qemu-options.texi GEN qemu-img-cmds.texi CC tests/qemu-iotests/socket_scm_helper.o GEN qemu-monitor.texi GEN qemu-monitor-info.texi GEN qemu-img.1 GEN qemu-nbd.8 GEN qemu-ga.8 GEN docs/interop/qemu-qmp-qapi.texi GEN docs/interop/qemu-ga-qapi.texi GEN fsdev/virtfs-proxy-helper.1 GEN qga/qapi-generated/qga-qapi-types.h GEN qga/qapi-generated/qga-qapi-visit.h GEN qga/qapi-generated/qga-qmp-commands.h GEN qga/qapi-generated/qga-qapi-types.c GEN qga/qapi-generated/qga-qapi-visit.c GEN qga/qapi-generated/qga-qmp-marshal.c CC qmp-introspect.o CC qapi-types.o CC qapi-visit.o CC qapi-event.o CC qapi/qapi-visit-core.o CC qapi/qapi-dealloc-visitor.o CC qapi/qobject-input-visitor.o CC qapi/qobject-output-visitor.o CC qapi/qmp-registry.o CC qapi/qmp-dispatch.o CC qapi/string-input-visitor.o CC qapi/string-output-visitor.o CC qapi/opts-visitor.o CC qapi/qapi-clone-visitor.o CC qapi/qapi-util.o CC qapi/qmp-event.o CC qobject/qnull.o CC qobject/qstring.o CC qobject/qnum.o CC qobject/qdict.o CC qobject/qlist.o CC qobject/qbool.o CC qobject/qjson.o CC qobject/qobject.o CC qobject/json-lexer.o CC qobject/json-streamer.o CC qobject/json-parser.o CC trace/control.o CC trace/qmp.o CC util/osdep.o CC util/cutils.o CC util/unicode.o CC util/qemu-timer-common.o CC util/bufferiszero.o CC util/lockcnt.o CC util/aiocb.o CC util/async.o CC util/qemu-timer.o CC util/thread-pool.o CC util/main-loop.o CC util/iohandler.o CC util/aio-posix.o CC util/compatfd.o CC util/event_notifier-posix.o CC util/mmap-alloc.o CC util/oslib-posix.o CC util/qemu-openpty.o CC util/qemu-thread-posix.o CC util/memfd.o CC util/envlist.o CC util/path.o CC util/module.o CC util/host-utils.o CC util/bitmap.o CC util/bitops.o CC util/hbitmap.o CC util/acl.o CC util/fifo8.o CC util/cacheinfo.o CC util/error.o CC util/qemu-error.o CC util/id.o CC util/iov.o CC util/qemu-config.o CC util/qemu-sockets.o CC util/uri.o CC util/notify.o CC util/qemu-option.o CC util/qemu-progress.o CC util/keyval.o CC util/hexdump.o CC util/crc32c.o CC util/uuid.o CC util/throttle.o CC util/getauxval.o CC util/readline.o CC util/rcu.o CC util/qemu-coroutine.o CC util/qemu-coroutine-lock.o CC util/qemu-coroutine-io.o CC util/qemu-coroutine-sleep.o CC util/buffer.o CC util/coroutine-ucontext.o CC util/timed-average.o CC util/base64.o CC util/log.o CC util/qdist.o CC util/qht.o CC util/range.o CC util/stats64.o CC util/systemd.o CC util/trace.o CC trace-root.o CC crypto/trace.o CC io/trace.o CC migration/trace.o CC block/trace.o CC chardev/trace.o CC hw/block/trace.o CC hw/block/dataplane/trace.o CC hw/char/trace.o CC hw/intc/trace.o CC hw/net/trace.o CC hw/audio/trace.o CC hw/virtio/trace.o CC hw/misc/trace.o CC hw/usb/trace.o CC hw/scsi/trace.o CC hw/nvram/trace.o CC hw/display/trace.o CC hw/input/trace.o CC hw/timer/trace.o CC hw/dma/trace.o CC hw/sparc/trace.o CC hw/sd/trace.o CC hw/isa/trace.o CC hw/mem/trace.o CC hw/i386/trace.o CC hw/i386/xen/trace.o CC hw/9pfs/trace.o CC hw/pci/trace.o CC hw/ppc/trace.o CC hw/s390x/trace.o CC hw/vfio/trace.o CC hw/acpi/trace.o CC hw/arm/trace.o CC hw/alpha/trace.o CC hw/xen/trace.o CC audio/trace.o CC ui/trace.o CC net/trace.o CC target/arm/trace.o CC target/i386/trace.o CC target/mips/trace.o CC target/sparc/trace.o CC target/s390x/trace.o CC target/ppc/trace.o CC qom/trace.o CC linux-user/trace.o CC qapi/trace.o CC accel/tcg/trace.o CC accel/kvm/trace.o CC nbd/trace.o CC crypto/pbkdf-stub.o CC stubs/arch-query-cpu-def.o CC stubs/arch-query-cpu-model-expansion.o CC stubs/arch-query-cpu-model-comparison.o CC stubs/arch-query-cpu-model-baseline.o CC stubs/bdrv-next-monitor-owned.o CC stubs/blk-commit-all.o CC stubs/blockdev-close-all-bdrv-states.o CC stubs/clock-warp.o CC stubs/cpu-get-clock.o CC stubs/cpu-get-icount.o CC stubs/dump.o CC stubs/fdset.o CC stubs/error-printf.o CC stubs/gdbstub.o CC stubs/get-vm-name.o CC stubs/iothread.o CC stubs/iothread-lock.o CC stubs/is-daemonized.o CC stubs/linux-aio.o CC stubs/machine-init-done.o CC stubs/migr-blocker.o CC stubs/monitor.o CC stubs/notify-event.o CC stubs/qtest.o CC stubs/replay.o CC stubs/runstate-check.o CC stubs/set-fd-handler.o CC stubs/slirp.o CC stubs/sysbus.o CC stubs/trace-control.o CC stubs/uuid.o CC stubs/vmstate.o CC stubs/vm-stop.o CC stubs/qmp_pc_dimm_device_list.o CC stubs/target-monitor-defs.o CC stubs/target-get-monitor-def.o CC stubs/pc_madt_cpu_entry.o CC stubs/vmgenid.o CC stubs/xen-common.o CC stubs/xen-hvm.o CC contrib/ivshmem-client/ivshmem-client.o CC contrib/ivshmem-server/ivshmem-server.o CC contrib/ivshmem-client/main.o CC contrib/ivshmem-server/main.o CC qemu-nbd.o CC block.o CC qemu-io-cmds.o CC blockjob.o CC replication.o CC block/raw-format.o CC block/qcow.o CC block/vdi.o CC block/vmdk.o CC block/cloop.o CC block/bochs.o CC block/vpc.o CC block/vvfat.o CC block/dmg.o CC block/qcow2.o CC block/qcow2-refcount.o CC block/qcow2-cluster.o CC block/qcow2-snapshot.o CC block/qcow2-bitmap.o CC block/qcow2-cache.o CC block/qed.o CC block/qed-l2-cache.o CC block/qed-table.o CC block/qed-cluster.o CC block/qed-check.o CC block/vhdx.o CC block/vhdx-endian.o CC block/vhdx-log.o CC block/quorum.o CC block/blkdebug.o CC block/parallels.o CC block/blkverify.o CC block/blkreplay.o CC block/block-backend.o CC block/snapshot.o CC block/qapi.o CC block/file-posix.o CC block/linux-aio.o CC block/null.o CC block/mirror.o CC block/commit.o CC block/io.o CC block/throttle-groups.o CC block/nbd.o CC block/nbd-client.o CC block/sheepdog.o CC block/iscsi-opts.o CC block/accounting.o CC block/dirty-bitmap.o CC block/write-threshold.o CC block/backup.o CC block/replication.o CC nbd/server.o CC block/crypto.o CC nbd/client.o CC nbd/common.o CC block/iscsi.o CC block/nfs.o CC block/curl.o CC block/rbd.o CC block/gluster.o CC block/ssh.o CC block/dmg-bz2.o CC crypto/init.o CC crypto/hash.o CC crypto/hash-nettle.o CC crypto/hmac.o CC crypto/hmac-nettle.o CC crypto/aes.o CC crypto/desrfb.o CC crypto/cipher.o CC crypto/tlscreds.o CC crypto/tlscredsanon.o CC crypto/tlscredsx509.o CC crypto/tlssession.o CC crypto/secret.o CC crypto/random-gnutls.o CC crypto/pbkdf.o CC crypto/pbkdf-nettle.o CC crypto/ivgen.o CC crypto/ivgen-essiv.o CC crypto/ivgen-plain.o CC crypto/ivgen-plain64.o CC crypto/afsplit.o CC crypto/xts.o CC crypto/block.o CC crypto/block-qcow.o CC crypto/block-luks.o CC io/channel.o CC io/channel-buffer.o CC io/channel-command.o CC io/channel-file.o CC io/channel-socket.o CC io/channel-tls.o CC io/channel-watch.o CC io/channel-websock.o CC io/channel-util.o CC io/dns-resolver.o CC qom/object.o CC io/task.o CC qom/container.o CC qom/qom-qobject.o CC qom/object_interfaces.o GEN qemu-img-cmds.h CC qemu-io.o CC fsdev/virtfs-proxy-helper.o CC fsdev/9p-marshal.o CC fsdev/9p-iov-marshal.o CC qemu-bridge-helper.o CC blockdev.o CC blockdev-nbd.o CC bootdevice.o CC iothread.o CC qdev-monitor.o CC device-hotplug.o CC os-posix.o CC bt-host.o CC bt-vhci.o CC dma-helpers.o CC vl.o CC tpm.o CC device_tree.o CC qmp-marshal.o CC qmp.o CC hmp.o CC cpus-common.o CC audio/audio.o CC audio/noaudio.o CC audio/wavaudio.o CC audio/mixeng.o CC audio/sdlaudio.o CC audio/ossaudio.o CC audio/wavcapture.o CC backends/rng.o CC backends/rng-egd.o CC backends/rng-random.o CC backends/tpm.o CC backends/hostmem.o CC backends/hostmem-ram.o CC backends/hostmem-file.o CC backends/cryptodev.o CC backends/cryptodev-builtin.o CC block/stream.o CC chardev/msmouse.o CC chardev/wctablet.o CC chardev/testdev.o CC chardev/baum.o CC disas/alpha.o CC disas/arm.o CXX disas/arm-a64.o CC disas/cris.o CC disas/hppa.o CC disas/i386.o CC disas/m68k.o CC disas/microblaze.o CC disas/mips.o CC disas/nios2.o CC disas/moxie.o CC disas/ppc.o CC disas/s390.o CC disas/sh4.o CC disas/sparc.o CC disas/lm32.o CXX disas/libvixl/vixl/utils.o CXX disas/libvixl/vixl/compiler-intrinsics.o CXX disas/libvixl/vixl/a64/instructions-a64.o CXX disas/libvixl/vixl/a64/decoder-a64.o CXX disas/libvixl/vixl/a64/disasm-a64.o CC fsdev/qemu-fsdev.o CC fsdev/qemu-fsdev-opts.o CC fsdev/qemu-fsdev-throttle.o CC fsdev/qemu-fsdev-dummy.o CC hw/9pfs/9p.o CC hw/9pfs/9p-util.o CC hw/9pfs/9p-local.o CC hw/9pfs/9p-xattr.o CC hw/9pfs/9p-xattr-user.o CC hw/9pfs/9p-posix-acl.o CC hw/9pfs/coth.o CC hw/9pfs/cofs.o CC hw/9pfs/codir.o CC hw/9pfs/cofile.o CC hw/9pfs/coxattr.o CC hw/9pfs/9p-synth.o CC hw/9pfs/9p-handle.o CC hw/9pfs/9p-proxy.o CC hw/acpi/core.o CC hw/acpi/piix4.o CC hw/acpi/pcihp.o CC hw/acpi/ich9.o CC hw/acpi/tco.o CC hw/acpi/cpu_hotplug.o CC hw/acpi/memory_hotplug.o CC hw/acpi/cpu.o CC hw/acpi/nvdimm.o CC hw/acpi/vmgenid.o CC hw/acpi/acpi_interface.o CC hw/acpi/bios-linker-loader.o CC hw/acpi/aml-build.o CC hw/acpi/ipmi.o CC hw/acpi/acpi-stub.o CC hw/acpi/ipmi-stub.o CC hw/audio/sb16.o CC hw/audio/es1370.o CC hw/audio/ac97.o CC hw/audio/fmopl.o CC hw/audio/adlib.o CC hw/audio/gus.o CC hw/audio/gusemu_hal.o CC hw/audio/gusemu_mixer.o CC hw/audio/cs4231a.o CC hw/audio/intel-hda.o CC hw/audio/hda-codec.o CC hw/audio/pcspk.o CC hw/audio/wm8750.o CC hw/audio/pl041.o CC hw/audio/lm4549.o CC hw/audio/cs4231.o CC hw/audio/marvell_88w8618.o CC hw/audio/milkymist-ac97.o CC hw/audio/soundhw.o CC hw/block/block.o CC hw/block/cdrom.o CC hw/block/hd-geometry.o CC hw/block/fdc.o CC hw/block/m25p80.o CC hw/block/nand.o CC hw/block/pflash_cfi01.o CC hw/block/pflash_cfi02.o CC hw/block/ecc.o CC hw/block/onenand.o CC hw/block/nvme.o CC hw/bt/core.o CC hw/bt/l2cap.o CC hw/bt/sdp.o CC hw/bt/hci.o CC hw/bt/hid.o CC hw/bt/hci-csr.o CC hw/char/ipoctal232.o CC hw/char/escc.o CC hw/char/parallel.o CC hw/char/pl011.o CC hw/char/serial.o CC hw/char/serial-isa.o CC hw/char/serial-pci.o CC hw/char/virtio-console.o CC hw/char/xilinx_uartlite.o CC hw/char/cadence_uart.o CC hw/char/etraxfs_ser.o CC hw/char/debugcon.o CC hw/char/grlib_apbuart.o CC hw/char/imx_serial.o CC hw/char/lm32_juart.o CC hw/char/lm32_uart.o CC hw/char/milkymist-uart.o CC hw/char/sclpconsole.o CC hw/char/sclpconsole-lm.o CC hw/core/qdev.o CC hw/core/qdev-properties.o CC hw/core/bus.o CC hw/core/reset.o CC hw/core/fw-path-provider.o CC hw/core/irq.o CC hw/core/hotplug.o CC hw/core/nmi.o CC hw/core/stream.o CC hw/core/empty_slot.o CC hw/core/ptimer.o CC hw/core/sysbus.o CC hw/core/machine.o CC hw/core/loader.o CC hw/core/loader-fit.o CC hw/core/qdev-properties-system.o CC hw/core/register.o CC hw/core/or-irq.o CC hw/core/platform-bus.o CC hw/cpu/core.o CC hw/display/ads7846.o CC hw/display/cirrus_vga.o CC hw/display/g364fb.o CC hw/display/jazz_led.o CC hw/display/pl110.o CC hw/display/ssd0303.o CC hw/display/ssd0323.o CC hw/display/vga-pci.o CC hw/display/vga-isa.o CC hw/display/vga-isa-mm.o CC hw/display/vmware_vga.o CC hw/display/blizzard.o CC hw/display/exynos4210_fimd.o CC hw/display/framebuffer.o CC hw/display/milkymist-vgafb.o CC hw/display/tc6393xb.o CC hw/display/milkymist-tmu2.o CC hw/dma/puv3_dma.o CC hw/dma/rc4030.o CC hw/dma/pl080.o CC hw/dma/pl330.o CC hw/dma/i82374.o CC hw/dma/i8257.o CC hw/dma/xilinx_axidma.o CC hw/dma/etraxfs_dma.o CC hw/dma/xlnx-zynq-devcfg.o CC hw/dma/sparc32_dma.o CC hw/dma/sun4m_iommu.o CC hw/gpio/max7310.o CC hw/gpio/pl061.o CC hw/gpio/puv3_gpio.o CC hw/gpio/zaurus.o CC hw/gpio/mpc8xxx.o CC hw/gpio/gpio_key.o CC hw/i2c/core.o CC hw/i2c/smbus.o CC hw/i2c/smbus_eeprom.o CC hw/i2c/i2c-ddc.o CC hw/i2c/versatile_i2c.o CC hw/i2c/smbus_ich9.o CC hw/i2c/pm_smbus.o CC hw/i2c/bitbang_i2c.o CC hw/i2c/exynos4210_i2c.o CC hw/i2c/imx_i2c.o CC hw/ide/core.o CC hw/i2c/aspeed_i2c.o CC hw/ide/atapi.o CC hw/ide/qdev.o CC hw/ide/pci.o CC hw/ide/isa.o CC hw/ide/piix.o CC hw/ide/cmd646.o CC hw/ide/macio.o CC hw/ide/mmio.o CC hw/ide/via.o CC hw/ide/microdrive.o CC hw/ide/ahci.o CC hw/ide/ich.o CC hw/input/adb.o CC hw/input/hid.o CC hw/input/lm832x.o CC hw/input/pckbd.o CC hw/input/pl050.o CC hw/input/ps2.o CC hw/input/stellaris_input.o CC hw/input/tsc2005.o CC hw/input/vmmouse.o CC hw/input/virtio-input.o CC hw/input/virtio-input-hid.o CC hw/input/virtio-input-host.o CC hw/intc/heathrow_pic.o CC hw/intc/i8259_common.o CC hw/intc/i8259.o CC hw/intc/pl190.o CC hw/intc/puv3_intc.o CC hw/intc/xilinx_intc.o CC hw/intc/etraxfs_pic.o CC hw/intc/imx_avic.o CC hw/intc/lm32_pic.o CC hw/intc/slavio_intctl.o CC hw/intc/realview_gic.o CC hw/intc/ioapic_common.o CC hw/intc/arm_gic_common.o CC hw/intc/arm_gic.o CC hw/intc/arm_gicv2m.o CC hw/intc/arm_gicv3_common.o CC hw/intc/arm_gicv3.o CC hw/intc/arm_gicv3_dist.o CC hw/intc/arm_gicv3_redist.o CC hw/intc/arm_gicv3_its_common.o CC hw/intc/openpic.o CC hw/intc/intc.o CC hw/ipack/ipack.o CC hw/ipack/tpci200.o CC hw/ipmi/ipmi.o CC hw/ipmi/ipmi_bmc_sim.o CC hw/ipmi/ipmi_bmc_extern.o CC hw/ipmi/isa_ipmi_kcs.o CC hw/ipmi/isa_ipmi_bt.o CC hw/isa/isa-bus.o CC hw/isa/apm.o CC hw/isa/i82378.o CC hw/isa/pc87312.o CC hw/isa/piix4.o CC hw/isa/vt82c686.o CC hw/mem/pc-dimm.o CC hw/misc/applesmc.o CC hw/mem/nvdimm.o CC hw/misc/max111x.o CC hw/misc/tmp105.o CC hw/misc/tmp421.o CC hw/misc/debugexit.o CC hw/misc/sga.o CC hw/misc/pc-testdev.o CC hw/misc/pci-testdev.o CC hw/misc/edu.o CC hw/misc/unimp.o CC hw/misc/arm_l2x0.o CC hw/misc/arm_integrator_debug.o CC hw/misc/a9scu.o CC hw/misc/arm11scu.o CC hw/misc/puv3_pm.o CC hw/misc/macio/macio.o CC hw/misc/macio/cuda.o CC hw/misc/macio/mac_dbdma.o CC hw/net/dp8393x.o CC hw/net/ne2000.o CC hw/net/eepro100.o CC hw/net/pcnet-pci.o CC hw/net/pcnet.o CC hw/net/e1000.o CC hw/net/e1000x_common.o CC hw/net/net_tx_pkt.o CC hw/net/net_rx_pkt.o CC hw/net/e1000e.o CC hw/net/e1000e_core.o CC hw/net/rtl8139.o CC hw/net/vmxnet3.o CC hw/net/smc91c111.o CC hw/net/lan9118.o CC hw/net/ne2000-isa.o CC hw/net/opencores_eth.o CC hw/net/xgmac.o CC hw/net/mipsnet.o CC hw/net/xilinx_axienet.o CC hw/net/allwinner_emac.o CC hw/net/imx_fec.o CC hw/net/cadence_gem.o CC hw/net/stellaris_enet.o CC hw/net/lance.o CC hw/net/ftgmac100.o CC hw/net/rocker/rocker.o CC hw/net/rocker/rocker_fp.o CC hw/net/rocker/rocker_world.o CC hw/net/rocker/rocker_desc.o CC hw/nvram/ds1225y.o CC hw/net/rocker/rocker_of_dpa.o CC hw/nvram/eeprom93xx.o CC hw/nvram/fw_cfg.o CC hw/nvram/chrp_nvram.o CC hw/nvram/mac_nvram.o CC hw/pci-bridge/pci_bridge_dev.o CC hw/pci-bridge/pcie_root_port.o CC hw/pci-bridge/gen_pcie_root_port.o CC hw/pci-bridge/pci_expander_bridge.o CC hw/pci-bridge/xio3130_upstream.o CC hw/pci-bridge/xio3130_downstream.o CC hw/pci-bridge/ioh3420.o CC hw/pci-bridge/i82801b11.o CC hw/pci-bridge/dec.o CC hw/pci-host/pam.o CC hw/pci-host/prep.o CC hw/pci-host/grackle.o CC hw/pci-host/uninorth.o CC hw/pci-host/ppce500.o CC hw/pci-host/versatile.o CC hw/pci-host/apb.o CC hw/pci-host/bonito.o CC hw/pci-host/piix.o CC hw/pci-host/q35.o CC hw/pci-host/gpex.o CC hw/pci-host/xilinx-pcie.o CC hw/pci/pci.o CC hw/pci/pci_bridge.o CC hw/pci/msix.o CC hw/pci/msi.o CC hw/pci/shpc.o CC hw/pci/slotid_cap.o CC hw/pci/pci_host.o CC hw/pci/pcie_host.o CC hw/pci/pcie.o CC hw/pci/pcie_aer.o CC hw/pci/pcie_port.o CC hw/pci/pci-stub.o CC hw/pcmcia/pcmcia.o CC hw/scsi/scsi-disk.o CC hw/scsi/scsi-generic.o CC hw/scsi/scsi-bus.o CC hw/scsi/lsi53c895a.o CC hw/scsi/mptsas.o CC hw/scsi/mptconfig.o CC hw/scsi/mptendian.o CC hw/scsi/megasas.o CC hw/scsi/vmw_pvscsi.o CC hw/scsi/esp.o CC hw/scsi/esp-pci.o CC hw/sd/pl181.o CC hw/sd/ssi-sd.o CC hw/sd/sd.o CC hw/sd/core.o CC hw/smbios/smbios.o CC hw/sd/sdhci.o CC hw/smbios/smbios_type_38.o CC hw/smbios/smbios-stub.o CC hw/smbios/smbios_type_38-stub.o CC hw/ssi/pl022.o CC hw/ssi/ssi.o CC hw/ssi/xilinx_spi.o CC hw/ssi/xilinx_spips.o CC hw/ssi/aspeed_smc.o CC hw/ssi/stm32f2xx_spi.o CC hw/timer/arm_timer.o CC hw/timer/arm_mptimer.o CC hw/timer/armv7m_systick.o CC hw/timer/a9gtimer.o CC hw/timer/cadence_ttc.o CC hw/timer/ds1338.o CC hw/timer/hpet.o CC hw/timer/i8254_common.o CC hw/timer/i8254.o CC hw/timer/m48t59.o CC hw/timer/m48t59-isa.o CC hw/timer/pl031.o CC hw/timer/puv3_ost.o CC hw/timer/twl92230.o CC hw/timer/xilinx_timer.o CC hw/timer/slavio_timer.o CC hw/timer/etraxfs_timer.o CC hw/timer/grlib_gptimer.o CC hw/timer/imx_epit.o CC hw/timer/imx_gpt.o CC hw/timer/lm32_timer.o CC hw/timer/milkymist-sysctl.o CC hw/timer/stm32f2xx_timer.o CC hw/timer/aspeed_timer.o CC hw/timer/sun4v-rtc.o CC hw/tpm/tpm_tis.o CC hw/usb/core.o CC hw/usb/combined-packet.o CC hw/usb/bus.o CC hw/usb/libhw.o CC hw/usb/desc.o CC hw/usb/desc-msos.o CC hw/usb/hcd-uhci.o CC hw/usb/hcd-ohci.o CC hw/usb/hcd-ehci.o CC hw/usb/hcd-ehci-pci.o CC hw/usb/hcd-ehci-sysbus.o CC hw/usb/hcd-xhci.o CC hw/usb/hcd-xhci-nec.o CC hw/usb/hcd-musb.o CC hw/usb/dev-hid.o CC hw/usb/dev-hub.o CC hw/usb/dev-wacom.o CC hw/usb/dev-storage.o CC hw/usb/dev-uas.o CC hw/usb/dev-audio.o CC hw/usb/dev-serial.o CC hw/usb/dev-network.o CC hw/usb/dev-bluetooth.o CC hw/usb/dev-smartcard-reader.o CC hw/usb/ccid-card-passthru.o CC hw/usb/ccid-card-emulated.o CC hw/usb/redirect.o CC hw/usb/dev-mtp.o CC hw/usb/quirks.o CC hw/usb/host-libusb.o CC hw/usb/host-legacy.o CC hw/virtio/virtio-rng.o CC hw/virtio/virtio-pci.o CC hw/virtio/virtio-bus.o CC hw/virtio/virtio-mmio.o CC hw/virtio/vhost-stub.o CC hw/watchdog/watchdog.o CC hw/watchdog/wdt_i6300esb.o CC hw/watchdog/wdt_ib700.o CC hw/watchdog/wdt_diag288.o CC hw/watchdog/wdt_aspeed.o CC migration/migration.o CC migration/socket.o CC migration/fd.o CC migration/exec.o CC migration/channel.o CC migration/tls.o CC migration/savevm.o CC migration/colo-comm.o CC migration/colo.o CC migration/colo-failover.o CC migration/vmstate.o CC migration/vmstate-types.o CC migration/page_cache.o CC migration/qemu-file.o CC migration/global_state.o CC migration/qemu-file-channel.o CC migration/xbzrle.o CC migration/postcopy-ram.o CC migration/qjson.o CC migration/block.o CC net/net.o CC net/queue.o CC net/checksum.o /var/tmp/patchew-tester-tmp-akl3dh_3/src/net/queue.c:28:20: fatal error: packet.h: No such file or directory #include "packet.h" ^ compilation terminated. /var/tmp/patchew-tester-tmp-akl3dh_3/src/rules.mak:66: recipe for target 'net/queue.o' failed make: *** [net/queue.o] Error 1 make: *** Waiting for unfinished jobs.... === OUTPUT END === Test command exited with code: 2 --- Email generated automatically by Patchew [http://patchew.org/]. Please send your feedback to patchew-devel@freelists.org
Apologies, some bits of the second stage (sendmmsg) got in by mistake and broke the patch. I will re-submit it later today including the proposed documentation, help and man page changes. A. On 18/07/17 07:12, no-reply@patchew.org wrote: > Hi, > > This series failed build test on s390x host. Please find the details below. > > Type: series > Message-id: 20170718060627.2107-1-anton.ivanov@cambridgegreys.com > Subject: [Qemu-devel] [PATCH] Unified Socket Transport > [snip] -- Anton R. Ivanov Cambridge Greys Limited, England and Wales company No 10273661 http://www.cambridgegreys.com/
Hi Jason, hi list, This is the first half (RX) of getting multi-message working for socket transports other than L2TPv3. I am looking at the second half (TX) as well as possibly moving the backend to something better than the legacy method(s). As an example of where I would like this to go you can have a look at the UML patches which were posted yesterday: http://marc.info/?l=user-mode-linux-devel&r=1&b=201707&w=2 - the 3 patches dated 2017-07-17 The UML implementation does the full set - RX/TX, DQL, BPF integration and scatter gather and I would like to reach a point where the QEMU implementation is feature and performance matched or better. There are some instructions on setup as well as actual numbers at: http://foswiki.kot-begemot.co.uk/Main/EatYourOwnDogFood A. P.S. This is an RFC - I would like some comments on how to organize multiple transports in the same driver, how it should look as far as qapi, etc. It should be possible to bring some of the existing code like half of net/socket.c under this umbrella as well. A. On 18/07/17 07:06, anton.ivanov@cambridgegreys.com wrote: > From: Anton Ivanov <anton.ivanov@cambridgegreys.com> > > 1. Creates a common recvmmsg backend for socket transports > 2. Migrates L2TPv3 to the new backend > 3. Adds gre socket transport - a vm can attach directly to GRE > 4. Adds raw socket transport - a vm can attach directly to an > Ethernet interface > 5. Adds simplistic static VXLAN tunnel transport (no > control plane). > 6. Sets up some of the infrastructure for future addition of > sendmmsg > > Signed-off-by: Anton Ivanov <anton.ivanov@cambridgegreys.com> > --- > configure | 10 +- > net/Makefile.objs | 2 +- > net/clients.h | 8 + > net/gre.c | 314 +++++++++++++++++++++++++++++++ > net/l2tpv3.c | 531 ++++++++--------------------------------------------- > net/net.c | 19 +- > net/queue.c | 21 +-- > net/raw.c | 123 +++++++++++++ > net/unified.c | 406 ++++++++++++++++++++++++++++++++++++++++ > net/unified.h | 118 ++++++++++++ > net/vxlan-static.c | 229 +++++++++++++++++++++++ > qapi-schema.json | 91 ++++++++- > 12 files changed, 1392 insertions(+), 480 deletions(-) > create mode 100644 net/gre.c > create mode 100644 net/raw.c > create mode 100644 net/unified.c > create mode 100644 net/unified.h > create mode 100644 net/vxlan-static.c > > diff --git a/configure b/configure > index a3f0522e8f..99a60b723c 100755 > --- a/configure > +++ b/configure > @@ -1862,7 +1862,7 @@ if ! compile_object -Werror ; then > fi > > ########################################## > -# L2TPV3 probe > +# UNIFIED probe > > cat > $TMPC <<EOF > #include <sys/socket.h> > @@ -1870,9 +1870,9 @@ cat > $TMPC <<EOF > int main(void) { return sizeof(struct mmsghdr); } > EOF > if compile_prog "" "" ; then > - l2tpv3=yes > + unified=yes > else > - l2tpv3=no > + unified=no > fi > > ########################################## > @@ -5458,8 +5458,8 @@ fi > if test "$netmap" = "yes" ; then > echo "CONFIG_NETMAP=y" >> $config_host_mak > fi > -if test "$l2tpv3" = "yes" ; then > - echo "CONFIG_L2TPV3=y" >> $config_host_mak > +if test "$unified" = "yes" ; then > + echo "CONFIG_UNIFIED=y" >> $config_host_mak > fi > if test "$cap_ng" = "yes" ; then > echo "CONFIG_LIBCAP=y" >> $config_host_mak > diff --git a/net/Makefile.objs b/net/Makefile.objs > index 67ba5e26fb..440360f714 100644 > --- a/net/Makefile.objs > +++ b/net/Makefile.objs > @@ -2,7 +2,7 @@ common-obj-y = net.o queue.o checksum.o util.o hub.o > common-obj-y += socket.o > common-obj-y += dump.o > common-obj-y += eth.o > -common-obj-$(CONFIG_L2TPV3) += l2tpv3.o > +common-obj-$(CONFIG_UNIFIED) += l2tpv3.o unified.o raw.o gre.o vxlan-static.o > common-obj-$(CONFIG_POSIX) += vhost-user.o > common-obj-$(CONFIG_SLIRP) += slirp.o > common-obj-$(CONFIG_VDE) += vde.o > diff --git a/net/clients.h b/net/clients.h > index 5cae479730..f91b879101 100644 > --- a/net/clients.h > +++ b/net/clients.h > @@ -49,6 +49,14 @@ int net_init_bridge(const Netdev *netdev, const char *name, > > int net_init_l2tpv3(const Netdev *netdev, const char *name, > NetClientState *peer, Error **errp); > + > +int net_init_raw(const Netdev *netdev, const char *name, > + NetClientState *peer, Error **errp); > + > +int net_init_gre(const Netdev *netdev, const char *name, > + NetClientState *peer, Error **errp); > +int net_init_vxlan(const Netdev *netdev, const char *name, > + NetClientState *peer, Error **errp); > #ifdef CONFIG_VDE > int net_init_vde(const Netdev *netdev, const char *name, > NetClientState *peer, Error **errp); > diff --git a/net/gre.c b/net/gre.c > new file mode 100644 > index 0000000000..2197b7581d > --- /dev/null > +++ b/net/gre.c > @@ -0,0 +1,314 @@ > +/* > + * QEMU System Emulator > + * > + * Copyright (c) 2015-2017 Cambridge GREys Limited > + * Copyright (c) 2003-2008 Fabrice Bellard > + * Copyright (c) 2012-2014 Cisco Systems > + * > + * Permission is hereby granted, free of charge, to any person obtaining a copy > + * of this software and associated documentation files (the "Software"), to deal > + * in the Software without restriction, including without limitation the rights > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the Software is > + * furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > + * THE SOFTWARE. > + */ > + > +#include "qemu/osdep.h" > +#include <linux/ip.h> > +#include <netdb.h> > +#include "net/net.h" > +#include "clients.h" > +#include "qemu-common.h" > +#include "qemu/error-report.h" > +#include "qemu/option.h" > +#include "qemu/sockets.h" > +#include "qemu/iov.h" > +#include "qemu/main-loop.h" > +#include "unified.h" > + > +/* IANA-assigned IP protocol ID for GRE */ > + > + > +#ifndef IPPROTO_GRE > +#define IPPROTO_GRE 0x2F > +#endif > + > +#define GRE_MODE_CHECKSUM htons(8 << 12) /* checksum */ > +#define GRE_MODE_RESERVED htons(4 << 12) /* unused */ > +#define GRE_MODE_KEY htons(2 << 12) /* KEY present */ > +#define GRE_MODE_SEQUENCE htons(1 << 12) /* no sequence */ > + > + > +/* GRE TYPE for Ethernet in GRE aka GRETAP */ > + > +#define GRE_IRB htons(0x6558) > + > +struct gre_minimal_header { > + uint16_t header; > + uint16_t arptype; > +}; > + > +typedef struct GRETunnelParams { > + /* > + * GRE parameters > + */ > + > + uint32_t rx_key; > + uint32_t tx_key; > + uint32_t sequence; > + > + /* Flags */ > + > + bool ipv6; > + bool udp; > + bool has_sequence; > + bool pin_sequence; > + bool checksum; > + bool key; > + > + /* Precomputed GRE specific offsets */ > + > + uint32_t key_offset; > + uint32_t sequence_offset; > + uint32_t checksum_offset; > + > + struct gre_minimal_header header_bits; > + > +} GRETunnelParams; > + > + > + > +static void gre_form_header(void *us) > +{ > + NetUnifiedState *s = (NetUnifiedState *) us; > + GRETunnelParams *p = (GRETunnelParams *) s->params; > + > + uint32_t *sequence; > + > + *((uint32_t *) s->header_buf) = *((uint32_t *) &p->header_bits); > + > + if (p->key) { > + stl_be_p( > + (uint32_t *) (s->header_buf + p->key_offset), > + p->tx_key > + ); > + } > + if (p->has_sequence) { > + sequence = (uint32_t *)(s->header_buf + p->sequence_offset); > + if (p->pin_sequence) { > + *sequence = 0; > + } else { > + stl_be_p(sequence, ++p->sequence); > + } > + } > +} > + > +static int gre_verify_header(void *us, uint8_t *buf) > +{ > + > + NetUnifiedState *s = (NetUnifiedState *) us; > + GRETunnelParams *p = (GRETunnelParams *) s->params; > + uint32_t key; > + > + > + if (!p->ipv6) { > + buf += sizeof(struct iphdr) /* fix for ipv4 raw */; > + } > + > + if (*((uint32_t *) buf) != *((uint32_t *) &p->header_bits)) { > + if (!s->header_mismatch) { > + error_report("header type disagreement, expecting %0x, got %0x", > + *((uint32_t *) &p->header_bits), *((uint32_t *) buf)); > + } > + return -1; > + } > + > + if (p->key) { > + key = ldl_be_p(buf + p->key_offset); > + if (key != p->rx_key) { > + if (!s->header_mismatch) { > + error_report("unknown key id %0x, expecting %0x", > + key, p->rx_key); > + } > + return -1; > + } > + } > + return 0; > +} > + > +int net_init_gre(const Netdev *netdev, > + const char *name, > + NetClientState *peer, Error **errp) > +{ > + /* FIXME error_setg(errp, ...) on failure */ > + const NetdevGREOptions *gre; > + NetUnifiedState *s; > + NetClientState *nc; > + GRETunnelParams *p; > + > + int fd = -1, gairet; > + struct addrinfo hints; > + struct addrinfo *result = NULL; > + > + nc = qemu_new_unified_net_client(name, peer); > + > + s = DO_UPCAST(NetUnifiedState, nc, nc); > + > + p = g_malloc(sizeof(GRETunnelParams)); > + > + s->params = p; > + p->header_bits.arptype = GRE_IRB; > + p->header_bits.header = 0; > + > + s->form_header = &gre_form_header; > + s->verify_header = &gre_verify_header; > + s->queue_head = 0; > + s->queue_tail = 0; > + s->header_mismatch = false; > + > + assert(netdev->type == NET_CLIENT_DRIVER_GRE); > + gre = &netdev->u.gre; > + > + if (gre->has_ipv6 && gre->ipv6) { > + p->ipv6 = gre->ipv6; > + } else { > + p->ipv6 = false; > + } > + > + s->offset = 4; > + p->key_offset = 4; > + p->sequence_offset = 4; > + p->checksum_offset = 4; > + > + if (gre->has_rxkey || gre->has_txkey) { > + if (gre->has_rxkey && gre->has_txkey) { > + p->key = true; > + p->header_bits.header |= GRE_MODE_KEY; > + } else { > + goto outerr; > + } > + } else { > + p->key = false; > + } > + > + if (p->key) { > + p->rx_key = gre->rxkey; > + p->tx_key = gre->txkey; > + s->offset += 4; > + p->sequence_offset += 4; > + } > + > + > + if (gre->has_sequence && gre->sequence) { > + s->offset += 4; > + p->has_sequence = true; > + p->header_bits.header |= GRE_MODE_SEQUENCE; > + } else { > + p->sequence = false; > + } > + > + if (gre->has_pinsequence && gre->pinsequence) { > + /* pin sequence implies that there is sequence */ > + p->has_sequence = true; > + p->pin_sequence = true; > + } else { > + p->pin_sequence = false; > + } > + > + memset(&hints, 0, sizeof(hints)); > + > + if (p->ipv6) { > + hints.ai_family = AF_INET6; > + } else { > + hints.ai_family = AF_INET; > + } > + > + hints.ai_socktype = SOCK_RAW; > + hints.ai_protocol = IPPROTO_GRE; > + > + gairet = getaddrinfo(gre->src, NULL, &hints, &result); > + > + if ((gairet != 0) || (result == NULL)) { > + error_report( > + "gre_open : could not resolve src, errno = %s", > + gai_strerror(gairet) > + ); > + goto outerr; > + } > + fd = socket(result->ai_family, result->ai_socktype, result->ai_protocol); > + if (fd == -1) { > + fd = -errno; > + error_report("gre_open : socket creation failed, errno = %d", -fd); > + goto outerr; > + } > + if (bind(fd, (struct sockaddr *) result->ai_addr, result->ai_addrlen)) { > + error_report("gre_open : could not bind socket err=%i", errno); > + goto outerr; > + } > + if (result) { > + freeaddrinfo(result); > + } > + > + memset(&hints, 0, sizeof(hints)); > + > + if (p->ipv6) { > + hints.ai_family = AF_INET6; > + } else { > + hints.ai_family = AF_INET; > + } > + hints.ai_socktype = SOCK_RAW; > + hints.ai_protocol = IPPROTO_GRE; > + > + result = NULL; > + gairet = getaddrinfo(gre->dst, NULL, &hints, &result); > + if ((gairet != 0) || (result == NULL)) { > + error_report( > + "gre_open : could not resolve dst, error = %s", > + gai_strerror(gairet) > + ); > + goto outerr; > + } > + > + s->dgram_dst = g_new0(struct sockaddr_storage, 1); > + memcpy(s->dgram_dst, result->ai_addr, result->ai_addrlen); > + s->dst_size = result->ai_addrlen; > + > + if (result) { > + freeaddrinfo(result); > + } > + > + if ((p->ipv6) || (p->udp)) { > + s->header_size = s->offset; > + } else { > + s->header_size = s->offset + sizeof(struct iphdr); > + } > + > + qemu_net_finalize_unified_init(s, fd); > + > + p->sequence = 0; > + > + snprintf(s->nc.info_str, sizeof(s->nc.info_str), > + "gre: connected"); > + return 0; > +outerr: > + qemu_del_net_client(nc); > + if (fd >= 0) { > + close(fd); > + } > + if (result) { > + freeaddrinfo(result); > + } > + return -1; > +} > + > diff --git a/net/l2tpv3.c b/net/l2tpv3.c > index 6745b78990..05413c9cbd 100644 > --- a/net/l2tpv3.c > +++ b/net/l2tpv3.c > @@ -1,6 +1,7 @@ > /* > * QEMU System Emulator > * > + * Copyright (c) 2015-2017 Cambridge Greys Limited > * Copyright (c) 2003-2008 Fabrice Bellard > * Copyright (c) 2012-2014 Cisco Systems > * > @@ -34,19 +35,9 @@ > #include "qemu/sockets.h" > #include "qemu/iov.h" > #include "qemu/main-loop.h" > +#include "unified.h" > > > -/* The buffer size needs to be investigated for optimum numbers and > - * optimum means of paging in on different systems. This size is > - * chosen to be sufficient to accommodate one packet with some headers > - */ > - > -#define BUFFER_ALIGN sysconf(_SC_PAGESIZE) > -#define BUFFER_SIZE 2048 > -#define IOVSIZE 2 > -#define MAX_L2TPV3_MSGCNT 64 > -#define MAX_L2TPV3_IOVCNT (MAX_L2TPV3_MSGCNT * IOVSIZE) > - > /* Header set to 0x30000 signifies a data packet */ > > #define L2TPV3_DATA_PACKET 0x30000 > @@ -57,31 +48,7 @@ > #define IPPROTO_L2TP 0x73 > #endif > > -typedef struct NetL2TPV3State { > - NetClientState nc; > - int fd; > - > - /* > - * these are used for xmit - that happens packet a time > - * and for first sign of life packet (easier to parse that once) > - */ > - > - uint8_t *header_buf; > - struct iovec *vec; > - > - /* > - * these are used for receive - try to "eat" up to 32 packets at a time > - */ > - > - struct mmsghdr *msgvec; > - > - /* > - * peer address > - */ > - > - struct sockaddr_storage *dgram_dst; > - uint32_t dst_size; > - > +typedef struct L2TPV3TunnelParams { > /* > * L2TPv3 parameters > */ > @@ -90,37 +57,8 @@ typedef struct NetL2TPV3State { > uint64_t tx_cookie; > uint32_t rx_session; > uint32_t tx_session; > - uint32_t header_size; > uint32_t counter; > > - /* > - * DOS avoidance in error handling > - */ > - > - bool header_mismatch; > - > - /* > - * Ring buffer handling > - */ > - > - int queue_head; > - int queue_tail; > - int queue_depth; > - > - /* > - * Precomputed offsets > - */ > - > - uint32_t offset; > - uint32_t cookie_offset; > - uint32_t counter_offset; > - uint32_t session_offset; > - > - /* Poll Control */ > - > - bool read_poll; > - bool write_poll; > - > /* Flags */ > > bool ipv6; > @@ -130,189 +68,62 @@ typedef struct NetL2TPV3State { > bool cookie; > bool cookie_is_64; > > -} NetL2TPV3State; > - > -static void net_l2tpv3_send(void *opaque); > -static void l2tpv3_writable(void *opaque); > - > -static void l2tpv3_update_fd_handler(NetL2TPV3State *s) > -{ > - qemu_set_fd_handler(s->fd, > - s->read_poll ? net_l2tpv3_send : NULL, > - s->write_poll ? l2tpv3_writable : NULL, > - s); > -} > - > -static void l2tpv3_read_poll(NetL2TPV3State *s, bool enable) > -{ > - if (s->read_poll != enable) { > - s->read_poll = enable; > - l2tpv3_update_fd_handler(s); > - } > -} > + /* Precomputed L2TPV3 specific offsets */ > + uint32_t cookie_offset; > + uint32_t counter_offset; > + uint32_t session_offset; > > -static void l2tpv3_write_poll(NetL2TPV3State *s, bool enable) > -{ > - if (s->write_poll != enable) { > - s->write_poll = enable; > - l2tpv3_update_fd_handler(s); > - } > -} > +} L2TPV3TunnelParams; > > -static void l2tpv3_writable(void *opaque) > -{ > - NetL2TPV3State *s = opaque; > - l2tpv3_write_poll(s, false); > - qemu_flush_queued_packets(&s->nc); > -} > > -static void l2tpv3_send_completed(NetClientState *nc, ssize_t len) > -{ > - NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc); > - l2tpv3_read_poll(s, true); > -} > > -static void l2tpv3_poll(NetClientState *nc, bool enable) > +static void l2tpv3_form_header(void *us) > { > - NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc); > - l2tpv3_write_poll(s, enable); > - l2tpv3_read_poll(s, enable); > -} > + NetUnifiedState *s = (NetUnifiedState *) us; > + L2TPV3TunnelParams *p = (L2TPV3TunnelParams *) s->params; > > -static void l2tpv3_form_header(NetL2TPV3State *s) > -{ > uint32_t *counter; > > - if (s->udp) { > + if (p->udp) { > stl_be_p((uint32_t *) s->header_buf, L2TPV3_DATA_PACKET); > } > stl_be_p( > - (uint32_t *) (s->header_buf + s->session_offset), > - s->tx_session > + (uint32_t *) (s->header_buf + p->session_offset), > + p->tx_session > ); > - if (s->cookie) { > - if (s->cookie_is_64) { > + if (p->cookie) { > + if (p->cookie_is_64) { > stq_be_p( > - (uint64_t *)(s->header_buf + s->cookie_offset), > - s->tx_cookie > + (uint64_t *)(s->header_buf + p->cookie_offset), > + p->tx_cookie > ); > } else { > stl_be_p( > - (uint32_t *) (s->header_buf + s->cookie_offset), > - s->tx_cookie > + (uint32_t *) (s->header_buf + p->cookie_offset), > + p->tx_cookie > ); > } > } > - if (s->has_counter) { > - counter = (uint32_t *)(s->header_buf + s->counter_offset); > - if (s->pin_counter) { > + if (p->has_counter) { > + counter = (uint32_t *)(s->header_buf + p->counter_offset); > + if (p->pin_counter) { > *counter = 0; > } else { > - stl_be_p(counter, ++s->counter); > - } > - } > -} > - > -static ssize_t net_l2tpv3_receive_dgram_iov(NetClientState *nc, > - const struct iovec *iov, > - int iovcnt) > -{ > - NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc); > - > - struct msghdr message; > - int ret; > - > - if (iovcnt > MAX_L2TPV3_IOVCNT - 1) { > - error_report( > - "iovec too long %d > %d, change l2tpv3.h", > - iovcnt, MAX_L2TPV3_IOVCNT > - ); > - return -1; > - } > - l2tpv3_form_header(s); > - memcpy(s->vec + 1, iov, iovcnt * sizeof(struct iovec)); > - s->vec->iov_base = s->header_buf; > - s->vec->iov_len = s->offset; > - message.msg_name = s->dgram_dst; > - message.msg_namelen = s->dst_size; > - message.msg_iov = s->vec; > - message.msg_iovlen = iovcnt + 1; > - message.msg_control = NULL; > - message.msg_controllen = 0; > - message.msg_flags = 0; > - do { > - ret = sendmsg(s->fd, &message, 0); > - } while ((ret == -1) && (errno == EINTR)); > - if (ret > 0) { > - ret -= s->offset; > - } else if (ret == 0) { > - /* belt and braces - should not occur on DGRAM > - * we should get an error and never a 0 send > - */ > - ret = iov_size(iov, iovcnt); > - } else { > - /* signal upper layer that socket buffer is full */ > - ret = -errno; > - if (ret == -EAGAIN || ret == -ENOBUFS) { > - l2tpv3_write_poll(s, true); > - ret = 0; > + stl_be_p(counter, ++p->counter); > } > } > - return ret; > } > > -static ssize_t net_l2tpv3_receive_dgram(NetClientState *nc, > - const uint8_t *buf, > - size_t size) > -{ > - NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc); > - > - struct iovec *vec; > - struct msghdr message; > - ssize_t ret = 0; > - > - l2tpv3_form_header(s); > - vec = s->vec; > - vec->iov_base = s->header_buf; > - vec->iov_len = s->offset; > - vec++; > - vec->iov_base = (void *) buf; > - vec->iov_len = size; > - message.msg_name = s->dgram_dst; > - message.msg_namelen = s->dst_size; > - message.msg_iov = s->vec; > - message.msg_iovlen = 2; > - message.msg_control = NULL; > - message.msg_controllen = 0; > - message.msg_flags = 0; > - do { > - ret = sendmsg(s->fd, &message, 0); > - } while ((ret == -1) && (errno == EINTR)); > - if (ret > 0) { > - ret -= s->offset; > - } else if (ret == 0) { > - /* belt and braces - should not occur on DGRAM > - * we should get an error and never a 0 send > - */ > - ret = size; > - } else { > - ret = -errno; > - if (ret == -EAGAIN || ret == -ENOBUFS) { > - /* signal upper layer that socket buffer is full */ > - l2tpv3_write_poll(s, true); > - ret = 0; > - } > - } > - return ret; > -} > > -static int l2tpv3_verify_header(NetL2TPV3State *s, uint8_t *buf) > +static int l2tpv3_verify_header(void *us, uint8_t *buf) > { > > + NetUnifiedState *s = (NetUnifiedState *) us; > + L2TPV3TunnelParams *p = (L2TPV3TunnelParams *) s->params; > uint32_t *session; > uint64_t cookie; > > - if ((!s->udp) && (!s->ipv6)) { > + if ((!p->udp) && (!p->ipv6)) { > buf += sizeof(struct iphdr) /* fix for ipv4 raw */; > } > > @@ -321,21 +132,21 @@ static int l2tpv3_verify_header(NetL2TPV3State *s, uint8_t *buf) > * that anyway. > */ > > - if (s->cookie) { > - if (s->cookie_is_64) { > - cookie = ldq_be_p(buf + s->cookie_offset); > + if (p->cookie) { > + if (p->cookie_is_64) { > + cookie = ldq_be_p(buf + p->cookie_offset); > } else { > - cookie = ldl_be_p(buf + s->cookie_offset) & 0xffffffffULL; > + cookie = ldl_be_p(buf + p->cookie_offset) & 0xffffffffULL; > } > - if (cookie != s->rx_cookie) { > + if (cookie != p->rx_cookie) { > if (!s->header_mismatch) { > error_report("unknown cookie id"); > } > return -1; > } > } > - session = (uint32_t *) (buf + s->session_offset); > - if (ldl_be_p(session) != s->rx_session) { > + session = (uint32_t *) (buf + p->session_offset); > + if (ldl_be_p(session) != p->rx_session) { > if (!s->header_mismatch) { > error_report("session mismatch"); > } > @@ -344,203 +155,31 @@ static int l2tpv3_verify_header(NetL2TPV3State *s, uint8_t *buf) > return 0; > } > > -static void net_l2tpv3_process_queue(NetL2TPV3State *s) > -{ > - int size = 0; > - struct iovec *vec; > - bool bad_read; > - int data_size; > - struct mmsghdr *msgvec; > - > - /* go into ring mode only if there is a "pending" tail */ > - if (s->queue_depth > 0) { > - do { > - msgvec = s->msgvec + s->queue_tail; > - if (msgvec->msg_len > 0) { > - data_size = msgvec->msg_len - s->header_size; > - vec = msgvec->msg_hdr.msg_iov; > - if ((data_size > 0) && > - (l2tpv3_verify_header(s, vec->iov_base) == 0)) { > - vec++; > - /* Use the legacy delivery for now, we will > - * switch to using our own ring as a queueing mechanism > - * at a later date > - */ > - size = qemu_send_packet_async( > - &s->nc, > - vec->iov_base, > - data_size, > - l2tpv3_send_completed > - ); > - if (size == 0) { > - l2tpv3_read_poll(s, false); > - } > - bad_read = false; > - } else { > - bad_read = true; > - if (!s->header_mismatch) { > - /* report error only once */ > - error_report("l2tpv3 header verification failed"); > - s->header_mismatch = true; > - } > - } > - } else { > - bad_read = true; > - } > - s->queue_tail = (s->queue_tail + 1) % MAX_L2TPV3_MSGCNT; > - s->queue_depth--; > - } while ( > - (s->queue_depth > 0) && > - qemu_can_send_packet(&s->nc) && > - ((size > 0) || bad_read) > - ); > - } > -} > - > -static void net_l2tpv3_send(void *opaque) > -{ > - NetL2TPV3State *s = opaque; > - int target_count, count; > - struct mmsghdr *msgvec; > - > - /* go into ring mode only if there is a "pending" tail */ > - > - if (s->queue_depth) { > - > - /* The ring buffer we use has variable intake > - * count of how much we can read varies - adjust accordingly > - */ > - > - target_count = MAX_L2TPV3_MSGCNT - s->queue_depth; > - > - /* Ensure we do not overrun the ring when we have > - * a lot of enqueued packets > - */ > - > - if (s->queue_head + target_count > MAX_L2TPV3_MSGCNT) { > - target_count = MAX_L2TPV3_MSGCNT - s->queue_head; > - } > - } else { > - > - /* we do not have any pending packets - we can use > - * the whole message vector linearly instead of using > - * it as a ring > - */ > - > - s->queue_head = 0; > - s->queue_tail = 0; > - target_count = MAX_L2TPV3_MSGCNT; > - } > - > - msgvec = s->msgvec + s->queue_head; > - if (target_count > 0) { > - do { > - count = recvmmsg( > - s->fd, > - msgvec, > - target_count, MSG_DONTWAIT, NULL); > - } while ((count == -1) && (errno == EINTR)); > - if (count < 0) { > - /* Recv error - we still need to flush packets here, > - * (re)set queue head to current position > - */ > - count = 0; > - } > - s->queue_head = (s->queue_head + count) % MAX_L2TPV3_MSGCNT; > - s->queue_depth += count; > - } > - net_l2tpv3_process_queue(s); > -} > - > -static void destroy_vector(struct mmsghdr *msgvec, int count, int iovcount) > -{ > - int i, j; > - struct iovec *iov; > - struct mmsghdr *cleanup = msgvec; > - if (cleanup) { > - for (i = 0; i < count; i++) { > - if (cleanup->msg_hdr.msg_iov) { > - iov = cleanup->msg_hdr.msg_iov; > - for (j = 0; j < iovcount; j++) { > - g_free(iov->iov_base); > - iov++; > - } > - g_free(cleanup->msg_hdr.msg_iov); > - } > - cleanup++; > - } > - g_free(msgvec); > - } > -} > - > -static struct mmsghdr *build_l2tpv3_vector(NetL2TPV3State *s, int count) > -{ > - int i; > - struct iovec *iov; > - struct mmsghdr *msgvec, *result; > - > - msgvec = g_new(struct mmsghdr, count); > - result = msgvec; > - for (i = 0; i < count ; i++) { > - msgvec->msg_hdr.msg_name = NULL; > - msgvec->msg_hdr.msg_namelen = 0; > - iov = g_new(struct iovec, IOVSIZE); > - msgvec->msg_hdr.msg_iov = iov; > - iov->iov_base = g_malloc(s->header_size); > - iov->iov_len = s->header_size; > - iov++ ; > - iov->iov_base = qemu_memalign(BUFFER_ALIGN, BUFFER_SIZE); > - iov->iov_len = BUFFER_SIZE; > - msgvec->msg_hdr.msg_iovlen = 2; > - msgvec->msg_hdr.msg_control = NULL; > - msgvec->msg_hdr.msg_controllen = 0; > - msgvec->msg_hdr.msg_flags = 0; > - msgvec++; > - } > - return result; > -} > - > -static void net_l2tpv3_cleanup(NetClientState *nc) > -{ > - NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc); > - qemu_purge_queued_packets(nc); > - l2tpv3_read_poll(s, false); > - l2tpv3_write_poll(s, false); > - if (s->fd >= 0) { > - close(s->fd); > - } > - destroy_vector(s->msgvec, MAX_L2TPV3_MSGCNT, IOVSIZE); > - g_free(s->vec); > - g_free(s->header_buf); > - g_free(s->dgram_dst); > -} > - > -static NetClientInfo net_l2tpv3_info = { > - .type = NET_CLIENT_DRIVER_L2TPV3, > - .size = sizeof(NetL2TPV3State), > - .receive = net_l2tpv3_receive_dgram, > - .receive_iov = net_l2tpv3_receive_dgram_iov, > - .poll = l2tpv3_poll, > - .cleanup = net_l2tpv3_cleanup, > -}; > - > int net_init_l2tpv3(const Netdev *netdev, > const char *name, > NetClientState *peer, Error **errp) > { > /* FIXME error_setg(errp, ...) on failure */ > const NetdevL2TPv3Options *l2tpv3; > - NetL2TPV3State *s; > + NetUnifiedState *s; > NetClientState *nc; > + L2TPV3TunnelParams *p; > + > int fd = -1, gairet; > struct addrinfo hints; > struct addrinfo *result = NULL; > char *srcport, *dstport; > > - nc = qemu_new_net_client(&net_l2tpv3_info, peer, "l2tpv3", name); > + nc = qemu_new_unified_net_client(name, peer); > + > + s = DO_UPCAST(NetUnifiedState, nc, nc); > + > + p = g_malloc(sizeof(L2TPV3TunnelParams)); > > - s = DO_UPCAST(NetL2TPV3State, nc, nc); > + s->params = p; > > + s->form_header = &l2tpv3_form_header; > + s->verify_header = &l2tpv3_verify_header; > s->queue_head = 0; > s->queue_tail = 0; > s->header_mismatch = false; > @@ -549,9 +188,9 @@ int net_init_l2tpv3(const Netdev *netdev, > l2tpv3 = &netdev->u.l2tpv3; > > if (l2tpv3->has_ipv6 && l2tpv3->ipv6) { > - s->ipv6 = l2tpv3->ipv6; > + p->ipv6 = l2tpv3->ipv6; > } else { > - s->ipv6 = false; > + p->ipv6 = false; > } > > if ((l2tpv3->has_offset) && (l2tpv3->offset > 256)) { > @@ -561,22 +200,22 @@ int net_init_l2tpv3(const Netdev *netdev, > > if (l2tpv3->has_rxcookie || l2tpv3->has_txcookie) { > if (l2tpv3->has_rxcookie && l2tpv3->has_txcookie) { > - s->cookie = true; > + p->cookie = true; > } else { > goto outerr; > } > } else { > - s->cookie = false; > + p->cookie = false; > } > > if (l2tpv3->has_cookie64 || l2tpv3->cookie64) { > - s->cookie_is_64 = true; > + p->cookie_is_64 = true; > } else { > - s->cookie_is_64 = false; > + p->cookie_is_64 = false; > } > > if (l2tpv3->has_udp && l2tpv3->udp) { > - s->udp = true; > + p->udp = true; > if (!(l2tpv3->has_srcport && l2tpv3->has_dstport)) { > error_report("l2tpv3_open : need both src and dst port for udp"); > goto outerr; > @@ -585,52 +224,52 @@ int net_init_l2tpv3(const Netdev *netdev, > dstport = l2tpv3->dstport; > } > } else { > - s->udp = false; > + p->udp = false; > srcport = NULL; > dstport = NULL; > } > > > s->offset = 4; > - s->session_offset = 0; > - s->cookie_offset = 4; > - s->counter_offset = 4; > + p->session_offset = 0; > + p->cookie_offset = 4; > + p->counter_offset = 4; > > - s->tx_session = l2tpv3->txsession; > + p->tx_session = l2tpv3->txsession; > if (l2tpv3->has_rxsession) { > - s->rx_session = l2tpv3->rxsession; > + p->rx_session = l2tpv3->rxsession; > } else { > - s->rx_session = s->tx_session; > + p->rx_session = p->tx_session; > } > > - if (s->cookie) { > - s->rx_cookie = l2tpv3->rxcookie; > - s->tx_cookie = l2tpv3->txcookie; > - if (s->cookie_is_64 == true) { > + if (p->cookie) { > + p->rx_cookie = l2tpv3->rxcookie; > + p->tx_cookie = l2tpv3->txcookie; > + if (p->cookie_is_64 == true) { > /* 64 bit cookie */ > s->offset += 8; > - s->counter_offset += 8; > + p->counter_offset += 8; > } else { > /* 32 bit cookie */ > s->offset += 4; > - s->counter_offset += 4; > + p->counter_offset += 4; > } > } > > memset(&hints, 0, sizeof(hints)); > > - if (s->ipv6) { > + if (p->ipv6) { > hints.ai_family = AF_INET6; > } else { > hints.ai_family = AF_INET; > } > - if (s->udp) { > + if (p->udp) { > hints.ai_socktype = SOCK_DGRAM; > hints.ai_protocol = 0; > s->offset += 4; > - s->counter_offset += 4; > - s->session_offset += 4; > - s->cookie_offset += 4; > + p->counter_offset += 4; > + p->session_offset += 4; > + p->cookie_offset += 4; > } else { > hints.ai_socktype = SOCK_RAW; > hints.ai_protocol = IPPROTO_L2TP; > @@ -661,12 +300,12 @@ int net_init_l2tpv3(const Netdev *netdev, > > memset(&hints, 0, sizeof(hints)); > > - if (s->ipv6) { > + if (p->ipv6) { > hints.ai_family = AF_INET6; > } else { > hints.ai_family = AF_INET; > } > - if (s->udp) { > + if (p->udp) { > hints.ai_socktype = SOCK_DGRAM; > hints.ai_protocol = 0; > } else { > @@ -693,17 +332,17 @@ int net_init_l2tpv3(const Netdev *netdev, > } > > if (l2tpv3->has_counter && l2tpv3->counter) { > - s->has_counter = true; > + p->has_counter = true; > s->offset += 4; > } else { > - s->has_counter = false; > + p->has_counter = false; > } > > if (l2tpv3->has_pincounter && l2tpv3->pincounter) { > - s->has_counter = true; /* pin counter implies that there is counter */ > - s->pin_counter = true; > + p->has_counter = true; /* pin counter implies that there is counter */ > + p->pin_counter = true; > } else { > - s->pin_counter = false; > + p->pin_counter = false; > } > > if (l2tpv3->has_offset) { > @@ -711,22 +350,14 @@ int net_init_l2tpv3(const Netdev *netdev, > s->offset += l2tpv3->offset; > } > > - if ((s->ipv6) || (s->udp)) { > + if ((p->ipv6) || (p->udp)) { > s->header_size = s->offset; > } else { > s->header_size = s->offset + sizeof(struct iphdr); > } > > - s->msgvec = build_l2tpv3_vector(s, MAX_L2TPV3_MSGCNT); > - s->vec = g_new(struct iovec, MAX_L2TPV3_IOVCNT); > - s->header_buf = g_malloc(s->header_size); > - > - qemu_set_nonblock(fd); > - > - s->fd = fd; > - s->counter = 0; > - > - l2tpv3_read_poll(s, true); > + qemu_net_finalize_unified_init(s, fd); > + p->counter = 0; > > snprintf(s->nc.info_str, sizeof(s->nc.info_str), > "l2tpv3: connected"); > diff --git a/net/net.c b/net/net.c > index 6235aabed8..4d9f0deb06 100644 > --- a/net/net.c > +++ b/net/net.c > @@ -959,8 +959,11 @@ static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])( > #ifdef CONFIG_VHOST_NET_USED > [NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user, > #endif > -#ifdef CONFIG_L2TPV3 > - [NET_CLIENT_DRIVER_L2TPV3] = net_init_l2tpv3, > +#ifdef CONFIG_UNIFIED > + [NET_CLIENT_DRIVER_RAW] = net_init_raw, > + [NET_CLIENT_DRIVER_GRE] = net_init_gre, > + [NET_CLIENT_DRIVER_VXLAN] = net_init_vxlan, > + [NET_CLIENT_DRIVER_L2TPV3] = net_init_l2tpv3, > #endif > }; > > @@ -1008,6 +1011,18 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp) > legacy.type = NET_CLIENT_DRIVER_TAP; > legacy.u.tap = opts->u.tap; > break; > + case NET_LEGACY_OPTIONS_TYPE_RAW: > + legacy.type = NET_CLIENT_DRIVER_RAW; > + legacy.u.raw = opts->u.raw; > + break; > + case NET_LEGACY_OPTIONS_TYPE_GRE: > + legacy.type = NET_CLIENT_DRIVER_GRE; > + legacy.u.gre = opts->u.gre; > + break; > + case NET_LEGACY_OPTIONS_TYPE_VXLAN: > + legacy.type = NET_CLIENT_DRIVER_VXLAN; > + legacy.u.vxlan = opts->u.vxlan; > + break; > case NET_LEGACY_OPTIONS_TYPE_L2TPV3: > legacy.type = NET_CLIENT_DRIVER_L2TPV3; > legacy.u.l2tpv3 = opts->u.l2tpv3; > diff --git a/net/queue.c b/net/queue.c > index 9c32abdb8f..1825fa06e8 100644 > --- a/net/queue.c > +++ b/net/queue.c > @@ -25,6 +25,7 @@ > #include "net/queue.h" > #include "qemu/queue.h" > #include "net/net.h" > +#include "packet.h" > > /* The delivery handler may only return zero if it will call > * qemu_net_queue_flush() when it determines that it is once again able > @@ -40,26 +41,6 @@ > * unbounded queueing. > */ > > -struct NetPacket { > - QTAILQ_ENTRY(NetPacket) entry; > - NetClientState *sender; > - unsigned flags; > - int size; > - NetPacketSent *sent_cb; > - uint8_t data[0]; > -}; > - > -struct NetQueue { > - void *opaque; > - uint32_t nq_maxlen; > - uint32_t nq_count; > - NetQueueDeliverFunc *deliver; > - > - QTAILQ_HEAD(packets, NetPacket) packets; > - > - unsigned delivering : 1; > -}; > - > NetQueue *qemu_new_net_queue(NetQueueDeliverFunc *deliver, void *opaque) > { > NetQueue *queue; > diff --git a/net/raw.c b/net/raw.c > new file mode 100644 > index 0000000000..73e2fd9fe3 > --- /dev/null > +++ b/net/raw.c > @@ -0,0 +1,123 @@ > +/* > + * QEMU System Emulator > + * > + * Copyright (c) 2015-2017 Cambridge Greys Limited > + * Copyright (c) 2003-2008 Fabrice Bellard > + * Copyright (c) 2012-2014 Cisco Systems > + * > + * Permission is hereby granted, free of charge, to any person obtaining a copy > + * of this software and associated documentation files (the "Software"), to deal > + * in the Software without restriction, including without limitation the rights > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the Software is > + * furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > + * THE SOFTWARE. > + */ > + > +#include "qemu/osdep.h" > +#include <linux/ip.h> > +#include <netdb.h> > +#include <sys/ioctl.h> > +#include <net/if.h> > +#include "net/net.h" > + #include <sys/socket.h> > +#include <linux/if_packet.h> > +#include <net/ethernet.h> > +#include "clients.h" > +#include "qemu-common.h" > +#include "qemu/error-report.h" > +#include "qemu/option.h" > +#include "qemu/sockets.h" > +#include "qemu/iov.h" > +#include "qemu/main-loop.h" > +#include "unified.h" > + > +static int noop(void *us, uint8_t *buf) > +{ > + return 0; > +} > + > +int net_init_raw(const Netdev *netdev, > + const char *name, > + NetClientState *peer, Error **errp) > +{ > + > + const NetdevRawOptions *raw; > + NetUnifiedState *s; > + NetClientState *nc; > + > + int fd = -1; > + int err; > + > + struct ifreq ifr; > + struct sockaddr_ll sock; > + > + > + nc = qemu_new_unified_net_client(name, peer); > + > + s = DO_UPCAST(NetUnifiedState, nc, nc); > + > + fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); > + if (fd == -1) { > + err = -errno; > + error_report("raw_open : raw socket creation failed, errno = %d", -err); > + goto outerr; > + } > + > + > + s->form_header = NULL; > + s->verify_header = &noop; > + s->queue_head = 0; > + s->queue_tail = 0; > + s->header_mismatch = false; > + s->dgram_dst = NULL; > + s->dst_size = 0; > + > + assert(netdev->type == NET_CLIENT_DRIVER_RAW); > + raw = &netdev->u.raw; > + > + memset(&ifr, 0, sizeof(struct ifreq)); > + strncpy((char *) &ifr.ifr_name, raw->ifname, sizeof(ifr.ifr_name) - 1); > + > + if (ioctl(fd, SIOCGIFINDEX, (void *) &ifr) < 0) { > + err = -errno; > + error_report("SIOCGIFINDEX, failed to get raw interface index for %s", > + raw->ifname); > + goto outerr; > + } > + > + sock.sll_family = AF_PACKET; > + sock.sll_protocol = htons(ETH_P_ALL); > + sock.sll_ifindex = ifr.ifr_ifindex; > + > + if (bind(fd, (struct sockaddr *) &sock, sizeof(struct sockaddr_ll)) < 0) { > + error_report("raw: failed to bind raw socket"); > + err = -errno; > + goto outerr; > + } > + > + s->offset = 0; > + > + qemu_net_finalize_unified_init(s, fd); > + > + snprintf(s->nc.info_str, sizeof(s->nc.info_str), > + "raw: connected"); > + return 0; > +outerr: > + qemu_del_net_client(nc); > + if (fd >= 0) { > + close(fd); > + } > + return -1; > +} > + > diff --git a/net/unified.c b/net/unified.c > new file mode 100644 > index 0000000000..f15d1e1eed > --- /dev/null > +++ b/net/unified.c > @@ -0,0 +1,406 @@ > +/* > + * QEMU System Emulator > + * > + * Copyright (c) 2015-2017 Cambridge Greys Limited > + * Copyright (c) 2012-2014 Cisco Systems > + * Copyright (c) 2003-2008 Fabrice Bellard > + * > + * Permission is hereby granted, free of charge, to any person obtaining a copy > + * of this software and associated documentation files (the "Software"), to deal > + * in the Software without restriction, including without limitation the rights > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the Software is > + * furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > + * THE SOFTWARE. > + */ > + > +#include "qemu/osdep.h" > +#include <linux/ip.h> > +#include <netdb.h> > +#include "net/net.h" > +#include "clients.h" > +#include "qemu-common.h" > +#include "qemu/error-report.h" > +#include "qemu/option.h" > +#include "qemu/sockets.h" > +#include "qemu/iov.h" > +#include "qemu/main-loop.h" > +#include "unified.h" > + > +static void net_unified_send(void *opaque); > +static void unified_writable(void *opaque); > + > +static void unified_update_fd_handler(NetUnifiedState *s) > +{ > + qemu_set_fd_handler(s->fd, > + s->read_poll ? net_unified_send : NULL, > + s->write_poll ? unified_writable : NULL, > + s); > +} > + > +static void unified_read_poll(NetUnifiedState *s, bool enable) > +{ > + if (s->read_poll != enable) { > + s->read_poll = enable; > + unified_update_fd_handler(s); > + } > +} > + > +static void unified_write_poll(NetUnifiedState *s, bool enable) > +{ > + if (s->write_poll != enable) { > + s->write_poll = enable; > + unified_update_fd_handler(s); > + } > +} > + > +static void unified_writable(void *opaque) > +{ > + NetUnifiedState *s = opaque; > + unified_write_poll(s, false); > + qemu_flush_queued_packets(&s->nc); > +} > + > +static void unified_send_completed(NetClientState *nc, ssize_t len) > +{ > + NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc); > + unified_read_poll(s, true); > +} > + > +static void unified_poll(NetClientState *nc, bool enable) > +{ > + NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc); > + unified_write_poll(s, enable); > + unified_read_poll(s, enable); > +} > + > +static ssize_t net_unified_receive_dgram_iov(NetClientState *nc, > + const struct iovec *iov, > + int iovcnt) > +{ > + NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc); > + > + struct msghdr message; > + int ret; > + > + if (iovcnt > MAX_UNIFIED_IOVCNT - 1) { > + error_report( > + "iovec too long %d > %d, change unified.h", > + iovcnt, MAX_UNIFIED_IOVCNT > + ); > + return -1; > + } > + if (s->offset > 0) { > + s->form_header(s); > + memcpy(s->vec + 1, iov, iovcnt * sizeof(struct iovec)); > + s->vec->iov_base = s->header_buf; > + s->vec->iov_len = s->offset; > + message.msg_iovlen = iovcnt + 1; > + } else { > + memcpy(s->vec, iov, iovcnt * sizeof(struct iovec)); > + message.msg_iovlen = iovcnt; > + } > + message.msg_name = s->dgram_dst; > + message.msg_namelen = s->dst_size; > + message.msg_iov = s->vec; > + message.msg_control = NULL; > + message.msg_controllen = 0; > + message.msg_flags = 0; > + do { > + ret = sendmsg(s->fd, &message, 0); > + } while ((ret == -1) && (errno == EINTR)); > + if (ret > 0) { > + ret -= s->offset; > + } else if (ret == 0) { > + /* belt and braces - should not occur on DGRAM > + * we should get an error and never a 0 send > + */ > + ret = iov_size(iov, iovcnt); > + } else { > + /* signal upper layer that socket buffer is full */ > + ret = -errno; > + if (ret == -EAGAIN || ret == -ENOBUFS) { > + unified_write_poll(s, true); > + ret = 0; > + } > + } > + return ret; > +} > + > +static ssize_t net_unified_receive_dgram(NetClientState *nc, > + const uint8_t *buf, > + size_t size) > +{ > + NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc); > + > + struct iovec *vec; > + struct msghdr message; > + ssize_t ret = 0; > + > + vec = s->vec; > + if (s->offset > 0) { > + s->form_header(s); > + vec->iov_base = s->header_buf; > + vec->iov_len = s->offset; > + message.msg_iovlen = 2; > + vec++; > + } else { > + message.msg_iovlen = 1; > + } > + vec->iov_base = (void *) buf; > + vec->iov_len = size; > + message.msg_name = s->dgram_dst; > + message.msg_namelen = s->dst_size; > + message.msg_iov = s->vec; > + message.msg_control = NULL; > + message.msg_controllen = 0; > + message.msg_flags = 0; > + do { > + ret = sendmsg(s->fd, &message, 0); > + } while ((ret == -1) && (errno == EINTR)); > + if (ret > 0) { > + ret -= s->offset; > + } else if (ret == 0) { > + /* belt and braces - should not occur on DGRAM > + * we should get an error and never a 0 send > + */ > + ret = size; > + } else { > + ret = -errno; > + if (ret == -EAGAIN || ret == -ENOBUFS) { > + /* signal upper layer that socket buffer is full */ > + unified_write_poll(s, true); > + ret = 0; > + } > + } > + return ret; > +} > + > + > +static void net_unified_process_queue(NetUnifiedState *s) > +{ > + int size = 0; > + struct iovec *vec; > + bool bad_read; > + int data_size; > + struct mmsghdr *msgvec; > + > + /* go into ring mode only if there is a "pending" tail */ > + if (s->queue_depth > 0) { > + do { > + msgvec = s->msgvec + s->queue_tail; > + if (msgvec->msg_len > 0) { > + data_size = msgvec->msg_len - s->header_size; > + vec = msgvec->msg_hdr.msg_iov; > + if ((data_size > 0) && > + (s->verify_header(s, vec->iov_base) == 0)) { > + if (s->header_size > 0) { > + vec++; > + } > + /* Use the legacy delivery for now, we will > + * switch to using our own ring as a queueing mechanism > + * at a later date > + */ > + size = qemu_send_packet_async( > + &s->nc, > + vec->iov_base, > + data_size, > + unified_send_completed > + ); > + if (size == 0) { > + unified_read_poll(s, false); > + } > + bad_read = false; > + } else { > + bad_read = true; > + if (!s->header_mismatch) { > + /* report error only once */ > + error_report("unified header verification failed"); > + s->header_mismatch = true; > + } > + } > + } else { > + bad_read = true; > + } > + s->queue_tail = (s->queue_tail + 1) % MAX_UNIFIED_MSGCNT; > + s->queue_depth--; > + } while ( > + (s->queue_depth > 0) && > + qemu_can_send_packet(&s->nc) && > + ((size > 0) || bad_read) > + ); > + } > +} > + > +static void net_unified_send(void *opaque) > +{ > + NetUnifiedState *s = opaque; > + int target_count, count; > + struct mmsghdr *msgvec; > + > + /* go into ring mode only if there is a "pending" tail */ > + > + if (s->queue_depth) { > + > + /* The ring buffer we use has variable intake > + * count of how much we can read varies - adjust accordingly > + */ > + > + target_count = MAX_UNIFIED_MSGCNT - s->queue_depth; > + > + /* Ensure we do not overrun the ring when we have > + * a lot of enqueued packets > + */ > + > + if (s->queue_head + target_count > MAX_UNIFIED_MSGCNT) { > + target_count = MAX_UNIFIED_MSGCNT - s->queue_head; > + } > + } else { > + > + /* we do not have any pending packets - we can use > + * the whole message vector linearly instead of using > + * it as a ring > + */ > + > + s->queue_head = 0; > + s->queue_tail = 0; > + target_count = MAX_UNIFIED_MSGCNT; > + } > + > + msgvec = s->msgvec + s->queue_head; > + if (target_count > 0) { > + do { > + count = recvmmsg( > + s->fd, > + msgvec, > + target_count, MSG_DONTWAIT, NULL); > + } while ((count == -1) && (errno == EINTR)); > + if (count < 0) { > + /* Recv error - we still need to flush packets here, > + * (re)set queue head to current position > + */ > + count = 0; > + } > + s->queue_head = (s->queue_head + count) % MAX_UNIFIED_MSGCNT; > + s->queue_depth += count; > + } > + net_unified_process_queue(s); > +} > + > +static void destroy_vector(struct mmsghdr *msgvec, int count, int iovcount) > +{ > + int i, j; > + struct iovec *iov; > + struct mmsghdr *cleanup = msgvec; > + if (cleanup) { > + for (i = 0; i < count; i++) { > + if (cleanup->msg_hdr.msg_iov) { > + iov = cleanup->msg_hdr.msg_iov; > + for (j = 0; j < iovcount; j++) { > + g_free(iov->iov_base); > + iov++; > + } > + g_free(cleanup->msg_hdr.msg_iov); > + } > + cleanup++; > + } > + g_free(msgvec); > + } > +} > + > + > + > +static struct mmsghdr *build_unified_vector(NetUnifiedState *s, int count) > +{ > + int i; > + struct iovec *iov; > + struct mmsghdr *msgvec, *result; > + > + msgvec = g_new(struct mmsghdr, count); > + result = msgvec; > + for (i = 0; i < count ; i++) { > + msgvec->msg_hdr.msg_name = NULL; > + msgvec->msg_hdr.msg_namelen = 0; > + iov = g_new(struct iovec, IOVSIZE); > + msgvec->msg_hdr.msg_iov = iov; > + if (s->header_size > 0) { > + iov->iov_base = g_malloc(s->header_size); > + iov->iov_len = s->header_size; > + iov++ ; > + } > + iov->iov_base = qemu_memalign(BUFFER_ALIGN, BUFFER_SIZE); > + iov->iov_len = BUFFER_SIZE; > + msgvec->msg_hdr.msg_iovlen = 2; > + msgvec->msg_hdr.msg_control = NULL; > + msgvec->msg_hdr.msg_controllen = 0; > + msgvec->msg_hdr.msg_flags = 0; > + msgvec++; > + } > + return result; > +} > + > +static void net_unified_cleanup(NetClientState *nc) > +{ > + NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc); > + qemu_purge_queued_packets(nc); > + unified_read_poll(s, false); > + unified_write_poll(s, false); > + if (s->fd >= 0) { > + close(s->fd); > + } > + if (s->header_size > 0) { > + destroy_vector(s->msgvec, MAX_UNIFIED_MSGCNT, IOVSIZE); > + } else { > + destroy_vector(s->msgvec, MAX_UNIFIED_MSGCNT, 1); > + } > + g_free(s->vec); > + if (s->header_buf != NULL) { > + g_free(s->header_buf); > + } > + if (s->dgram_dst != NULL) { > + g_free(s->dgram_dst); > + } > +} > + > +static NetClientInfo net_unified_info = { > + /* we share this one for all types for now, wrong I know :) */ > + .type = NET_CLIENT_DRIVER_L2TPV3, > + .size = sizeof(NetUnifiedState), > + .receive = net_unified_receive_dgram, > + .receive_iov = net_unified_receive_dgram_iov, > + .poll = unified_poll, > + .cleanup = net_unified_cleanup, > +}; > + > +NetClientState *qemu_new_unified_net_client(const char *name, > + NetClientState *peer) { > + return qemu_new_net_client(&net_unified_info, peer, "unified", name); > +} > + > +void qemu_net_finalize_unified_init(NetUnifiedState *s, int fd) > +{ > + > + s->msgvec = build_unified_vector(s, MAX_UNIFIED_MSGCNT); > + s->vec = g_new(struct iovec, MAX_UNIFIED_IOVCNT); > + if (s->header_size > 0) { > + s->header_buf = g_malloc(s->header_size); > + } else { > + s->header_buf = NULL; > + } > + qemu_set_nonblock(fd); > + > + s->fd = fd; > + unified_read_poll(s, true); > + > +} > + > diff --git a/net/unified.h b/net/unified.h > new file mode 100644 > index 0000000000..97ec743f0e > --- /dev/null > +++ b/net/unified.h > @@ -0,0 +1,118 @@ > +/* > + * QEMU System Emulator > + * > + * Copyright (c) 2015-2017 Cambridge Greys Limited > + * Copyright (c) 2012-2014 Cisco Systems > + * Copyright (c) 2003-2008 Fabrice Bellard > + * > + * Permission is hereby granted, free of charge, to any person obtaining a copy > + * of this software and associated documentation files (the "Software"), to deal > + * in the Software without restriction, including without limitation the rights > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the Software is > + * furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > + * THE SOFTWARE. > + */ > + > +#include "qemu/osdep.h" > + > + > +#define BUFFER_ALIGN sysconf(_SC_PAGESIZE) > +#define BUFFER_SIZE 2048 > +#define IOVSIZE 2 > +#define MAX_UNIFIED_MSGCNT 64 > +#define MAX_UNIFIED_IOVCNT (MAX_UNIFIED_MSGCNT * IOVSIZE) > + > +#ifndef QEMU_NET_UNIFIED_H > +#define QEMU_NET_UNIFIED_H > + > +typedef struct NetUnifiedState { > + NetClientState nc; > + > + int fd; > + > + /* > + * these are used for xmit - that happens packet a time > + * and for first sign of life packet (easier to parse that once) > + */ > + > + uint8_t *header_buf; > + struct iovec *vec; > + > + /* > + * these are used for receive - try to "eat" up to 32 packets at a time > + */ > + > + struct mmsghdr *msgvec; > + > + /* > + * peer address > + */ > + > + struct sockaddr_storage *dgram_dst; > + uint32_t dst_size; > + > + /* > + * Internal Queue > + */ > + > + /* > + * DOS avoidance in error handling > + */ > + > + /* Easier to keep l2tpv3 specific */ > + > + bool header_mismatch; > + > + /* > + * > + * Ring buffer handling > + * > + */ > + > + int queue_head; > + int queue_tail; > + int queue_depth; > + > + /* > + * Offset to data - common for all protocols > + */ > + > + uint32_t offset; > + > + /* > + * Header size - common for all protocols > + */ > + > + uint32_t header_size; > + /* Poll Control */ > + > + bool read_poll; > + bool write_poll; > + > + /* Parameters */ > + > + void *params; > + > + /* header forming functions */ > + > + int (*verify_header)(void *s, uint8_t *buf); > + void (*form_header)(void *s); > + > +} NetUnifiedState; > + > +extern NetClientState *qemu_new_unified_net_client(const char *name, > + NetClientState *peer); > + > +extern void qemu_net_finalize_unified_init(NetUnifiedState *s, int fd); > +#endif > diff --git a/net/vxlan-static.c b/net/vxlan-static.c > new file mode 100644 > index 0000000000..11265897fb > --- /dev/null > +++ b/net/vxlan-static.c > @@ -0,0 +1,229 @@ > +/* > + * QEMU System Emulator > + * > + * Copyright (c) 2003-2008 Fabrice Bellard > + * Copyright (c) 2012-2014 Cisco Systems > + * > + * Permission is hereby granted, free of charge, to any person obtaining a copy > + * of this software and associated documentation files (the "Software"), to deal > + * in the Software without restriction, including without limitation the rights > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the Software is > + * furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > + * THE SOFTWARE. > + */ > + > +#include "qemu/osdep.h" > +#include <linux/ip.h> > +#include <netdb.h> > +#include "net/net.h" > +#include "clients.h" > +#include "qemu-common.h" > +#include "qemu/error-report.h" > +#include "qemu/option.h" > +#include "qemu/sockets.h" > +#include "qemu/iov.h" > +#include "qemu/main-loop.h" > +#include "unified.h" > + > + > +/* vxlan header RRRRIRRR in top byte, 3 bytes reserved */ > +#define HEADER_RESERVED 24 > +#define VNID_RESERVED 8 > +#define VXLAN_BIT 3 > +#define VXLAN_DATA_PACKET (1 << (HEADER_RESERVED + VXLAN_BIT)) > +#define VNID_OFFSET 4 > +#define VXLAN_HEADER_SIZE 8 > + > +typedef struct VXLANTunnelParams { > + > + /* Rather skimpy - VXLAN is very simple at present */ > + > + uint32_t vnid; > + > +} VXLANTunnelParams; > + > + > + > +static void vxlan_form_header(void *us) > +{ > + NetUnifiedState *s = (NetUnifiedState *) us; > + VXLANTunnelParams *p = (VXLANTunnelParams *) s->params; > + > + stl_be_p((uint32_t *) s->header_buf, VXLAN_DATA_PACKET); > + stl_be_p( > + (uint32_t *) (s->header_buf + VNID_OFFSET), > + p->vnid > + ); > +} > +static int vxlan_verify_header(void *us, uint8_t *buf) > +{ > + > + NetUnifiedState *s = (NetUnifiedState *) us; > + VXLANTunnelParams *p = (VXLANTunnelParams *) s->params; > + uint32_t header; > + uint32_t vnid; > + > + header = ldl_be_p(buf); > + if ((header & VXLAN_DATA_PACKET) == 0) { > + if (!s->header_mismatch) { > + error_report( > + "header type disagreement, expecting %0x, got %0x", > + VXLAN_DATA_PACKET, header > + ); > + } > + return -1; > + } > + > + vnid = ldl_be_p(buf + VNID_OFFSET); > + if (vnid != p->vnid) { > + if (!s->header_mismatch) { > + error_report("unknown vnid id %0x, expecting %0x", vnid, p->vnid); > + } > + return -1; > + } > + return 0; > +} > + > +int net_init_vxlan(const Netdev *netdev, > + const char *name, > + NetClientState *peer, Error **errp) > +{ > + /* FIXME error_setg(errp, ...) on failure */ > + const NetdevVXLANOptions *vxlan; > + NetUnifiedState *s; > + NetClientState *nc; > + VXLANTunnelParams *p; > + > + int fd = -1, gairet; > + struct addrinfo hints; > + struct addrinfo *result = NULL; > + const char *default_port = "4789"; > + const char *srcport; > + const char *dstport; > + > + nc = qemu_new_unified_net_client(name, peer); > + > + s = DO_UPCAST(NetUnifiedState, nc, nc); > + > + p = g_malloc(sizeof(VXLANTunnelParams)); > + > + s->params = p; > + > + s->form_header = &vxlan_form_header; > + s->verify_header = &vxlan_verify_header; > + s->queue_head = 0; > + s->queue_tail = 0; > + s->header_mismatch = false; > + s->header_size = VXLAN_HEADER_SIZE; > + > + assert(netdev->type == NET_CLIENT_DRIVER_VXLAN); > + vxlan = &netdev->u.vxlan; > + > + if (vxlan->has_srcport) { > + srcport = vxlan->srcport; > + } else { > + srcport = default_port; > + } > + > + if (vxlan->has_dstport) { > + dstport = vxlan->dstport; > + } else { > + dstport = default_port; > + } > + s->offset = VXLAN_HEADER_SIZE; > + > + /* we store it shifted to the correct position, so we do not need > + * to recompute it each time > + */ > + > + p->vnid = vxlan->vnid << VNID_RESERVED; > + > + memset(&hints, 0, sizeof(hints)); > + > + if (vxlan->has_ipv6) { > + hints.ai_family = AF_INET6; > + } else { > + hints.ai_family = AF_INET; > + } > + > + hints.ai_socktype = SOCK_DGRAM; > + hints.ai_protocol = 0; > + > + gairet = getaddrinfo(vxlan->src, srcport, &hints, &result); > + > + if ((gairet != 0) || (result == NULL)) { > + error_report( > + "vxlan_open : could not resolve src, errno = %s", > + gai_strerror(gairet) > + ); > + goto outerr; > + } > + fd = socket(result->ai_family, result->ai_socktype, result->ai_protocol); > + if (fd == -1) { > + fd = -errno; > + error_report("vxlan_open : socket creation failed, errno = %d", -fd); > + goto outerr; > + } > + if (bind(fd, (struct sockaddr *) result->ai_addr, result->ai_addrlen)) { > + error_report("vxlan_open : could not bind socket err=%i", errno); > + goto outerr; > + } > + if (result) { > + freeaddrinfo(result); > + } > + > + memset(&hints, 0, sizeof(hints)); > + > + if (vxlan->has_ipv6) { > + hints.ai_family = AF_INET6; > + } else { > + hints.ai_family = AF_INET; > + } > + hints.ai_socktype = SOCK_DGRAM; > + hints.ai_protocol = 0; > + > + result = NULL; > + gairet = getaddrinfo(vxlan->dst, dstport, &hints, &result); > + if ((gairet != 0) || (result == NULL)) { > + error_report( > + "vxlan_open : could not resolve dst, error = %s", > + gai_strerror(gairet) > + ); > + goto outerr; > + } > + > + s->dgram_dst = g_new0(struct sockaddr_storage, 1); > + memcpy(s->dgram_dst, result->ai_addr, result->ai_addrlen); > + s->dst_size = result->ai_addrlen; > + > + if (result) { > + freeaddrinfo(result); > + } > + > + qemu_net_finalize_unified_init(s, fd); > + > + snprintf(s->nc.info_str, sizeof(s->nc.info_str), > + "vxlan: connected"); > + return 0; > +outerr: > + qemu_del_net_client(nc); > + if (fd >= 0) { > + close(fd); > + } > + if (result) { > + freeaddrinfo(result); > + } > + return -1; > +} > + > diff --git a/qapi-schema.json b/qapi-schema.json > index ab438ead70..40ef09dded 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -2785,6 +2785,57 @@ > ## > { 'command': 'migrate_set_speed', 'data': {'value': 'int'} } > > + > +## > +# @NetdevRawOptions: > +# > +# Connect the VLAN to an network interface using raw sockets > +# > +# @ifname: network interface name > +# > + > +# Since 2.9 > +## > +{ 'struct': 'NetdevRawOptions', > + 'data': { > + 'ifname': 'str' > +} } > + > +## > +# @NetdevGREOptions: > +# > +# Connect the VLAN to Ethernet over Ethernet over GRE (GRETAP) tunnel > +# > +# @src: source address > +# > +# @dst: destination address > +# > +# @ipv6: force the use of ipv6 > +# > +# @sequence: have sequence counter > +# > +# @pinsequence: pin sequence counter to zero - > +# workaround for buggy implementations or > +# networks with packet reorder > +# > +# @txkey: 32 bit transmit key > +# > +# @rxkey: 32 bit receive key > +# > +# Note - gre checksums are not supported at present > +# > +# > +# Since 2.9 > +## > +{ 'struct': 'NetdevGREOptions', > + 'data': { > + 'src': 'str', > + 'dst': 'str', > + '*ipv6': 'bool', > + '*sequence': 'bool', > + '*pinsequence': 'bool', > + '*txkey': 'uint32', > + '*rxkey': 'uint32' } } > ## > # @migrate-set-cache-size: > # > @@ -3849,6 +3900,33 @@ > '*offset': 'uint32' } } > > ## > +# @NetdevVXLANOptions: > +# > +# Connect the VLAN to a VXLAN Static Tunnel > +# > +# @src: source address > +# > +# @dst: destination address > +# > +# @vnid: Virtual Network Identifier > +# > +# @srcport: source port > +# > +# @dstport: destination port > +# > +# @ipv6: force the use of ipv6 > +## > +# Since 2.9 > +{ 'struct': 'NetdevVXLANOptions', > + 'data': { > + 'src': 'str', > + 'dst': 'str', > + '*srcport': 'str', > + '*dstport': 'str', > + '*ipv6': 'bool', > + 'vnid': 'uint32' } } > + > +## > # @NetdevVdeOptions: > # > # Connect the VLAN to a vde switch running on the host. > @@ -3965,7 +4043,8 @@ > # Since: 2.7 > ## > { 'enum': 'NetClientDriver', > - 'data': [ 'none', 'nic', 'user', 'tap', 'l2tpv3', 'socket', 'vde', 'dump', > + 'data': [ 'none', 'nic', 'user', 'tap', 'l2tpv3', 'raw', 'gre', > + 'vxlan', 'socket', 'vde', 'dump', > 'bridge', 'hubport', 'netmap', 'vhost-user' ] } > > ## > @@ -3980,6 +4059,8 @@ > # Since: 1.2 > # > # 'l2tpv3' - since 2.1 > +# 'gre' - since 2.9 > +# 'raw' - since 2.9 > ## > { 'union': 'Netdev', > 'base': { 'id': 'str', 'type': 'NetClientDriver' }, > @@ -3990,6 +4071,9 @@ > 'user': 'NetdevUserOptions', > 'tap': 'NetdevTapOptions', > 'l2tpv3': 'NetdevL2TPv3Options', > + 'raw': 'NetdevRawOptions', > + 'gre': 'NetdevGREOptions', > + 'vxlan': 'NetdevVXLANOptions', > 'socket': 'NetdevSocketOptions', > 'vde': 'NetdevVdeOptions', > 'dump': 'NetdevDumpOptions', > @@ -4027,7 +4111,7 @@ > ## > { 'enum': 'NetLegacyOptionsType', > 'data': ['none', 'nic', 'user', 'tap', 'l2tpv3', 'socket', 'vde', > - 'dump', 'bridge', 'netmap', 'vhost-user'] } > + 'raw', 'gre', 'vxlan', 'dump', 'bridge', 'netmap', 'vhost-user'] } > > ## > # @NetLegacyOptions: > @@ -4045,6 +4129,9 @@ > 'user': 'NetdevUserOptions', > 'tap': 'NetdevTapOptions', > 'l2tpv3': 'NetdevL2TPv3Options', > + 'raw': 'NetdevRawOptions', > + 'gre': 'NetdevGREOptions', > + 'vxlan': 'NetdevVXLANOptions', > 'socket': 'NetdevSocketOptions', > 'vde': 'NetdevVdeOptions', > 'dump': 'NetdevDumpOptions', -- Anton R. Ivanov Cambridge Greys Limited, England and Wales company No 10273661 http://www.cambridgegreys.com/
On Tue, Jul 18, 2017 at 07:06:27AM +0100, anton.ivanov@cambridgegreys.com wrote: > From: Anton Ivanov <anton.ivanov@cambridgegreys.com> > > 1. Creates a common recvmmsg backend for socket transports > 2. Migrates L2TPv3 to the new backend > 3. Adds gre socket transport - a vm can attach directly to GRE > 4. Adds raw socket transport - a vm can attach directly to an > Ethernet interface > 5. Adds simplistic static VXLAN tunnel transport (no > control plane). > 6. Sets up some of the infrastructure for future addition of > sendmmsg This list of features is a really strong sign that you should split this patch up into a patch series with multiple commits, each commit adding / changing a single feature. Especially keep refactoring of existing code completely separate from adding of new features. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
OK. I can split it into series before next submission. A. On 18/07/17 08:27, Daniel P. Berrange wrote: > On Tue, Jul 18, 2017 at 07:06:27AM +0100, anton.ivanov@cambridgegreys.com wrote: >> From: Anton Ivanov <anton.ivanov@cambridgegreys.com> >> >> 1. Creates a common recvmmsg backend for socket transports >> 2. Migrates L2TPv3 to the new backend >> 3. Adds gre socket transport - a vm can attach directly to GRE >> 4. Adds raw socket transport - a vm can attach directly to an >> Ethernet interface >> 5. Adds simplistic static VXLAN tunnel transport (no >> control plane). >> 6. Sets up some of the infrastructure for future addition of >> sendmmsg > This list of features is a really strong sign that you should split > this patch up into a patch series with multiple commits, each commit > adding / changing a single feature. Especially keep refactoring of > existing code completely separate from adding of new features. > > Regards, > Daniel -- Anton R. Ivanov Cambridge Greys Limited, England and Wales company No 10273661 http://www.cambridgegreys.com/
Hi, This series failed automatic build test. Please find the testing commands and their output below. If you have docker installed, you can probably reproduce it locally. Subject: [Qemu-devel] [PATCH] Unified Socket Transport Message-id: 20170718060627.2107-1-anton.ivanov@cambridgegreys.com Type: series === TEST SCRIPT BEGIN === #!/bin/bash set -e git submodule update --init dtc # Let docker tests dump environment info export SHOW_ENV=1 export J=8 time make docker-test-quick@centos6 time make docker-test-build@min-glib time make docker-test-mingw@fedora === TEST SCRIPT END === Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384 Switched to a new branch 'test' 6ed9046 Unified Socket Transport === OUTPUT BEGIN === Submodule 'dtc' (git://git.qemu-project.org/dtc.git) registered for path 'dtc' Cloning into '/var/tmp/patchew-tester-tmp-cq6cnfju/src/dtc'... Submodule path 'dtc': checked out '558cd81bdd432769b59bff01240c44f82cfb1a9d' BUILD centos6 make[1]: Entering directory '/var/tmp/patchew-tester-tmp-cq6cnfju/src' ARCHIVE qemu.tgz ARCHIVE dtc.tgz COPY RUNNER RUN test-quick in qemu:centos6 Packages installed: SDL-devel-1.2.14-7.el6_7.1.x86_64 bison-2.4.1-5.el6.x86_64 ccache-3.1.6-2.el6.x86_64 epel-release-6-8.noarch flex-2.5.35-9.el6.x86_64 gcc-4.4.7-18.el6.x86_64 git-1.7.1-8.el6.x86_64 glib2-devel-2.28.8-9.el6.x86_64 libfdt-devel-1.4.0-1.el6.x86_64 make-3.81-23.el6.x86_64 package g++ is not installed pixman-devel-0.32.8-1.el6.x86_64 tar-1.23-15.el6_8.x86_64 zlib-devel-1.2.3-29.el6.x86_64 Environment variables: PACKAGES=libfdt-devel ccache tar git make gcc g++ flex bison zlib-devel glib2-devel SDL-devel pixman-devel epel-release HOSTNAME=d5bfd3078ba3 TERM=xterm MAKEFLAGS= -j8 HISTSIZE=1000 J=8 USER=root CCACHE_DIR=/var/tmp/ccache EXTRA_CONFIGURE_OPTS= V= SHOW_ENV=1 MAIL=/var/spool/mail/root PATH=/usr/lib/ccache:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ LANG=en_US.UTF-8 TARGET_LIST= HISTCONTROL=ignoredups SHLVL=1 HOME=/root TEST_DIR=/tmp/qemu-test LOGNAME=root LESSOPEN=||/usr/bin/lesspipe.sh %s FEATURES= dtc DEBUG= G_BROKEN_FILENAMES=1 CCACHE_HASHDIR= _=/usr/bin/env Configure options: --enable-werror --target-list=x86_64-softmmu,aarch64-softmmu --prefix=/var/tmp/qemu-build/install No C++ compiler available; disabling C++ specific optional code Install prefix /var/tmp/qemu-build/install BIOS directory /var/tmp/qemu-build/install/share/qemu binary directory /var/tmp/qemu-build/install/bin library directory /var/tmp/qemu-build/install/lib module directory /var/tmp/qemu-build/install/lib/qemu libexec directory /var/tmp/qemu-build/install/libexec include directory /var/tmp/qemu-build/install/include config directory /var/tmp/qemu-build/install/etc local state directory /var/tmp/qemu-build/install/var Manual directory /var/tmp/qemu-build/install/share/man ELF interp prefix /usr/gnemul/qemu-%M Source path /tmp/qemu-test/src C compiler cc Host C compiler cc C++ compiler Objective-C compiler cc ARFLAGS rv CFLAGS -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g QEMU_CFLAGS -I/usr/include/pixman-1 -I$(SRC_PATH)/dtc/libfdt -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -fPIE -DPIE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wendif-labels -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-all LDFLAGS -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g make make install install python python -B smbd /usr/sbin/smbd module support no host CPU x86_64 host big endian no target list x86_64-softmmu aarch64-softmmu gprof enabled no sparse enabled no strip binaries yes profiler no static build no pixman system SDL support yes (1.2.14) GTK support no GTK GL support no VTE support no TLS priority NORMAL GNUTLS support no GNUTLS rnd no libgcrypt no libgcrypt kdf no nettle no nettle kdf no libtasn1 no curses support no virgl support no curl support no mingw32 support no Audio drivers oss Block whitelist (rw) Block whitelist (ro) VirtFS support no VNC support yes VNC SASL support no VNC JPEG support no VNC PNG support no xen support no brlapi support no bluez support no Documentation no PIE yes vde support no netmap support no Linux AIO support no ATTR/XATTR support yes Install blobs yes KVM support yes HAX support no TCG support yes TCG debug enabled no TCG interpreter no RDMA support no fdt support yes preadv support yes fdatasync yes madvise yes posix_madvise yes libcap-ng support no vhost-net support yes vhost-scsi support yes vhost-vsock support yes Trace backends log spice support no rbd support no xfsctl support no smartcard support no libusb no usb net redir no OpenGL support no OpenGL dmabufs no libiscsi support no libnfs support no build guest agent yes QGA VSS support no QGA w32 disk info no QGA MSI support no seccomp support no coroutine backend ucontext coroutine pool yes debug stack usage no GlusterFS support no gcov gcov gcov enabled no TPM support yes libssh2 support no TPM passthrough yes QOM debugging yes Live block migration yes lzo support no snappy support no bzip2 support no NUMA host support no tcmalloc support no jemalloc support no avx2 optimization no replication support yes VxHS block device no mkdir -p dtc/libfdt mkdir -p dtc/tests GEN x86_64-softmmu/config-devices.mak.tmp GEN aarch64-softmmu/config-devices.mak.tmp GEN config-host.h GEN qemu-options.def GEN qmp-commands.h GEN qapi-types.h GEN qapi-visit.h GEN qapi-event.h GEN aarch64-softmmu/config-devices.mak GEN x86_64-softmmu/config-devices.mak GEN qmp-marshal.c GEN qapi-types.c GEN qapi-visit.c GEN qapi-event.c GEN qmp-introspect.h GEN qmp-introspect.c GEN trace/generated-tcg-tracers.h GEN trace/generated-helpers-wrappers.h GEN trace/generated-helpers.h GEN trace/generated-helpers.c GEN module_block.h GEN tests/test-qapi-types.h GEN tests/test-qapi-visit.h GEN tests/test-qmp-commands.h GEN tests/test-qapi-event.h GEN tests/test-qmp-introspect.h GEN trace-root.h GEN util/trace.h GEN crypto/trace.h GEN io/trace.h GEN migration/trace.h GEN block/trace.h GEN chardev/trace.h GEN hw/block/trace.h GEN hw/block/dataplane/trace.h GEN hw/char/trace.h GEN hw/intc/trace.h GEN hw/net/trace.h GEN hw/virtio/trace.h GEN hw/audio/trace.h GEN hw/misc/trace.h GEN hw/usb/trace.h GEN hw/scsi/trace.h GEN hw/nvram/trace.h GEN hw/display/trace.h GEN hw/input/trace.h GEN hw/timer/trace.h GEN hw/dma/trace.h GEN hw/sparc/trace.h GEN hw/sd/trace.h GEN hw/isa/trace.h GEN hw/mem/trace.h GEN hw/i386/trace.h GEN hw/i386/xen/trace.h GEN hw/9pfs/trace.h GEN hw/ppc/trace.h GEN hw/pci/trace.h GEN hw/s390x/trace.h GEN hw/vfio/trace.h GEN hw/acpi/trace.h GEN hw/arm/trace.h GEN hw/alpha/trace.h GEN hw/xen/trace.h GEN ui/trace.h GEN audio/trace.h GEN net/trace.h GEN target/arm/trace.h GEN target/i386/trace.h GEN target/mips/trace.h GEN target/sparc/trace.h GEN target/s390x/trace.h GEN target/ppc/trace.h GEN qom/trace.h GEN linux-user/trace.h GEN qapi/trace.h GEN accel/tcg/trace.h GEN accel/kvm/trace.h GEN nbd/trace.h GEN trace-root.c GEN util/trace.c GEN crypto/trace.c GEN io/trace.c GEN migration/trace.c GEN block/trace.c GEN chardev/trace.c GEN hw/block/trace.c GEN hw/block/dataplane/trace.c GEN hw/char/trace.c GEN hw/intc/trace.c GEN hw/net/trace.c GEN hw/virtio/trace.c GEN hw/audio/trace.c GEN hw/misc/trace.c GEN hw/usb/trace.c GEN hw/scsi/trace.c GEN hw/nvram/trace.c GEN hw/display/trace.c GEN hw/input/trace.c GEN hw/timer/trace.c GEN hw/dma/trace.c GEN hw/sparc/trace.c GEN hw/sd/trace.c GEN hw/isa/trace.c GEN hw/mem/trace.c GEN hw/i386/trace.c GEN hw/i386/xen/trace.c GEN hw/9pfs/trace.c GEN hw/ppc/trace.c GEN hw/pci/trace.c GEN hw/s390x/trace.c GEN hw/vfio/trace.c GEN hw/acpi/trace.c GEN hw/arm/trace.c GEN hw/alpha/trace.c GEN hw/xen/trace.c GEN ui/trace.c GEN audio/trace.c GEN net/trace.c GEN target/arm/trace.c GEN target/i386/trace.c GEN target/mips/trace.c GEN target/sparc/trace.c GEN target/s390x/trace.c GEN target/ppc/trace.c GEN qom/trace.c GEN linux-user/trace.c GEN qapi/trace.c GEN accel/tcg/trace.c GEN accel/kvm/trace.c GEN nbd/trace.c GEN config-all-devices.mak DEP /tmp/qemu-test/src/dtc/tests/dumptrees.c DEP /tmp/qemu-test/src/dtc/tests/trees.S DEP /tmp/qemu-test/src/dtc/tests/testutils.c DEP /tmp/qemu-test/src/dtc/tests/value-labels.c DEP /tmp/qemu-test/src/dtc/tests/asm_tree_dump.c DEP /tmp/qemu-test/src/dtc/tests/truncated_property.c DEP /tmp/qemu-test/src/dtc/tests/check_path.c DEP /tmp/qemu-test/src/dtc/tests/overlay_bad_fixup.c DEP /tmp/qemu-test/src/dtc/tests/overlay.c DEP /tmp/qemu-test/src/dtc/tests/subnode_iterate.c DEP /tmp/qemu-test/src/dtc/tests/property_iterate.c DEP /tmp/qemu-test/src/dtc/tests/utilfdt_test.c DEP /tmp/qemu-test/src/dtc/tests/path_offset_aliases.c DEP /tmp/qemu-test/src/dtc/tests/integer-expressions.c DEP /tmp/qemu-test/src/dtc/tests/add_subnode_with_nops.c DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_unordered.c DEP /tmp/qemu-test/src/dtc/tests/dtb_reverse.c DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_ordered.c DEP /tmp/qemu-test/src/dtc/tests/extra-terminating-null.c DEP /tmp/qemu-test/src/dtc/tests/incbin.c DEP /tmp/qemu-test/src/dtc/tests/boot-cpuid.c DEP /tmp/qemu-test/src/dtc/tests/phandle_format.c DEP /tmp/qemu-test/src/dtc/tests/path-references.c DEP /tmp/qemu-test/src/dtc/tests/references.c DEP /tmp/qemu-test/src/dtc/tests/string_escapes.c DEP /tmp/qemu-test/src/dtc/tests/propname_escapes.c DEP /tmp/qemu-test/src/dtc/tests/appendprop2.c DEP /tmp/qemu-test/src/dtc/tests/appendprop1.c DEP /tmp/qemu-test/src/dtc/tests/del_node.c DEP /tmp/qemu-test/src/dtc/tests/del_property.c DEP /tmp/qemu-test/src/dtc/tests/setprop.c DEP /tmp/qemu-test/src/dtc/tests/set_name.c DEP /tmp/qemu-test/src/dtc/tests/rw_tree1.c DEP /tmp/qemu-test/src/dtc/tests/open_pack.c DEP /tmp/qemu-test/src/dtc/tests/nopulate.c DEP /tmp/qemu-test/src/dtc/tests/mangle-layout.c DEP /tmp/qemu-test/src/dtc/tests/move_and_save.c DEP /tmp/qemu-test/src/dtc/tests/sw_tree1.c DEP /tmp/qemu-test/src/dtc/tests/nop_node.c DEP /tmp/qemu-test/src/dtc/tests/nop_property.c DEP /tmp/qemu-test/src/dtc/tests/setprop_inplace.c DEP /tmp/qemu-test/src/dtc/tests/stringlist.c DEP /tmp/qemu-test/src/dtc/tests/addr_size_cells.c DEP /tmp/qemu-test/src/dtc/tests/notfound.c DEP /tmp/qemu-test/src/dtc/tests/sized_cells.c DEP /tmp/qemu-test/src/dtc/tests/char_literal.c DEP /tmp/qemu-test/src/dtc/tests/get_alias.c DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_compatible.c DEP /tmp/qemu-test/src/dtc/tests/node_check_compatible.c DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_phandle.c DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_prop_value.c DEP /tmp/qemu-test/src/dtc/tests/parent_offset.c DEP /tmp/qemu-test/src/dtc/tests/supernode_atdepth_offset.c DEP /tmp/qemu-test/src/dtc/tests/get_path.c DEP /tmp/qemu-test/src/dtc/tests/get_phandle.c DEP /tmp/qemu-test/src/dtc/tests/getprop.c DEP /tmp/qemu-test/src/dtc/tests/get_name.c DEP /tmp/qemu-test/src/dtc/tests/path_offset.c DEP /tmp/qemu-test/src/dtc/tests/subnode_offset.c DEP /tmp/qemu-test/src/dtc/tests/find_property.c DEP /tmp/qemu-test/src/dtc/tests/root_node.c DEP /tmp/qemu-test/src/dtc/tests/get_mem_rsv.c DEP /tmp/qemu-test/src/dtc/libfdt/fdt_overlay.c DEP /tmp/qemu-test/src/dtc/libfdt/fdt_addresses.c DEP /tmp/qemu-test/src/dtc/libfdt/fdt_empty_tree.c DEP /tmp/qemu-test/src/dtc/libfdt/fdt_strerror.c DEP /tmp/qemu-test/src/dtc/libfdt/fdt_rw.c DEP /tmp/qemu-test/src/dtc/libfdt/fdt_sw.c DEP /tmp/qemu-test/src/dtc/libfdt/fdt_wip.c DEP /tmp/qemu-test/src/dtc/libfdt/fdt_ro.c DEP /tmp/qemu-test/src/dtc/libfdt/fdt.c DEP /tmp/qemu-test/src/dtc/util.c DEP /tmp/qemu-test/src/dtc/fdtget.c DEP /tmp/qemu-test/src/dtc/fdtput.c DEP /tmp/qemu-test/src/dtc/fdtdump.c LEX convert-dtsv0-lexer.lex.c DEP /tmp/qemu-test/src/dtc/srcpos.c BISON dtc-parser.tab.c DEP /tmp/qemu-test/src/dtc/treesource.c LEX dtc-lexer.lex.c DEP /tmp/qemu-test/src/dtc/livetree.c DEP /tmp/qemu-test/src/dtc/fstree.c DEP /tmp/qemu-test/src/dtc/flattree.c DEP /tmp/qemu-test/src/dtc/dtc.c DEP /tmp/qemu-test/src/dtc/data.c DEP /tmp/qemu-test/src/dtc/checks.c DEP convert-dtsv0-lexer.lex.c DEP dtc-parser.tab.c DEP dtc-lexer.lex.c CHK version_gen.h UPD version_gen.h DEP /tmp/qemu-test/src/dtc/util.c CC libfdt/fdt.o CC libfdt/fdt_ro.o CC libfdt/fdt_wip.o CC libfdt/fdt_strerror.o CC libfdt/fdt_sw.o CC libfdt/fdt_empty_tree.o CC libfdt/fdt_rw.o CC libfdt/fdt_addresses.o CC libfdt/fdt_overlay.o AR libfdt/libfdt.a ar: creating libfdt/libfdt.a a - libfdt/fdt.o a - libfdt/fdt_ro.o a - libfdt/fdt_wip.o a - libfdt/fdt_sw.o a - libfdt/fdt_rw.o a - libfdt/fdt_strerror.o a - libfdt/fdt_empty_tree.o a - libfdt/fdt_addresses.o a - libfdt/fdt_overlay.o CC tests/qemu-iotests/socket_scm_helper.o GEN qga/qapi-generated/qga-qapi-types.h GEN qga/qapi-generated/qga-qapi-visit.h GEN qga/qapi-generated/qga-qmp-commands.h GEN qga/qapi-generated/qga-qapi-types.c GEN qga/qapi-generated/qga-qapi-visit.c GEN qga/qapi-generated/qga-qmp-marshal.c CC qmp-introspect.o CC qapi-types.o CC qapi-visit.o CC qapi-event.o CC qapi/qapi-dealloc-visitor.o CC qapi/qobject-input-visitor.o CC qapi/qapi-visit-core.o CC qapi/qobject-output-visitor.o CC qapi/qmp-registry.o CC qapi/qmp-dispatch.o CC qapi/string-input-visitor.o CC qapi/string-output-visitor.o CC qapi/opts-visitor.o CC qapi/qapi-clone-visitor.o CC qapi/qmp-event.o CC qapi/qapi-util.o CC qobject/qnull.o CC qobject/qnum.o CC qobject/qstring.o CC qobject/qdict.o CC qobject/qlist.o CC qobject/qbool.o CC qobject/qjson.o CC qobject/qobject.o CC qobject/json-lexer.o CC qobject/json-streamer.o CC qobject/json-parser.o CC trace/control.o CC trace/qmp.o CC util/osdep.o CC util/cutils.o CC util/unicode.o CC util/qemu-timer-common.o CC util/bufferiszero.o CC util/lockcnt.o CC util/aiocb.o CC util/async.o CC util/thread-pool.o CC util/qemu-timer.o CC util/main-loop.o CC util/iohandler.o CC util/aio-posix.o CC util/compatfd.o CC util/event_notifier-posix.o CC util/mmap-alloc.o CC util/oslib-posix.o CC util/qemu-openpty.o CC util/qemu-thread-posix.o CC util/memfd.o CC util/envlist.o CC util/path.o CC util/module.o CC util/host-utils.o CC util/bitmap.o CC util/bitops.o CC util/hbitmap.o CC util/fifo8.o CC util/acl.o CC util/cacheinfo.o CC util/error.o CC util/qemu-error.o CC util/id.o CC util/iov.o CC util/qemu-sockets.o CC util/qemu-config.o CC util/uri.o CC util/notify.o CC util/qemu-option.o CC util/qemu-progress.o CC util/keyval.o CC util/hexdump.o CC util/crc32c.o CC util/uuid.o CC util/throttle.o CC util/getauxval.o CC util/readline.o CC util/rcu.o CC util/qemu-coroutine.o CC util/qemu-coroutine-lock.o CC util/qemu-coroutine-io.o CC util/qemu-coroutine-sleep.o CC util/coroutine-ucontext.o CC util/buffer.o CC util/timed-average.o CC util/base64.o CC util/log.o CC util/qdist.o CC util/qht.o CC util/range.o CC util/stats64.o CC util/systemd.o CC trace-root.o CC util/trace.o CC crypto/trace.o CC io/trace.o CC migration/trace.o CC block/trace.o CC chardev/trace.o CC hw/block/trace.o CC hw/block/dataplane/trace.o CC hw/char/trace.o CC hw/intc/trace.o CC hw/net/trace.o CC hw/virtio/trace.o CC hw/audio/trace.o CC hw/misc/trace.o CC hw/usb/trace.o CC hw/scsi/trace.o CC hw/nvram/trace.o CC hw/display/trace.o CC hw/timer/trace.o CC hw/input/trace.o CC hw/dma/trace.o CC hw/sparc/trace.o CC hw/sd/trace.o CC hw/isa/trace.o CC hw/mem/trace.o CC hw/i386/trace.o CC hw/i386/xen/trace.o CC hw/9pfs/trace.o CC hw/ppc/trace.o CC hw/pci/trace.o CC hw/s390x/trace.o CC hw/vfio/trace.o CC hw/acpi/trace.o CC hw/arm/trace.o CC hw/alpha/trace.o CC hw/xen/trace.o CC ui/trace.o CC audio/trace.o CC net/trace.o CC target/arm/trace.o CC target/mips/trace.o CC target/i386/trace.o CC target/sparc/trace.o CC target/s390x/trace.o CC target/ppc/trace.o CC qom/trace.o CC linux-user/trace.o CC qapi/trace.o CC accel/tcg/trace.o CC accel/kvm/trace.o CC nbd/trace.o CC crypto/pbkdf-stub.o CC stubs/arch-query-cpu-def.o CC stubs/arch-query-cpu-model-expansion.o CC stubs/arch-query-cpu-model-comparison.o CC stubs/arch-query-cpu-model-baseline.o CC stubs/bdrv-next-monitor-owned.o CC stubs/blk-commit-all.o CC stubs/blockdev-close-all-bdrv-states.o CC stubs/clock-warp.o CC stubs/cpu-get-clock.o CC stubs/cpu-get-icount.o CC stubs/dump.o CC stubs/error-printf.o CC stubs/fdset.o CC stubs/gdbstub.o CC stubs/get-vm-name.o CC stubs/iothread.o CC stubs/iothread-lock.o CC stubs/is-daemonized.o CC stubs/machine-init-done.o CC stubs/migr-blocker.o CC stubs/monitor.o CC stubs/notify-event.o CC stubs/qtest.o CC stubs/replay.o CC stubs/runstate-check.o CC stubs/set-fd-handler.o CC stubs/slirp.o CC stubs/sysbus.o CC stubs/trace-control.o CC stubs/uuid.o CC stubs/vm-stop.o CC stubs/vmstate.o CC stubs/qmp_pc_dimm_device_list.o CC stubs/target-monitor-defs.o CC stubs/target-get-monitor-def.o CC stubs/vmgenid.o CC stubs/pc_madt_cpu_entry.o CC stubs/xen-common.o CC stubs/xen-hvm.o CC contrib/ivshmem-client/ivshmem-client.o CC contrib/ivshmem-client/main.o CC contrib/ivshmem-server/ivshmem-server.o CC contrib/ivshmem-server/main.o CC qemu-nbd.o CC block.o CC blockjob.o CC qemu-io-cmds.o CC replication.o CC block/raw-format.o CC block/vdi.o CC block/qcow.o CC block/vmdk.o CC block/cloop.o CC block/bochs.o CC block/vpc.o CC block/vvfat.o CC block/dmg.o CC block/qcow2.o CC block/qcow2-refcount.o CC block/qcow2-cluster.o CC block/qcow2-snapshot.o CC block/qcow2-cache.o CC block/qcow2-bitmap.o CC block/qed.o CC block/qed-l2-cache.o CC block/qed-table.o CC block/qed-cluster.o CC block/qed-check.o CC block/vhdx.o CC block/vhdx-endian.o CC block/vhdx-log.o CC block/quorum.o CC block/parallels.o CC block/blkdebug.o CC block/blkverify.o CC block/blkreplay.o CC block/block-backend.o CC block/snapshot.o CC block/qapi.o CC block/file-posix.o CC block/null.o CC block/mirror.o CC block/commit.o CC block/io.o CC block/throttle-groups.o CC block/nbd.o CC block/nbd-client.o CC block/sheepdog.o CC block/accounting.o CC block/dirty-bitmap.o CC block/write-threshold.o CC block/backup.o CC block/replication.o CC block/crypto.o CC nbd/server.o CC nbd/client.o CC nbd/common.o CC crypto/init.o CC crypto/hash.o CC crypto/hash-glib.o CC crypto/hmac.o CC crypto/hmac-glib.o CC crypto/aes.o CC crypto/desrfb.o CC crypto/cipher.o CC crypto/tlscreds.o CC crypto/tlscredsanon.o CC crypto/tlscredsx509.o CC crypto/tlssession.o CC crypto/secret.o CC crypto/random-platform.o CC crypto/pbkdf.o CC crypto/ivgen.o CC crypto/ivgen-essiv.o CC crypto/ivgen-plain.o CC crypto/ivgen-plain64.o CC crypto/afsplit.o CC crypto/xts.o CC crypto/block.o CC crypto/block-qcow.o CC crypto/block-luks.o CC io/channel.o CC io/channel-buffer.o CC io/channel-command.o CC io/channel-file.o CC io/channel-socket.o CC io/channel-tls.o CC io/channel-watch.o CC io/channel-websock.o CC io/channel-util.o CC io/dns-resolver.o CC io/task.o CC qom/object.o CC qom/container.o CC qom/qom-qobject.o CC qom/object_interfaces.o GEN qemu-img-cmds.h CC qemu-io.o CC qemu-bridge-helper.o CC blockdev.o CC blockdev-nbd.o CC bootdevice.o CC iothread.o CC qdev-monitor.o CC device-hotplug.o CC os-posix.o CC bt-host.o CC bt-vhci.o CC dma-helpers.o CC vl.o CC tpm.o CC device_tree.o CC qmp-marshal.o CC qmp.o CC hmp.o CC cpus-common.o CC audio/audio.o CC audio/noaudio.o CC audio/wavaudio.o CC audio/mixeng.o CC audio/sdlaudio.o CC audio/ossaudio.o CC audio/wavcapture.o CC backends/rng.o CC backends/rng-egd.o CC backends/rng-random.o CC backends/tpm.o CC backends/hostmem.o CC backends/hostmem-ram.o CC backends/hostmem-file.o CC backends/cryptodev.o CC backends/cryptodev-builtin.o CC block/stream.o CC chardev/msmouse.o CC chardev/wctablet.o CC chardev/testdev.o CC disas/arm.o CC disas/i386.o CC fsdev/qemu-fsdev-dummy.o CC fsdev/qemu-fsdev-opts.o CC fsdev/qemu-fsdev-throttle.o CC hw/acpi/core.o CC hw/acpi/piix4.o CC hw/acpi/pcihp.o CC hw/acpi/ich9.o CC hw/acpi/tco.o CC hw/acpi/cpu_hotplug.o CC hw/acpi/memory_hotplug.o CC hw/acpi/cpu.o CC hw/acpi/nvdimm.o CC hw/acpi/vmgenid.o CC hw/acpi/acpi_interface.o CC hw/acpi/bios-linker-loader.o CC hw/acpi/aml-build.o CC hw/acpi/ipmi.o CC hw/acpi/acpi-stub.o CC hw/acpi/ipmi-stub.o CC hw/audio/sb16.o CC hw/audio/es1370.o CC hw/audio/ac97.o CC hw/audio/fmopl.o CC hw/audio/adlib.o CC hw/audio/gus.o CC hw/audio/gusemu_hal.o CC hw/audio/gusemu_mixer.o CC hw/audio/cs4231a.o CC hw/audio/intel-hda.o CC hw/audio/pcspk.o CC hw/audio/hda-codec.o CC hw/audio/wm8750.o CC hw/audio/pl041.o CC hw/audio/lm4549.o CC hw/audio/marvell_88w8618.o CC hw/audio/soundhw.o CC hw/block/block.o CC hw/block/cdrom.o CC hw/block/hd-geometry.o CC hw/block/fdc.o CC hw/block/m25p80.o CC hw/block/nand.o CC hw/block/pflash_cfi01.o CC hw/block/pflash_cfi02.o CC hw/block/ecc.o CC hw/block/onenand.o CC hw/block/nvme.o CC hw/bt/core.o CC hw/bt/l2cap.o CC hw/bt/sdp.o CC hw/bt/hci.o CC hw/bt/hid.o CC hw/bt/hci-csr.o CC hw/char/ipoctal232.o CC hw/char/parallel.o CC hw/char/pl011.o CC hw/char/serial.o CC hw/char/serial-isa.o CC hw/char/serial-pci.o CC hw/char/virtio-console.o CC hw/char/cadence_uart.o CC hw/char/debugcon.o CC hw/char/imx_serial.o CC hw/core/qdev.o CC hw/core/qdev-properties.o CC hw/core/bus.o CC hw/core/reset.o CC hw/core/fw-path-provider.o CC hw/core/irq.o CC hw/core/hotplug.o CC hw/core/nmi.o CC hw/core/ptimer.o CC hw/core/sysbus.o CC hw/core/machine.o CC hw/core/loader.o CC hw/core/qdev-properties-system.o CC hw/core/register.o CC hw/core/or-irq.o CC hw/core/platform-bus.o CC hw/cpu/core.o CC hw/display/ads7846.o CC hw/display/cirrus_vga.o CC hw/display/pl110.o CC hw/display/ssd0303.o CC hw/display/ssd0323.o CC hw/display/vga-pci.o CC hw/display/vga-isa.o CC hw/display/vmware_vga.o CC hw/display/blizzard.o CC hw/display/exynos4210_fimd.o CC hw/display/framebuffer.o CC hw/display/tc6393xb.o CC hw/dma/pl080.o CC hw/dma/pl330.o CC hw/dma/i8257.o CC hw/dma/xlnx-zynq-devcfg.o CC hw/gpio/max7310.o CC hw/gpio/pl061.o CC hw/gpio/zaurus.o CC hw/gpio/gpio_key.o CC hw/i2c/core.o CC hw/i2c/smbus.o CC hw/i2c/smbus_eeprom.o CC hw/i2c/i2c-ddc.o CC hw/i2c/versatile_i2c.o CC hw/i2c/smbus_ich9.o CC hw/i2c/pm_smbus.o CC hw/i2c/bitbang_i2c.o CC hw/i2c/exynos4210_i2c.o CC hw/i2c/imx_i2c.o CC hw/i2c/aspeed_i2c.o CC hw/ide/core.o CC hw/ide/atapi.o CC hw/ide/qdev.o CC hw/ide/pci.o CC hw/ide/isa.o CC hw/ide/piix.o CC hw/ide/microdrive.o CC hw/ide/ahci.o CC hw/ide/ich.o CC hw/input/hid.o CC hw/input/lm832x.o CC hw/input/pckbd.o CC hw/input/pl050.o CC hw/input/ps2.o CC hw/input/stellaris_input.o CC hw/input/tsc2005.o CC hw/input/vmmouse.o CC hw/input/virtio-input.o CC hw/input/virtio-input-hid.o CC hw/input/virtio-input-host.o CC hw/intc/i8259_common.o CC hw/intc/i8259.o CC hw/intc/pl190.o CC hw/intc/imx_avic.o CC hw/intc/realview_gic.o CC hw/intc/ioapic_common.o CC hw/intc/arm_gic_common.o CC hw/intc/arm_gic.o CC hw/intc/arm_gicv2m.o CC hw/intc/arm_gicv3_common.o CC hw/intc/arm_gicv3.o CC hw/intc/arm_gicv3_dist.o CC hw/intc/arm_gicv3_redist.o CC hw/intc/arm_gicv3_its_common.o CC hw/ipack/ipack.o CC hw/intc/intc.o CC hw/ipack/tpci200.o CC hw/ipmi/ipmi.o CC hw/ipmi/ipmi_bmc_sim.o CC hw/ipmi/ipmi_bmc_extern.o CC hw/ipmi/isa_ipmi_kcs.o CC hw/ipmi/isa_ipmi_bt.o CC hw/isa/isa-bus.o CC hw/isa/apm.o CC hw/mem/pc-dimm.o CC hw/mem/nvdimm.o CC hw/misc/applesmc.o CC hw/misc/max111x.o CC hw/misc/tmp105.o CC hw/misc/tmp421.o CC hw/misc/debugexit.o CC hw/misc/sga.o CC hw/misc/pc-testdev.o CC hw/misc/pci-testdev.o CC hw/misc/edu.o CC hw/misc/unimp.o CC hw/misc/arm_l2x0.o CC hw/misc/arm_integrator_debug.o CC hw/misc/a9scu.o CC hw/misc/arm11scu.o CC hw/net/ne2000.o CC hw/net/eepro100.o CC hw/net/pcnet-pci.o CC hw/net/e1000.o CC hw/net/pcnet.o CC hw/net/e1000x_common.o CC hw/net/net_tx_pkt.o CC hw/net/net_rx_pkt.o CC hw/net/e1000e.o CC hw/net/e1000e_core.o CC hw/net/rtl8139.o CC hw/net/vmxnet3.o CC hw/net/smc91c111.o CC hw/net/lan9118.o CC hw/net/ne2000-isa.o CC hw/net/xgmac.o CC hw/net/allwinner_emac.o CC hw/net/imx_fec.o CC hw/net/cadence_gem.o CC hw/net/stellaris_enet.o CC hw/net/ftgmac100.o CC hw/net/rocker/rocker.o CC hw/net/rocker/rocker_fp.o CC hw/net/rocker/rocker_desc.o CC hw/net/rocker/rocker_world.o CC hw/net/rocker/rocker_of_dpa.o CC hw/nvram/eeprom93xx.o CC hw/nvram/fw_cfg.o CC hw/nvram/chrp_nvram.o CC hw/pci-bridge/pci_bridge_dev.o CC hw/pci-bridge/pcie_root_port.o CC hw/pci-bridge/gen_pcie_root_port.o CC hw/pci-bridge/pci_expander_bridge.o CC hw/pci-bridge/xio3130_upstream.o CC hw/pci-bridge/xio3130_downstream.o CC hw/pci-bridge/ioh3420.o CC hw/pci-bridge/i82801b11.o CC hw/pci-host/pam.o CC hw/pci-host/versatile.o CC hw/pci-host/piix.o CC hw/pci-host/q35.o CC hw/pci-host/gpex.o CC hw/pci/pci.o CC hw/pci/pci_bridge.o CC hw/pci/msi.o CC hw/pci/msix.o CC hw/pci/shpc.o CC hw/pci/slotid_cap.o CC hw/pci/pci_host.o CC hw/pci/pcie_host.o CC hw/pci/pcie.o CC hw/pci/pcie_aer.o CC hw/pci/pcie_port.o CC hw/pci/pci-stub.o CC hw/pcmcia/pcmcia.o CC hw/scsi/scsi-disk.o CC hw/scsi/scsi-generic.o CC hw/scsi/scsi-bus.o CC hw/scsi/lsi53c895a.o CC hw/scsi/mptsas.o CC hw/scsi/mptconfig.o CC hw/scsi/mptendian.o CC hw/scsi/megasas.o CC hw/scsi/vmw_pvscsi.o CC hw/scsi/esp.o CC hw/scsi/esp-pci.o CC hw/sd/pl181.o CC hw/sd/ssi-sd.o CC hw/sd/sd.o CC hw/sd/core.o CC hw/sd/sdhci.o CC hw/smbios/smbios.o CC hw/smbios/smbios_type_38.o CC hw/smbios/smbios-stub.o CC hw/smbios/smbios_type_38-stub.o CC hw/ssi/pl022.o CC hw/ssi/ssi.o CC hw/ssi/xilinx_spips.o CC hw/ssi/aspeed_smc.o CC hw/ssi/stm32f2xx_spi.o CC hw/timer/arm_timer.o CC hw/timer/arm_mptimer.o CC hw/timer/armv7m_systick.o CC hw/timer/a9gtimer.o CC hw/timer/cadence_ttc.o CC hw/timer/ds1338.o CC hw/timer/hpet.o CC hw/timer/i8254_common.o CC hw/timer/i8254.o CC hw/timer/pl031.o CC hw/timer/twl92230.o CC hw/timer/imx_epit.o CC hw/timer/imx_gpt.o CC hw/timer/stm32f2xx_timer.o CC hw/timer/aspeed_timer.o CC hw/tpm/tpm_tis.o CC hw/tpm/tpm_passthrough.o CC hw/usb/core.o CC hw/tpm/tpm_util.o CC hw/usb/combined-packet.o CC hw/usb/bus.o CC hw/usb/libhw.o CC hw/usb/desc.o CC hw/usb/desc-msos.o CC hw/usb/hcd-uhci.o CC hw/usb/hcd-ohci.o CC hw/usb/hcd-ehci.o CC hw/usb/hcd-ehci-pci.o CC hw/usb/hcd-ehci-sysbus.o CC hw/usb/hcd-xhci.o CC hw/usb/hcd-xhci-nec.o CC hw/usb/hcd-musb.o CC hw/usb/dev-hub.o CC hw/usb/dev-hid.o CC hw/usb/dev-wacom.o CC hw/usb/dev-storage.o CC hw/usb/dev-uas.o CC hw/usb/dev-audio.o CC hw/usb/dev-serial.o CC hw/usb/dev-network.o CC hw/usb/dev-bluetooth.o CC hw/usb/dev-smartcard-reader.o CC hw/usb/dev-mtp.o CC hw/usb/host-stub.o CC hw/virtio/virtio-rng.o CC hw/virtio/virtio-pci.o CC hw/virtio/virtio-bus.o CC hw/virtio/virtio-mmio.o CC hw/virtio/vhost-stub.o CC hw/watchdog/watchdog.o CC hw/watchdog/wdt_i6300esb.o CC hw/watchdog/wdt_ib700.o CC hw/watchdog/wdt_aspeed.o CC migration/migration.o CC migration/socket.o CC migration/fd.o CC migration/exec.o CC migration/tls.o CC migration/channel.o CC migration/savevm.o CC migration/colo-comm.o CC migration/colo.o CC migration/colo-failover.o CC migration/vmstate.o CC migration/vmstate-types.o CC migration/page_cache.o CC migration/qemu-file.o CC migration/global_state.o CC migration/qemu-file-channel.o CC migration/xbzrle.o CC migration/postcopy-ram.o CC migration/qjson.o CC migration/block.o CC net/net.o CC net/queue.o CC net/checksum.o /tmp/qemu-test/src/net/queue.c:28:20: error: packet.h: No such file or directory /tmp/qemu-test/src/net/queue.c: In function ‘qemu_new_net_queue’: /tmp/qemu-test/src/net/queue.c:48: error: invalid application of ‘sizeof’ to incomplete type ‘NetQueue’ /tmp/qemu-test/src/net/queue.c:50: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:51: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:52: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:53: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:55: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:55: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:55: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:57: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c: In function ‘qemu_del_net_queue’: /tmp/qemu-test/src/net/queue.c:66: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:66: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:66: warning: left-hand operand of comma expression has no effect /tmp/qemu-test/src/net/queue.c:67: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:67: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:67: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:67: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:67: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:67: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:67: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:67: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c: In function ‘qemu_net_queue_append’: /tmp/qemu-test/src/net/queue.c:83: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:83: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:86: error: invalid application of ‘sizeof’ to incomplete type ‘NetPacket’ /tmp/qemu-test/src/net/queue.c:87: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:88: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:89: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:90: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:91: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:93: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:94: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:94: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:94: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:94: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:94: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:94: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c: In function ‘qemu_net_queue_append_iov’: /tmp/qemu-test/src/net/queue.c:108: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:108: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:115: error: invalid application of ‘sizeof’ to incomplete type ‘NetPacket’ /tmp/qemu-test/src/net/queue.c:116: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:117: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:118: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:119: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:124: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:124: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:125: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:128: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:129: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:129: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:129: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:129: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:129: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:129: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c: In function ‘qemu_net_queue_deliver’: /tmp/qemu-test/src/net/queue.c:144: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:145: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:145: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:146: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c: In function ‘qemu_net_queue_deliver_iov’: /tmp/qemu-test/src/net/queue.c:159: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:160: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:160: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:161: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c: In function ‘qemu_net_queue_send’: /tmp/qemu-test/src/net/queue.c:175: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c: In function ‘qemu_net_queue_send_iov’: /tmp/qemu-test/src/net/queue.c:200: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c: In function ‘qemu_net_queue_purge’: /tmp/qemu-test/src/net/queue.c:220: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:220: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:220: warning: left-hand operand of comma expression has no effect /tmp/qemu-test/src/net/queue.c:221: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:222: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:222: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:222: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:222: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:222: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:222: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:222: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:222: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:223: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:224: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:225: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:225: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c: In function ‘qemu_net_queue_flush’: /tmp/qemu-test/src/net/queue.c:234: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:238: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:239: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:239: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:239: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:239: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:239: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:239: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:239: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:239: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:240: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:243: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:244: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:245: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:246: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:248: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:249: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:249: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:249: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:249: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:249: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:249: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:249: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:249: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:249: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:253: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:254: error: dereferencing pointer to incomplete type /tmp/qemu-test/src/net/queue.c:254: error: dereferencing pointer to incomplete type make: *** [net/queue.o] Error 1 make: *** Waiting for unfinished jobs.... Traceback (most recent call last): File "./tests/docker/docker.py", line 382, in <module> sys.exit(main()) File "./tests/docker/docker.py", line 379, in main return args.cmdobj.run(args, argv) File "./tests/docker/docker.py", line 237, in run return Docker().run(argv, args.keep, quiet=args.quiet) File "./tests/docker/docker.py", line 205, in run quiet=quiet) File "./tests/docker/docker.py", line 123, in _do_check return subprocess.check_call(self._command + cmd, **kwargs) File "/usr/lib64/python2.7/subprocess.py", line 186, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['docker', 'run', '--label', 'com.qemu.instance.uuid=2a50050a6bae11e7ac69525400c803e1', '-u', '0', '-t', '--rm', '--net=none', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=8', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/var/tmp/patchew-tester-tmp-cq6cnfju/src/docker-src.2017-07-18-07.42.20.15755:/var/tmp/qemu:z,ro', '-v', '/root/.cache/qemu-docker-ccache:/var/tmp/ccache:z', 'qemu:centos6', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2 tests/docker/Makefile.include:124: recipe for target 'docker-run' failed make[1]: *** [docker-run] Error 1 make[1]: Leaving directory '/var/tmp/patchew-tester-tmp-cq6cnfju/src' tests/docker/Makefile.include:156: recipe for target 'docker-run-test-quick@centos6' failed make: *** [docker-run-test-quick@centos6] Error 2 === OUTPUT END === Test command exited with code: 2 --- Email generated automatically by Patchew [http://patchew.org/]. Please send your feedback to patchew-devel@freelists.org
© 2016 - 2024 Red Hat, Inc.