[Qemu-devel] [PULL 60/65] slirp: add clock_get_ns() callback

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c  |  6 ++
 slirp/if.c   |  2 +-
 slirp/ip6_icmp.c |  4 ++--
 slirp/libslirp.h |  2 ++
 slirp/slirp.c| 12 +---
 5 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index 2d5337da04..f98425ee9f 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -146,9 +146,15 @@ static void net_slirp_guest_error(const char *msg)
 qemu_log_mask(LOG_GUEST_ERROR, "%s", msg);
 }
 
+static int64_t net_slirp_clock_get_ns(void)
+{
+return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+}
+
 static const SlirpCb slirp_cb = {
 .output = net_slirp_output,
 .guest_error = net_slirp_guest_error,
+.clock_get_ns = net_slirp_clock_get_ns,
 };
 
 static int net_slirp_init(NetClientState *peer, const char *model,
diff --git a/slirp/if.c b/slirp/if.c
index ce4f5fac53..73e3705740 100644
--- a/slirp/if.c
+++ b/slirp/if.c
@@ -148,7 +148,7 @@ diddit:
  */
 void if_start(Slirp *slirp)
 {
-uint64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+uint64_t now = slirp->cb->clock_get_ns();
 bool from_batchq = false;
 struct mbuf *ifm, *ifm_next, *ifqt;
 
diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index 97304a9dd9..5261baae27 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -17,7 +17,7 @@ static void ra_timer_handler(void *opaque)
 {
 Slirp *slirp = opaque;
 timer_mod(slirp->ra_timer,
-  qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + NDP_Interval);
+  slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval);
 ndp_send_ra(slirp);
 }
 
@@ -31,7 +31,7 @@ void icmp6_init(Slirp *slirp)
  SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
  ra_timer_handler, slirp);
 timer_mod(slirp->ra_timer,
-  qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + NDP_Interval);
+  slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval);
 }
 
 void icmp6_cleanup(Slirp *slirp)
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 3e0aa19f4b..4611a7447b 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -15,6 +15,8 @@ typedef struct SlirpCb {
 void (*output)(void *opaque, const uint8_t *pkt, int pkt_len);
 /* Print a message for an error due to guest misbehavior.  */
 void (*guest_error)(const char *msg);
+/* Return the virtual clock value in nanoseconds */
+int64_t (*clock_get_ns)(void);
 } SlirpCb;
 
 
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 882d28a4de..535c8ad5f9 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -581,15 +581,15 @@ void slirp_pollfds_fill(GArray *pollfds, uint32_t 
*timeout)
 
 void slirp_pollfds_poll(GArray *pollfds, int select_error)
 {
-Slirp *slirp;
+Slirp *slirp = QTAILQ_FIRST(&slirp_instances);
 struct socket *so, *so_next;
 int ret;
 
-if (QTAILQ_EMPTY(&slirp_instances)) {
+if (!slirp) {
 return;
 }
 
-curtime = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL);
+curtime = slirp->cb->clock_get_ns() / SCALE_MS;
 
 QTAILQ_FOREACH(slirp, &slirp_instances, entry) {
 /*
@@ -916,8 +916,7 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct 
ethhdr *eh,
 ifm->resolution_requested = true;
 
 /* Expire request and drop outgoing packet after 1 second */
-ifm->expiration_date =
-qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 10ULL;
+ifm->expiration_date = slirp->cb->clock_get_ns() + 10ULL;
 }
 return 0;
 } else {
@@ -943,8 +942,7 @@ static int if_encap6(Slirp *slirp, struct mbuf *ifm, struct 
ethhdr *eh,
 if (!ifm->resolution_requested) {
 ndp_send_ns(slirp, ip6h->ip_dst);
 ifm->resolution_requested = true;
-ifm->expiration_date =
-qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 10ULL;
+ifm->expiration_date = slirp->cb->clock_get_ns() + 10ULL;
 }
 return 0;
 } else {
-- 
2.20.1




[Qemu-devel] [PULL 36/65] slirp: add a callback to log guest errors

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c  | 7 +++
 slirp/dhcpv6.c   | 6 +++---
 slirp/ip6_icmp.c | 7 +++
 slirp/libslirp.h | 2 ++
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index 031c324f02..ea8b04e007 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -23,6 +23,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qemu/log.h"
 #include "net/slirp.h"
 
 
@@ -140,8 +141,14 @@ static NetClientInfo net_slirp_info = {
 .cleanup = net_slirp_cleanup,
 };
 
+static void net_slirp_guest_error(const char *msg)
+{
+qemu_log_mask(LOG_GUEST_ERROR, "%s", msg);
+}
+
 static const SlirpCb slirp_cb = {
 .output = net_slirp_output,
+.guest_error = net_slirp_guest_error,
 };
 
 static int net_slirp_init(NetClientState *peer, const char *model,
diff --git a/slirp/dhcpv6.c b/slirp/dhcpv6.c
index 943a13bca8..5d703e8ae6 100644
--- a/slirp/dhcpv6.c
+++ b/slirp/dhcpv6.c
@@ -50,7 +50,7 @@ struct requested_infos {
  * the odata region, thus the caller must keep odata valid as long as it
  * needs to access the requested_infos struct.
  */
-static int dhcpv6_parse_info_request(uint8_t *odata, int olen,
+static int dhcpv6_parse_info_request(Slirp *slirp, uint8_t *odata, int olen,
  struct requested_infos *ri)
 {
 int i, req_opt;
@@ -61,7 +61,7 @@ static int dhcpv6_parse_info_request(uint8_t *odata, int olen,
 int len = odata[2] << 8 | odata[3];
 
 if (len + 4 > olen) {
-qemu_log_mask(LOG_GUEST_ERROR, "Guest sent bad DHCPv6 packet!\n");
+slirp->cb->guest_error("Guest sent bad DHCPv6 packet!");
 return -E2BIG;
 }
 
@@ -121,7 +121,7 @@ static void dhcpv6_info_request(Slirp *slirp, struct 
sockaddr_in6 *srcsas,
 struct mbuf *m;
 uint8_t *resp;
 
-if (dhcpv6_parse_info_request(odata, olen, &ri) < 0) {
+if (dhcpv6_parse_info_request(slirp, odata, olen, &ri) < 0) {
 return;
 }
 
diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index 595647b1b1..3f74d172f4 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -342,8 +342,7 @@ static void ndp_input(struct mbuf *m, Slirp *slirp, struct 
ip6 *ip,
 
 case ICMP6_NDP_RA:
 DEBUG_CALL(" type = Router Advertisement");
-qemu_log_mask(LOG_GUEST_ERROR,
-"Warning: guest sent NDP RA, but shouldn't");
+slirp->cb->guest_error("Warning: guest sent NDP RA, but shouldn't");
 break;
 
 case ICMP6_NDP_NS:
@@ -376,8 +375,8 @@ static void ndp_input(struct mbuf *m, Slirp *slirp, struct 
ip6 *ip,
 
 case ICMP6_NDP_REDIRECT:
 DEBUG_CALL(" type = Redirect");
-qemu_log_mask(LOG_GUEST_ERROR,
-"Warning: guest sent NDP REDIRECT, but shouldn't");
+slirp->cb->guest_error(
+"Warning: guest sent NDP REDIRECT, but shouldn't");
 break;
 }
 }
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index a5d1b27b5e..3e0aa19f4b 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -13,6 +13,8 @@ typedef struct Slirp Slirp;
 typedef struct SlirpCb {
 /* Send an ethernet frame to the guest network.  */
 void (*output)(void *opaque, const uint8_t *pkt, int pkt_len);
+/* Print a message for an error due to guest misbehavior.  */
+void (*guest_error)(const char *msg);
 } SlirpCb;
 
 
-- 
2.20.1




[Qemu-devel] [PULL 56/65] slirp: use %p for pointers format

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

This fixes some compilation warnings on mingw64.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/ip6_icmp.c   | 2 +-
 slirp/ip6_input.c  | 2 +-
 slirp/ip6_output.c | 4 ++--
 slirp/udp6.c   | 6 +++---
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index 595a62c8d4..bce075913c 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -390,7 +390,7 @@ void icmp6_input(struct mbuf *m)
 int hlen = sizeof(struct ip6);
 
 DEBUG_CALL("icmp6_input");
-DEBUG_ARG("m = %lx", (long) m);
+DEBUG_ARG("m = %p", m);
 DEBUG_ARG("m_len = %d", m->m_len);
 
 if (ntohs(ip->ip_pl) < ICMP6_MINLEN) {
diff --git a/slirp/ip6_input.c b/slirp/ip6_input.c
index ac2e3ea882..ab656a0a9d 100644
--- a/slirp/ip6_input.c
+++ b/slirp/ip6_input.c
@@ -31,7 +31,7 @@ void ip6_input(struct mbuf *m)
 }
 
 DEBUG_CALL("ip6_input");
-DEBUG_ARG("m = %lx", (long)m);
+DEBUG_ARG("m = %p", m);
 DEBUG_ARG("m_len = %d", m->m_len);
 
 if (m->m_len < sizeof(struct ip6)) {
diff --git a/slirp/ip6_output.c b/slirp/ip6_output.c
index 762cbfe89c..52c88ad691 100644
--- a/slirp/ip6_output.c
+++ b/slirp/ip6_output.c
@@ -19,8 +19,8 @@ int ip6_output(struct socket *so, struct mbuf *m, int fast)
 struct ip6 *ip = mtod(m, struct ip6 *);
 
 DEBUG_CALL("ip6_output");
-DEBUG_ARG("so = %lx", (long)so);
-DEBUG_ARG("m = %lx", (long)m);
+DEBUG_ARG("so = %p", so);
+DEBUG_ARG("m = %p", m);
 
 /* Fill IPv6 header */
 ip->ip_v = IP6VERSION;
diff --git a/slirp/udp6.c b/slirp/udp6.c
index 473ba1586e..8cdb1892e2 100644
--- a/slirp/udp6.c
+++ b/slirp/udp6.c
@@ -20,7 +20,7 @@ void udp6_input(struct mbuf *m)
 struct sockaddr_in6 lhost;
 
 DEBUG_CALL("udp6_input");
-DEBUG_ARG("m = %lx", (long)m);
+DEBUG_ARG("m = %p", m);
 
 if (slirp->restricted) {
 goto bad;
@@ -144,8 +144,8 @@ int udp6_output(struct socket *so, struct mbuf *m,
 struct udphdr *uh;
 
 DEBUG_CALL("udp6_output");
-DEBUG_ARG("so = %lx", (long)so);
-DEBUG_ARG("m = %lx", (long)m);
+DEBUG_ARG("so = %p", so);
+DEBUG_ARG("m = %p", m);
 
 /* adjust for header */
 m->m_data -= sizeof(struct udphdr);
-- 
2.20.1




[Qemu-devel] [PULL 47/65] slirp: drop

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Since commit 12f8def0e02232d7c6416ad9b66640f973c531d1 (v2.9), qemu
requires Vista. Let's remove some conditional code.

Note that this introduces a missing declaration warning with mingw.
warning: implicit declaration of function 'inet_ntop'

See also: https://sourceforge.net/p/mingw-w64/mailman/message/36473782/

We could workaround it by declaring it ourself depending on __MINGW64_VERSION_*:
WINSOCK_API_LINKAGE INT WSAAPI inet_pton(int Family, PCTSTR pszAddrString, 
PVOID pAddrBuf);

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c   | 22 --
 slirp/ip6_icmp.c  | 10 --
 slirp/ndp_table.c | 14 ++
 3 files changed, 10 insertions(+), 36 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index b1c98b9470..2d5337da04 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -290,17 +290,6 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
 }
 #endif
 
-#if defined(_WIN32) && (_WIN32_WINNT < 0x0600)
-/* No inet_pton helper before Vista... */
-if (vprefix6) {
-/* Unsupported */
-error_setg(errp, "IPv6 prefix not supported");
-return -1;
-}
-memset(&ip6_prefix, 0, sizeof(ip6_prefix));
-ip6_prefix.s6_addr[0] = 0xfe;
-ip6_prefix.s6_addr[1] = 0xc0;
-#else
 if (!vprefix6) {
 vprefix6 = "fec0::";
 }
@@ -308,7 +297,6 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
 error_setg(errp, "Failed to parse IPv6 prefix");
 return -1;
 }
-#endif
 
 if (!vprefix6_len) {
 vprefix6_len = 64;
@@ -320,10 +308,6 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
 }
 
 if (vhost6) {
-#if defined(_WIN32) && (_WIN32_WINNT < 0x0600)
-error_setg(errp, "IPv6 host not supported");
-return -1;
-#else
 if (!inet_pton(AF_INET6, vhost6, &ip6_host)) {
 error_setg(errp, "Failed to parse IPv6 host");
 return -1;
@@ -332,17 +316,12 @@ static int net_slirp_init(NetClientState *peer, const 
char *model,
 error_setg(errp, "IPv6 Host doesn't belong to network");
 return -1;
 }
-#endif
 } else {
 ip6_host = ip6_prefix;
 ip6_host.s6_addr[15] |= 2;
 }
 
 if (vnameserver6) {
-#if defined(_WIN32) && (_WIN32_WINNT < 0x0600)
-error_setg(errp, "IPv6 DNS not supported");
-return -1;
-#else
 if (!inet_pton(AF_INET6, vnameserver6, &ip6_dns)) {
 error_setg(errp, "Failed to parse IPv6 DNS");
 return -1;
@@ -351,7 +330,6 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
 error_setg(errp, "IPv6 DNS doesn't belong to network");
 return -1;
 }
-#endif
 } else {
 ip6_dns = ip6_prefix;
 ip6_dns.s6_addr[15] |= 3;
diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index 3f74d172f4..595a62c8d4 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -74,6 +74,7 @@ void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t 
code)
 Slirp *slirp = m->slirp;
 struct mbuf *t;
 struct ip6 *ip = mtod(m, struct ip6 *);
+char addrstr[INET6_ADDRSTRLEN];
 
 DEBUG_CALL("icmp6_send_error");
 DEBUG_ARGS(" type = %d, code = %d\n", type, code);
@@ -90,11 +91,8 @@ void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t 
code)
 struct ip6 *rip = mtod(t, struct ip6 *);
 rip->ip_src = (struct in6_addr)LINKLOCAL_ADDR;
 rip->ip_dst = ip->ip_src;
-#if !defined(_WIN32) || (_WIN32_WINNT >= 0x0600)
-char addrstr[INET6_ADDRSTRLEN];
 inet_ntop(AF_INET6, &rip->ip_dst, addrstr, INET6_ADDRSTRLEN);
 DEBUG_ARG("target = %s", addrstr);
-#endif
 
 rip->ip_nh = IPPROTO_ICMPV6;
 const int error_data_len = MIN(m->m_len,
@@ -222,12 +220,12 @@ void ndp_send_ra(Slirp *slirp)
  */
 void ndp_send_ns(Slirp *slirp, struct in6_addr addr)
 {
-DEBUG_CALL("ndp_send_ns");
-#if !defined(_WIN32) || (_WIN32_WINNT >= 0x0600)
 char addrstr[INET6_ADDRSTRLEN];
+
 inet_ntop(AF_INET6, &addr, addrstr, INET6_ADDRSTRLEN);
+
+DEBUG_CALL("ndp_send_ns");
 DEBUG_ARG("target = %s", addrstr);
-#endif
 
 /* Build IPv6 packet */
 struct mbuf *t = m_get(slirp);
diff --git a/slirp/ndp_table.c b/slirp/ndp_table.c
index a4e6421fd3..1401e1b322 100644
--- a/slirp/ndp_table.c
+++ b/slirp/ndp_table.c
@@ -10,15 +10,14 @@
 void ndp_table_add(Slirp *slirp, struct in6_addr ip_addr,
 uint8_t ethaddr[ETH_ALEN])
 {
+char addrstr[INET6_ADDRSTRLEN];
 NdpTable *ndp_table = &slirp->ndp_table;
 int i;
 
-DEBUG_CALL("ndp_table_add");
-#if !defined(_WIN32) || (_WIN32_WINNT >= 0x0600)
-c

[Qemu-devel] [PULL 29/65] slirp: remove unused HAVE_INET_ATON

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp_config.h | 6 --
 1 file changed, 6 deletions(-)

diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 833f25a965..5126711849 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -16,9 +16,3 @@
 
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
-
-/* Define if you have inet_aton */
-#undef HAVE_INET_ATON
-#ifndef _WIN32
-#define HAVE_INET_ATON
-#endif
-- 
2.20.1




[Qemu-devel] [PULL 53/65] slirp: no need to make DPRINTF conditional on DEBUG

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

DEBUG_CALL is already handled conditionally.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/bootp.c | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/slirp/bootp.c b/slirp/bootp.c
index 5ab6692038..4c9a77eb98 100644
--- a/slirp/bootp.c
+++ b/slirp/bootp.c
@@ -36,11 +36,7 @@
 
 static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE };
 
-#ifdef DEBUG
 #define DPRINTF(fmt, ...) DEBUG_CALL(fmt, ##__VA_ARGS__)
-#else
-#define DPRINTF(fmt, ...) do{}while(0)
-#endif
 
 static BOOTPClient *get_new_addr(Slirp *slirp, struct in_addr *paddr,
  const uint8_t *macaddr)
@@ -166,8 +162,9 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t 
*bp)
 DPRINTF("bootp packet op=%d msgtype=%d", bp->bp_op, dhcp_msg_type);
 if (preq_addr.s_addr != htonl(0L))
 DPRINTF(" req_addr=%08" PRIx32 "\n", ntohl(preq_addr.s_addr));
-else
+else {
 DPRINTF("\n");
+}
 
 if (dhcp_msg_type == 0)
 dhcp_msg_type = DHCPREQUEST; /* Force reply for old BOOTP clients */
-- 
2.20.1




[Qemu-devel] [PULL 44/65] slirp: simplify fork_exec()

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Use g_spawn_async_with_fds() to setup the child.

GSpawn handles reaping the child, and closing parent file descriptors.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c | 75 +---
 1 file changed, 36 insertions(+), 39 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index ee3492a2ae..753b3da25b 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -129,56 +129,53 @@ err:
 return -1;
 }
 
+static void
+fork_exec_child_setup(gpointer data)
+{
+setsid();
+}
+
 int
 fork_exec(struct socket *so, const char *ex)
 {
-   char **argv;
-   int opt, c, sp[2];
-   pid_t pid;
+GError *err = NULL;
+char **argv;
+int opt, sp[2];
 
-   DEBUG_CALL("fork_exec");
-   DEBUG_ARG("so = %p", so);
-   DEBUG_ARG("ex = %p", ex);
+DEBUG_CALL("fork_exec");
+DEBUG_ARG("so = %p", so);
+DEBUG_ARG("ex = %p", ex);
 
 if (slirp_socketpair_with_oob(sp) < 0) {
 return 0;
 }
 
-   pid = fork();
-   switch(pid) {
-case -1:
-   error_report("Error: fork failed: %s", strerror(errno));
-   closesocket(sp[0]);
-   closesocket(sp[1]);
-   return 0;
-
-case 0:
-   setsid();
-   dup2(sp[1], 0);
-   dup2(sp[1], 1);
-   dup2(sp[1], 2);
-   for (c = getdtablesize() - 1; c >= 3; c--)
-  close(c);
+argv = g_strsplit(ex, " ", -1);
+g_spawn_async_with_fds(NULL /* cwd */,
+   argv,
+   NULL /* env */,
+   G_SPAWN_SEARCH_PATH,
+   fork_exec_child_setup, NULL /* data */,
+   NULL /* child_pid */,
+   sp[1], sp[1], sp[1],
+   &err);
+g_strfreev(argv);
 
-argv = g_strsplit(ex, " ", -1);
-   execvp(argv[0], (char **)argv);
-
-   /* Ooops, failed, let's tell the user why */
-fprintf(stderr, "Error: execvp of %s failed: %s\n",
-argv[0], strerror(errno));
-   close(0); close(1); close(2); /* XXX */
-   exit(1);
+if (err) {
+error_report("%s", err->message);
+g_error_free(err);
+closesocket(sp[0]);
+closesocket(sp[1]);
+return 0;
+}
 
-default:
-   so->s = sp[0];
-   closesocket(sp[1]);
-   qemu_add_child_watch(pid);
-   socket_set_fast_reuse(so->s);
-   opt = 1;
-   qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, 
sizeof(int));
-   qemu_set_nonblock(so->s);
-   return 1;
-   }
+so->s = sp[0];
+closesocket(sp[1]);
+socket_set_fast_reuse(so->s);
+opt = 1;
+qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
+qemu_set_nonblock(so->s);
+return 1;
 }
 #endif
 
-- 
2.20.1




[Qemu-devel] [PULL 35/65] slirp: improve a bit the debug macros

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Let them accept multiple arguments. Simplify the inner argument
handling of DEBUG_ARGS/DEBUG_MISC_DEBUG_ERROR.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/arp_table.c  | 12 ++--
 slirp/bootp.c  |  3 +--
 slirp/cksum.c  |  4 ++--
 slirp/debug.h  | 47 --
 slirp/dhcpv6.c | 11 +--
 slirp/ip6_icmp.c   |  2 +-
 slirp/ip_icmp.c| 18 +-
 slirp/mbuf.c   |  2 +-
 slirp/ndp_table.c  | 18 +-
 slirp/slirp.c  | 12 ++--
 slirp/socket.c | 32 +++
 slirp/tcp_input.c  | 15 +++
 slirp/tcp_output.c |  2 +-
 slirp/tcp_subr.c   |  4 ++--
 slirp/udp.c|  6 +++---
 slirp/udp6.c   |  6 +++---
 16 files changed, 109 insertions(+), 85 deletions(-)

diff --git a/slirp/arp_table.c b/slirp/arp_table.c
index f81963bb88..ce19e6e7c0 100644
--- a/slirp/arp_table.c
+++ b/slirp/arp_table.c
@@ -34,9 +34,9 @@ void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t 
ethaddr[ETH_ALEN])
 
 DEBUG_CALL("arp_table_add");
 DEBUG_ARG("ip = %s", inet_ntoa((struct in_addr){.s_addr = ip_addr}));
-DEBUG_ARGS((dfd, " hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
-ethaddr[0], ethaddr[1], ethaddr[2],
-ethaddr[3], ethaddr[4], ethaddr[5]));
+DEBUG_ARGS(" hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
+   ethaddr[0], ethaddr[1], ethaddr[2],
+   ethaddr[3], ethaddr[4], ethaddr[5]);
 
 if (ip_addr == 0 || ip_addr == 0x || ip_addr == broadcast_addr) {
 /* Do not register broadcast addresses */
@@ -79,9 +79,9 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
 for (i = 0; i < ARP_TABLE_SIZE; i++) {
 if (arptbl->table[i].ar_sip == ip_addr) {
 memcpy(out_ethaddr, arptbl->table[i].ar_sha,  ETH_ALEN);
-DEBUG_ARGS((dfd, " found hw addr = 
%02x:%02x:%02x:%02x:%02x:%02x\n",
-out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
-out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]));
+DEBUG_ARGS(" found hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
+   out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
+   out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]);
 return 1;
 }
 }
diff --git a/slirp/bootp.c b/slirp/bootp.c
index 7b1af73c95..5ab6692038 100644
--- a/slirp/bootp.c
+++ b/slirp/bootp.c
@@ -37,8 +37,7 @@
 static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE };
 
 #ifdef DEBUG
-#define DPRINTF(fmt, ...) \
-do if (slirp_debug & DBG_CALL) { fprintf(dfd, fmt, ##  __VA_ARGS__); 
fflush(dfd); } while (0)
+#define DPRINTF(fmt, ...) DEBUG_CALL(fmt, ##__VA_ARGS__)
 #else
 #define DPRINTF(fmt, ...) do{}while(0)
 #endif
diff --git a/slirp/cksum.c b/slirp/cksum.c
index 6d73abf4a0..b9466485b5 100644
--- a/slirp/cksum.c
+++ b/slirp/cksum.c
@@ -124,8 +124,8 @@ int cksum(struct mbuf *m, int len)
 cont:
 #ifdef DEBUG
if (len) {
-   DEBUG_ERROR((dfd, "cksum: out of data\n"));
-   DEBUG_ERROR((dfd, " len = %d\n", len));
+   DEBUG_ERROR("cksum: out of data\n");
+   DEBUG_ERROR(" len = %d\n", len);
}
 #endif
if (mlen == -1) {
diff --git a/slirp/debug.h b/slirp/debug.h
index 6cfa61edb3..ca3a4b04da 100644
--- a/slirp/debug.h
+++ b/slirp/debug.h
@@ -17,18 +17,45 @@
 
 extern int slirp_debug;
 
-#define DEBUG_CALL(x) if (slirp_debug & DBG_CALL) { fprintf(dfd, "%s...\n", 
x); fflush(dfd); }
-#define DEBUG_ARG(x, y) if (slirp_debug & DBG_CALL) { fputc(' ', dfd); 
fprintf(dfd, x, y); fputc('\n', dfd); fflush(dfd); }
-#define DEBUG_ARGS(x) if (slirp_debug & DBG_CALL) { fprintf x ; fflush(dfd); }
-#define DEBUG_MISC(x) if (slirp_debug & DBG_MISC) { fprintf x ; fflush(dfd); }
-#define DEBUG_ERROR(x) if (slirp_debug & DBG_ERROR) {fprintf x ; fflush(dfd); }
+#define DEBUG_CALL(fmt, ...) do {   \
+if (slirp_debug & DBG_CALL) {   \
+fprintf(dfd, fmt, ##__VA_ARGS__);   \
+fprintf(dfd, "...\n");  \
+fflush(dfd);\
+}   \
+} while (0)
+
+#define DEBUG_ARG(fmt, ...) do {\
+if (slirp_debug & DBG_CALL) {   \
+fputc(' ', dfd);\
+fprintf(dfd, fmt, ##__VA_ARGS__);   \
+fputc('\n', dfd);   \
+fflush(dfd);\
+}   \
+} while (0)
+
+#define DEBUG_ARGS(fmt, ...) DEBUG_ARG(fmt, ##__VA_ARGS__)
+
+#define DEBUG_MISC(fmt, ...) do {   \
+if (sl

[Qemu-devel] [PULL 54/65] slirp: always build with debug statements

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Make debug statements condiitonal only on slirp_debug flags, instead
of the pre-processor DEBUG blocks, as it may introduce breakage
easily, since the debug code isn't always compiled.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/debug.h | 15 +++
 slirp/misc.c  |  6 +-
 2 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/slirp/debug.h b/slirp/debug.h
index ca3a4b04da..ff920f0b87 100644
--- a/slirp/debug.h
+++ b/slirp/debug.h
@@ -5,9 +5,8 @@
  * terms and conditions of the copyright.
  */
 
-//#define DEBUG 1
-
-#ifdef DEBUG
+#ifndef DEBUG_H_
+#define DEBUG_H_
 
 #define DBG_CALL 0x1
 #define DBG_MISC 0x2
@@ -50,12 +49,4 @@ extern int slirp_debug;
 }   \
 } while (0)
 
-#else
-
-#define DEBUG_CALL(fmt, ...)
-#define DEBUG_ARG(fmt, ...)
-#define DEBUG_ARGS(fmt, ...)
-#define DEBUG_MISC(fmt, ...)
-#define DEBUG_ERROR(fmt, ...)
-
-#endif
+#endif /* DEBUG_H_ */
diff --git a/slirp/misc.c b/slirp/misc.c
index 526cefa0f1..e30d2ceb2a 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -12,9 +12,13 @@
 #include "qemu/main-loop.h"
 
 #ifdef DEBUG
-int slirp_debug = DBG_CALL|DBG_MISC|DBG_ERROR;
+#define SLIRP_DEBUG (DBG_CALL | DBG_MISC | DBG_ERROR)
+#else
+#define SLIRP_DEBUG 0
 #endif
 
+int slirp_debug = SLIRP_DEBUG;
+
 inline void
 insque(void *a, void *b)
 {
-- 
2.20.1




[Qemu-devel] [PULL 39/65] slirp: NULL is defined by stddef.h

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h | 4 
 1 file changed, 4 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index d1b6bcefbb..fdf397256b 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -199,10 +199,6 @@ struct Slirp {
 void *opaque;
 };
 
-#ifndef NULL
-#define NULL (void *)0
-#endif
-
 void if_start(Slirp *);
 
 int get_dns_addr(struct in_addr *pdns_addr);
-- 
2.20.1




[Qemu-devel] [PULL 42/65] net: do not depend on slirp internals

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Only slirp/libslirp.h should be included.

Instead of using some slirp declarations and utility functions directly,
let's copy them in net/util.h.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Tested-by: Philippe Mathieu-Daudé 
Signed-off-by: Samuel Thibault 
---
 net/colo-compare.c| 11 +
 net/colo.c|  1 +
 net/colo.h|  7 +++---
 net/filter-rewriter.c |  9 +++
 net/slirp.c   |  2 +-
 net/util.h| 55 +++
 stubs/slirp.c |  2 +-
 7 files changed, 72 insertions(+), 15 deletions(-)

diff --git a/net/colo-compare.c b/net/colo-compare.c
index 9156ab3349..3e515f3023 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -30,6 +30,7 @@
 #include "net/colo-compare.h"
 #include "migration/colo.h"
 #include "migration/migration.h"
+#include "util.h"
 
 #define TYPE_COLO_COMPARE "colo-compare"
 #define COLO_COMPARE(obj) \
@@ -129,19 +130,19 @@ static int compare_chr_send(CompareState *s,
 
 static gint seq_sorter(Packet *a, Packet *b, gpointer data)
 {
-struct tcphdr *atcp, *btcp;
+struct tcp_hdr *atcp, *btcp;
 
-atcp = (struct tcphdr *)(a->transport_header);
-btcp = (struct tcphdr *)(b->transport_header);
+atcp = (struct tcp_hdr *)(a->transport_header);
+btcp = (struct tcp_hdr *)(b->transport_header);
 return ntohl(atcp->th_seq) - ntohl(btcp->th_seq);
 }
 
 static void fill_pkt_tcp_info(void *data, uint32_t *max_ack)
 {
 Packet *pkt = data;
-struct tcphdr *tcphd;
+struct tcp_hdr *tcphd;
 
-tcphd = (struct tcphdr *)pkt->transport_header;
+tcphd = (struct tcp_hdr *)pkt->transport_header;
 
 pkt->tcp_seq = ntohl(tcphd->th_seq);
 pkt->tcp_ack = ntohl(tcphd->th_ack);
diff --git a/net/colo.c b/net/colo.c
index 49176bf07b..8196b35837 100644
--- a/net/colo.c
+++ b/net/colo.c
@@ -15,6 +15,7 @@
 #include "qemu/osdep.h"
 #include "trace.h"
 #include "colo.h"
+#include "util.h"
 
 uint32_t connection_key_hash(const void *opaque)
 {
diff --git a/net/colo.h b/net/colo.h
index 11c5226488..b21c6830b5 100644
--- a/net/colo.h
+++ b/net/colo.h
@@ -15,10 +15,9 @@
 #ifndef QEMU_COLO_PROXY_H
 #define QEMU_COLO_PROXY_H
 
-#include "slirp/slirp.h"
 #include "qemu/jhash.h"
 #include "qemu/timer.h"
-#include "slirp/tcp.h"
+#include "net/eth.h"
 
 #define HASHTABLE_MAX_SIZE 16384
 
@@ -81,10 +80,10 @@ typedef struct Connection {
 /* the maximum of acknowledgement number in secondary_list queue */
 uint32_t sack;
 /* offset = secondary_seq - primary_seq */
-tcp_seq  offset;
+uint32_t  offset;
 
 int tcp_state; /* TCP FSM state */
-tcp_seq fin_ack_seq; /* the seq of 'fin=1,ack=1' */
+uint32_t fin_ack_seq; /* the seq of 'fin=1,ack=1' */
 } Connection;
 
 uint32_t connection_key_hash(const void *opaque);
diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c
index 2e26839bc2..b464abe5e8 100644
--- a/net/filter-rewriter.c
+++ b/net/filter-rewriter.c
@@ -22,6 +22,7 @@
 #include "net/checksum.h"
 #include "net/colo.h"
 #include "migration/colo.h"
+#include "util.h"
 
 #define FILTER_COLO_REWRITER(obj) \
 OBJECT_CHECK(RewriterState, (obj), TYPE_FILTER_REWRITER)
@@ -73,9 +74,9 @@ static int handle_primary_tcp_pkt(RewriterState *rf,
   Connection *conn,
   Packet *pkt, ConnectionKey *key)
 {
-struct tcphdr *tcp_pkt;
+struct tcp_hdr *tcp_pkt;
 
-tcp_pkt = (struct tcphdr *)pkt->transport_header;
+tcp_pkt = (struct tcp_hdr *)pkt->transport_header;
 if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_DEBUG)) {
 trace_colo_filter_rewriter_pkt_info(__func__,
 inet_ntoa(pkt->ip->ip_src), inet_ntoa(pkt->ip->ip_dst),
@@ -176,9 +177,9 @@ static int handle_secondary_tcp_pkt(RewriterState *rf,
 Connection *conn,
 Packet *pkt, ConnectionKey *key)
 {
-struct tcphdr *tcp_pkt;
+struct tcp_hdr *tcp_pkt;
 
-tcp_pkt = (struct tcphdr *)pkt->transport_header;
+tcp_pkt = (struct tcp_hdr *)pkt->transport_header;
 
 if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_DEBUG)) {
 trace_colo_filter_rewriter_pkt_info(__func__,
diff --git a/net/slirp.c b/net/slirp.c
index ea8b04e007..b1c98b9470 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -38,12 +38,12 @@
 #include "qemu/error-report.h"
 #include "qemu/sockets.h"
 #include "slirp/libslirp.h"
-#include "slirp/ip6.h"
 #include "chardev/char-fe.h"
 #include "sysemu/sysemu.h"
 #include "qemu/cutils.h"
 #include "qapi/e

[Qemu-devel] [PULL 23/65] slirp: remove unused HAVE_ARPA_INET_H

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp_config.h | 6 --
 1 file changed, 6 deletions(-)

diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 47811e36dc..e95284071a 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -41,12 +41,6 @@
 #define HAVE_SYS_SELECT_H
 #endif
 
-/* Define if you have arpa/inet.h */
-#undef HAVE_ARPA_INET_H
-#ifndef _WIN32
-#define HAVE_ARPA_INET_H
-#endif
-
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
 
-- 
2.20.1




[Qemu-devel] [PULL 34/65] slirp: replace error_report() with g_critical()

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Reduce dependency on QEMU. QEMU could use a custom log handler if it
wants to redirect/filter it.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/ip6_icmp.c | 2 +-
 slirp/misc.c | 2 +-
 slirp/slirp.c| 6 +++---
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index cd1e0b9fe1..3c424df591 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -417,7 +417,7 @@ void icmp6_input(struct mbuf *m)
 icmp6_send_echoreply(m, slirp, ip, icmp);
 } else {
 /* TODO */
-error_report("external icmpv6 not supported yet");
+g_critical("external icmpv6 not supported yet");
 }
 break;
 
diff --git a/slirp/misc.c b/slirp/misc.c
index 7362e14339..ee3492a2ae 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -119,7 +119,7 @@ slirp_socketpair_with_oob(int sv[2])
 return 0;
 
 err:
-error_report("Error: slirp_socketpair(): %s", strerror(errno));
+g_critical("slirp_socketpair(): %s", strerror(errno));
 if (s >= 0) {
 closesocket(s);
 }
diff --git a/slirp/slirp.c b/slirp/slirp.c
index f11f9e9e51..8391d18faf 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1214,8 +1214,8 @@ static int sbuf_tmp_post_load(void *opaque, int version)
 }
 if (tmp->woff >= requested_len ||
 tmp->roff >= requested_len) {
-error_report("invalid sbuf offsets r/w=%u/%u len=%u",
- tmp->roff, tmp->woff, requested_len);
+g_critical("invalid sbuf offsets r/w=%u/%u len=%u",
+   tmp->roff, tmp->woff, requested_len);
 return -EINVAL;
 }
 
@@ -1323,7 +1323,7 @@ static int ss_family_post_load(void *opaque, int 
version_id)
 tss->parent->ss.ss_family = AF_INET6;
 break;
 default:
-error_report("invalid ss_family type %x", tss->portable_family);
+g_critical("invalid ss_family type %x", tss->portable_family);
 return -EINVAL;
 }
 
-- 
2.20.1




[Qemu-devel] [PULL 38/65] slirp: remove unused sbflush()

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/sbuf.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/slirp/sbuf.h b/slirp/sbuf.h
index a722ecb629..644c201341 100644
--- a/slirp/sbuf.h
+++ b/slirp/sbuf.h
@@ -8,7 +8,6 @@
 #ifndef SBUF_H
 #define SBUF_H
 
-#define sbflush(sb) sbdrop((sb),(sb)->sb_cc)
 #define sbspace(sb) ((sb)->sb_datalen - (sb)->sb_cc)
 
 struct sbuf {
-- 
2.20.1




[Qemu-devel] [PULL 33/65] slirp: remove unused global slirp_instance

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 05c203c8c7..d1b6bcefbb 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -199,8 +199,6 @@ struct Slirp {
 void *opaque;
 };
 
-extern Slirp *slirp_instance;
-
 #ifndef NULL
 #define NULL (void *)0
 #endif
-- 
2.20.1




[Qemu-devel] [PULL 25/65] slirp: remove unused HAVE_SYS_SELECT_H

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/main.h | 4 
 slirp/slirp.h| 4 
 slirp/slirp_config.h | 6 --
 3 files changed, 14 deletions(-)

diff --git a/slirp/main.h b/slirp/main.h
index e04677944f..4bc05fb904 100644
--- a/slirp/main.h
+++ b/slirp/main.h
@@ -8,10 +8,6 @@
 #ifndef SLIRP_MAIN_H
 #define SLIRP_MAIN_H
 
-#ifdef HAVE_SYS_SELECT_H
-#include 
-#endif
-
 extern u_int curtime;
 extern struct in_addr loopback_addr;
 extern unsigned long loopback_mask;
diff --git a/slirp/slirp.h b/slirp/slirp.h
index 1f47848271..7606de962f 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -36,10 +36,6 @@ typedef char *caddr_t;
 # include 
 #endif
 
-#ifdef HAVE_SYS_SELECT_H
-# include 
-#endif
-
 #ifdef HAVE_SYS_FILIO_H
 # include 
 #endif
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 9becb98e11..68e75f3873 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -32,12 +32,6 @@
 #define DECLARE_IOVEC
 #endif
 
-/* Define if you have sys/select.h */
-#undef HAVE_SYS_SELECT_H
-#ifndef _WIN32
-#define HAVE_SYS_SELECT_H
-#endif
-
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
 
-- 
2.20.1




[Qemu-devel] [PULL 16/65] slirp: remove PROBE_CONN dead-code

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Nobody cares for over 14y. Somebody can revert or rewrite if
interested by that.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.c| 41 -
 slirp/slirp_config.h |  4 
 2 files changed, 45 deletions(-)

diff --git a/slirp/slirp.c b/slirp/slirp.c
index bab49e83e3..76e94eb1cd 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -699,47 +699,6 @@ void slirp_pollfds_poll(GArray *pollfds, int select_error)
 }
 }
 }
-
-/*
- * Probe a still-connecting, non-blocking socket
- * to check if it's still alive
- */
-#ifdef PROBE_CONN
-if (so->so_state & SS_ISFCONNECTING) {
-ret = qemu_recv(so->s, &ret, 0, 0);
-
-if (ret < 0) {
-/* XXX */
-if (errno == EAGAIN || errno == EWOULDBLOCK ||
-errno == EINPROGRESS || errno == ENOTCONN) {
-continue; /* Still connecting, continue */
-}
-
-/* else failed */
-so->so_state &= SS_PERSISTENT_MASK;
-so->so_state |= SS_NOFDREF;
-
-/* tcp_input will take care of it */
-} else {
-ret = send(so->s, &ret, 0, 0);
-if (ret < 0) {
-/* XXX */
-if (errno == EAGAIN || errno == EWOULDBLOCK ||
-errno == EINPROGRESS || errno == ENOTCONN) {
-continue;
-}
-/* else failed */
-so->so_state &= SS_PERSISTENT_MASK;
-so->so_state |= SS_NOFDREF;
-} else {
-so->so_state &= ~SS_ISFCONNECTING;
-}
-
-}
-tcp_input((struct mbuf *)NULL, sizeof(struct ip), so,
-  so->so_ffamily);
-} /* SS_ISFCONNECTING */
-#endif
 }
 
 /*
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index c59f655207..721667e3ef 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -2,10 +2,6 @@
  * User definable configuration options
  */
 
-/* Define if you want the connection to be probed */
-/* XXX Not working yet, so ignore this for now */
-#undef PROBE_CONN
-
 /* Define to 1 if you want KEEPALIVE timers */
 #define DO_KEEPALIVE 0
 
-- 
2.20.1




[Qemu-devel] [PULL 45/65] slirp: replace error_report() with g_critical()

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Reduce dependency on QEMU. QEMU could use a custom log handler if it
wants to redirect/filter it.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index 753b3da25b..b141446319 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -162,7 +162,7 @@ fork_exec(struct socket *so, const char *ex)
 g_strfreev(argv);
 
 if (err) {
-error_report("%s", err->message);
+g_critical("fork_exec: %s", err->message);
 g_error_free(err);
 closesocket(sp[0]);
 closesocket(sp[1]);
-- 
2.20.1




[Qemu-devel] [PULL 43/65] glib-compat: add g_spawn_async_with_fds() fallback

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 include/glib-compat.h | 56 +++
 1 file changed, 56 insertions(+)

diff --git a/include/glib-compat.h b/include/glib-compat.h
index fdf95a255d..8a078c5288 100644
--- a/include/glib-compat.h
+++ b/include/glib-compat.h
@@ -83,6 +83,62 @@ static inline gboolean g_strv_contains_qemu(const gchar 
*const *strv,
 }
 #define g_strv_contains(a, b) g_strv_contains_qemu(a, b)
 
+#if !GLIB_CHECK_VERSION(2, 58, 0)
+typedef struct QemuGSpawnFds {
+GSpawnChildSetupFunc child_setup;
+gpointer user_data;
+gint stdin_fd;
+gint stdout_fd;
+gint stderr_fd;
+} QemuGSpawnFds;
+
+static inline void
+qemu_gspawn_fds_setup(gpointer user_data)
+{
+QemuGSpawnFds *q = (QemuGSpawnFds *)user_data;
+
+dup2(q->stdin_fd, 0);
+dup2(q->stdout_fd, 1);
+dup2(q->stderr_fd, 2);
+q->child_setup(q->user_data);
+}
+#endif
+
+static inline gboolean
+g_spawn_async_with_fds_qemu(const gchar *working_directory,
+gchar **argv,
+gchar **envp,
+GSpawnFlags flags,
+GSpawnChildSetupFunc child_setup,
+gpointer user_data,
+GPid *child_pid,
+gint stdin_fd,
+gint stdout_fd,
+gint stderr_fd,
+GError **error)
+{
+#if GLIB_CHECK_VERSION(2, 58, 0)
+return g_spawn_async_with_fds(working_directory, argv, envp, flags,
+  child_setup, user_data,
+  child_pid, stdin_fd, stdout_fd, stderr_fd,
+  error);
+#else
+QemuGSpawnFds setup = {
+.child_setup = child_setup,
+.user_data = user_data,
+.stdin_fd = stdin_fd,
+.stdout_fd = stdout_fd,
+.stderr_fd = stderr_fd,
+};
+
+return g_spawn_async(working_directory, argv, envp, flags,
+ qemu_gspawn_fds_setup, &setup,
+ child_pid, error);
+#endif
+}
+
+#define g_spawn_async_with_fds(wd, argv, env, f, c, d, p, ifd, ofd, efd, err) \
+g_spawn_async_with_fds_qemu(wd, argv, env, f, c, d, p, ifd, ofd, efd, err)
 
 #if defined(_WIN32) && !GLIB_CHECK_VERSION(2, 50, 0)
 /*
-- 
2.20.1




[Qemu-devel] [PULL 26/65] slirp: remove HAVE_SYS_IOCTL_H

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 2 +-
 slirp/slirp_config.h | 6 --
 2 files changed, 1 insertion(+), 7 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 7606de962f..226bced429 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -32,7 +32,7 @@ typedef char *caddr_t;
 #include 
 #endif
 
-#if defined(HAVE_SYS_IOCTL_H)
+#ifndef _WIN32
 # include 
 #endif
 
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 68e75f3873..0e78e92d94 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -11,12 +11,6 @@
  * You shouldn't need to touch any of these
  */
 
-/* Define if you have sys/ioctl.h */
-#undef HAVE_SYS_IOCTL_H
-#ifndef _WIN32
-#define HAVE_SYS_IOCTL_H
-#endif
-
 /* Define if you have sys/filio.h */
 #undef HAVE_SYS_FILIO_H
 #ifdef __APPLE__
-- 
2.20.1




[Qemu-devel] [PULL 41/65] slirp: replace ARRAY_SIZE with G_N_ELEMENTS

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Do not require QEMU macro.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/ncsi.c | 2 +-
 slirp/tftp.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/slirp/ncsi.c b/slirp/ncsi.c
index 10decfb5ef..8594382270 100644
--- a/slirp/ncsi.c
+++ b/slirp/ncsi.c
@@ -128,7 +128,7 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len)
 memset(reh->h_source, 0xff, ETH_ALEN);
 reh->h_proto = htons(ETH_P_NCSI);
 
-for (i = 0; i < ARRAY_SIZE(ncsi_rsp_handlers); i++) {
+for (i = 0; i < G_N_ELEMENTS(ncsi_rsp_handlers); i++) {
 if (ncsi_rsp_handlers[i].type == nh->type + 0x80) {
 handler = &ncsi_rsp_handlers[i];
 break;
diff --git a/slirp/tftp.c b/slirp/tftp.c
index 735b57aa55..a9ba1480db 100644
--- a/slirp/tftp.c
+++ b/slirp/tftp.c
@@ -359,7 +359,7 @@ static void tftp_handle_rrq(Slirp *slirp, struct 
sockaddr_storage *srcsas,
   return;
   }
 
-  while (k < pktlen && nb_options < ARRAY_SIZE(option_name)) {
+  while (k < pktlen && nb_options < G_N_ELEMENTS(option_name)) {
   const char *key, *value;
 
   key = &tp->x.tp_buf[k];
@@ -403,7 +403,7 @@ static void tftp_handle_rrq(Slirp *slirp, struct 
sockaddr_storage *srcsas,
   }
 
   if (nb_options > 0) {
-  assert(nb_options <= ARRAY_SIZE(option_name));
+  assert(nb_options <= G_N_ELEMENTS(option_name));
   tftp_send_oack(spt, option_name, option_value, nb_options, tp);
   return;
   }
-- 
2.20.1




[Qemu-devel] [PULL 37/65] slirp: remove #if notdef dead code

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/ip_input.c  | 200 --
 slirp/tcp_input.c |  39 -
 2 files changed, 239 deletions(-)

diff --git a/slirp/ip_input.c b/slirp/ip_input.c
index 094a807d41..d360620838 100644
--- a/slirp/ip_input.c
+++ b/slirp/ip_input.c
@@ -447,206 +447,6 @@ ip_slowtimo(Slirp *slirp)
 }
 }
 
-/*
- * Do option processing on a datagram,
- * possibly discarding it if bad options are encountered,
- * or forwarding it if source-routed.
- * Returns 1 if packet has been forwarded/freed,
- * 0 if the packet should be processed further.
- */
-
-#ifdef notdef
-
-int
-ip_dooptions(m)
-   struct mbuf *m;
-{
-   register struct ip *ip = mtod(m, struct ip *);
-   register u_char *cp;
-   register struct ip_timestamp *ipt;
-   register struct in_ifaddr *ia;
-   int opt, optlen, cnt, off, code, type, forward = 0;
-   struct in_addr *sin, dst;
-typedef uint32_t n_time;
-   n_time ntime;
-
-   dst = ip->ip_dst;
-   cp = (u_char *)(ip + 1);
-   cnt = (ip->ip_hl << 2) - sizeof (struct ip);
-   for (; cnt > 0; cnt -= optlen, cp += optlen) {
-   opt = cp[IPOPT_OPTVAL];
-   if (opt == IPOPT_EOL)
-   break;
-   if (opt == IPOPT_NOP)
-   optlen = 1;
-   else {
-   optlen = cp[IPOPT_OLEN];
-   if (optlen <= 0 || optlen > cnt) {
-   code = &cp[IPOPT_OLEN] - (u_char *)ip;
-   goto bad;
-   }
-   }
-   switch (opt) {
-
-   default:
-   break;
-
-   /*
-* Source routing with record.
-* Find interface with current destination address.
-* If none on this machine then drop if strictly routed,
-* or do nothing if loosely routed.
-* Record interface address and bring up next address
-* component.  If strictly routed make sure next
-* address is on directly accessible net.
-*/
-   case IPOPT_LSRR:
-   case IPOPT_SSRR:
-   if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) {
-   code = &cp[IPOPT_OFFSET] - (u_char *)ip;
-   goto bad;
-   }
-   ipaddr.sin_addr = ip->ip_dst;
-   ia = (struct in_ifaddr *)
-   ifa_ifwithaddr((struct sockaddr *)&ipaddr);
-   if (ia == 0) {
-   if (opt == IPOPT_SSRR) {
-   type = ICMP_UNREACH;
-   code = ICMP_UNREACH_SRCFAIL;
-   goto bad;
-   }
-   /*
-* Loose routing, and not at next destination
-* yet; nothing to do except forward.
-*/
-   break;
-   }
-off--; /* 0 origin */
-   if (off > optlen - sizeof(struct in_addr)) {
-   /*
-* End of source route.  Should be for us.
-*/
-   save_rte(cp, ip->ip_src);
-   break;
-   }
-   /*
-* locate outgoing interface
-*/
-   bcopy((caddr_t)(cp + off), (caddr_t)&ipaddr.sin_addr,
-   sizeof(ipaddr.sin_addr));
-   if (opt == IPOPT_SSRR) {
-#defineINA struct in_ifaddr *
-#defineSA  struct sockaddr *
-   if ((ia = (INA)ifa_ifwithdstaddr((SA)&ipaddr)) == 0)
-   ia = (INA)ifa_ifwithnet((SA)&ipaddr);
-   } else
-   ia = ip_rtaddr(ipaddr.sin_addr);
-   if (ia == 0) {
-   type = ICMP_UNREACH;
-   code = ICMP_UNREACH_SRCFAIL;
-   goto bad;
-   }
-   ip->ip_dst = ipaddr.sin_addr;
-   bcopy((caddr_t)&(IA_SIN(ia)->sin_addr),
-   (caddr_t)(cp + off), sizeof(struct in_addr));
-   cp[IPOPT_OFFSET] += sizeof(struct in_addr);
-   /*
-* Let ip_intr's mcast routing check handl

[Qemu-devel] [PULL 27/65] slirp: remove HAVE_SYS_FILIO_H

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 2 +-
 slirp/slirp_config.h | 6 --
 2 files changed, 1 insertion(+), 7 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 226bced429..4a046e 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -36,7 +36,7 @@ typedef char *caddr_t;
 # include 
 #endif
 
-#ifdef HAVE_SYS_FILIO_H
+#ifdef __APPLE__
 # include 
 #endif
 
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 0e78e92d94..f1ee927c15 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -11,12 +11,6 @@
  * You shouldn't need to touch any of these
  */
 
-/* Define if you have sys/filio.h */
-#undef HAVE_SYS_FILIO_H
-#ifdef __APPLE__
-#define HAVE_SYS_FILIO_H
-#endif
-
 /* Define if the machine is big endian */
 //#undef HOST_WORDS_BIGENDIAN
 
-- 
2.20.1




[Qemu-devel] [PULL 22/65] slirp: remove unused HAVE_SYS_STROPTS_H

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 5 -
 slirp/slirp_config.h | 3 ---
 2 files changed, 8 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index fba77d0c3d..400f585cec 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -54,11 +54,6 @@ typedef char *caddr_t;
 #define remque slirp_remque
 #define quehead slirp_quehead
 
-#ifdef HAVE_SYS_STROPTS_H
-#include 
-#endif
-
-
 #include "debug.h"
 
 #include "qemu/queue.h"
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 4417b05d1c..47811e36dc 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -47,9 +47,6 @@
 #define HAVE_ARPA_INET_H
 #endif
 
-/* Define if you have sys/stropts.h */
-#undef HAVE_SYS_STROPTS_H
-
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
 
-- 
2.20.1




[Qemu-devel] [PULL 30/65] slirp: replace HOST_WORDS_BIGENDIAN with glib equivalent

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

One more step towards making the project independent from QEMU.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/ip.h   | 8 +---
 slirp/ip6.h  | 3 ++-
 slirp/ip6_icmp.h | 6 +++---
 slirp/slirp_config.h | 3 ---
 slirp/tcp.h  | 4 +++-
 5 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/slirp/ip.h b/slirp/ip.h
index 59cf4aa918..83fc9cdfbf 100644
--- a/slirp/ip.h
+++ b/slirp/ip.h
@@ -33,7 +33,9 @@
 #ifndef IP_H
 #define IP_H
 
-#ifdef HOST_WORDS_BIGENDIAN
+#include 
+
+#if G_BYTE_ORDER == G_BIG_ENDIAN
 # undef NTOHL
 # undef NTOHS
 # undef HTONL
@@ -69,7 +71,7 @@ typedef uint32_t n_long; /* long as received 
from the net */
  * Structure of an internet header, naked of options.
  */
 struct ip {
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
uint8_t ip_v:4, /* version */
ip_hl:4;/* header length */
 #else
@@ -135,7 +137,7 @@ struct  ip_timestamp {
uint8_t ipt_code;   /* IPOPT_TS */
uint8_t ipt_len;/* size of structure (variable) */
uint8_t ipt_ptr;/* index of current entry */
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
uint8_t ipt_oflw:4, /* overflow counter */
ipt_flg:4;  /* flags, see below */
 #else
diff --git a/slirp/ip6.h b/slirp/ip6.h
index b1bea43b3c..14e9c78735 100644
--- a/slirp/ip6.h
+++ b/slirp/ip6.h
@@ -6,6 +6,7 @@
 #ifndef SLIRP_IP6_H
 #define SLIRP_IP6_H
 
+#include 
 #include "net/eth.h"
 
 #define ALLNODES_MULTICAST  { .s6_addr = \
@@ -113,7 +114,7 @@ static inline void in6_compute_ethaddr(struct in6_addr ip,
  * Structure of an internet header, naked of options.
  */
 struct ip6 {
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
 uint32_t
 ip_v:4, /* version */
 ip_tc_hi:4, /* traffic class */
diff --git a/slirp/ip6_icmp.h b/slirp/ip6_icmp.h
index b3378b17b5..32b0914055 100644
--- a/slirp/ip6_icmp.h
+++ b/slirp/ip6_icmp.h
@@ -34,7 +34,7 @@ struct ndp_rs { /* Router Solicitation Message */
 
 struct ndp_ra { /* Router Advertisement Message */
 uint8_t chl;/* Cur Hop Limit */
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
 uint8_t
 M:1,
 O:1,
@@ -56,7 +56,7 @@ struct ndp_ns { /* Neighbor Solicitation Message */
 } QEMU_PACKED;
 
 struct ndp_na { /* Neighbor Advertisement Message */
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
 uint32_t
 R:1,/* Router Flag */
 S:1,/* Solicited Flag */
@@ -125,7 +125,7 @@ struct ndpopt {
 #define ndpopt_linklayer ndpopt_body.linklayer_addr
 struct prefixinfo { /* Prefix Information */
 uint8_t prefix_length;
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
 uint8_t L:1, A:1, reserved1:6;
 #else
 uint8_t reserved1:6, A:1, L:1;
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 5126711849..b2def6d20c 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -11,8 +11,5 @@
  * You shouldn't need to touch any of these
  */
 
-/* Define if the machine is big endian */
-//#undef HOST_WORDS_BIGENDIAN
-
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
diff --git a/slirp/tcp.h b/slirp/tcp.h
index 174d3d960c..47aaea6c5b 100644
--- a/slirp/tcp.h
+++ b/slirp/tcp.h
@@ -33,6 +33,8 @@
 #ifndef TCP_H
 #define TCP_H
 
+#include 
+
 typedefuint32_t tcp_seq;
 
 #define  PR_SLOWHZ   2   /* 2 slow timeouts per second 
(approx) */
@@ -51,7 +53,7 @@ struct tcphdr {
uint16_t th_dport;  /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
uint8_t th_off:4,   /* data offset */
th_x2:4;/* (unused) */
 #else
-- 
2.20.1




[Qemu-devel] [PULL 31/65] slirp: replace SIZEOF_CHAR_P with glib equivalent

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Signed-off-by: Samuel Thibault 
---
 slirp/ip.h   | 2 +-
 slirp/slirp_config.h | 3 ---
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/slirp/ip.h b/slirp/ip.h
index 83fc9cdfbf..243b6c8b24 100644
--- a/slirp/ip.h
+++ b/slirp/ip.h
@@ -177,7 +177,7 @@ struct  ip_timestamp {
 
 #defineIP_MSS  576 /* default maximum segment size 
*/
 
-#if SIZEOF_CHAR_P == 4
+#if GLIB_SIZEOF_VOID_P == 4
 struct mbuf_ptr {
struct mbuf *mptr;
uint32_t dummy;
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index b2def6d20c..7147e0de04 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -10,6 +10,3 @@
  * Autoconf defined configuration options
  * You shouldn't need to touch any of these
  */
-
-/* Define to sizeof(char *) */
-#define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
-- 
2.20.1




[Qemu-devel] [PULL 20/65] slirp: remove unused HAVE_SYS_BITYPES_H

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 4 
 slirp/slirp_config.h | 3 ---
 2 files changed, 7 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 4c3c672ee6..57955a8965 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -19,10 +19,6 @@ typedef char *caddr_t;
 # endif
 #endif
 
-#ifdef HAVE_SYS_BITYPES_H
-# include 
-#endif
-
 #ifndef _WIN32
 #include 
 #endif
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 2605c4222b..a205dc8c28 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -23,9 +23,6 @@
 #define HAVE_SYS_FILIO_H
 #endif
 
-/* Define if you have sys/bitypes.h */
-#undef HAVE_SYS_BITYPES_H
-
 /* Define if the machine is big endian */
 //#undef HOST_WORDS_BIGENDIAN
 
-- 
2.20.1




[Qemu-devel] [PULL 08/65] slirp: remove Monitor dependency, return a string for info

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

There is nothing performance-sensitive in returning an allocated
string for info, and handling the monitor_printf() on the caller side.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c  |  7 ---
 slirp/libslirp.h |  2 +-
 slirp/misc.c | 23 +--
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index 58d880de8d..b7319ca6b2 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -828,10 +828,11 @@ void hmp_info_usernet(Monitor *mon, const QDict *qdict)
 QTAILQ_FOREACH(s, &slirp_stacks, entry) {
 int id;
 bool got_hub_id = net_hub_id_for_client(&s->nc, &id) == 0;
-monitor_printf(mon, "Hub %d (%s):\n",
+char *info = slirp_connection_info(s->slirp);
+monitor_printf(mon, "Hub %d (%s):\n%s",
got_hub_id ? id : -1,
-   s->nc.name);
-slirp_connection_info(s->slirp, mon);
+   s->nc.name, info);
+g_free(info);
 }
 }
 
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index a4f390ee89..04b6db9f49 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -35,7 +35,7 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp,
 int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
struct in_addr *guest_addr, int guest_port);
 
-void slirp_connection_info(Slirp *slirp, Monitor *mon);
+char *slirp_connection_info(Slirp *slirp);
 
 void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr,
int guest_port, const uint8_t *buf, int size);
diff --git a/slirp/misc.c b/slirp/misc.c
index 2784fc420f..ce323ef92e 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -8,7 +8,6 @@
 #include "qemu/osdep.h"
 #include "slirp.h"
 #include "libslirp.h"
-#include "monitor/monitor.h"
 #include "qemu/error-report.h"
 #include "qemu/main-loop.h"
 
@@ -198,8 +197,9 @@ fork_exec(struct socket *so, const char *ex)
 }
 #endif
 
-void slirp_connection_info(Slirp *slirp, Monitor *mon)
+char *slirp_connection_info(Slirp *slirp)
 {
+GString *str = g_string_new(NULL);
 const char * const tcpstates[] = {
 [TCPS_CLOSED]   = "CLOSED",
 [TCPS_LISTEN]   = "LISTEN",
@@ -221,8 +221,9 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
 const char *state;
 char buf[20];
 
-monitor_printf(mon, "  Protocol[State]FD  Source Address  Port   "
-"Dest. Address  Port RecvQ SendQ\n");
+g_string_append_printf(str,
+"  Protocol[State]FD  Source Address  Port   "
+"Dest. Address  Port RecvQ SendQ\n");
 
 for (so = slirp->tcb.so_next; so != &slirp->tcb; so = so->so_next) {
 if (so->so_state & SS_HOSTFWD) {
@@ -244,10 +245,10 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
 dst_port = so->so_fport;
 }
 snprintf(buf, sizeof(buf), "  TCP[%s]", state);
-monitor_printf(mon, "%-19s %3d %15s %5d ", buf, so->s,
+g_string_append_printf(str, "%-19s %3d %15s %5d ", buf, so->s,
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",
ntohs(src.sin_port));
-monitor_printf(mon, "%15s %5d %5d %5d\n",
+g_string_append_printf(str, "%15s %5d %5d %5d\n",
inet_ntoa(dst_addr), ntohs(dst_port),
so->so_rcv.sb_cc, so->so_snd.sb_cc);
 }
@@ -267,10 +268,10 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
 dst_addr = so->so_faddr;
 dst_port = so->so_fport;
 }
-monitor_printf(mon, "%-19s %3d %15s %5d ", buf, so->s,
+g_string_append_printf(str, "%-19s %3d %15s %5d ", buf, so->s,
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",
ntohs(src.sin_port));
-monitor_printf(mon, "%15s %5d %5d %5d\n",
+g_string_append_printf(str, "%15s %5d %5d %5d\n",
inet_ntoa(dst_addr), ntohs(dst_port),
so->so_rcv.sb_cc, so->so_snd.sb_cc);
 }
@@ -280,9 +281,11 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
  (so->so_expire - curtime) / 1000);
 src.sin_addr = so->so_laddr;
 dst_addr = so->so_faddr;
-monitor_printf(mon, "%-19s %3d %15s  -", buf, so->s,
+g_string_append_printf(str, "%-19s %3d %15s  -", buf, so->s,
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*");
-monitor_printf(mon, "%15s  -%5d %5d\n", inet_ntoa(dst_addr),
+g_string_append_printf(str, "%15s  -%5d %5d\n", 
inet_ntoa(dst_addr),
so->so_rcv.sb_cc, so->so_snd.sb_cc);
 }
+
+return g_string_free(str, FALSE);
 }
-- 
2.20.1




[Qemu-devel] [PULL 28/65] slirp: remove unused DECLARE_IOVEC

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

It's actually qemu configure CONFIG_IOVEC that is being used.

slirp/ does not use it anyway

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp_config.h | 6 --
 1 file changed, 6 deletions(-)

diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index f1ee927c15..833f25a965 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -14,12 +14,6 @@
 /* Define if the machine is big endian */
 //#undef HOST_WORDS_BIGENDIAN
 
-/* Define if iovec needs to be declared */
-#undef DECLARE_IOVEC
-#ifdef _WIN32
-#define DECLARE_IOVEC
-#endif
-
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
 
-- 
2.20.1




[Qemu-devel] [PULL 24/65] slirp: remove unused HAVE_SYS_WAIT_H

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 4 
 slirp/slirp_config.h | 3 ---
 2 files changed, 7 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 400f585cec..1f47848271 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -40,10 +40,6 @@ typedef char *caddr_t;
 # include 
 #endif
 
-#ifdef HAVE_SYS_WAIT_H
-# include 
-#endif
-
 #ifdef HAVE_SYS_FILIO_H
 # include 
 #endif
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index e95284071a..9becb98e11 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -32,9 +32,6 @@
 #define DECLARE_IOVEC
 #endif
 
-/* Define if you have a POSIX.1 sys/wait.h */
-#undef HAVE_SYS_WAIT_H
-
 /* Define if you have sys/select.h */
 #undef HAVE_SYS_SELECT_H
 #ifndef _WIN32
-- 
2.20.1




[Qemu-devel] [PULL 18/65] slirp: remove the disabled readv()/writev() code path

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

The soread() function may be used on datagram sockets, and would
provide different behaviour if HAVE_READV was set, on empty datagrams.
This looks like a minor optimization, that never has been a strong
goal for slirp.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp_config.h |  3 ---
 slirp/socket.c   | 15 ---
 2 files changed, 18 deletions(-)

diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index f0cc1c781b..3ce64e088e 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -29,9 +29,6 @@
 /* Define if the machine is big endian */
 //#undef HOST_WORDS_BIGENDIAN
 
-/* Define if you have readv */
-#undef HAVE_READV
-
 /* Define if iovec needs to be declared */
 #undef DECLARE_IOVEC
 #ifdef _WIN32
diff --git a/slirp/socket.c b/slirp/socket.c
index 041ec5061a..7012c7c07d 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -187,12 +187,7 @@ soread(struct socket *so)
 */
sopreprbuf(so, iov, &n);
 
-#ifdef HAVE_READV
-   nn = readv(so->s, (struct iovec *)iov, n);
-   DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn));
-#else
nn = qemu_recv(so->s, iov[0].iov_base, iov[0].iov_len,0);
-#endif
if (nn <= 0) {
if (nn < 0 && (errno == EINTR || errno == EAGAIN))
return 0;
@@ -226,7 +221,6 @@ soread(struct socket *so)
}
}
 
-#ifndef HAVE_READV
/*
 * If there was no error, try and read the second time round
 * We read again if n = 2 (ie, there's another part of the buffer)
@@ -244,7 +238,6 @@ soread(struct socket *so)
 }
 
DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn));
-#endif
 
/* Update fields */
sb->sb_cc += nn;
@@ -452,13 +445,7 @@ sowrite(struct socket *so)
}
/* Check if there's urgent data to send, and if so, send it */
 
-#ifdef HAVE_READV
-   nn = writev(so->s, (const struct iovec *)iov, n);
-
-   DEBUG_MISC((dfd, "  ... wrote nn = %d bytes\n", nn));
-#else
nn = slirp_send(so, iov[0].iov_base, iov[0].iov_len,0);
-#endif
/* This should never happen, but people tell me it does *shrug* */
if (nn < 0 && (errno == EAGAIN || errno == EINTR))
return 0;
@@ -467,7 +454,6 @@ sowrite(struct socket *so)
goto err_disconnected;
}
 
-#ifndef HAVE_READV
if (n == 2 && nn == iov[0].iov_len) {
 int ret;
 ret = slirp_send(so, iov[1].iov_base, iov[1].iov_len,0);
@@ -475,7 +461,6 @@ sowrite(struct socket *so)
 nn += ret;
 }
 DEBUG_MISC((dfd, "  ... wrote nn = %d bytes\n", nn));
-#endif
 
/* Update sbuf */
sb->sb_cc -= nn;
-- 
2.20.1




[Qemu-devel] [PULL 04/65] slirp: use a dedicated field for chardev pointer

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Let's not mix command line and chardev pointers.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c  |  8 
 slirp/libslirp.h |  2 +-
 slirp/misc.c | 11 +++
 slirp/misc.h |  4 ++--
 slirp/slirp.c|  5 +++--
 slirp/tcp_subr.c |  2 +-
 6 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index dd06b0189e..58d880de8d 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -709,8 +709,8 @@ static int slirp_smb(SlirpState* s, const char 
*exported_dir,
  CONFIG_SMBD_COMMAND, s->smb_dir, smb_conf);
 g_free(smb_conf);
 
-if (slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 139) < 0 ||
-slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 445) < 0) {
+if (slirp_add_exec(s->slirp, NULL, smb_cmdline, &vserver_addr, 139) < 0 ||
+slirp_add_exec(s->slirp, NULL, smb_cmdline, &vserver_addr, 445) < 0) {
 slirp_smb_cleanup(s);
 g_free(smb_cmdline);
 error_setg(errp, "Conflicting/invalid smbserver address");
@@ -774,7 +774,7 @@ static int slirp_guestfwd(SlirpState *s, const char 
*config_str, Error **errp)
 snprintf(buf, sizeof(buf), "guestfwd.tcp.%d", port);
 
 if ((strlen(p) > 4) && !strncmp(p, "cmd:", 4)) {
-if (slirp_add_exec(s->slirp, 0, &p[4], &server, port) < 0) {
+if (slirp_add_exec(s->slirp, NULL, &p[4], &server, port) < 0) {
 error_setg(errp, "Conflicting/invalid host:port in guest "
"forwarding rule '%s'", config_str);
 return -1;
@@ -801,7 +801,7 @@ static int slirp_guestfwd(SlirpState *s, const char 
*config_str, Error **errp)
 return -1;
 }
 
-if (slirp_add_exec(s->slirp, 3, &fwd->hd, &server, port) < 0) {
+if (slirp_add_exec(s->slirp, &fwd->hd, NULL, &server, port) < 0) {
 error_setg(errp, "Conflicting/invalid host:port in guest "
"forwarding rule '%s'", config_str);
 g_free(fwd);
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 52dbb9feb5..3e88dbaa01 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -35,7 +35,7 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp,
   struct in_addr guest_addr, int guest_port);
 int slirp_remove_hostfwd(Slirp *slirp, int is_udp,
  struct in_addr host_addr, int host_port);
-int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
+int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
struct in_addr *guest_addr, int guest_port);
 
 void slirp_connection_info(Slirp *slirp, Monitor *mon);
diff --git a/slirp/misc.c b/slirp/misc.c
index 8f0b6004bd..2784fc420f 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -37,7 +37,7 @@ remque(void *a)
   element->qh_rlink = NULL;
 }
 
-int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
+int add_exec(struct ex_list **ex_ptr, void *chardev, const char *cmdline,
  struct in_addr addr, int port)
 {
struct ex_list *tmp_ptr;
@@ -50,11 +50,14 @@ int add_exec(struct ex_list **ex_ptr, int do_pty, char 
*exec,
}
 
tmp_ptr = *ex_ptr;
-   *ex_ptr = g_new(struct ex_list, 1);
+   *ex_ptr = g_new0(struct ex_list, 1);
(*ex_ptr)->ex_fport = port;
(*ex_ptr)->ex_addr = addr;
-   (*ex_ptr)->ex_chardev = do_pty == 3;
-   (*ex_ptr)->ex_exec = (do_pty == 3) ? exec : g_strdup(exec);
+   if (chardev) {
+   (*ex_ptr)->ex_chardev = chardev;
+   } else {
+   (*ex_ptr)->ex_exec = g_strdup(cmdline);
+   }
(*ex_ptr)->ex_next = tmp_ptr;
return 0;
 }
diff --git a/slirp/misc.h b/slirp/misc.h
index 1f8d11def6..64ca88c3b7 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -9,7 +9,7 @@
 #define MISC_H
 
 struct ex_list {
-   int ex_chardev;
+   void *ex_chardev;
struct in_addr ex_addr; /* Server address */
int ex_fport;   /* Port to telnet to */
const char *ex_exec;/* Command line of what to exec */
@@ -52,7 +52,7 @@ struct slirp_quehead {
 
 void slirp_insque(void *, void *);
 void slirp_remque(void *);
-int add_exec(struct ex_list **, int, char *, struct in_addr, int);
+int add_exec(struct ex_list **, void *, const char *, struct in_addr, int);
 int fork_exec(struct socket *so, const char *ex);
 
 #endif
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 0498a092b9..0de46084c0 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1068,7 +1068,7 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct 
in_addr host_addr,
 return 0;
 }
 
-int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
+int slirp_add_exe

[Qemu-devel] [PULL 32/65] slirp: replace compile time DO_KEEPALIVE

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Use a global variable instead (similar to slirp_debug)

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.c|  3 +++
 slirp/slirp.h|  6 +++---
 slirp/slirp_config.h | 12 
 slirp/tcp_input.c|  2 +-
 slirp/tcp_timer.c|  2 +-
 5 files changed, 8 insertions(+), 17 deletions(-)
 delete mode 100644 slirp/slirp_config.h

diff --git a/slirp/slirp.c b/slirp/slirp.c
index 76e94eb1cd..f11f9e9e51 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -35,6 +35,9 @@
 #include 
 #endif
 
+/* Define to 1 if you want KEEPALIVE timers */
+bool slirp_do_keepalive;
+
 /* host loopback address */
 struct in_addr loopback_addr;
 /* host loopback network mask */
diff --git a/slirp/slirp.h b/slirp/slirp.h
index 4a046e..05c203c8c7 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -1,8 +1,6 @@
 #ifndef SLIRP_H
 #define SLIRP_H
 
-#include "slirp_config.h"
-
 #ifdef _WIN32
 
 typedef char *caddr_t;
@@ -219,7 +217,9 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len);
 #include 
 #endif
 
-#define SO_OPTIONS DO_KEEPALIVE
+
+extern bool slirp_do_keepalive;
+
 #define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL)
 
 /* dnssearch.c */
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
deleted file mode 100644
index 7147e0de04..00
--- a/slirp/slirp_config.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * User definable configuration options
- */
-
-/* Define to 1 if you want KEEPALIVE timers */
-#define DO_KEEPALIVE 0
-
-/*/
-/*
- * Autoconf defined configuration options
- * You shouldn't need to touch any of these
- */
diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c
index 09bdf9b482..6af63469da 100644
--- a/slirp/tcp_input.c
+++ b/slirp/tcp_input.c
@@ -481,7 +481,7 @@ findso:
 * Reset idle time and keep-alive timer.
 */
tp->t_idle = 0;
-   if (SO_OPTIONS)
+   if (slirp_do_keepalive)
   tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
else
   tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE;
diff --git a/slirp/tcp_timer.c b/slirp/tcp_timer.c
index dc8288b511..a843e57a2b 100644
--- a/slirp/tcp_timer.c
+++ b/slirp/tcp_timer.c
@@ -262,7 +262,7 @@ tcp_timers(register struct tcpcb *tp, int timer)
if (tp->t_state < TCPS_ESTABLISHED)
goto dropit;
 
-   if ((SO_OPTIONS) && tp->t_state <= TCPS_CLOSE_WAIT) {
+   if (slirp_do_keepalive && tp->t_state <= TCPS_CLOSE_WAIT) {
if (tp->t_idle >= TCPTV_KEEP_IDLE + TCP_MAXIDLE)
goto dropit;
/*
-- 
2.20.1




[Qemu-devel] [PULL 19/65] slirp: remove HAVE_SYS_SIGNAL_H

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 3 ---
 slirp/slirp_config.h | 3 ---
 2 files changed, 6 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index f7c087456a..4c3c672ee6 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -35,9 +35,6 @@ typedef char *caddr_t;
 #ifndef NO_UNIX_SOCKETS
 #include 
 #endif
-#ifdef HAVE_SYS_SIGNAL_H
-# include 
-#endif
 #ifndef _WIN32
 #include 
 #endif
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 3ce64e088e..2605c4222b 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -50,9 +50,6 @@
 #define HAVE_ARPA_INET_H
 #endif
 
-/* Define if you have sys/signal.h */
-#undef HAVE_SYS_SIGNAL_H
-
 /* Define if you have sys/stropts.h */
 #undef HAVE_SYS_STROPTS_H
 
-- 
2.20.1




[Qemu-devel] [PULL 21/65] slirp: remove NO_UNIX_SOCKETS

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 3 ---
 slirp/slirp_config.h | 6 --
 2 files changed, 9 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 57955a8965..fba77d0c3d 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -28,9 +28,6 @@ typedef char *caddr_t;
 #include 
 #endif
 
-#ifndef NO_UNIX_SOCKETS
-#include 
-#endif
 #ifndef _WIN32
 #include 
 #endif
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index a205dc8c28..4417b05d1c 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -58,9 +58,3 @@
 #ifndef _WIN32
 #define HAVE_INET_ATON
 #endif
-
-/* Define if you DON'T have unix-domain sockets */
-#undef NO_UNIX_SOCKETS
-#ifdef _WIN32
-#define NO_UNIX_SOCKETS
-#endif
-- 
2.20.1




[Qemu-devel] [PULL 15/65] slirp: use a callback structure to interface with qemu

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

This will bring slirp a bit forward to the state of an independent
project.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c  |  6 +-
 slirp/libslirp.h | 13 +++--
 slirp/ncsi.c |  2 +-
 slirp/slirp.c| 10 +-
 slirp/slirp.h|  2 +-
 5 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index b7319ca6b2..031c324f02 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -140,6 +140,10 @@ static NetClientInfo net_slirp_info = {
 .cleanup = net_slirp_cleanup,
 };
 
+static const SlirpCb slirp_cb = {
+.output = net_slirp_output,
+};
+
 static int net_slirp_init(NetClientState *peer, const char *model,
   const char *name, int restricted,
   bool ipv4, const char *vnetwork, const char *vhost,
@@ -379,7 +383,7 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
   vhostname, tftp_server_name,
   tftp_export, bootfile, dhcp,
   dns, ip6_dns, dnssearch, vdomainname,
-  net_slirp_output, s);
+  &slirp_cb, s);
 QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
 
 for (config = slirp_configs; config; config = config->next) {
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 04b6db9f49..a5d1b27b5e 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -5,7 +5,16 @@
 
 typedef struct Slirp Slirp;
 
-typedef void (*slirp_output)(void *opaque, const uint8_t *pkt, int pkt_len);
+/*
+ * Callbacks from slirp
+ *
+ * The opaque parameter comes from the opaque parameter given to slirp_init().
+ */
+typedef struct SlirpCb {
+/* Send an ethernet frame to the guest network.  */
+void (*output)(void *opaque, const uint8_t *pkt, int pkt_len);
+} SlirpCb;
+
 
 Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
   struct in_addr vnetmask, struct in_addr vhost,
@@ -17,7 +26,7 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct 
in_addr vnetwork,
   struct in_addr vdhcp_start, struct in_addr vnameserver,
   struct in6_addr vnameserver6, const char **vdnssearch,
   const char *vdomainname,
-  slirp_output output,
+  const SlirpCb *callbacks,
   void *opaque);
 void slirp_cleanup(Slirp *slirp);
 
diff --git a/slirp/ncsi.c b/slirp/ncsi.c
index d7701f7785..10decfb5ef 100644
--- a/slirp/ncsi.c
+++ b/slirp/ncsi.c
@@ -163,5 +163,5 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len)
 *pchecksum = htonl(checksum);
 ncsi_rsp_len += 4;
 
-slirp->output(slirp->opaque, ncsi_reply, ETH_HLEN + ncsi_rsp_len);
+slirp->cb->output(slirp->opaque, ncsi_reply, ETH_HLEN + ncsi_rsp_len);
 }
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 1627436e7d..bab49e83e3 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -288,14 +288,14 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct 
in_addr vnetwork,
   struct in_addr vdhcp_start, struct in_addr vnameserver,
   struct in6_addr vnameserver6, const char **vdnssearch,
   const char *vdomainname,
-  slirp_output output,
+  const SlirpCb *callbacks,
   void *opaque)
 {
 Slirp *slirp = g_malloc0(sizeof(Slirp));
 
 slirp_init_once();
 
-slirp->output = output;
+slirp->cb = callbacks;
 slirp->grand = g_rand_new();
 slirp->restricted = restricted;
 
@@ -843,7 +843,7 @@ static void arp_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len)
 rah->ar_sip = ah->ar_tip;
 memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN);
 rah->ar_tip = ah->ar_sip;
-slirp->output(slirp->opaque, arp_reply, sizeof(arp_reply));
+slirp->cb->output(slirp->opaque, arp_reply, sizeof(arp_reply));
 }
 break;
 case ARPOP_REPLY:
@@ -943,7 +943,7 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct 
ethhdr *eh,
 /* target IP */
 rah->ar_tip = iph->ip_dst.s_addr;
 slirp->client_ipaddr = iph->ip_dst;
-slirp->output(slirp->opaque, arp_req, sizeof(arp_req));
+slirp->cb->output(slirp->opaque, arp_req, sizeof(arp_req));
 ifm->resolution_requested = true;
 
 /* Expire request and drop outgoing packet after 1 second */
@@ -1029,7 +1029,7 @@ int if_encap(Slirp *slirp, struct mbuf *ifm)
 eh->h_dest[0], eh->h_dest[1], eh->h_dest[2],
 eh->h_dest[3], eh->h_dest[4], eh->h_dest[5]));
 memcpy(buf + sizeof(struct ethhdr), ifm->m_data, ifm->m_len);
-slirp->output(slirp->opaqu

[Qemu-devel] [PULL 13/65] slirp: move socket pair creation in helper function

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Originally, the patch was fixing a bunch of issues, but Peter beat me
to it with earlier commit "slirp: fork_exec(): create and connect
child socket before fork()".

Factor out socket pair creation, to simplify the fork_exec() code.
Use the name socketpair_with_oob() since the code is actually similar
to what socketpair() would do, except that it uses TCP sockets, for
SLIRP to be able to call send with MSG_OOB (since SO_OOBINLINE is set,
this could probably be faked instead on regular unix sockets though).

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c | 142 +--
 1 file changed, 71 insertions(+), 71 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index 4840187750..7362e14339 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -73,85 +73,92 @@ fork_exec(struct socket *so, const char *ex)
 
 #else
 
-/*
- * XXX This is ugly
- * We create and bind a socket, then fork off to another
- * process, which connects to this socket, after which we
- * exec the wanted program.  If something (strange) happens,
- * the accept() call could block us forever.
- */
+static int
+slirp_socketpair_with_oob(int sv[2])
+{
+struct sockaddr_in addr = {
+.sin_family = AF_INET,
+.sin_port = 0,
+.sin_addr.s_addr = INADDR_ANY,
+};
+socklen_t addrlen = sizeof(addr);
+int ret, s;
+
+sv[1] = -1;
+s = qemu_socket(AF_INET, SOCK_STREAM, 0);
+if (s < 0 || bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
+listen(s, 1) < 0 ||
+getsockname(s, (struct sockaddr *)&addr, &addrlen) < 0) {
+goto err;
+}
+
+sv[1] = qemu_socket(AF_INET, SOCK_STREAM, 0);
+if (sv[1] < 0) {
+goto err;
+}
+/*
+ * This connect won't block because we've already listen()ed on
+ * the server end (even though we won't accept() the connection
+ * until later on).
+ */
+do {
+ret = connect(sv[1], (struct sockaddr *)&addr, addrlen);
+} while (ret < 0 && errno == EINTR);
+if (ret < 0) {
+goto err;
+}
+
+do {
+sv[0] = accept(s, (struct sockaddr *)&addr, &addrlen);
+} while (sv[0] < 0 && errno == EINTR);
+if (sv[0] < 0) {
+goto err;
+}
+
+closesocket(s);
+return 0;
+
+err:
+error_report("Error: slirp_socketpair(): %s", strerror(errno));
+if (s >= 0) {
+closesocket(s);
+}
+if (sv[1] >= 0) {
+closesocket(sv[1]);
+}
+return -1;
+}
+
 int
 fork_exec(struct socket *so, const char *ex)
 {
-int s, cs;
-struct sockaddr_in addr, csaddr;
-   socklen_t addrlen = sizeof(addr);
-socklen_t csaddrlen = sizeof(csaddr);
-   int opt;
char **argv;
-   int ret;
+   int opt, c, sp[2];
pid_t pid;
 
DEBUG_CALL("fork_exec");
DEBUG_ARG("so = %p", so);
DEBUG_ARG("ex = %p", ex);
 
-addr.sin_family = AF_INET;
-addr.sin_port = 0;
-addr.sin_addr.s_addr = INADDR_ANY;
-
-s = qemu_socket(AF_INET, SOCK_STREAM, 0);
-if (s < 0 || bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
-listen(s, 1) < 0) {
-error_report("Error: inet socket: %s", strerror(errno));
-if (s >= 0) {
-closesocket(s);
-}
+if (slirp_socketpair_with_oob(sp) < 0) {
 return 0;
 }
 
-if (getsockname(s, (struct sockaddr *)&csaddr, &csaddrlen) < 0) {
-closesocket(s);
-return 0;
-}
-cs = qemu_socket(AF_INET, SOCK_STREAM, 0);
-if (cs < 0) {
-closesocket(s);
-return 0;
-}
-csaddr.sin_addr = loopback_addr;
-/*
- * This connect won't block because we've already listen()ed on
- * the server end (even though we won't accept() the connection
- * until later on).
- */
-do {
-ret = connect(cs, (struct sockaddr *)&csaddr, csaddrlen);
-} while (ret < 0 && errno == EINTR);
-if (ret < 0) {
-closesocket(s);
-closesocket(cs);
-return 0;
-}
-
pid = fork();
switch(pid) {
 case -1:
error_report("Error: fork failed: %s", strerror(errno));
-closesocket(cs);
-   close(s);
+   closesocket(sp[0]);
+   closesocket(sp[1]);
return 0;
 
 case 0:
-setsid();
-
-   /* Set the DISPLAY */
-close(s);
-dup2(cs, 0);
-dup2(cs, 1);
-dup2(cs, 2);
-   for (s = getdtablesize() - 1; s >= 3; s--)
-  close(s);
+   setsid

[Qemu-devel] [PULL 10/65] slirp: replace the poor-man string split with g_strsplit()

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Use the glib function for the work, fix a potential crash on >256 words.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c | 21 +++--
 1 file changed, 3 insertions(+), 18 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index ce323ef92e..4840187750 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -88,11 +88,8 @@ fork_exec(struct socket *so, const char *ex)
socklen_t addrlen = sizeof(addr);
 socklen_t csaddrlen = sizeof(csaddr);
int opt;
-   const char *argv[256];
-   /* don't want to clobber the original */
-   char *bptr;
-   const char *curarg;
-   int c, i, ret;
+   char **argv;
+   int ret;
pid_t pid;
 
DEBUG_CALL("fork_exec");
@@ -156,19 +153,7 @@ fork_exec(struct socket *so, const char *ex)
for (s = getdtablesize() - 1; s >= 3; s--)
   close(s);
 
-   i = 0;
-   bptr = g_strdup(ex); /* No need to free() this */
-do {
-   /* Change the string into argv[] */
-   curarg = bptr;
-   while (*bptr != ' ' && *bptr != (char)0)
-  bptr++;
-   c = *bptr;
-   *bptr++ = (char)0;
-   argv[i++] = g_strdup(curarg);
-} while (c);
-
-argv[i] = NULL;
+argv = g_strsplit(ex, " ", -1);
execvp(argv[0], (char **)argv);
 
/* Ooops, failed, let's tell the user why */
-- 
2.20.1




[Qemu-devel] [PULL 12/65] slirp: add tftp tracing

2019-01-13 Thread Samuel Thibault
From: Gerd Hoffmann 

Useful when debugging pxeboot, to see what the guest tries to do.

Signed-off-by: Gerd Hoffmann 
Reviewed-by: Liam Merwick 
Reviewed-by: Philippe Mathieu-Daudé 
Tested-by: Philippe Mathieu-Daudé 
Signed-off-by: Samuel Thibault 
---
 Makefile.objs  | 1 +
 slirp/tftp.c   | 3 +++
 slirp/trace-events | 5 +
 3 files changed, 9 insertions(+)
 create mode 100644 slirp/trace-events

diff --git a/Makefile.objs b/Makefile.objs
index 456115992a..2121120492 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -193,6 +193,7 @@ trace-events-subdirs += net
 trace-events-subdirs += qapi
 trace-events-subdirs += qom
 trace-events-subdirs += scsi
+trace-events-subdirs += slirp
 trace-events-subdirs += target/arm
 trace-events-subdirs += target/i386
 trace-events-subdirs += target/mips
diff --git a/slirp/tftp.c b/slirp/tftp.c
index a9bc4bb1b6..735b57aa55 100644
--- a/slirp/tftp.c
+++ b/slirp/tftp.c
@@ -26,6 +26,7 @@
 #include "slirp.h"
 #include "qemu-common.h"
 #include "qemu/cutils.h"
+#include "trace.h"
 
 static inline int tftp_session_in_use(struct tftp_session *spt)
 {
@@ -204,6 +205,7 @@ static void tftp_send_error(struct tftp_session *spt,
   struct mbuf *m;
   struct tftp_t *tp;
 
+  trace_slirp_tftp_error(msg);
   m = m_get(spt->slirp);
 
   if (!m) {
@@ -323,6 +325,7 @@ static void tftp_handle_rrq(Slirp *slirp, struct 
sockaddr_storage *srcsas,
   break;
 }
   }
+  trace_slirp_tftp_rrq(req_fname);
 
   /* check mode */
   if ((pktlen - k) < 6) {
diff --git a/slirp/trace-events b/slirp/trace-events
new file mode 100644
index 00..ff8f656e8c
--- /dev/null
+++ b/slirp/trace-events
@@ -0,0 +1,5 @@
+# See docs/devel/tracing.txt for syntax documentation.
+
+# slirp/tftp.c
+slirp_tftp_rrq(const char *file) "file: %s"
+slirp_tftp_error(const char *file) "msg: %s"
-- 
2.20.1




[Qemu-devel] [PULL 01/65] slirp: associate slirp_output callback with the Slirp context

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Let's make the slirp interface a bit more library-like.
Associate the slirp_output() with a Slirp context.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c  |  5 +++--
 slirp/libslirp.h |  9 +
 slirp/ncsi.c |  2 +-
 slirp/slirp.c| 11 +++
 slirp/slirp.h|  1 +
 5 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index 38ae65e4a9..dd06b0189e 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -99,7 +99,7 @@ static void slirp_smb_cleanup(SlirpState *s);
 static inline void slirp_smb_cleanup(SlirpState *s) { }
 #endif
 
-void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
+static void net_slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
 {
 SlirpState *s = opaque;
 
@@ -378,7 +378,8 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
   ipv6, ip6_prefix, vprefix6_len, ip6_host,
   vhostname, tftp_server_name,
   tftp_export, bootfile, dhcp,
-  dns, ip6_dns, dnssearch, vdomainname, s);
+  dns, ip6_dns, dnssearch, vdomainname,
+  net_slirp_output, s);
 QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
 
 for (config = slirp_configs; config; config = config->next) {
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 42e42e9a2a..52dbb9feb5 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -5,6 +5,8 @@
 
 typedef struct Slirp Slirp;
 
+typedef void (*slirp_output)(void *opaque, const uint8_t *pkt, int pkt_len);
+
 int get_dns_addr(struct in_addr *pdns_addr);
 int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id);
 
@@ -17,7 +19,9 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct 
in_addr vnetwork,
   const char *tftp_path, const char *bootfile,
   struct in_addr vdhcp_start, struct in_addr vnameserver,
   struct in6_addr vnameserver6, const char **vdnssearch,
-  const char *vdomainname, void *opaque);
+  const char *vdomainname,
+  slirp_output output,
+  void *opaque);
 void slirp_cleanup(Slirp *slirp);
 
 void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout);
@@ -26,9 +30,6 @@ void slirp_pollfds_poll(GArray *pollfds, int select_error);
 
 void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len);
 
-/* you must provide the following functions: */
-void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len);
-
 int slirp_add_hostfwd(Slirp *slirp, int is_udp,
   struct in_addr host_addr, int host_port,
   struct in_addr guest_addr, int guest_port);
diff --git a/slirp/ncsi.c b/slirp/ncsi.c
index 7116034afc..d7701f7785 100644
--- a/slirp/ncsi.c
+++ b/slirp/ncsi.c
@@ -163,5 +163,5 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len)
 *pchecksum = htonl(checksum);
 ncsi_rsp_len += 4;
 
-slirp_output(slirp->opaque, ncsi_reply, ETH_HLEN + ncsi_rsp_len);
+slirp->output(slirp->opaque, ncsi_reply, ETH_HLEN + ncsi_rsp_len);
 }
diff --git a/slirp/slirp.c b/slirp/slirp.c
index ab2fc4eb8b..4d4c2c13b5 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -287,12 +287,15 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct 
in_addr vnetwork,
   const char *tftp_path, const char *bootfile,
   struct in_addr vdhcp_start, struct in_addr vnameserver,
   struct in6_addr vnameserver6, const char **vdnssearch,
-  const char *vdomainname, void *opaque)
+  const char *vdomainname,
+  slirp_output output,
+  void *opaque)
 {
 Slirp *slirp = g_malloc0(sizeof(Slirp));
 
 slirp_init_once();
 
+slirp->output = output;
 slirp->grand = g_rand_new();
 slirp->restricted = restricted;
 
@@ -832,7 +835,7 @@ static void arp_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len)
 rah->ar_sip = ah->ar_tip;
 memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN);
 rah->ar_tip = ah->ar_sip;
-slirp_output(slirp->opaque, arp_reply, sizeof(arp_reply));
+slirp->output(slirp->opaque, arp_reply, sizeof(arp_reply));
 }
 break;
 case ARPOP_REPLY:
@@ -932,7 +935,7 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct 
ethhdr *eh,
 /* target IP */
 rah->ar_tip = iph->ip_dst.s_addr;
 slirp->client_ipaddr = iph->ip_dst;
-slirp_output(slirp->opaque, arp_req, sizeof(arp_req));
+slirp->output(slirp->opaque, arp_req, sizeof(arp_req));
 ifm->resolution_requested = true;
 
 /* Expire request and drop outgoing packet after 1 second */
@@ -1018,7 +1021,7 @

[Qemu-devel] [PULL 14/65] slirp: remove unused M_TRAILINGSPACE

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/mbuf.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/slirp/mbuf.h b/slirp/mbuf.h
index bfdf8c4577..cbf17e136b 100644
--- a/slirp/mbuf.h
+++ b/slirp/mbuf.h
@@ -72,7 +72,6 @@
  * How much free room there is
  */
 #define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len)
-#define M_TRAILINGSPACE M_FREEROOM
 
 struct mbuf {
/* XXX should union some of these! */
-- 
2.20.1




[Qemu-devel] [PULL 05/65] slirp: remove unused EMU_RSH

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

EMU_RSH handling was dropped in commit
0d62c4cfe21752df4c1d6e2c2398f15d5eaa794a.

The assignment, and subsequent free() of ex_ptr->ex_exec to so->extra
looks unsafe (double free is likely to occur).

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.h | 1 -
 slirp/slirp.c| 2 --
 slirp/socket.c   | 4 
 slirp/tcp_subr.c | 1 -
 4 files changed, 8 deletions(-)

diff --git a/slirp/misc.h b/slirp/misc.h
index 64ca88c3b7..94829722cd 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -26,7 +26,6 @@ struct ex_list {
 #define EMU_REALAUDIO 0x5
 #define EMU_RLOGIN 0x6
 #define EMU_IDENT 0x7
-#define EMU_RSH 0x8
 
 #define EMU_NOCONNECT 0x10 /* Don't connect */
 
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 0de46084c0..fac7849195 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1499,8 +1499,6 @@ static int slirp_state_load(QEMUFile *f, void *opaque, 
int version_id)
 }
 if (!ex_ptr)
 return -EINVAL;
-
-so->extra = (void *)ex_ptr->ex_exec;
 }
 
 return vmstate_load_state(f, &vmstate_slirp, slirp, version_id);
diff --git a/slirp/socket.c b/slirp/socket.c
index c01d8696af..041ec5061a 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -89,10 +89,6 @@ sofree(struct socket *so)
   soqfree(so, &slirp->if_fastq);
   soqfree(so, &slirp->if_batchq);
 
-  if (so->so_emu==EMU_RSH && so->extra) {
-   sofree(so->extra);
-   so->extra=NULL;
-  }
   if (so == slirp->tcp_last_so) {
   slirp->tcp_last_so = &slirp->tcb;
   } else if (so == slirp->udp_last_so) {
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index e7b2baa087..fd7521854e 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -541,7 +541,6 @@ static const struct tos_t tcptos[] = {
  {0, 23, IPTOS_LOWDELAY, 0},   /* telnet */
  {0, 80, IPTOS_THROUGHPUT, 0}, /* WWW */
  {0, 513, IPTOS_LOWDELAY, EMU_RLOGIN|EMU_NOCONNECT},   /* rlogin */
- {0, 514, IPTOS_LOWDELAY, EMU_RSH|EMU_NOCONNECT},  /* shell */
  {0, 544, IPTOS_LOWDELAY, EMU_KSH},/* kshell */
  {0, 543, IPTOS_LOWDELAY, 0},  /* klogin */
  {0, 6667, IPTOS_THROUGHPUT, EMU_IRC}, /* IRC */
-- 
2.20.1




[Qemu-devel] [PULL 09/65] slirp: fix slirp_add_exec() leaks

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Free the list elements allocated in add_exec().

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.h  | 2 +-
 slirp/slirp.c | 8 
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/slirp/misc.h b/slirp/misc.h
index 94829722cd..0bc5e74bc5 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -12,7 +12,7 @@ struct ex_list {
void *ex_chardev;
struct in_addr ex_addr; /* Server address */
int ex_fport;   /* Port to telnet to */
-   const char *ex_exec;/* Command line of what to exec */
+   char *ex_exec;  /* Command line of what to exec */
struct ex_list *ex_next;
 };
 
diff --git a/slirp/slirp.c b/slirp/slirp.c
index ab08694e37..1627436e7d 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -342,6 +342,14 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct 
in_addr vnetwork,
 
 void slirp_cleanup(Slirp *slirp)
 {
+struct ex_list *e, *next;
+
+for (e = slirp->exec_list; e; e = next) {
+next = e->ex_next;
+g_free(e->ex_exec);
+g_free(e);
+}
+
 QTAILQ_REMOVE(&slirp_instances, slirp, entry);
 
 unregister_savevm(NULL, "slirp", slirp);
-- 
2.20.1




[Qemu-devel] [PULL 06/65] slirp: rename /extra/chardev

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Now it's only used for the chardev pointer.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.c| 4 ++--
 slirp/socket.h   | 2 +-
 slirp/tcp_subr.c | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/slirp/slirp.c b/slirp/slirp.c
index fac7849195..ab08694e37 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1088,10 +1088,10 @@ int slirp_add_exec(Slirp *slirp, void *chardev, const 
char *cmdline,
 
 ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags)
 {
-if (so->s == -1 && so->extra) {
+if (so->s == -1 && so->chardev) {
 /* XXX this blocks entire thread. Rewrite to use
  * qemu_chr_fe_write and background I/O callbacks */
-qemu_chr_fe_write_all(so->extra, buf, len);
+qemu_chr_fe_write_all(so->chardev, buf, len);
 return len;
 }
 
diff --git a/slirp/socket.h b/slirp/socket.h
index 2f224bc34f..930ed95972 100644
--- a/slirp/socket.h
+++ b/slirp/socket.h
@@ -67,7 +67,7 @@ struct socket {
 
   struct sbuf so_rcv;  /* Receive buffer */
   struct sbuf so_snd;  /* Send buffer */
-  void * extra;/* Extra pointer */
+  void * chardev;
 };
 
 
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index fd7521854e..4b40850c7a 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -961,7 +961,7 @@ int tcp_ctl(struct socket *so)
 so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
 if (ex_ptr->ex_chardev) {
 so->s = -1;
-so->extra = ex_ptr->ex_chardev;
+so->chardev = ex_ptr->ex_chardev;
 return 1;
 }
 DEBUG_MISC((dfd, " executing %s\n", ex_ptr->ex_exec));
-- 
2.20.1




[Qemu-devel] [PULL 03/65] slirp: replace ex_pty with ex_chardev

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

do_pty == 3 means to talk to a chardev.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c | 2 +-
 slirp/misc.h | 2 +-
 slirp/slirp.c| 4 ++--
 slirp/tcp_subr.c | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index e69d5f42c3..8f0b6004bd 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -53,7 +53,7 @@ int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
*ex_ptr = g_new(struct ex_list, 1);
(*ex_ptr)->ex_fport = port;
(*ex_ptr)->ex_addr = addr;
-   (*ex_ptr)->ex_pty = do_pty;
+   (*ex_ptr)->ex_chardev = do_pty == 3;
(*ex_ptr)->ex_exec = (do_pty == 3) ? exec : g_strdup(exec);
(*ex_ptr)->ex_next = tmp_ptr;
return 0;
diff --git a/slirp/misc.h b/slirp/misc.h
index 897650aea1..1f8d11def6 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -9,7 +9,7 @@
 #define MISC_H
 
 struct ex_list {
-   int ex_pty; /* Do we want a pty? */
+   int ex_chardev;
struct in_addr ex_addr; /* Server address */
int ex_fport;   /* Port to telnet to */
const char *ex_exec;/* Command line of what to exec */
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 4d4c2c13b5..0498a092b9 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1455,7 +1455,7 @@ static void slirp_state_save(QEMUFile *f, void *opaque)
 struct ex_list *ex_ptr;
 
 for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next)
-if (ex_ptr->ex_pty == 3) {
+if (ex_ptr->ex_chardev) {
 struct socket *so;
 so = slirp_find_ctl_socket(slirp, ex_ptr->ex_addr,
ntohs(ex_ptr->ex_fport));
@@ -1490,7 +1490,7 @@ static int slirp_state_load(QEMUFile *f, void *opaque, 
int version_id)
 return -EINVAL;
 }
 for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
-if (ex_ptr->ex_pty == 3 &&
+if (ex_ptr->ex_chardev &&
 so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr &&
 so->so_fport == ex_ptr->ex_fport) {
 break;
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index 0ccd8e1a96..dc19eea55a 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -960,7 +960,7 @@ int tcp_ctl(struct socket *so)
 for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
 if (ex_ptr->ex_fport == so->so_fport &&
 so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
-if (ex_ptr->ex_pty == 3) {
+if (ex_ptr->ex_chardev) {
 so->s = -1;
 so->extra = (void *)ex_ptr->ex_exec;
 return 1;
-- 
2.20.1




[Qemu-devel] [PULL 17/65] slirp: remove FULL_BOLT

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Looking at git history, this looks like something from the past, when
there was a tty layer. Let's remove it.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/if.c   | 2 --
 slirp/slirp_config.h | 7 ---
 2 files changed, 9 deletions(-)

diff --git a/slirp/if.c b/slirp/if.c
index 590753c658..aa88cc4e76 100644
--- a/slirp/if.c
+++ b/slirp/if.c
@@ -131,12 +131,10 @@ diddit:
}
}
 
-#ifndef FULL_BOLT
/*
 * This prevents us from malloc()ing too many mbufs
 */
if_start(ifm->slirp);
-#endif
 }
 
 /*
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 721667e3ef..f0cc1c781b 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -5,13 +5,6 @@
 /* Define to 1 if you want KEEPALIVE timers */
 #define DO_KEEPALIVE 0
 
-/* Define this if you want slirp to write to the tty as fast as it can */
-/* This should only be set if you are using load-balancing, slirp does a */
-/* pretty good job on single modems already, and seting this will make */
-/* interactive sessions less responsive */
-/* X Talk about having fast modem as unit 0 */
-#undef FULL_BOLT
-
 /*/
 /*
  * Autoconf defined configuration options
-- 
2.20.1




[Qemu-devel] [PULL 07/65] slirp: move internal function declarations

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Clarify that those functions are internal to slirp.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/libslirp.h | 3 ---
 slirp/slirp.h| 3 +++
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 3e88dbaa01..a4f390ee89 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -7,9 +7,6 @@ typedef struct Slirp Slirp;
 
 typedef void (*slirp_output)(void *opaque, const uint8_t *pkt, int pkt_len);
 
-int get_dns_addr(struct in_addr *pdns_addr);
-int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id);
-
 Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
   struct in_addr vnetmask, struct in_addr vhost,
   bool in6_enabled,
diff --git a/slirp/slirp.h b/slirp/slirp.h
index e3d65d68ec..de299aa36c 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -232,6 +232,9 @@ extern Slirp *slirp_instance;
 
 void if_start(Slirp *);
 
+int get_dns_addr(struct in_addr *pdns_addr);
+int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id);
+
 /* ncsi.c */
 void ncsi_input(Slirp *slirp, const uint8_t *pkt, int pkt_len);
 
-- 
2.20.1




[Qemu-devel] [PULLv2 00/65] slirp updates

2019-01-13 Thread Samuel Thibault
The following changes since commit 27df21ca3886fff4dd3d70e515517667963a52f1:

  Merge remote-tracking branch 'remotes/kraxel/tags/misc-20190111-pull-request' 
into staging (2019-01-11 16:45:59 +)

are available in the Git repository at:

  https://people.debian.org/~sthibault/qemu.git tags/samuel-thibault

for you to fetch changes up to 341cb5fd7a15ebdaa821ff068b517e120f22c412:

  slirp: check data length while emulating ident function (2019-01-14 00:44:29 
+0100)


slirp updates

Gerd Hoffmann (1):
  slirp: add tftp tracing

Marc-André Lureau (61):
  slirp: associate slirp_output callback with the Slirp context
  slirp: remove do_pty from fork_exec()
  slirp: replace ex_pty with ex_chardev
  slirp: use a dedicated field for chardev pointer
  slirp: remove unused EMU_RSH
  slirp: rename /extra/chardev
  slirp: move internal function declarations
  slirp: remove Monitor dependency, return a string for info
  slirp: fix slirp_add_exec() leaks
  slirp: replace the poor-man string split with g_strsplit()
  slirp: remove dead declarations
  slirp: move socket pair creation in helper function
  slirp: remove unused M_TRAILINGSPACE
  slirp: use a callback structure to interface with qemu
  slirp: remove PROBE_CONN dead-code
  slirp: remove FULL_BOLT
  slirp: remove the disabled readv()/writev() code path
  slirp: remove HAVE_SYS_SIGNAL_H
  slirp: remove unused HAVE_SYS_BITYPES_H
  slirp: remove NO_UNIX_SOCKETS
  slirp: remove unused HAVE_SYS_STROPTS_H
  slirp: remove unused HAVE_ARPA_INET_H
  slirp: remove unused HAVE_SYS_WAIT_H
  slirp: remove unused HAVE_SYS_SELECT_H
  slirp: remove HAVE_SYS_IOCTL_H
  slirp: remove HAVE_SYS_FILIO_H
  slirp: remove unused DECLARE_IOVEC
  slirp: remove unused HAVE_INET_ATON
  slirp: replace HOST_WORDS_BIGENDIAN with glib equivalent
  slirp: replace SIZEOF_CHAR_P with glib equivalent
  slirp: replace compile time DO_KEEPALIVE
  slirp: remove unused global slirp_instance
  slirp: replace error_report() with g_critical()
  slirp: improve a bit the debug macros
  slirp: add a callback to log guest errors
  slirp: remove #if notdef dead code
  slirp: remove unused sbflush()
  slirp: NULL is defined by stddef.h
  slirp: remove dead TCP_ACK_HACK code
  slirp: replace ARRAY_SIZE with G_N_ELEMENTS
  net: do not depend on slirp internals
  glib-compat: add g_spawn_async_with_fds() fallback
  slirp: simplify fork_exec()
  slirp: replace error_report() with g_critical()
  slirp: drop 

[Qemu-devel] [PULL 11/65] slirp: remove dead declarations

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

An overdue cleanup. Remaining declarations could probably be moved in
other headers, such as slirp.h.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/main.h | 29 -
 1 file changed, 29 deletions(-)

diff --git a/slirp/main.h b/slirp/main.h
index 90053ce5ec..e04677944f 100644
--- a/slirp/main.h
+++ b/slirp/main.h
@@ -12,38 +12,9 @@
 #include 
 #endif
 
-#define TOWRITEMAX 512
-
-extern int slirp_socket;
-extern int slirp_socket_unit;
-extern int slirp_socket_port;
-extern uint32_t slirp_socket_addr;
-extern char *slirp_socket_passwd;
-extern int ctty_closed;
-
-/*
- * Get the difference in 2 times from updtim()
- * Allow for wraparound times, "just in case"
- * x is the greater of the 2 (current time) and y is
- * what it's being compared against.
- */
-#define TIME_DIFF(x,y) (x)-(y) < 0 ? ~0-(y)+(x) : (x)-(y)
-
-extern char *slirp_tty;
-extern char *exec_shell;
 extern u_int curtime;
 extern struct in_addr loopback_addr;
 extern unsigned long loopback_mask;
-extern char *username;
-extern char *socket_path;
-extern int towrite_max;
-extern int ppp_exit;
-extern int tcp_keepintvl;
-
-#define PROTO_SLIP 0x1
-#ifdef USE_PPP
-#define PROTO_PPP 0x2
-#endif
 
 int if_encap(Slirp *slirp, struct mbuf *ifm);
 ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags);
-- 
2.20.1




[Qemu-devel] [PULL 02/65] slirp: remove do_pty from fork_exec()

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

QEMU uses fork_exec() with do_pty values 0 or 3.
Let's clean up some unused code.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c | 55 ++--
 slirp/misc.h |  2 +-
 slirp/tcp_subr.c |  4 +---
 3 files changed, 18 insertions(+), 43 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index 57bdd808e2..e69d5f42c3 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -63,7 +63,7 @@ int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
 #ifdef _WIN32
 
 int
-fork_exec(struct socket *so, const char *ex, int do_pty)
+fork_exec(struct socket *so, const char *ex)
 {
 /* not implemented */
 return 0;
@@ -77,13 +77,9 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
  * process, which connects to this socket, after which we
  * exec the wanted program.  If something (strange) happens,
  * the accept() call could block us forever.
- *
- * do_pty = 0   Fork/exec inetd style
- * do_pty = 1   Fork/exec using slirp.telnetd
- * do_ptr = 2   Fork/exec using pty
  */
 int
-fork_exec(struct socket *so, const char *ex, int do_pty)
+fork_exec(struct socket *so, const char *ex)
 {
 int s, cs;
 struct sockaddr_in addr, csaddr;
@@ -100,26 +96,20 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
DEBUG_CALL("fork_exec");
DEBUG_ARG("so = %p", so);
DEBUG_ARG("ex = %p", ex);
-   DEBUG_ARG("do_pty = %x", do_pty);
-
-   if (do_pty == 2) {
-return 0;
-   } else {
-   addr.sin_family = AF_INET;
-   addr.sin_port = 0;
-   addr.sin_addr.s_addr = INADDR_ANY;
 
-   if ((s = qemu_socket(AF_INET, SOCK_STREAM, 0)) < 0 ||
-   bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
-   listen(s, 1) < 0) {
-   error_report("Error: inet socket: %s", strerror(errno));
-   if (s >= 0) {
-   closesocket(s);
-   }
+addr.sin_family = AF_INET;
+addr.sin_port = 0;
+addr.sin_addr.s_addr = INADDR_ANY;
 
-   return 0;
-   }
-   }
+s = qemu_socket(AF_INET, SOCK_STREAM, 0);
+if (s < 0 || bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
+listen(s, 1) < 0) {
+error_report("Error: inet socket: %s", strerror(errno));
+if (s >= 0) {
+closesocket(s);
+}
+return 0;
+}
 
 if (getsockname(s, (struct sockaddr *)&csaddr, &csaddrlen) < 0) {
 closesocket(s);
@@ -166,13 +156,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
 
i = 0;
bptr = g_strdup(ex); /* No need to free() this */
-   if (do_pty == 1) {
-   /* Setup "slirp.telnetd -x" */
-   argv[i++] = "slirp.telnetd";
-   argv[i++] = "-x";
-   argv[i++] = bptr;
-   } else
-  do {
+do {
/* Change the string into argv[] */
curarg = bptr;
while (*bptr != ' ' && *bptr != (char)0)
@@ -180,7 +164,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
c = *bptr;
*bptr++ = (char)0;
argv[i++] = g_strdup(curarg);
-  } while (c);
+} while (c);
 
 argv[i] = NULL;
execvp(argv[0], (char **)argv);
@@ -206,13 +190,6 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
 opt = 1;
 qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, 
sizeof(int));
qemu_set_nonblock(so->s);
-
-   /* Append the telnet options now */
-if (so->so_m != NULL && do_pty == 1)  {
-   sbappend(so, so->so_m);
-so->so_m = NULL;
-   }
-
return 1;
}
 }
diff --git a/slirp/misc.h b/slirp/misc.h
index 5211bbd30a..897650aea1 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -53,6 +53,6 @@ struct slirp_quehead {
 void slirp_insque(void *, void *);
 void slirp_remque(void *);
 int add_exec(struct ex_list **, int, char *, struct in_addr, int);
-int fork_exec(struct socket *so, const char *ex, int do_pty);
+int fork_exec(struct socket *so, const char *ex);
 
 #endif
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index fa61349cbb..0ccd8e1a96 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -951,7 +951,6 @@ int tcp_ctl(struct socket *so)
 Slirp *slirp = so->slirp;
 struct sbuf *sb = &so->so_snd;
 struct ex_list *ex_ptr;
-int do_pty;
 

Re: [Qemu-devel] [PATCH v2] slirp: check data length while emulating ident function

2019-01-13 Thread Samuel Thibault
P J P, le dim. 13 janv. 2019 23:29:48 +0530, a ecrit:
> From: Prasad J Pandit 
> 
> While emulating identification protocol, tcp_emu() does not check
> available space in the 'sc_rcv->sb_data' buffer. It could lead to
> heap buffer overflow issue. Add check to avoid it.
> 
> Reported-by: Kira <864786...@qq.com>
> Signed-off-by: Prasad J Pandit 

Applied to my tree, thanks!

Samuel



Re: [Qemu-devel] [PULL 00/64] slirp updates

2018-12-20 Thread Samuel Thibault
Marc-André Lureau, le jeu. 20 déc. 2018 16:01:44 +0400, a ecrit:
> > declaration of 'inet_pton' [-Werror=nested-externs]
> >  if (!inet_pton(AF_INET6, vprefix6, &ip6_prefix)) {
> >  ^
> >
> 
> This one is easy, it needs "build-sys: require Vista API by default
> globally" series that Paolo has been sending in his last pullreqs.

Ok, let's wait for it for that part then.

> there is an obvious
> mistake in "build-sys: use a seperate slirp-obj-y && slirp.mo" (Sam,
> you should squash that fix)

Ok, squashed in my tree.

Samuel



[Qemu-devel] [PULL 60/64] slirp: add clock_get_ns() callback

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c  |  6 ++
 slirp/if.c   |  2 +-
 slirp/ip6_icmp.c |  4 ++--
 slirp/libslirp.h |  2 ++
 slirp/slirp.c| 12 +---
 5 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index 4d890287ba..0c06d6f3c1 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -146,9 +146,15 @@ static void net_slirp_guest_error(const char *msg)
 qemu_log_mask(LOG_GUEST_ERROR, "%s", msg);
 }
 
+static int64_t net_slirp_clock_get_ns(void)
+{
+return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+}
+
 static const SlirpCb slirp_cb = {
 .output = net_slirp_output,
 .guest_error = net_slirp_guest_error,
+.clock_get_ns = net_slirp_clock_get_ns,
 };
 
 static int net_slirp_init(NetClientState *peer, const char *model,
diff --git a/slirp/if.c b/slirp/if.c
index ce4f5fac53..73e3705740 100644
--- a/slirp/if.c
+++ b/slirp/if.c
@@ -148,7 +148,7 @@ diddit:
  */
 void if_start(Slirp *slirp)
 {
-uint64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+uint64_t now = slirp->cb->clock_get_ns();
 bool from_batchq = false;
 struct mbuf *ifm, *ifm_next, *ifqt;
 
diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index 97304a9dd9..5261baae27 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -17,7 +17,7 @@ static void ra_timer_handler(void *opaque)
 {
 Slirp *slirp = opaque;
 timer_mod(slirp->ra_timer,
-  qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + NDP_Interval);
+  slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval);
 ndp_send_ra(slirp);
 }
 
@@ -31,7 +31,7 @@ void icmp6_init(Slirp *slirp)
  SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
  ra_timer_handler, slirp);
 timer_mod(slirp->ra_timer,
-  qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + NDP_Interval);
+  slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval);
 }
 
 void icmp6_cleanup(Slirp *slirp)
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 3e0aa19f4b..4611a7447b 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -15,6 +15,8 @@ typedef struct SlirpCb {
 void (*output)(void *opaque, const uint8_t *pkt, int pkt_len);
 /* Print a message for an error due to guest misbehavior.  */
 void (*guest_error)(const char *msg);
+/* Return the virtual clock value in nanoseconds */
+int64_t (*clock_get_ns)(void);
 } SlirpCb;
 
 
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 6a4d506d49..dcab564a79 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -581,15 +581,15 @@ void slirp_pollfds_fill(GArray *pollfds, uint32_t 
*timeout)
 
 void slirp_pollfds_poll(GArray *pollfds, int select_error)
 {
-Slirp *slirp;
+Slirp *slirp = QTAILQ_FIRST(&slirp_instances);
 struct socket *so, *so_next;
 int ret;
 
-if (QTAILQ_EMPTY(&slirp_instances)) {
+if (!slirp) {
 return;
 }
 
-curtime = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL);
+curtime = slirp->cb->clock_get_ns() / SCALE_MS;
 
 QTAILQ_FOREACH(slirp, &slirp_instances, entry) {
 /*
@@ -916,8 +916,7 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct 
ethhdr *eh,
 ifm->resolution_requested = true;
 
 /* Expire request and drop outgoing packet after 1 second */
-ifm->expiration_date =
-qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 10ULL;
+ifm->expiration_date = slirp->cb->clock_get_ns() + 10ULL;
 }
 return 0;
 } else {
@@ -943,8 +942,7 @@ static int if_encap6(Slirp *slirp, struct mbuf *ifm, struct 
ethhdr *eh,
 if (!ifm->resolution_requested) {
 ndp_send_ns(slirp, ip6h->ip_dst);
 ifm->resolution_requested = true;
-ifm->expiration_date =
-qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 10ULL;
+ifm->expiration_date = slirp->cb->clock_get_ns() + 10ULL;
 }
 return 0;
 } else {
-- 
2.19.2




[Qemu-devel] [PULL 55/64] slirp: introduce SLIRP_DEBUG environment variable

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Learn to read SLIRP_DEBUG=call,misc,error (all or help also handled)
to set the slirp_debug flags.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c  |  8 
 slirp/slirp.c | 15 +++
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index e30d2ceb2a..a0f104be5e 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -11,14 +11,6 @@
 #include "qemu/error-report.h"
 #include "qemu/main-loop.h"
 
-#ifdef DEBUG
-#define SLIRP_DEBUG (DBG_CALL | DBG_MISC | DBG_ERROR)
-#else
-#define SLIRP_DEBUG 0
-#endif
-
-int slirp_debug = SLIRP_DEBUG;
-
 inline void
 insque(void *a, void *b)
 {
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 84f6b05974..abc573e6de 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -35,6 +35,8 @@
 #include 
 #endif
 
+int slirp_debug;
+
 /* Define to 1 if you want KEEPALIVE timers */
 bool slirp_do_keepalive;
 
@@ -250,6 +252,7 @@ int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t 
*scope_id)
 static void slirp_init_once(void)
 {
 static int initialized;
+const char *debug;
 #ifdef _WIN32
 WSADATA Data;
 #endif
@@ -266,6 +269,18 @@ static void slirp_init_once(void)
 
 loopback_addr.s_addr = htonl(INADDR_LOOPBACK);
 loopback_mask = htonl(IN_CLASSA_NET);
+
+debug = g_getenv("SLIRP_DEBUG");
+if (debug) {
+const GDebugKey keys[] = {
+{ "call", DBG_CALL },
+{ "misc", DBG_MISC },
+{ "error", DBG_ERROR },
+};
+slirp_debug = g_parse_debug_string(debug, keys, G_N_ELEMENTS(keys));
+}
+
+
 }
 
 static void slirp_state_save(QEMUFile *f, void *opaque);
-- 
2.19.2




[Qemu-devel] [PULL 52/64] slirp: replace a DEBUG block with WITH_ICMP_ERROR_MSG

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

icmp_send_error() doesnt actually log messages when DEBUG is enabled.
Let's use a different define that describes better the tweaked
behaviour of the function, and avoid uncompiled code.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/ip_icmp.c | 8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c
index af11cfcefe..6c7e375ff8 100644
--- a/slirp/ip_icmp.c
+++ b/slirp/ip_icmp.c
@@ -34,6 +34,10 @@
 #include "slirp.h"
 #include "ip_icmp.h"
 
+#ifndef WITH_ICMP_ERROR_MSG
+#define WITH_ICMP_ERROR_MSG 0
+#endif
+
 /* The message sent when emulating PING */
 /* Be nice and tell them it's just a pseudo-ping packet */
 static const char icmp_ping_msg[] = "This is a pseudo-PING packet used by 
Slirp to emulate ICMP ECHO-REQUEST packets.\n";
@@ -319,8 +323,7 @@ icmp_send_error(struct mbuf *msrc, u_char type, u_char 
code, int minsize,
   HTONS(icp->icmp_ip.ip_id);
   HTONS(icp->icmp_ip.ip_off);
 
-#ifdef DEBUG
-  if(message) {   /* DEBUG : append message to ICMP packet */
+  if (message && WITH_ICMP_ERROR_MSG) { /* append message to ICMP packet */
 int message_len;
 char *cpnt;
 message_len=strlen(message);
@@ -329,7 +332,6 @@ icmp_send_error(struct mbuf *msrc, u_char type, u_char 
code, int minsize,
 memcpy(cpnt, message, message_len);
 m->m_len+=message_len;
   }
-#endif
 
   icp->icmp_cksum = 0;
   icp->icmp_cksum = cksum(m, m->m_len);
-- 
2.19.2




[Qemu-devel] [PULL 58/64] slirp: replace DEBUG_ARGS with DEBUG_ARG

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

There is no clear benefit in calling an alias DEBUG_ARGS(). Replace
calls with DEBUG_ARG(), and fix the white-spacing while at it.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/arp_table.c | 12 ++--
 slirp/debug.h |  2 --
 slirp/ip6_icmp.c  |  2 +-
 slirp/ndp_table.c | 18 +-
 slirp/slirp.c | 12 ++--
 slirp/tcp_input.c |  6 +++---
 6 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/slirp/arp_table.c b/slirp/arp_table.c
index ce19e6e7c0..bf71b984ad 100644
--- a/slirp/arp_table.c
+++ b/slirp/arp_table.c
@@ -34,9 +34,9 @@ void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t 
ethaddr[ETH_ALEN])
 
 DEBUG_CALL("arp_table_add");
 DEBUG_ARG("ip = %s", inet_ntoa((struct in_addr){.s_addr = ip_addr}));
-DEBUG_ARGS(" hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
-   ethaddr[0], ethaddr[1], ethaddr[2],
-   ethaddr[3], ethaddr[4], ethaddr[5]);
+DEBUG_ARG("hw addr = %02x:%02x:%02x:%02x:%02x:%02x",
+  ethaddr[0], ethaddr[1], ethaddr[2],
+  ethaddr[3], ethaddr[4], ethaddr[5]);
 
 if (ip_addr == 0 || ip_addr == 0x || ip_addr == broadcast_addr) {
 /* Do not register broadcast addresses */
@@ -79,9 +79,9 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
 for (i = 0; i < ARP_TABLE_SIZE; i++) {
 if (arptbl->table[i].ar_sip == ip_addr) {
 memcpy(out_ethaddr, arptbl->table[i].ar_sha,  ETH_ALEN);
-DEBUG_ARGS(" found hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
-   out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
-   out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]);
+DEBUG_ARG("found hw addr = %02x:%02x:%02x:%02x:%02x:%02x",
+  out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
+  out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]);
 return 1;
 }
 }
diff --git a/slirp/debug.h b/slirp/debug.h
index ff920f0b87..50f30898fb 100644
--- a/slirp/debug.h
+++ b/slirp/debug.h
@@ -33,8 +33,6 @@ extern int slirp_debug;
 }   \
 } while (0)
 
-#define DEBUG_ARGS(fmt, ...) DEBUG_ARG(fmt, ##__VA_ARGS__)
-
 #define DEBUG_MISC(fmt, ...) do {   \
 if (slirp_debug & DBG_MISC) {   \
 fprintf(dfd, fmt, ##__VA_ARGS__);   \
diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index bce075913c..97304a9dd9 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -77,7 +77,7 @@ void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t 
code)
 char addrstr[INET6_ADDRSTRLEN];
 
 DEBUG_CALL("icmp6_send_error");
-DEBUG_ARGS(" type = %d, code = %d\n", type, code);
+DEBUG_ARG("type = %d, code = %d", type, code);
 
 if (IN6_IS_ADDR_MULTICAST(&ip->ip_src) ||
 in6_zero(&ip->ip_src)) {
diff --git a/slirp/ndp_table.c b/slirp/ndp_table.c
index 1401e1b322..b7b73722f7 100644
--- a/slirp/ndp_table.c
+++ b/slirp/ndp_table.c
@@ -18,9 +18,9 @@ void ndp_table_add(Slirp *slirp, struct in6_addr ip_addr,
 
 DEBUG_CALL("ndp_table_add");
 DEBUG_ARG("ip = %s", addrstr);
-DEBUG_ARGS(" hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
-   ethaddr[0], ethaddr[1], ethaddr[2],
-   ethaddr[3], ethaddr[4], ethaddr[5]);
+DEBUG_ARG("hw addr = %02x:%02x:%02x:%02x:%02x:%02x",
+  ethaddr[0], ethaddr[1], ethaddr[2],
+  ethaddr[3], ethaddr[4], ethaddr[5]);
 
 if (IN6_IS_ADDR_MULTICAST(&ip_addr) || in6_zero(&ip_addr)) {
 /* Do not register multicast or unspecified addresses */
@@ -67,18 +67,18 @@ bool ndp_table_search(Slirp *slirp, struct in6_addr ip_addr,
 out_ethaddr[3] = ip_addr.s6_addr[13];
 out_ethaddr[4] = ip_addr.s6_addr[14];
 out_ethaddr[5] = ip_addr.s6_addr[15];
-DEBUG_ARGS(" multicast addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
-   out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
-   out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]);
+DEBUG_ARG("multicast addr = %02x:%02x:%02x:%02x:%02x:%02x",
+  out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
+  out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]);
 return 1;
 }
 
 for (i = 0; i < NDP_TABLE_SIZE; i++) {
 if (in6_equal(&ndp_table->table[i].ip_addr, &ip_addr)) {
 memcpy(out_ethaddr, ndp_table->table[i].eth_addr,  ETH_ALEN);
-DEBUG_ARGS(" found hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
-   out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
-   out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]);
+DEBUG_ARG(&

[Qemu-devel] [PULL 49/64] slirp: use virtual time for packet expiration

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Make all packets expiration time based on virtual clock.

Suggested-by: Paolo Bonzini 
Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/if.c| 2 +-
 slirp/slirp.c | 7 ---
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/slirp/if.c b/slirp/if.c
index aa88cc4e76..ce4f5fac53 100644
--- a/slirp/if.c
+++ b/slirp/if.c
@@ -148,7 +148,7 @@ diddit:
  */
 void if_start(Slirp *slirp)
 {
-uint64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
+uint64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
 bool from_batchq = false;
 struct mbuf *ifm, *ifm_next, *ifqt;
 
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 4949d17c73..91210dc00a 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -582,7 +582,7 @@ void slirp_pollfds_poll(GArray *pollfds, int select_error)
 return;
 }
 
-curtime = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
+curtime = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL);
 
 QTAILQ_FOREACH(slirp, &slirp_instances, entry) {
 /*
@@ -909,7 +909,8 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct 
ethhdr *eh,
 ifm->resolution_requested = true;
 
 /* Expire request and drop outgoing packet after 1 second */
-ifm->expiration_date = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) + 
10ULL;
+ifm->expiration_date =
+qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 10ULL;
 }
 return 0;
 } else {
@@ -936,7 +937,7 @@ static int if_encap6(Slirp *slirp, struct mbuf *ifm, struct 
ethhdr *eh,
 ndp_send_ns(slirp, ip6h->ip_dst);
 ifm->resolution_requested = true;
 ifm->expiration_date =
-qemu_clock_get_ns(QEMU_CLOCK_REALTIME) + 10ULL;
+qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 10ULL;
 }
 return 0;
 } else {
-- 
2.19.2




[Qemu-devel] [PULL 51/64] slirp: replace some fprintf() with DEBUG_MISC

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Remove some clutter, and avoids direct call to fprintf().

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.c | 17 ++---
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/slirp/slirp.c b/slirp/slirp.c
index 91210dc00a..84f6b05974 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -164,9 +164,7 @@ static int get_dns_addr_resolv_conf(int af, void 
*pdns_addr, void *cached_addr,
 if (!f)
 return -1;
 
-#ifdef DEBUG
-fprintf(stderr, "IP address of your DNS(s): ");
-#endif
+DEBUG_MISC("IP address of your DNS(s): ");
 while (fgets(buff, 512, f) != NULL) {
 if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) {
 char *c = strchr(buff2, '%');
@@ -188,15 +186,12 @@ static int get_dns_addr_resolv_conf(int af, void 
*pdns_addr, void *cached_addr,
 *scope_id = if_index;
 }
 *cached_time = curtime;
+} else {
+DEBUG_MISC(", ");
 }
-#ifdef DEBUG
-else
-fprintf(stderr, ", ");
-#endif
+
 if (++found > 3) {
-#ifdef DEBUG
-fprintf(stderr, "(more)");
-#endif
+DEBUG_MISC("(more)");
 break;
 }
 #ifdef DEBUG
@@ -206,7 +201,7 @@ static int get_dns_addr_resolv_conf(int af, void 
*pdns_addr, void *cached_addr,
 if (!res) {
 res = "(string conversion error)";
 }
-fprintf(stderr, "%s", res);
+DEBUG_MISC("%s", res);
 }
 #endif
 }
-- 
2.19.2




[Qemu-devel] [PULL 64/64] slirp: Mark debugging calls as unlikely

2018-12-18 Thread Samuel Thibault
to get them out of the hot path.

Signed-off-by: Samuel Thibault 
Reviewed-by: Marc-André Lureau 
---
 slirp/debug.h | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/slirp/debug.h b/slirp/debug.h
index 25a5d59439..269d97d807 100644
--- a/slirp/debug.h
+++ b/slirp/debug.h
@@ -15,25 +15,25 @@
 extern int slirp_debug;
 
 #define DEBUG_CALL(fmt, ...) do {   \
-if (slirp_debug & DBG_CALL) {   \
+if (G_UNLIKELY(slirp_debug & DBG_CALL)) {   \
 g_debug(fmt "...", ##__VA_ARGS__);  \
 }   \
 } while (0)
 
 #define DEBUG_ARG(fmt, ...) do {\
-if (slirp_debug & DBG_CALL) {   \
+if (G_UNLIKELY(slirp_debug & DBG_CALL)) {   \
 g_debug(" " fmt, ##__VA_ARGS__);\
 }   \
 } while (0)
 
 #define DEBUG_MISC(fmt, ...) do {   \
-if (slirp_debug & DBG_MISC) {   \
+if (G_UNLIKELY(slirp_debug & DBG_MISC)) {   \
 g_debug(fmt, ##__VA_ARGS__);\
 }   \
 } while (0)
 
 #define DEBUG_ERROR(fmt, ...) do {  \
-if (slirp_debug & DBG_ERROR) {  \
+if (G_UNLIKELY(slirp_debug & DBG_ERROR)) {  \
 g_debug(fmt, ##__VA_ARGS__);\
 }   \
 } while (0)
-- 
2.19.2




[Qemu-devel] [PULL 44/64] slirp: simplify fork_exec()

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Use g_spawn_async_with_fds() to setup the child.

GSpawn handles reaping the child, and closing parent file descriptors.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c | 75 +---
 1 file changed, 36 insertions(+), 39 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index ee3492a2ae..753b3da25b 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -129,56 +129,53 @@ err:
 return -1;
 }
 
+static void
+fork_exec_child_setup(gpointer data)
+{
+setsid();
+}
+
 int
 fork_exec(struct socket *so, const char *ex)
 {
-   char **argv;
-   int opt, c, sp[2];
-   pid_t pid;
+GError *err = NULL;
+char **argv;
+int opt, sp[2];
 
-   DEBUG_CALL("fork_exec");
-   DEBUG_ARG("so = %p", so);
-   DEBUG_ARG("ex = %p", ex);
+DEBUG_CALL("fork_exec");
+DEBUG_ARG("so = %p", so);
+DEBUG_ARG("ex = %p", ex);
 
 if (slirp_socketpair_with_oob(sp) < 0) {
 return 0;
 }
 
-   pid = fork();
-   switch(pid) {
-case -1:
-   error_report("Error: fork failed: %s", strerror(errno));
-   closesocket(sp[0]);
-   closesocket(sp[1]);
-   return 0;
-
-case 0:
-   setsid();
-   dup2(sp[1], 0);
-   dup2(sp[1], 1);
-   dup2(sp[1], 2);
-   for (c = getdtablesize() - 1; c >= 3; c--)
-  close(c);
+argv = g_strsplit(ex, " ", -1);
+g_spawn_async_with_fds(NULL /* cwd */,
+   argv,
+   NULL /* env */,
+   G_SPAWN_SEARCH_PATH,
+   fork_exec_child_setup, NULL /* data */,
+   NULL /* child_pid */,
+   sp[1], sp[1], sp[1],
+   &err);
+g_strfreev(argv);
 
-argv = g_strsplit(ex, " ", -1);
-   execvp(argv[0], (char **)argv);
-
-   /* Ooops, failed, let's tell the user why */
-fprintf(stderr, "Error: execvp of %s failed: %s\n",
-argv[0], strerror(errno));
-   close(0); close(1); close(2); /* XXX */
-   exit(1);
+if (err) {
+error_report("%s", err->message);
+g_error_free(err);
+closesocket(sp[0]);
+closesocket(sp[1]);
+return 0;
+}
 
-default:
-   so->s = sp[0];
-   closesocket(sp[1]);
-   qemu_add_child_watch(pid);
-   socket_set_fast_reuse(so->s);
-   opt = 1;
-   qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, 
sizeof(int));
-   qemu_set_nonblock(so->s);
-   return 1;
-   }
+so->s = sp[0];
+closesocket(sp[1]);
+socket_set_fast_reuse(so->s);
+opt = 1;
+qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
+qemu_set_nonblock(so->s);
+return 1;
 }
 #endif
 
-- 
2.19.2




[Qemu-devel] [PULL 47/64] slirp: drop

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Since commit 12f8def0e02232d7c6416ad9b66640f973c531d1 (v2.9), qemu
requires Vista. Let's remove some conditional code.

Note that this introduces a missing declaration warning with mingw.
warning: implicit declaration of function 'inet_ntop'

See also: https://sourceforge.net/p/mingw-w64/mailman/message/36473782/

We could workaround it by declaring it ourself depending on __MINGW64_VERSION_*:
WINSOCK_API_LINKAGE INT WSAAPI inet_pton(int Family, PCTSTR pszAddrString, 
PVOID pAddrBuf);

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c   | 22 --
 slirp/ip6_icmp.c  | 10 --
 slirp/ndp_table.c | 14 ++
 3 files changed, 10 insertions(+), 36 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index 30eda2cca1..4d890287ba 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -290,17 +290,6 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
 }
 #endif
 
-#if defined(_WIN32) && (_WIN32_WINNT < 0x0600)
-/* No inet_pton helper before Vista... */
-if (vprefix6) {
-/* Unsupported */
-error_setg(errp, "IPv6 prefix not supported");
-return -1;
-}
-memset(&ip6_prefix, 0, sizeof(ip6_prefix));
-ip6_prefix.s6_addr[0] = 0xfe;
-ip6_prefix.s6_addr[1] = 0xc0;
-#else
 if (!vprefix6) {
 vprefix6 = "fec0::";
 }
@@ -308,7 +297,6 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
 error_setg(errp, "Failed to parse IPv6 prefix");
 return -1;
 }
-#endif
 
 if (!vprefix6_len) {
 vprefix6_len = 64;
@@ -320,10 +308,6 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
 }
 
 if (vhost6) {
-#if defined(_WIN32) && (_WIN32_WINNT < 0x0600)
-error_setg(errp, "IPv6 host not supported");
-return -1;
-#else
 if (!inet_pton(AF_INET6, vhost6, &ip6_host)) {
 error_setg(errp, "Failed to parse IPv6 host");
 return -1;
@@ -332,17 +316,12 @@ static int net_slirp_init(NetClientState *peer, const 
char *model,
 error_setg(errp, "IPv6 Host doesn't belong to network");
 return -1;
 }
-#endif
 } else {
 ip6_host = ip6_prefix;
 ip6_host.s6_addr[15] |= 2;
 }
 
 if (vnameserver6) {
-#if defined(_WIN32) && (_WIN32_WINNT < 0x0600)
-error_setg(errp, "IPv6 DNS not supported");
-return -1;
-#else
 if (!inet_pton(AF_INET6, vnameserver6, &ip6_dns)) {
 error_setg(errp, "Failed to parse IPv6 DNS");
 return -1;
@@ -351,7 +330,6 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
 error_setg(errp, "IPv6 DNS doesn't belong to network");
 return -1;
 }
-#endif
 } else {
 ip6_dns = ip6_prefix;
 ip6_dns.s6_addr[15] |= 3;
diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index 3f74d172f4..595a62c8d4 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -74,6 +74,7 @@ void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t 
code)
 Slirp *slirp = m->slirp;
 struct mbuf *t;
 struct ip6 *ip = mtod(m, struct ip6 *);
+char addrstr[INET6_ADDRSTRLEN];
 
 DEBUG_CALL("icmp6_send_error");
 DEBUG_ARGS(" type = %d, code = %d\n", type, code);
@@ -90,11 +91,8 @@ void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t 
code)
 struct ip6 *rip = mtod(t, struct ip6 *);
 rip->ip_src = (struct in6_addr)LINKLOCAL_ADDR;
 rip->ip_dst = ip->ip_src;
-#if !defined(_WIN32) || (_WIN32_WINNT >= 0x0600)
-char addrstr[INET6_ADDRSTRLEN];
 inet_ntop(AF_INET6, &rip->ip_dst, addrstr, INET6_ADDRSTRLEN);
 DEBUG_ARG("target = %s", addrstr);
-#endif
 
 rip->ip_nh = IPPROTO_ICMPV6;
 const int error_data_len = MIN(m->m_len,
@@ -222,12 +220,12 @@ void ndp_send_ra(Slirp *slirp)
  */
 void ndp_send_ns(Slirp *slirp, struct in6_addr addr)
 {
-DEBUG_CALL("ndp_send_ns");
-#if !defined(_WIN32) || (_WIN32_WINNT >= 0x0600)
 char addrstr[INET6_ADDRSTRLEN];
+
 inet_ntop(AF_INET6, &addr, addrstr, INET6_ADDRSTRLEN);
+
+DEBUG_CALL("ndp_send_ns");
 DEBUG_ARG("target = %s", addrstr);
-#endif
 
 /* Build IPv6 packet */
 struct mbuf *t = m_get(slirp);
diff --git a/slirp/ndp_table.c b/slirp/ndp_table.c
index a4e6421fd3..1401e1b322 100644
--- a/slirp/ndp_table.c
+++ b/slirp/ndp_table.c
@@ -10,15 +10,14 @@
 void ndp_table_add(Slirp *slirp, struct in6_addr ip_addr,
 uint8_t ethaddr[ETH_ALEN])
 {
+char addrstr[INET6_ADDRSTRLEN];
 NdpTable *ndp_table = &slirp->ndp_table;
 int i;
 
-DEBUG_CALL("ndp_table_add");
-#if !defined(_WIN32) || (_WIN32_WINNT >= 0x0600)
-c

[Qemu-devel] [PULL 48/64] slirp: rename exec_list

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

This list is not only used to handle command to execute on guest
connection, it can also redirect to an arbitrary object, such as a
chardev. Let's rename the struct and the field to "guestfwd".

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c  |  6 +++---
 slirp/misc.h  |  6 +++---
 slirp/slirp.c | 18 +-
 slirp/slirp.h |  2 +-
 slirp/tcp_input.c |  6 +++---
 slirp/tcp_subr.c  |  4 ++--
 6 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index 2d092624d3..526cefa0f1 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -36,10 +36,10 @@ remque(void *a)
   element->qh_rlink = NULL;
 }
 
-int add_exec(struct ex_list **ex_ptr, void *chardev, const char *cmdline,
+int add_exec(struct gfwd_list **ex_ptr, void *chardev, const char *cmdline,
  struct in_addr addr, int port)
 {
-   struct ex_list *tmp_ptr;
+   struct gfwd_list *tmp_ptr;
 
/* First, check if the port is "bound" */
for (tmp_ptr = *ex_ptr; tmp_ptr; tmp_ptr = tmp_ptr->ex_next) {
@@ -49,7 +49,7 @@ int add_exec(struct ex_list **ex_ptr, void *chardev, const 
char *cmdline,
}
 
tmp_ptr = *ex_ptr;
-   *ex_ptr = g_new0(struct ex_list, 1);
+   *ex_ptr = g_new0(struct gfwd_list, 1);
(*ex_ptr)->ex_fport = port;
(*ex_ptr)->ex_addr = addr;
if (chardev) {
diff --git a/slirp/misc.h b/slirp/misc.h
index 0bc5e74bc5..1df707c052 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -8,12 +8,12 @@
 #ifndef MISC_H
 #define MISC_H
 
-struct ex_list {
+struct gfwd_list {
void *ex_chardev;
struct in_addr ex_addr; /* Server address */
int ex_fport;   /* Port to telnet to */
char *ex_exec;  /* Command line of what to exec */
-   struct ex_list *ex_next;
+   struct gfwd_list *ex_next;
 };
 
 #define EMU_NONE 0x0
@@ -51,7 +51,7 @@ struct slirp_quehead {
 
 void slirp_insque(void *, void *);
 void slirp_remque(void *);
-int add_exec(struct ex_list **, void *, const char *, struct in_addr, int);
+int add_exec(struct gfwd_list **, void *, const char *, struct in_addr, int);
 int fork_exec(struct socket *so, const char *ex);
 
 #endif
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 8da528afaa..4949d17c73 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -345,9 +345,9 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct 
in_addr vnetwork,
 
 void slirp_cleanup(Slirp *slirp)
 {
-struct ex_list *e, *next;
+struct gfwd_list *e, *next;
 
-for (e = slirp->exec_list; e; e = next) {
+for (e = slirp->guestfwd_list; e; e = next) {
 next = e->ex_next;
 g_free(e->ex_exec);
 g_free(e);
@@ -760,7 +760,7 @@ static void arp_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len)
 struct ethhdr *reh = (struct ethhdr *)arp_reply;
 struct slirp_arphdr *rah = (struct slirp_arphdr *)(arp_reply + ETH_HLEN);
 int ar_op;
-struct ex_list *ex_ptr;
+struct gfwd_list *ex_ptr;
 
 if (!slirp->in_enabled) {
 return;
@@ -780,7 +780,7 @@ static void arp_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len)
 if (ah->ar_tip == slirp->vnameserver_addr.s_addr ||
 ah->ar_tip == slirp->vhost_addr.s_addr)
 goto arp_ok;
-for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
+for (ex_ptr = slirp->guestfwd_list; ex_ptr; ex_ptr = 
ex_ptr->ex_next) {
 if (ex_ptr->ex_addr.s_addr == ah->ar_tip)
 goto arp_ok;
 }
@@ -1052,7 +1052,7 @@ int slirp_add_exec(Slirp *slirp, void *chardev, const 
char *cmdline,
 return -1;
 }
 
-return add_exec(&slirp->exec_list, chardev, cmdline, *guest_addr,
+return add_exec(&slirp->guestfwd_list, chardev, cmdline, *guest_addr,
 htons(guest_port));
 }
 
@@ -1423,9 +1423,9 @@ static const VMStateDescription vmstate_slirp = {
 static void slirp_state_save(QEMUFile *f, void *opaque)
 {
 Slirp *slirp = opaque;
-struct ex_list *ex_ptr;
+struct gfwd_list *ex_ptr;
 
-for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next)
+for (ex_ptr = slirp->guestfwd_list; ex_ptr; ex_ptr = ex_ptr->ex_next)
 if (ex_ptr->ex_chardev) {
 struct socket *so;
 so = slirp_find_ctl_socket(slirp, ex_ptr->ex_addr,
@@ -1445,7 +1445,7 @@ static void slirp_state_save(QEMUFile *f, void *opaque)
 static int slirp_state_load(QEMUFile *f, void *opaque, int version_id)
 {
 Slirp *slirp = opaque;
-struct ex_list *ex_ptr;
+struct gfwd_list *ex_ptr;
 
 while (qemu_get_byte(f)) {
 int ret;
@@ -1460,7 +1460,7 @@ static int slirp_state_load(QEMUFile *f, void *opaque, 
int version_id)
 slirp->vnetwork_ad

[Qemu-devel] [PULL 61/64] build-sys: use a seperate slirp-obj-y && slirp.mo

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

This will allow to have cflags for the whole slirp.mo -objs.
It makes it possible to build tests that links only with
slirp-obj-y (and not the whole common-obj).

It is also a step towards building slirp as a shared library, although
this requires a bit more thoughts to build with
net/slirp.o (CONFIG_SLIRP would need to be 'm') and other build issues.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 Makefile.objs   |  3 +--
 Makefile.target |  5 -
 slirp/Makefile.objs | 35 ++-
 3 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/Makefile.objs b/Makefile.objs
index 7f777a4908..47b3896ceb 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -16,6 +16,7 @@ util-obj-y += $(QAPI_MODULES:%=qapi/qapi-events-%.o)
 util-obj-y += qapi/qapi-introspect.o
 
 chardev-obj-y = chardev/
+slirp-obj-$(CONFIG_SLIRP) = slirp/
 
 ###
 # block-obj-y is code used by both qemu system emulation and qemu-img
@@ -78,8 +79,6 @@ common-obj-y += vl.o
 vl.o-cflags := $(GPROF_CFLAGS) $(SDL_CFLAGS)
 common-obj-$(CONFIG_TPM) += tpm.o
 
-common-obj-$(CONFIG_SLIRP) += slirp/
-
 common-obj-y += backends/
 common-obj-y += chardev/
 
diff --git a/Makefile.target b/Makefile.target
index 44ec4b630c..37e2fc449b 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -165,6 +165,7 @@ target-obj-y :=
 block-obj-y :=
 common-obj-y :=
 chardev-obj-y :=
+slirp-obj-y :=
 include $(SRC_PATH)/Makefile.objs
 dummy := $(call unnest-vars,,target-obj-y)
 target-obj-y-save := $(target-obj-y)
@@ -177,9 +178,11 @@ dummy := $(call unnest-vars,.., \
qom-obj-y \
io-obj-y \
common-obj-y \
-   common-obj-m)
+   common-obj-m \
+   slirp-obj-y)
 target-obj-y := $(target-obj-y-save)
 all-obj-y += $(common-obj-y)
+all-obj-y += $(slirp-obj-y)
 all-obj-y += $(target-obj-y)
 all-obj-y += $(qom-obj-y)
 all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y) $(chardev-obj-y)
diff --git a/slirp/Makefile.objs b/slirp/Makefile.objs
index 28049b03cd..21653f69e9 100644
--- a/slirp/Makefile.objs
+++ b/slirp/Makefile.objs
@@ -1,5 +1,30 @@
-common-obj-y = cksum.o if.o ip_icmp.o ip6_icmp.o ip6_input.o ip6_output.o \
-   ip_input.o ip_output.o dnssearch.o dhcpv6.o
-common-obj-y += slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o
-common-obj-y += tcp_subr.o tcp_timer.o udp.o udp6.o bootp.o tftp.o arp_table.o 
\
-ndp_table.o ncsi.o
+slirp-obj-y = slirp.mo
+
+slirp.mo-objs = \
+   arp_table.o \
+   bootp.o \
+   cksum.o \
+   dhcpv6.o \
+   dnssearch.o \
+   if.o \
+   ip6_icmp.o \
+   ip6_input.o \
+   ip6_output.o \
+   ip_icmp.o \
+   ip_input.o \
+   ip_output.o \
+   mbuf.o \
+   misc.o \
+   ncsi.o \
+   ndp_table.o \
+   sbuf.o \
+   slirp.o \
+   socket.o \
+   tcp_input.o \
+   tcp_output.o \
+   tcp_subr.o \
+   tcp_timer.o \
+   tftp.o \
+   udp.o \
+   udp6.o \
+   $(NULL)
-- 
2.19.2




[Qemu-devel] [PULL 59/64] slirp: factor out guestfwd addition checks

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

This will allow reusing the function in a following patch.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c  |  7 ---
 slirp/slirp.c | 23 +--
 2 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index a0f104be5e..eae9596a55 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -37,13 +37,6 @@ int add_exec(struct gfwd_list **ex_ptr, void *chardev, const 
char *cmdline,
 {
struct gfwd_list *tmp_ptr;
 
-   /* First, check if the port is "bound" */
-   for (tmp_ptr = *ex_ptr; tmp_ptr; tmp_ptr = tmp_ptr->ex_next) {
-   if (port == tmp_ptr->ex_fport &&
-   addr.s_addr == tmp_ptr->ex_addr.s_addr)
-   return -1;
-   }
-
tmp_ptr = *ex_ptr;
*ex_ptr = g_new0(struct gfwd_list, 1);
(*ex_ptr)->ex_fport = port;
diff --git a/slirp/slirp.c b/slirp/slirp.c
index c022644888..6a4d506d49 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1046,9 +1046,11 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct 
in_addr host_addr,
 return 0;
 }
 
-int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
-   struct in_addr *guest_addr, int guest_port)
+static bool
+check_guestfwd(Slirp *slirp, struct in_addr *guest_addr, int guest_port)
 {
+struct gfwd_list *tmp_ptr;
+
 if (!guest_addr->s_addr) {
 guest_addr->s_addr = slirp->vnetwork_addr.s_addr |
 (htonl(0x0204) & ~slirp->vnetwork_mask.s_addr);
@@ -1057,6 +1059,23 @@ int slirp_add_exec(Slirp *slirp, void *chardev, const 
char *cmdline,
 slirp->vnetwork_addr.s_addr ||
 guest_addr->s_addr == slirp->vhost_addr.s_addr ||
 guest_addr->s_addr == slirp->vnameserver_addr.s_addr) {
+return false;
+}
+
+/* check if the port is "bound" */
+for (tmp_ptr = slirp->guestfwd_list; tmp_ptr; tmp_ptr = tmp_ptr->ex_next) {
+if (guest_port == tmp_ptr->ex_fport &&
+guest_addr->s_addr == tmp_ptr->ex_addr.s_addr)
+return false;
+}
+
+return true;
+}
+
+int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
+   struct in_addr *guest_addr, int guest_port)
+{
+if (!check_guestfwd(slirp, guest_addr, guest_port)) {
 return -1;
 }
 
-- 
2.19.2




[Qemu-devel] [PULL 45/64] slirp: replace error_report() with g_critical()

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Reduce dependency on QEMU. QEMU could use a custom log handler if it
wants to redirect/filter it.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index 753b3da25b..b141446319 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -162,7 +162,7 @@ fork_exec(struct socket *so, const char *ex)
 g_strfreev(argv);
 
 if (err) {
-error_report("%s", err->message);
+g_critical("fork_exec: %s", err->message);
 g_error_free(err);
 closesocket(sp[0]);
 closesocket(sp[1]);
-- 
2.19.2




[Qemu-devel] [PULL 63/64] slirp: call into g_debug() for DEBUG macros

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Make slirp use GLib logging, instead of fprintf(), so that
applications can filter log, process it etc.

With recent versions of glib, G_MESSAGES_DEBUG must be set to "all" or
"Slirp" to see slirp debug messages.

Reformat DEBUG_MISC & DEBUG_ERROR calls to not need \n ending.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/cksum.c  |  4 ++--
 slirp/debug.h  | 17 -
 slirp/dhcpv6.c |  6 +++---
 slirp/ip_icmp.c| 10 +-
 slirp/slirp.c  | 10 --
 slirp/socket.c | 24 
 slirp/tcp_input.c  |  7 +++
 slirp/tcp_output.c |  2 +-
 slirp/tcp_subr.c   |  2 +-
 slirp/udp.c|  5 ++---
 slirp/udp6.c   |  5 ++---
 11 files changed, 39 insertions(+), 53 deletions(-)

diff --git a/slirp/cksum.c b/slirp/cksum.c
index 0a988b845d..84c858fafb 100644
--- a/slirp/cksum.c
+++ b/slirp/cksum.c
@@ -121,8 +121,8 @@ int cksum(struct mbuf *m, int len)
 
 cont:
if (len) {
-   DEBUG_ERROR("cksum: out of data\n");
-   DEBUG_ERROR(" len = %d\n", len);
+   DEBUG_ERROR("cksum: out of data");
+   DEBUG_ERROR(" len = %d", len);
}
if (mlen == -1) {
/* The last mbuf has odd # of bytes. Follow the
diff --git a/slirp/debug.h b/slirp/debug.h
index 50f30898fb..25a5d59439 100644
--- a/slirp/debug.h
+++ b/slirp/debug.h
@@ -12,38 +12,29 @@
 #define DBG_MISC 0x2
 #define DBG_ERROR 0x4
 
-#define dfd stderr
-
 extern int slirp_debug;
 
 #define DEBUG_CALL(fmt, ...) do {   \
 if (slirp_debug & DBG_CALL) {   \
-fprintf(dfd, fmt, ##__VA_ARGS__);   \
-fprintf(dfd, "...\n");  \
-fflush(dfd);\
+g_debug(fmt "...", ##__VA_ARGS__);  \
 }   \
 } while (0)
 
 #define DEBUG_ARG(fmt, ...) do {\
 if (slirp_debug & DBG_CALL) {   \
-fputc(' ', dfd);\
-fprintf(dfd, fmt, ##__VA_ARGS__);   \
-fputc('\n', dfd);   \
-fflush(dfd);\
+g_debug(" " fmt, ##__VA_ARGS__);\
 }   \
 } while (0)
 
 #define DEBUG_MISC(fmt, ...) do {   \
 if (slirp_debug & DBG_MISC) {   \
-fprintf(dfd, fmt, ##__VA_ARGS__);   \
-fflush(dfd);\
+g_debug(fmt, ##__VA_ARGS__);\
 }   \
 } while (0)
 
 #define DEBUG_ERROR(fmt, ...) do {  \
 if (slirp_debug & DBG_ERROR) {  \
-fprintf(dfd, fmt, ##__VA_ARGS__);   \
-fflush(dfd);\
+g_debug(fmt, ##__VA_ARGS__);\
 }   \
 } while (0)
 
diff --git a/slirp/dhcpv6.c b/slirp/dhcpv6.c
index 5d703e8ae6..752df40536 100644
--- a/slirp/dhcpv6.c
+++ b/slirp/dhcpv6.c
@@ -92,13 +92,13 @@ static int dhcpv6_parse_info_request(Slirp *slirp, uint8_t 
*odata, int olen,
 ri->want_boot_url = true;
 break;
 default:
-DEBUG_MISC("dhcpv6: Unsupported option request %d\n",
+DEBUG_MISC("dhcpv6: Unsupported option request %d",
req_opt);
 }
 }
 break;
 default:
-DEBUG_MISC("dhcpv6 info req: Unsupported option %d, len=%d\n",
+DEBUG_MISC("dhcpv6 info req: Unsupported option %d, len=%d",
option, len);
 }
 
@@ -203,6 +203,6 @@ void dhcpv6_input(struct sockaddr_in6 *srcsas, struct mbuf 
*m)
 dhcpv6_info_request(m->slirp, srcsas, xid, &data[4], data_len - 4);
 break;
 default:
-DEBUG_MISC("dhcpv6_input: Unsupported message type 0x%x\n", data[0]);
+DEBUG_MISC("dhcpv6_input: Unsupported message type 0x%x", data[0]);
 }
 }
diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c
index cd2faeacb6..7c7e042049 100644
--- a/slirp/ip_icmp.c
+++ b/slirp/ip_icmp.c
@@ -103,7 +103,7 @@ static int icmp_send(struct socket *so, struct mbuf *m, int 
hlen)
 
 if (sendto(so->s, m->m_data + hlen, m->m_len - hlen, 0,
(struct sockaddr *)&addr, sizeof(addr)) == -1) {
-DEBUG_MISC("icmp_input icmp sendto tx errno = %d-%s\n",
+DEBUG_MISC("icmp_input icmp sendto tx errno = %d-%s",
errno, strerror(errno));
 icmp_send_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, 0, strerror(errno));
 icmp_detach(so);
@@ -169,7

[Qemu-devel] [PULL 41/64] slirp: replace ARRAY_SIZE with G_N_ELEMENTS

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Do not require QEMU macro.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/ncsi.c | 2 +-
 slirp/tftp.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/slirp/ncsi.c b/slirp/ncsi.c
index 10decfb5ef..8594382270 100644
--- a/slirp/ncsi.c
+++ b/slirp/ncsi.c
@@ -128,7 +128,7 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len)
 memset(reh->h_source, 0xff, ETH_ALEN);
 reh->h_proto = htons(ETH_P_NCSI);
 
-for (i = 0; i < ARRAY_SIZE(ncsi_rsp_handlers); i++) {
+for (i = 0; i < G_N_ELEMENTS(ncsi_rsp_handlers); i++) {
 if (ncsi_rsp_handlers[i].type == nh->type + 0x80) {
 handler = &ncsi_rsp_handlers[i];
 break;
diff --git a/slirp/tftp.c b/slirp/tftp.c
index 735b57aa55..a9ba1480db 100644
--- a/slirp/tftp.c
+++ b/slirp/tftp.c
@@ -359,7 +359,7 @@ static void tftp_handle_rrq(Slirp *slirp, struct 
sockaddr_storage *srcsas,
   return;
   }
 
-  while (k < pktlen && nb_options < ARRAY_SIZE(option_name)) {
+  while (k < pktlen && nb_options < G_N_ELEMENTS(option_name)) {
   const char *key, *value;
 
   key = &tp->x.tp_buf[k];
@@ -403,7 +403,7 @@ static void tftp_handle_rrq(Slirp *slirp, struct 
sockaddr_storage *srcsas,
   }
 
   if (nb_options > 0) {
-  assert(nb_options <= ARRAY_SIZE(option_name));
+  assert(nb_options <= G_N_ELEMENTS(option_name));
   tftp_send_oack(spt, option_name, option_value, nb_options, tp);
   return;
   }
-- 
2.19.2




[Qemu-devel] [PULL 56/64] slirp: use %p for pointers format

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

This fixes some compilation warnings on mingw64.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/ip6_icmp.c   | 2 +-
 slirp/ip6_input.c  | 2 +-
 slirp/ip6_output.c | 4 ++--
 slirp/udp6.c   | 6 +++---
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index 595a62c8d4..bce075913c 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -390,7 +390,7 @@ void icmp6_input(struct mbuf *m)
 int hlen = sizeof(struct ip6);
 
 DEBUG_CALL("icmp6_input");
-DEBUG_ARG("m = %lx", (long) m);
+DEBUG_ARG("m = %p", m);
 DEBUG_ARG("m_len = %d", m->m_len);
 
 if (ntohs(ip->ip_pl) < ICMP6_MINLEN) {
diff --git a/slirp/ip6_input.c b/slirp/ip6_input.c
index ac2e3ea882..ab656a0a9d 100644
--- a/slirp/ip6_input.c
+++ b/slirp/ip6_input.c
@@ -31,7 +31,7 @@ void ip6_input(struct mbuf *m)
 }
 
 DEBUG_CALL("ip6_input");
-DEBUG_ARG("m = %lx", (long)m);
+DEBUG_ARG("m = %p", m);
 DEBUG_ARG("m_len = %d", m->m_len);
 
 if (m->m_len < sizeof(struct ip6)) {
diff --git a/slirp/ip6_output.c b/slirp/ip6_output.c
index 762cbfe89c..52c88ad691 100644
--- a/slirp/ip6_output.c
+++ b/slirp/ip6_output.c
@@ -19,8 +19,8 @@ int ip6_output(struct socket *so, struct mbuf *m, int fast)
 struct ip6 *ip = mtod(m, struct ip6 *);
 
 DEBUG_CALL("ip6_output");
-DEBUG_ARG("so = %lx", (long)so);
-DEBUG_ARG("m = %lx", (long)m);
+DEBUG_ARG("so = %p", so);
+DEBUG_ARG("m = %p", m);
 
 /* Fill IPv6 header */
 ip->ip_v = IP6VERSION;
diff --git a/slirp/udp6.c b/slirp/udp6.c
index 473ba1586e..8cdb1892e2 100644
--- a/slirp/udp6.c
+++ b/slirp/udp6.c
@@ -20,7 +20,7 @@ void udp6_input(struct mbuf *m)
 struct sockaddr_in6 lhost;
 
 DEBUG_CALL("udp6_input");
-DEBUG_ARG("m = %lx", (long)m);
+DEBUG_ARG("m = %p", m);
 
 if (slirp->restricted) {
 goto bad;
@@ -144,8 +144,8 @@ int udp6_output(struct socket *so, struct mbuf *m,
 struct udphdr *uh;
 
 DEBUG_CALL("udp6_output");
-DEBUG_ARG("so = %lx", (long)so);
-DEBUG_ARG("m = %lx", (long)m);
+DEBUG_ARG("so = %p", so);
+DEBUG_ARG("m = %p", m);
 
 /* adjust for header */
 m->m_data -= sizeof(struct udphdr);
-- 
2.19.2




[Qemu-devel] [PULL 50/64] slirp: replace a fprintf with g_critical()

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Reduce dependency on QEMU. QEMU could use a custom glib log handler if
it wants to redirect/filter it.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/socket.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/slirp/socket.c b/slirp/socket.c
index 677fd20c9d..08a065f6a7 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -285,7 +285,7 @@ err:
 
 sofcantrcvmore(so);
 tcp_sockclosed(sototcpcb(so));
-fprintf(stderr, "soreadbuf buffer to small");
+g_critical("soreadbuf buffer too small");
 return -1;
 }
 
-- 
2.19.2




[Qemu-devel] [PULL 54/64] slirp: always build with debug statements

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Make debug statements condiitonal only on slirp_debug flags, instead
of the pre-processor DEBUG blocks, as it may introduce breakage
easily, since the debug code isn't always compiled.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/debug.h | 15 +++
 slirp/misc.c  |  6 +-
 2 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/slirp/debug.h b/slirp/debug.h
index ca3a4b04da..ff920f0b87 100644
--- a/slirp/debug.h
+++ b/slirp/debug.h
@@ -5,9 +5,8 @@
  * terms and conditions of the copyright.
  */
 
-//#define DEBUG 1
-
-#ifdef DEBUG
+#ifndef DEBUG_H_
+#define DEBUG_H_
 
 #define DBG_CALL 0x1
 #define DBG_MISC 0x2
@@ -50,12 +49,4 @@ extern int slirp_debug;
 }   \
 } while (0)
 
-#else
-
-#define DEBUG_CALL(fmt, ...)
-#define DEBUG_ARG(fmt, ...)
-#define DEBUG_ARGS(fmt, ...)
-#define DEBUG_MISC(fmt, ...)
-#define DEBUG_ERROR(fmt, ...)
-
-#endif
+#endif /* DEBUG_H_ */
diff --git a/slirp/misc.c b/slirp/misc.c
index 526cefa0f1..e30d2ceb2a 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -12,9 +12,13 @@
 #include "qemu/main-loop.h"
 
 #ifdef DEBUG
-int slirp_debug = DBG_CALL|DBG_MISC|DBG_ERROR;
+#define SLIRP_DEBUG (DBG_CALL | DBG_MISC | DBG_ERROR)
+#else
+#define SLIRP_DEBUG 0
 #endif
 
+int slirp_debug = SLIRP_DEBUG;
+
 inline void
 insque(void *a, void *b)
 {
-- 
2.19.2




[Qemu-devel] [PULL 38/64] slirp: remove unused sbflush()

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/sbuf.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/slirp/sbuf.h b/slirp/sbuf.h
index a722ecb629..644c201341 100644
--- a/slirp/sbuf.h
+++ b/slirp/sbuf.h
@@ -8,7 +8,6 @@
 #ifndef SBUF_H
 #define SBUF_H
 
-#define sbflush(sb) sbdrop((sb),(sb)->sb_cc)
 #define sbspace(sb) ((sb)->sb_datalen - (sb)->sb_cc)
 
 struct sbuf {
-- 
2.19.2




[Qemu-devel] [PULL 31/64] slirp: replace SIZEOF_CHAR_P with glib equivalent

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Signed-off-by: Samuel Thibault 
---
 slirp/ip.h   | 2 +-
 slirp/slirp_config.h | 3 ---
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/slirp/ip.h b/slirp/ip.h
index 83fc9cdfbf..243b6c8b24 100644
--- a/slirp/ip.h
+++ b/slirp/ip.h
@@ -177,7 +177,7 @@ struct  ip_timestamp {
 
 #defineIP_MSS  576 /* default maximum segment size 
*/
 
-#if SIZEOF_CHAR_P == 4
+#if GLIB_SIZEOF_VOID_P == 4
 struct mbuf_ptr {
struct mbuf *mptr;
uint32_t dummy;
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index b2def6d20c..7147e0de04 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -10,6 +10,3 @@
  * Autoconf defined configuration options
  * You shouldn't need to touch any of these
  */
-
-/* Define to sizeof(char *) */
-#define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
-- 
2.19.2




[Qemu-devel] [PULL 57/64] slirp: remove remaining DEBUG blocks

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Instead, rely on slirp_debug flags, or compile unconditionally (the
substraction in cksum is unlikely to affect any benchmark result).

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/cksum.c   | 4 
 slirp/ip_icmp.c | 5 ++---
 slirp/slirp.c   | 5 +
 3 files changed, 3 insertions(+), 11 deletions(-)

diff --git a/slirp/cksum.c b/slirp/cksum.c
index b9466485b5..0a988b845d 100644
--- a/slirp/cksum.c
+++ b/slirp/cksum.c
@@ -70,9 +70,7 @@ int cksum(struct mbuf *m, int len)
 
if (len < mlen)
   mlen = len;
-#ifdef DEBUG
len -= mlen;
-#endif
/*
 * Force to even boundary.
 */
@@ -122,12 +120,10 @@ int cksum(struct mbuf *m, int len)
   s_util.c[0] = *(uint8_t *)w;
 
 cont:
-#ifdef DEBUG
if (len) {
DEBUG_ERROR("cksum: out of data\n");
DEBUG_ERROR(" len = %d\n", len);
}
-#endif
if (mlen == -1) {
/* The last mbuf has odd # of bytes. Follow the
 standard (the odd byte may be shifted left by 8 bits
diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c
index 6c7e375ff8..cd2faeacb6 100644
--- a/slirp/ip_icmp.c
+++ b/slirp/ip_icmp.c
@@ -257,13 +257,12 @@ icmp_send_error(struct mbuf *msrc, u_char type, u_char 
code, int minsize,
   /* check msrc */
   if(!msrc) goto end_error;
   ip = mtod(msrc, struct ip *);
-#ifdef DEBUG
-  { char bufa[20], bufb[20];
+  if (slirp_debug & DBG_MISC) {
+char bufa[20], bufb[20];
 strcpy(bufa, inet_ntoa(ip->ip_src));
 strcpy(bufb, inet_ntoa(ip->ip_dst));
 DEBUG_MISC(" %.16s to %.16s\n", bufa, bufb);
   }
-#endif
   if(ip->ip_off & IP_OFFMASK) goto end_error;/* Only reply to fragment 0 */
 
   /* Do not reply to source-only IPs */
diff --git a/slirp/slirp.c b/slirp/slirp.c
index abc573e6de..31af2efbd5 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -195,9 +195,7 @@ static int get_dns_addr_resolv_conf(int af, void 
*pdns_addr, void *cached_addr,
 if (++found > 3) {
 DEBUG_MISC("(more)");
 break;
-}
-#ifdef DEBUG
-else {
+} else if (slirp_debug & DBG_MISC) {
 char s[INET6_ADDRSTRLEN];
 const char *res = inet_ntop(af, tmp_addr, s, sizeof(s));
 if (!res) {
@@ -205,7 +203,6 @@ static int get_dns_addr_resolv_conf(int af, void 
*pdns_addr, void *cached_addr,
 }
 DEBUG_MISC("%s", res);
 }
-#endif
 }
 }
 fclose(f);
-- 
2.19.2




[Qemu-devel] [PULL 46/64] slirp: Enable fork_exec support on Windows

2018-12-18 Thread Samuel Thibault
g_spawn_async_with_fds is portable on Windows, so we can now enable
fork_exec support there.

Thanks Daniel P. Berrangé for the notice!

Signed-off-by: Samuel Thibault 
Reviewed-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
---
 slirp/misc.c | 14 ++
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index b141446319..2d092624d3 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -62,17 +62,6 @@ int add_exec(struct ex_list **ex_ptr, void *chardev, const 
char *cmdline,
 }
 
 
-#ifdef _WIN32
-
-int
-fork_exec(struct socket *so, const char *ex)
-{
-/* not implemented */
-return 0;
-}
-
-#else
-
 static int
 slirp_socketpair_with_oob(int sv[2])
 {
@@ -132,7 +121,9 @@ err:
 static void
 fork_exec_child_setup(gpointer data)
 {
+#ifndef _WIN32
 setsid();
+#endif
 }
 
 int
@@ -177,7 +168,6 @@ fork_exec(struct socket *so, const char *ex)
 qemu_set_nonblock(so->s);
 return 1;
 }
-#endif
 
 char *slirp_connection_info(Slirp *slirp)
 {
-- 
2.19.2




[Qemu-devel] [PULL 62/64] slirp: set G_LOG_DOMAIN

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

We are moving to g_log() facilities to log errors and probably debug
messages too. Let's have the "Slirp" prefix on messages slirp produces.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/Makefile.objs | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/slirp/Makefile.objs b/slirp/Makefile.objs
index 21653f69e9..959558c732 100644
--- a/slirp/Makefile.objs
+++ b/slirp/Makefile.objs
@@ -28,3 +28,5 @@ slirp.mo-objs = \
udp.o \
udp6.o \
$(NULL)
+
+slirp.mo-cflags = -DG_LOG_DOMAIN=\"Slirp\"
-- 
2.19.2




[Qemu-devel] [PULL 25/64] slirp: remove unused HAVE_SYS_SELECT_H

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/main.h | 4 
 slirp/slirp.h| 4 
 slirp/slirp_config.h | 6 --
 3 files changed, 14 deletions(-)

diff --git a/slirp/main.h b/slirp/main.h
index e04677944f..4bc05fb904 100644
--- a/slirp/main.h
+++ b/slirp/main.h
@@ -8,10 +8,6 @@
 #ifndef SLIRP_MAIN_H
 #define SLIRP_MAIN_H
 
-#ifdef HAVE_SYS_SELECT_H
-#include 
-#endif
-
 extern u_int curtime;
 extern struct in_addr loopback_addr;
 extern unsigned long loopback_mask;
diff --git a/slirp/slirp.h b/slirp/slirp.h
index 1f47848271..7606de962f 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -36,10 +36,6 @@ typedef char *caddr_t;
 # include 
 #endif
 
-#ifdef HAVE_SYS_SELECT_H
-# include 
-#endif
-
 #ifdef HAVE_SYS_FILIO_H
 # include 
 #endif
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 9becb98e11..68e75f3873 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -32,12 +32,6 @@
 #define DECLARE_IOVEC
 #endif
 
-/* Define if you have sys/select.h */
-#undef HAVE_SYS_SELECT_H
-#ifndef _WIN32
-#define HAVE_SYS_SELECT_H
-#endif
-
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
 
-- 
2.19.2




[Qemu-devel] [PULL 37/64] slirp: remove #if notdef dead code

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/ip_input.c  | 200 --
 slirp/tcp_input.c |  39 -
 2 files changed, 239 deletions(-)

diff --git a/slirp/ip_input.c b/slirp/ip_input.c
index 348e1dca5a..6831526320 100644
--- a/slirp/ip_input.c
+++ b/slirp/ip_input.c
@@ -447,206 +447,6 @@ ip_slowtimo(Slirp *slirp)
 }
 }
 
-/*
- * Do option processing on a datagram,
- * possibly discarding it if bad options are encountered,
- * or forwarding it if source-routed.
- * Returns 1 if packet has been forwarded/freed,
- * 0 if the packet should be processed further.
- */
-
-#ifdef notdef
-
-int
-ip_dooptions(m)
-   struct mbuf *m;
-{
-   register struct ip *ip = mtod(m, struct ip *);
-   register u_char *cp;
-   register struct ip_timestamp *ipt;
-   register struct in_ifaddr *ia;
-   int opt, optlen, cnt, off, code, type, forward = 0;
-   struct in_addr *sin, dst;
-typedef uint32_t n_time;
-   n_time ntime;
-
-   dst = ip->ip_dst;
-   cp = (u_char *)(ip + 1);
-   cnt = (ip->ip_hl << 2) - sizeof (struct ip);
-   for (; cnt > 0; cnt -= optlen, cp += optlen) {
-   opt = cp[IPOPT_OPTVAL];
-   if (opt == IPOPT_EOL)
-   break;
-   if (opt == IPOPT_NOP)
-   optlen = 1;
-   else {
-   optlen = cp[IPOPT_OLEN];
-   if (optlen <= 0 || optlen > cnt) {
-   code = &cp[IPOPT_OLEN] - (u_char *)ip;
-   goto bad;
-   }
-   }
-   switch (opt) {
-
-   default:
-   break;
-
-   /*
-* Source routing with record.
-* Find interface with current destination address.
-* If none on this machine then drop if strictly routed,
-* or do nothing if loosely routed.
-* Record interface address and bring up next address
-* component.  If strictly routed make sure next
-* address is on directly accessible net.
-*/
-   case IPOPT_LSRR:
-   case IPOPT_SSRR:
-   if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) {
-   code = &cp[IPOPT_OFFSET] - (u_char *)ip;
-   goto bad;
-   }
-   ipaddr.sin_addr = ip->ip_dst;
-   ia = (struct in_ifaddr *)
-   ifa_ifwithaddr((struct sockaddr *)&ipaddr);
-   if (ia == 0) {
-   if (opt == IPOPT_SSRR) {
-   type = ICMP_UNREACH;
-   code = ICMP_UNREACH_SRCFAIL;
-   goto bad;
-   }
-   /*
-* Loose routing, and not at next destination
-* yet; nothing to do except forward.
-*/
-   break;
-   }
-off--; /* 0 origin */
-   if (off > optlen - sizeof(struct in_addr)) {
-   /*
-* End of source route.  Should be for us.
-*/
-   save_rte(cp, ip->ip_src);
-   break;
-   }
-   /*
-* locate outgoing interface
-*/
-   bcopy((caddr_t)(cp + off), (caddr_t)&ipaddr.sin_addr,
-   sizeof(ipaddr.sin_addr));
-   if (opt == IPOPT_SSRR) {
-#defineINA struct in_ifaddr *
-#defineSA  struct sockaddr *
-   if ((ia = (INA)ifa_ifwithdstaddr((SA)&ipaddr)) == 0)
-   ia = (INA)ifa_ifwithnet((SA)&ipaddr);
-   } else
-   ia = ip_rtaddr(ipaddr.sin_addr);
-   if (ia == 0) {
-   type = ICMP_UNREACH;
-   code = ICMP_UNREACH_SRCFAIL;
-   goto bad;
-   }
-   ip->ip_dst = ipaddr.sin_addr;
-   bcopy((caddr_t)&(IA_SIN(ia)->sin_addr),
-   (caddr_t)(cp + off), sizeof(struct in_addr));
-   cp[IPOPT_OFFSET] += sizeof(struct in_addr);
-   /*
-* Let ip_intr's mcast routing check handl

[Qemu-devel] [PULL 15/64] slirp: use a callback structure to interface with qemu

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

This will bring slirp a bit forward to the state of an independent
project.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c  |  6 +-
 slirp/libslirp.h | 13 +++--
 slirp/ncsi.c |  2 +-
 slirp/slirp.c| 10 +-
 slirp/slirp.h|  2 +-
 5 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index dfc72cfc2e..a7802ddbcc 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -140,6 +140,10 @@ static NetClientInfo net_slirp_info = {
 .cleanup = net_slirp_cleanup,
 };
 
+static const SlirpCb slirp_cb = {
+.output = net_slirp_output,
+};
+
 static int net_slirp_init(NetClientState *peer, const char *model,
   const char *name, int restricted,
   bool ipv4, const char *vnetwork, const char *vhost,
@@ -379,7 +383,7 @@ static int net_slirp_init(NetClientState *peer, const char 
*model,
   vhostname, tftp_server_name,
   tftp_export, bootfile, dhcp,
   dns, ip6_dns, dnssearch, vdomainname,
-  net_slirp_output, s);
+  &slirp_cb, s);
 QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
 
 for (config = slirp_configs; config; config = config->next) {
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 04b6db9f49..a5d1b27b5e 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -5,7 +5,16 @@
 
 typedef struct Slirp Slirp;
 
-typedef void (*slirp_output)(void *opaque, const uint8_t *pkt, int pkt_len);
+/*
+ * Callbacks from slirp
+ *
+ * The opaque parameter comes from the opaque parameter given to slirp_init().
+ */
+typedef struct SlirpCb {
+/* Send an ethernet frame to the guest network.  */
+void (*output)(void *opaque, const uint8_t *pkt, int pkt_len);
+} SlirpCb;
+
 
 Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
   struct in_addr vnetmask, struct in_addr vhost,
@@ -17,7 +26,7 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct 
in_addr vnetwork,
   struct in_addr vdhcp_start, struct in_addr vnameserver,
   struct in6_addr vnameserver6, const char **vdnssearch,
   const char *vdomainname,
-  slirp_output output,
+  const SlirpCb *callbacks,
   void *opaque);
 void slirp_cleanup(Slirp *slirp);
 
diff --git a/slirp/ncsi.c b/slirp/ncsi.c
index d7701f7785..10decfb5ef 100644
--- a/slirp/ncsi.c
+++ b/slirp/ncsi.c
@@ -163,5 +163,5 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len)
 *pchecksum = htonl(checksum);
 ncsi_rsp_len += 4;
 
-slirp->output(slirp->opaque, ncsi_reply, ETH_HLEN + ncsi_rsp_len);
+slirp->cb->output(slirp->opaque, ncsi_reply, ETH_HLEN + ncsi_rsp_len);
 }
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 0e4ade3e4a..7213915bf3 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -288,14 +288,14 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct 
in_addr vnetwork,
   struct in_addr vdhcp_start, struct in_addr vnameserver,
   struct in6_addr vnameserver6, const char **vdnssearch,
   const char *vdomainname,
-  slirp_output output,
+  const SlirpCb *callbacks,
   void *opaque)
 {
 Slirp *slirp = g_malloc0(sizeof(Slirp));
 
 slirp_init_once();
 
-slirp->output = output;
+slirp->cb = callbacks;
 slirp->grand = g_rand_new();
 slirp->restricted = restricted;
 
@@ -843,7 +843,7 @@ static void arp_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len)
 rah->ar_sip = ah->ar_tip;
 memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN);
 rah->ar_tip = ah->ar_sip;
-slirp->output(slirp->opaque, arp_reply, sizeof(arp_reply));
+slirp->cb->output(slirp->opaque, arp_reply, sizeof(arp_reply));
 }
 break;
 case ARPOP_REPLY:
@@ -943,7 +943,7 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct 
ethhdr *eh,
 /* target IP */
 rah->ar_tip = iph->ip_dst.s_addr;
 slirp->client_ipaddr = iph->ip_dst;
-slirp->output(slirp->opaque, arp_req, sizeof(arp_req));
+slirp->cb->output(slirp->opaque, arp_req, sizeof(arp_req));
 ifm->resolution_requested = true;
 
 /* Expire request and drop outgoing packet after 1 second */
@@ -1029,7 +1029,7 @@ int if_encap(Slirp *slirp, struct mbuf *ifm)
 eh->h_dest[0], eh->h_dest[1], eh->h_dest[2],
 eh->h_dest[3], eh->h_dest[4], eh->h_dest[5]));
 memcpy(buf + sizeof(struct ethhdr), ifm->m_data, ifm->m_len);
-slirp->output(slirp->opaqu

[Qemu-devel] [PULL 42/64] net: do not depend on slirp internals

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Only slirp/libslirp.h should be included.

Instead of using some slirp declarations and utility functions directly,
let's copy them in net/util.h.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Tested-by: Philippe Mathieu-Daudé 
Signed-off-by: Samuel Thibault 
---
 net/colo-compare.c| 11 +
 net/colo.c|  1 +
 net/colo.h|  7 +++---
 net/filter-rewriter.c |  9 +++
 net/slirp.c   |  2 +-
 net/util.h| 55 +++
 stubs/slirp.c |  2 +-
 7 files changed, 72 insertions(+), 15 deletions(-)

diff --git a/net/colo-compare.c b/net/colo-compare.c
index 9156ab3349..3e515f3023 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -30,6 +30,7 @@
 #include "net/colo-compare.h"
 #include "migration/colo.h"
 #include "migration/migration.h"
+#include "util.h"
 
 #define TYPE_COLO_COMPARE "colo-compare"
 #define COLO_COMPARE(obj) \
@@ -129,19 +130,19 @@ static int compare_chr_send(CompareState *s,
 
 static gint seq_sorter(Packet *a, Packet *b, gpointer data)
 {
-struct tcphdr *atcp, *btcp;
+struct tcp_hdr *atcp, *btcp;
 
-atcp = (struct tcphdr *)(a->transport_header);
-btcp = (struct tcphdr *)(b->transport_header);
+atcp = (struct tcp_hdr *)(a->transport_header);
+btcp = (struct tcp_hdr *)(b->transport_header);
 return ntohl(atcp->th_seq) - ntohl(btcp->th_seq);
 }
 
 static void fill_pkt_tcp_info(void *data, uint32_t *max_ack)
 {
 Packet *pkt = data;
-struct tcphdr *tcphd;
+struct tcp_hdr *tcphd;
 
-tcphd = (struct tcphdr *)pkt->transport_header;
+tcphd = (struct tcp_hdr *)pkt->transport_header;
 
 pkt->tcp_seq = ntohl(tcphd->th_seq);
 pkt->tcp_ack = ntohl(tcphd->th_ack);
diff --git a/net/colo.c b/net/colo.c
index 49176bf07b..8196b35837 100644
--- a/net/colo.c
+++ b/net/colo.c
@@ -15,6 +15,7 @@
 #include "qemu/osdep.h"
 #include "trace.h"
 #include "colo.h"
+#include "util.h"
 
 uint32_t connection_key_hash(const void *opaque)
 {
diff --git a/net/colo.h b/net/colo.h
index 11c5226488..b21c6830b5 100644
--- a/net/colo.h
+++ b/net/colo.h
@@ -15,10 +15,9 @@
 #ifndef QEMU_COLO_PROXY_H
 #define QEMU_COLO_PROXY_H
 
-#include "slirp/slirp.h"
 #include "qemu/jhash.h"
 #include "qemu/timer.h"
-#include "slirp/tcp.h"
+#include "net/eth.h"
 
 #define HASHTABLE_MAX_SIZE 16384
 
@@ -81,10 +80,10 @@ typedef struct Connection {
 /* the maximum of acknowledgement number in secondary_list queue */
 uint32_t sack;
 /* offset = secondary_seq - primary_seq */
-tcp_seq  offset;
+uint32_t  offset;
 
 int tcp_state; /* TCP FSM state */
-tcp_seq fin_ack_seq; /* the seq of 'fin=1,ack=1' */
+uint32_t fin_ack_seq; /* the seq of 'fin=1,ack=1' */
 } Connection;
 
 uint32_t connection_key_hash(const void *opaque);
diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c
index 2e26839bc2..b464abe5e8 100644
--- a/net/filter-rewriter.c
+++ b/net/filter-rewriter.c
@@ -22,6 +22,7 @@
 #include "net/checksum.h"
 #include "net/colo.h"
 #include "migration/colo.h"
+#include "util.h"
 
 #define FILTER_COLO_REWRITER(obj) \
 OBJECT_CHECK(RewriterState, (obj), TYPE_FILTER_REWRITER)
@@ -73,9 +74,9 @@ static int handle_primary_tcp_pkt(RewriterState *rf,
   Connection *conn,
   Packet *pkt, ConnectionKey *key)
 {
-struct tcphdr *tcp_pkt;
+struct tcp_hdr *tcp_pkt;
 
-tcp_pkt = (struct tcphdr *)pkt->transport_header;
+tcp_pkt = (struct tcp_hdr *)pkt->transport_header;
 if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_DEBUG)) {
 trace_colo_filter_rewriter_pkt_info(__func__,
 inet_ntoa(pkt->ip->ip_src), inet_ntoa(pkt->ip->ip_dst),
@@ -176,9 +177,9 @@ static int handle_secondary_tcp_pkt(RewriterState *rf,
 Connection *conn,
 Packet *pkt, ConnectionKey *key)
 {
-struct tcphdr *tcp_pkt;
+struct tcp_hdr *tcp_pkt;
 
-tcp_pkt = (struct tcphdr *)pkt->transport_header;
+tcp_pkt = (struct tcp_hdr *)pkt->transport_header;
 
 if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_DEBUG)) {
 trace_colo_filter_rewriter_pkt_info(__func__,
diff --git a/net/slirp.c b/net/slirp.c
index 00f7306b69..30eda2cca1 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -38,12 +38,12 @@
 #include "qemu/error-report.h"
 #include "qemu/sockets.h"
 #include "slirp/libslirp.h"
-#include "slirp/ip6.h"
 #include "chardev/char-fe.h"
 #include "sysemu/sysemu.h"
 #include "qemu/cutils.h"
 #include "qapi/e

[Qemu-devel] [PULL 39/64] slirp: NULL is defined by stddef.h

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h | 4 
 1 file changed, 4 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index d1b6bcefbb..fdf397256b 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -199,10 +199,6 @@ struct Slirp {
 void *opaque;
 };
 
-#ifndef NULL
-#define NULL (void *)0
-#endif
-
 void if_start(Slirp *);
 
 int get_dns_addr(struct in_addr *pdns_addr);
-- 
2.19.2




[Qemu-devel] [PULL 40/64] slirp: remove dead TCP_ACK_HACK code

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Untouched since original introduction in 2004.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/tcp_input.c | 23 +--
 1 file changed, 1 insertion(+), 22 deletions(-)

diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c
index 5b5355dd99..b67ec24075 100644
--- a/slirp/tcp_input.c
+++ b/slirp/tcp_input.c
@@ -60,27 +60,6 @@
  * Set DELACK for segments received in order, but ack immediately
  * when segments are out of order (so fast retransmit can work).
  */
-#ifdef TCP_ACK_HACK
-#define TCP_REASS(tp, ti, m, so, flags) {\
-   if ((ti)->ti_seq == (tp)->rcv_nxt && \
-   tcpfrag_list_empty(tp) && \
-   (tp)->t_state == TCPS_ESTABLISHED) {\
-   if (ti->ti_flags & TH_PUSH) \
-   tp->t_flags |= TF_ACKNOW; \
-   else \
-   tp->t_flags |= TF_DELACK; \
-   (tp)->rcv_nxt += (ti)->ti_len; \
-   flags = (ti)->ti_flags & TH_FIN; \
-   if (so->so_emu) { \
-  if (tcp_emu((so),(m))) sbappend((so), (m)); \
-  } else \
-  sbappend((so), (m)); \
-   } else {\
-   (flags) = tcp_reass((tp), (ti), (m)); \
-   tp->t_flags |= TF_ACKNOW; \
-   } \
-}
-#else
 #defineTCP_REASS(tp, ti, m, so, flags) { \
if ((ti)->ti_seq == (tp)->rcv_nxt && \
 tcpfrag_list_empty(tp) && \
@@ -97,7 +76,7 @@
tp->t_flags |= TF_ACKNOW; \
} \
 }
-#endif
+
 static void tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt,
   struct tcpiphdr *ti);
 static void tcp_xmit_timer(register struct tcpcb *tp, int rtt);
-- 
2.19.2




[Qemu-devel] [PULL 36/64] slirp: add a callback to log guest errors

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c  | 7 +++
 slirp/dhcpv6.c   | 6 +++---
 slirp/ip6_icmp.c | 7 +++
 slirp/libslirp.h | 2 ++
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index a7802ddbcc..00f7306b69 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -23,6 +23,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qemu/log.h"
 #include "net/slirp.h"
 
 
@@ -140,8 +141,14 @@ static NetClientInfo net_slirp_info = {
 .cleanup = net_slirp_cleanup,
 };
 
+static void net_slirp_guest_error(const char *msg)
+{
+qemu_log_mask(LOG_GUEST_ERROR, "%s", msg);
+}
+
 static const SlirpCb slirp_cb = {
 .output = net_slirp_output,
+.guest_error = net_slirp_guest_error,
 };
 
 static int net_slirp_init(NetClientState *peer, const char *model,
diff --git a/slirp/dhcpv6.c b/slirp/dhcpv6.c
index 943a13bca8..5d703e8ae6 100644
--- a/slirp/dhcpv6.c
+++ b/slirp/dhcpv6.c
@@ -50,7 +50,7 @@ struct requested_infos {
  * the odata region, thus the caller must keep odata valid as long as it
  * needs to access the requested_infos struct.
  */
-static int dhcpv6_parse_info_request(uint8_t *odata, int olen,
+static int dhcpv6_parse_info_request(Slirp *slirp, uint8_t *odata, int olen,
  struct requested_infos *ri)
 {
 int i, req_opt;
@@ -61,7 +61,7 @@ static int dhcpv6_parse_info_request(uint8_t *odata, int olen,
 int len = odata[2] << 8 | odata[3];
 
 if (len + 4 > olen) {
-qemu_log_mask(LOG_GUEST_ERROR, "Guest sent bad DHCPv6 packet!\n");
+slirp->cb->guest_error("Guest sent bad DHCPv6 packet!");
 return -E2BIG;
 }
 
@@ -121,7 +121,7 @@ static void dhcpv6_info_request(Slirp *slirp, struct 
sockaddr_in6 *srcsas,
 struct mbuf *m;
 uint8_t *resp;
 
-if (dhcpv6_parse_info_request(odata, olen, &ri) < 0) {
+if (dhcpv6_parse_info_request(slirp, odata, olen, &ri) < 0) {
 return;
 }
 
diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index 595647b1b1..3f74d172f4 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -342,8 +342,7 @@ static void ndp_input(struct mbuf *m, Slirp *slirp, struct 
ip6 *ip,
 
 case ICMP6_NDP_RA:
 DEBUG_CALL(" type = Router Advertisement");
-qemu_log_mask(LOG_GUEST_ERROR,
-"Warning: guest sent NDP RA, but shouldn't");
+slirp->cb->guest_error("Warning: guest sent NDP RA, but shouldn't");
 break;
 
 case ICMP6_NDP_NS:
@@ -376,8 +375,8 @@ static void ndp_input(struct mbuf *m, Slirp *slirp, struct 
ip6 *ip,
 
 case ICMP6_NDP_REDIRECT:
 DEBUG_CALL(" type = Redirect");
-qemu_log_mask(LOG_GUEST_ERROR,
-"Warning: guest sent NDP REDIRECT, but shouldn't");
+slirp->cb->guest_error(
+"Warning: guest sent NDP REDIRECT, but shouldn't");
 break;
 }
 }
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index a5d1b27b5e..3e0aa19f4b 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -13,6 +13,8 @@ typedef struct Slirp Slirp;
 typedef struct SlirpCb {
 /* Send an ethernet frame to the guest network.  */
 void (*output)(void *opaque, const uint8_t *pkt, int pkt_len);
+/* Print a message for an error due to guest misbehavior.  */
+void (*guest_error)(const char *msg);
 } SlirpCb;
 
 
-- 
2.19.2




[Qemu-devel] [PULL 28/64] slirp: remove unused DECLARE_IOVEC

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

It's actually qemu configure CONFIG_IOVEC that is being used.

slirp/ does not use it anyway

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp_config.h | 6 --
 1 file changed, 6 deletions(-)

diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index f1ee927c15..833f25a965 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -14,12 +14,6 @@
 /* Define if the machine is big endian */
 //#undef HOST_WORDS_BIGENDIAN
 
-/* Define if iovec needs to be declared */
-#undef DECLARE_IOVEC
-#ifdef _WIN32
-#define DECLARE_IOVEC
-#endif
-
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
 
-- 
2.19.2




[Qemu-devel] [PULL 22/64] slirp: remove unused HAVE_SYS_STROPTS_H

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 5 -
 slirp/slirp_config.h | 3 ---
 2 files changed, 8 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index fba77d0c3d..400f585cec 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -54,11 +54,6 @@ typedef char *caddr_t;
 #define remque slirp_remque
 #define quehead slirp_quehead
 
-#ifdef HAVE_SYS_STROPTS_H
-#include 
-#endif
-
-
 #include "debug.h"
 
 #include "qemu/queue.h"
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 4417b05d1c..47811e36dc 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -47,9 +47,6 @@
 #define HAVE_ARPA_INET_H
 #endif
 
-/* Define if you have sys/stropts.h */
-#undef HAVE_SYS_STROPTS_H
-
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
 
-- 
2.19.2




[Qemu-devel] [PULL 08/64] slirp: remove Monitor dependency, return a string for info

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

There is nothing performance-sensitive in returning an allocated
string for info, and handling the monitor_printf() on the caller side.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 net/slirp.c  |  7 ---
 slirp/libslirp.h |  2 +-
 slirp/misc.c | 23 +--
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/net/slirp.c b/net/slirp.c
index 0bb12567fe..dfc72cfc2e 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -828,10 +828,11 @@ void hmp_info_usernet(Monitor *mon, const QDict *qdict)
 QTAILQ_FOREACH(s, &slirp_stacks, entry) {
 int id;
 bool got_hub_id = net_hub_id_for_client(&s->nc, &id) == 0;
-monitor_printf(mon, "Hub %d (%s):\n",
+char *info = slirp_connection_info(s->slirp);
+monitor_printf(mon, "Hub %d (%s):\n%s",
got_hub_id ? id : -1,
-   s->nc.name);
-slirp_connection_info(s->slirp, mon);
+   s->nc.name, info);
+g_free(info);
 }
 }
 
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index a4f390ee89..04b6db9f49 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -35,7 +35,7 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp,
 int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
struct in_addr *guest_addr, int guest_port);
 
-void slirp_connection_info(Slirp *slirp, Monitor *mon);
+char *slirp_connection_info(Slirp *slirp);
 
 void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr,
int guest_port, const uint8_t *buf, int size);
diff --git a/slirp/misc.c b/slirp/misc.c
index 2784fc420f..ce323ef92e 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -8,7 +8,6 @@
 #include "qemu/osdep.h"
 #include "slirp.h"
 #include "libslirp.h"
-#include "monitor/monitor.h"
 #include "qemu/error-report.h"
 #include "qemu/main-loop.h"
 
@@ -198,8 +197,9 @@ fork_exec(struct socket *so, const char *ex)
 }
 #endif
 
-void slirp_connection_info(Slirp *slirp, Monitor *mon)
+char *slirp_connection_info(Slirp *slirp)
 {
+GString *str = g_string_new(NULL);
 const char * const tcpstates[] = {
 [TCPS_CLOSED]   = "CLOSED",
 [TCPS_LISTEN]   = "LISTEN",
@@ -221,8 +221,9 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
 const char *state;
 char buf[20];
 
-monitor_printf(mon, "  Protocol[State]FD  Source Address  Port   "
-"Dest. Address  Port RecvQ SendQ\n");
+g_string_append_printf(str,
+"  Protocol[State]FD  Source Address  Port   "
+"Dest. Address  Port RecvQ SendQ\n");
 
 for (so = slirp->tcb.so_next; so != &slirp->tcb; so = so->so_next) {
 if (so->so_state & SS_HOSTFWD) {
@@ -244,10 +245,10 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
 dst_port = so->so_fport;
 }
 snprintf(buf, sizeof(buf), "  TCP[%s]", state);
-monitor_printf(mon, "%-19s %3d %15s %5d ", buf, so->s,
+g_string_append_printf(str, "%-19s %3d %15s %5d ", buf, so->s,
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",
ntohs(src.sin_port));
-monitor_printf(mon, "%15s %5d %5d %5d\n",
+g_string_append_printf(str, "%15s %5d %5d %5d\n",
inet_ntoa(dst_addr), ntohs(dst_port),
so->so_rcv.sb_cc, so->so_snd.sb_cc);
 }
@@ -267,10 +268,10 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
 dst_addr = so->so_faddr;
 dst_port = so->so_fport;
 }
-monitor_printf(mon, "%-19s %3d %15s %5d ", buf, so->s,
+g_string_append_printf(str, "%-19s %3d %15s %5d ", buf, so->s,
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",
ntohs(src.sin_port));
-monitor_printf(mon, "%15s %5d %5d %5d\n",
+g_string_append_printf(str, "%15s %5d %5d %5d\n",
inet_ntoa(dst_addr), ntohs(dst_port),
so->so_rcv.sb_cc, so->so_snd.sb_cc);
 }
@@ -280,9 +281,11 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
  (so->so_expire - curtime) / 1000);
 src.sin_addr = so->so_laddr;
 dst_addr = so->so_faddr;
-monitor_printf(mon, "%-19s %3d %15s  -", buf, so->s,
+g_string_append_printf(str, "%-19s %3d %15s  -", buf, so->s,
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*");
-monitor_printf(mon, "%15s  -%5d %5d\n", inet_ntoa(dst_addr),
+g_string_append_printf(str, "%15s  -%5d %5d\n", 
inet_ntoa(dst_addr),
so->so_rcv.sb_cc, so->so_snd.sb_cc);
 }
+
+return g_string_free(str, FALSE);
 }
-- 
2.19.2




[Qemu-devel] [PULL 43/64] glib-compat: add g_spawn_async_with_fds() fallback

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 include/glib-compat.h | 56 +++
 1 file changed, 56 insertions(+)

diff --git a/include/glib-compat.h b/include/glib-compat.h
index fdf95a255d..8a078c5288 100644
--- a/include/glib-compat.h
+++ b/include/glib-compat.h
@@ -83,6 +83,62 @@ static inline gboolean g_strv_contains_qemu(const gchar 
*const *strv,
 }
 #define g_strv_contains(a, b) g_strv_contains_qemu(a, b)
 
+#if !GLIB_CHECK_VERSION(2, 58, 0)
+typedef struct QemuGSpawnFds {
+GSpawnChildSetupFunc child_setup;
+gpointer user_data;
+gint stdin_fd;
+gint stdout_fd;
+gint stderr_fd;
+} QemuGSpawnFds;
+
+static inline void
+qemu_gspawn_fds_setup(gpointer user_data)
+{
+QemuGSpawnFds *q = (QemuGSpawnFds *)user_data;
+
+dup2(q->stdin_fd, 0);
+dup2(q->stdout_fd, 1);
+dup2(q->stderr_fd, 2);
+q->child_setup(q->user_data);
+}
+#endif
+
+static inline gboolean
+g_spawn_async_with_fds_qemu(const gchar *working_directory,
+gchar **argv,
+gchar **envp,
+GSpawnFlags flags,
+GSpawnChildSetupFunc child_setup,
+gpointer user_data,
+GPid *child_pid,
+gint stdin_fd,
+gint stdout_fd,
+gint stderr_fd,
+GError **error)
+{
+#if GLIB_CHECK_VERSION(2, 58, 0)
+return g_spawn_async_with_fds(working_directory, argv, envp, flags,
+  child_setup, user_data,
+  child_pid, stdin_fd, stdout_fd, stderr_fd,
+  error);
+#else
+QemuGSpawnFds setup = {
+.child_setup = child_setup,
+.user_data = user_data,
+.stdin_fd = stdin_fd,
+.stdout_fd = stdout_fd,
+.stderr_fd = stderr_fd,
+};
+
+return g_spawn_async(working_directory, argv, envp, flags,
+ qemu_gspawn_fds_setup, &setup,
+ child_pid, error);
+#endif
+}
+
+#define g_spawn_async_with_fds(wd, argv, env, f, c, d, p, ifd, ofd, efd, err) \
+g_spawn_async_with_fds_qemu(wd, argv, env, f, c, d, p, ifd, ofd, efd, err)
 
 #if defined(_WIN32) && !GLIB_CHECK_VERSION(2, 50, 0)
 /*
-- 
2.19.2




[Qemu-devel] [PULL 27/64] slirp: remove HAVE_SYS_FILIO_H

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 2 +-
 slirp/slirp_config.h | 6 --
 2 files changed, 1 insertion(+), 7 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 226bced429..4a046e 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -36,7 +36,7 @@ typedef char *caddr_t;
 # include 
 #endif
 
-#ifdef HAVE_SYS_FILIO_H
+#ifdef __APPLE__
 # include 
 #endif
 
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 0e78e92d94..f1ee927c15 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -11,12 +11,6 @@
  * You shouldn't need to touch any of these
  */
 
-/* Define if you have sys/filio.h */
-#undef HAVE_SYS_FILIO_H
-#ifdef __APPLE__
-#define HAVE_SYS_FILIO_H
-#endif
-
 /* Define if the machine is big endian */
 //#undef HOST_WORDS_BIGENDIAN
 
-- 
2.19.2




[Qemu-devel] [PULL 16/64] slirp: remove PROBE_CONN dead-code

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Nobody cares for over 14y. Somebody can revert or rewrite if
interested by that.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.c| 41 -
 slirp/slirp_config.h |  4 
 2 files changed, 45 deletions(-)

diff --git a/slirp/slirp.c b/slirp/slirp.c
index 7213915bf3..4fd957be89 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -699,47 +699,6 @@ void slirp_pollfds_poll(GArray *pollfds, int select_error)
 }
 }
 }
-
-/*
- * Probe a still-connecting, non-blocking socket
- * to check if it's still alive
- */
-#ifdef PROBE_CONN
-if (so->so_state & SS_ISFCONNECTING) {
-ret = qemu_recv(so->s, &ret, 0, 0);
-
-if (ret < 0) {
-/* XXX */
-if (errno == EAGAIN || errno == EWOULDBLOCK ||
-errno == EINPROGRESS || errno == ENOTCONN) {
-continue; /* Still connecting, continue */
-}
-
-/* else failed */
-so->so_state &= SS_PERSISTENT_MASK;
-so->so_state |= SS_NOFDREF;
-
-/* tcp_input will take care of it */
-} else {
-ret = send(so->s, &ret, 0, 0);
-if (ret < 0) {
-/* XXX */
-if (errno == EAGAIN || errno == EWOULDBLOCK ||
-errno == EINPROGRESS || errno == ENOTCONN) {
-continue;
-}
-/* else failed */
-so->so_state &= SS_PERSISTENT_MASK;
-so->so_state |= SS_NOFDREF;
-} else {
-so->so_state &= ~SS_ISFCONNECTING;
-}
-
-}
-tcp_input((struct mbuf *)NULL, sizeof(struct ip), so,
-  so->so_ffamily);
-} /* SS_ISFCONNECTING */
-#endif
 }
 
 /*
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index c59f655207..721667e3ef 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -2,10 +2,6 @@
  * User definable configuration options
  */
 
-/* Define if you want the connection to be probed */
-/* XXX Not working yet, so ignore this for now */
-#undef PROBE_CONN
-
 /* Define to 1 if you want KEEPALIVE timers */
 #define DO_KEEPALIVE 0
 
-- 
2.19.2




[Qemu-devel] [PULL 34/64] slirp: replace error_report() with g_critical()

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Reduce dependency on QEMU. QEMU could use a custom log handler if it
wants to redirect/filter it.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/ip6_icmp.c | 2 +-
 slirp/misc.c | 2 +-
 slirp/slirp.c| 6 +++---
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index cd1e0b9fe1..3c424df591 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -417,7 +417,7 @@ void icmp6_input(struct mbuf *m)
 icmp6_send_echoreply(m, slirp, ip, icmp);
 } else {
 /* TODO */
-error_report("external icmpv6 not supported yet");
+g_critical("external icmpv6 not supported yet");
 }
 break;
 
diff --git a/slirp/misc.c b/slirp/misc.c
index 7362e14339..ee3492a2ae 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -119,7 +119,7 @@ slirp_socketpair_with_oob(int sv[2])
 return 0;
 
 err:
-error_report("Error: slirp_socketpair(): %s", strerror(errno));
+g_critical("slirp_socketpair(): %s", strerror(errno));
 if (s >= 0) {
 closesocket(s);
 }
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 3261a04236..238629228f 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1214,8 +1214,8 @@ static int sbuf_tmp_post_load(void *opaque, int version)
 }
 if (tmp->woff >= requested_len ||
 tmp->roff >= requested_len) {
-error_report("invalid sbuf offsets r/w=%u/%u len=%u",
- tmp->roff, tmp->woff, requested_len);
+g_critical("invalid sbuf offsets r/w=%u/%u len=%u",
+   tmp->roff, tmp->woff, requested_len);
 return -EINVAL;
 }
 
@@ -1323,7 +1323,7 @@ static int ss_family_post_load(void *opaque, int 
version_id)
 tss->parent->ss.ss_family = AF_INET6;
 break;
 default:
-error_report("invalid ss_family type %x", tss->portable_family);
+g_critical("invalid ss_family type %x", tss->portable_family);
 return -EINVAL;
 }
 
-- 
2.19.2




[Qemu-devel] [PULL 21/64] slirp: remove NO_UNIX_SOCKETS

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 3 ---
 slirp/slirp_config.h | 6 --
 2 files changed, 9 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 57955a8965..fba77d0c3d 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -28,9 +28,6 @@ typedef char *caddr_t;
 #include 
 #endif
 
-#ifndef NO_UNIX_SOCKETS
-#include 
-#endif
 #ifndef _WIN32
 #include 
 #endif
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index a205dc8c28..4417b05d1c 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -58,9 +58,3 @@
 #ifndef _WIN32
 #define HAVE_INET_ATON
 #endif
-
-/* Define if you DON'T have unix-domain sockets */
-#undef NO_UNIX_SOCKETS
-#ifdef _WIN32
-#define NO_UNIX_SOCKETS
-#endif
-- 
2.19.2




[Qemu-devel] [PULL 53/64] slirp: no need to make DPRINTF conditional on DEBUG

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

DEBUG_CALL is already handled conditionally.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/bootp.c | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/slirp/bootp.c b/slirp/bootp.c
index 5ab6692038..4c9a77eb98 100644
--- a/slirp/bootp.c
+++ b/slirp/bootp.c
@@ -36,11 +36,7 @@
 
 static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE };
 
-#ifdef DEBUG
 #define DPRINTF(fmt, ...) DEBUG_CALL(fmt, ##__VA_ARGS__)
-#else
-#define DPRINTF(fmt, ...) do{}while(0)
-#endif
 
 static BOOTPClient *get_new_addr(Slirp *slirp, struct in_addr *paddr,
  const uint8_t *macaddr)
@@ -166,8 +162,9 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t 
*bp)
 DPRINTF("bootp packet op=%d msgtype=%d", bp->bp_op, dhcp_msg_type);
 if (preq_addr.s_addr != htonl(0L))
 DPRINTF(" req_addr=%08" PRIx32 "\n", ntohl(preq_addr.s_addr));
-else
+else {
 DPRINTF("\n");
+}
 
 if (dhcp_msg_type == 0)
 dhcp_msg_type = DHCPREQUEST; /* Force reply for old BOOTP clients */
-- 
2.19.2




[Qemu-devel] [PULL 33/64] slirp: remove unused global slirp_instance

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 05c203c8c7..d1b6bcefbb 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -199,8 +199,6 @@ struct Slirp {
 void *opaque;
 };
 
-extern Slirp *slirp_instance;
-
 #ifndef NULL
 #define NULL (void *)0
 #endif
-- 
2.19.2




[Qemu-devel] [PULL 10/64] slirp: replace the poor-man string split with g_strsplit()

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Use the glib function for the work, fix a potential crash on >256 words.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/misc.c | 21 +++--
 1 file changed, 3 insertions(+), 18 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index ce323ef92e..4840187750 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -88,11 +88,8 @@ fork_exec(struct socket *so, const char *ex)
socklen_t addrlen = sizeof(addr);
 socklen_t csaddrlen = sizeof(csaddr);
int opt;
-   const char *argv[256];
-   /* don't want to clobber the original */
-   char *bptr;
-   const char *curarg;
-   int c, i, ret;
+   char **argv;
+   int ret;
pid_t pid;
 
DEBUG_CALL("fork_exec");
@@ -156,19 +153,7 @@ fork_exec(struct socket *so, const char *ex)
for (s = getdtablesize() - 1; s >= 3; s--)
   close(s);
 
-   i = 0;
-   bptr = g_strdup(ex); /* No need to free() this */
-do {
-   /* Change the string into argv[] */
-   curarg = bptr;
-   while (*bptr != ' ' && *bptr != (char)0)
-  bptr++;
-   c = *bptr;
-   *bptr++ = (char)0;
-   argv[i++] = g_strdup(curarg);
-} while (c);
-
-argv[i] = NULL;
+argv = g_strsplit(ex, " ", -1);
execvp(argv[0], (char **)argv);
 
/* Ooops, failed, let's tell the user why */
-- 
2.19.2




[Qemu-devel] [PULL 23/64] slirp: remove unused HAVE_ARPA_INET_H

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp_config.h | 6 --
 1 file changed, 6 deletions(-)

diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 47811e36dc..e95284071a 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -41,12 +41,6 @@
 #define HAVE_SYS_SELECT_H
 #endif
 
-/* Define if you have arpa/inet.h */
-#undef HAVE_ARPA_INET_H
-#ifndef _WIN32
-#define HAVE_ARPA_INET_H
-#endif
-
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
 
-- 
2.19.2




[Qemu-devel] [PULL 26/64] slirp: remove HAVE_SYS_IOCTL_H

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.h| 2 +-
 slirp/slirp_config.h | 6 --
 2 files changed, 1 insertion(+), 7 deletions(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 7606de962f..226bced429 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -32,7 +32,7 @@ typedef char *caddr_t;
 #include 
 #endif
 
-#if defined(HAVE_SYS_IOCTL_H)
+#ifndef _WIN32
 # include 
 #endif
 
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 68e75f3873..0e78e92d94 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -11,12 +11,6 @@
  * You shouldn't need to touch any of these
  */
 
-/* Define if you have sys/ioctl.h */
-#undef HAVE_SYS_IOCTL_H
-#ifndef _WIN32
-#define HAVE_SYS_IOCTL_H
-#endif
-
 /* Define if you have sys/filio.h */
 #undef HAVE_SYS_FILIO_H
 #ifdef __APPLE__
-- 
2.19.2




[Qemu-devel] [PULL 32/64] slirp: replace compile time DO_KEEPALIVE

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Use a global variable instead (similar to slirp_debug)

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp.c|  3 +++
 slirp/slirp.h|  6 +++---
 slirp/slirp_config.h | 12 
 slirp/tcp_input.c|  2 +-
 slirp/tcp_timer.c|  2 +-
 5 files changed, 8 insertions(+), 17 deletions(-)
 delete mode 100644 slirp/slirp_config.h

diff --git a/slirp/slirp.c b/slirp/slirp.c
index 4fd957be89..3261a04236 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -35,6 +35,9 @@
 #include 
 #endif
 
+/* Define to 1 if you want KEEPALIVE timers */
+bool slirp_do_keepalive;
+
 /* host loopback address */
 struct in_addr loopback_addr;
 /* host loopback network mask */
diff --git a/slirp/slirp.h b/slirp/slirp.h
index 4a046e..05c203c8c7 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -1,8 +1,6 @@
 #ifndef SLIRP_H
 #define SLIRP_H
 
-#include "slirp_config.h"
-
 #ifdef _WIN32
 
 typedef char *caddr_t;
@@ -219,7 +217,9 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int 
pkt_len);
 #include 
 #endif
 
-#define SO_OPTIONS DO_KEEPALIVE
+
+extern bool slirp_do_keepalive;
+
 #define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL)
 
 /* dnssearch.c */
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
deleted file mode 100644
index 7147e0de04..00
--- a/slirp/slirp_config.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * User definable configuration options
- */
-
-/* Define to 1 if you want KEEPALIVE timers */
-#define DO_KEEPALIVE 0
-
-/*/
-/*
- * Autoconf defined configuration options
- * You shouldn't need to touch any of these
- */
diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c
index d073ef9525..922dbe32eb 100644
--- a/slirp/tcp_input.c
+++ b/slirp/tcp_input.c
@@ -481,7 +481,7 @@ findso:
 * Reset idle time and keep-alive timer.
 */
tp->t_idle = 0;
-   if (SO_OPTIONS)
+   if (slirp_do_keepalive)
   tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
else
   tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE;
diff --git a/slirp/tcp_timer.c b/slirp/tcp_timer.c
index 52ef5f9100..d953a16386 100644
--- a/slirp/tcp_timer.c
+++ b/slirp/tcp_timer.c
@@ -262,7 +262,7 @@ tcp_timers(register struct tcpcb *tp, int timer)
if (tp->t_state < TCPS_ESTABLISHED)
goto dropit;
 
-   if ((SO_OPTIONS) && tp->t_state <= TCPS_CLOSE_WAIT) {
+   if (slirp_do_keepalive && tp->t_state <= TCPS_CLOSE_WAIT) {
if (tp->t_idle >= TCPTV_KEEP_IDLE + TCP_MAXIDLE)
goto dropit;
/*
-- 
2.19.2




[Qemu-devel] [PULL 17/64] slirp: remove FULL_BOLT

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Looking at git history, this looks like something from the past, when
there was a tty layer. Let's remove it.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/if.c   | 2 --
 slirp/slirp_config.h | 7 ---
 2 files changed, 9 deletions(-)

diff --git a/slirp/if.c b/slirp/if.c
index 590753c658..aa88cc4e76 100644
--- a/slirp/if.c
+++ b/slirp/if.c
@@ -131,12 +131,10 @@ diddit:
}
}
 
-#ifndef FULL_BOLT
/*
 * This prevents us from malloc()ing too many mbufs
 */
if_start(ifm->slirp);
-#endif
 }
 
 /*
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 721667e3ef..f0cc1c781b 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -5,13 +5,6 @@
 /* Define to 1 if you want KEEPALIVE timers */
 #define DO_KEEPALIVE 0
 
-/* Define this if you want slirp to write to the tty as fast as it can */
-/* This should only be set if you are using load-balancing, slirp does a */
-/* pretty good job on single modems already, and seting this will make */
-/* interactive sessions less responsive */
-/* X Talk about having fast modem as unit 0 */
-#undef FULL_BOLT
-
 /*/
 /*
  * Autoconf defined configuration options
-- 
2.19.2




[Qemu-devel] [PULL 18/64] slirp: remove the disabled readv()/writev() code path

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

The soread() function may be used on datagram sockets, and would
provide different behaviour if HAVE_READV was set, on empty datagrams.
This looks like a minor optimization, that never has been a strong
goal for slirp.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/slirp_config.h |  3 ---
 slirp/socket.c   | 15 ---
 2 files changed, 18 deletions(-)

diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index f0cc1c781b..3ce64e088e 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -29,9 +29,6 @@
 /* Define if the machine is big endian */
 //#undef HOST_WORDS_BIGENDIAN
 
-/* Define if you have readv */
-#undef HAVE_READV
-
 /* Define if iovec needs to be declared */
 #undef DECLARE_IOVEC
 #ifdef _WIN32
diff --git a/slirp/socket.c b/slirp/socket.c
index 041ec5061a..7012c7c07d 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -187,12 +187,7 @@ soread(struct socket *so)
 */
sopreprbuf(so, iov, &n);
 
-#ifdef HAVE_READV
-   nn = readv(so->s, (struct iovec *)iov, n);
-   DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn));
-#else
nn = qemu_recv(so->s, iov[0].iov_base, iov[0].iov_len,0);
-#endif
if (nn <= 0) {
if (nn < 0 && (errno == EINTR || errno == EAGAIN))
return 0;
@@ -226,7 +221,6 @@ soread(struct socket *so)
}
}
 
-#ifndef HAVE_READV
/*
 * If there was no error, try and read the second time round
 * We read again if n = 2 (ie, there's another part of the buffer)
@@ -244,7 +238,6 @@ soread(struct socket *so)
 }
 
DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn));
-#endif
 
/* Update fields */
sb->sb_cc += nn;
@@ -452,13 +445,7 @@ sowrite(struct socket *so)
}
/* Check if there's urgent data to send, and if so, send it */
 
-#ifdef HAVE_READV
-   nn = writev(so->s, (const struct iovec *)iov, n);
-
-   DEBUG_MISC((dfd, "  ... wrote nn = %d bytes\n", nn));
-#else
nn = slirp_send(so, iov[0].iov_base, iov[0].iov_len,0);
-#endif
/* This should never happen, but people tell me it does *shrug* */
if (nn < 0 && (errno == EAGAIN || errno == EINTR))
return 0;
@@ -467,7 +454,6 @@ sowrite(struct socket *so)
goto err_disconnected;
}
 
-#ifndef HAVE_READV
if (n == 2 && nn == iov[0].iov_len) {
 int ret;
 ret = slirp_send(so, iov[1].iov_base, iov[1].iov_len,0);
@@ -475,7 +461,6 @@ sowrite(struct socket *so)
 nn += ret;
 }
 DEBUG_MISC((dfd, "  ... wrote nn = %d bytes\n", nn));
-#endif
 
/* Update sbuf */
sb->sb_cc -= nn;
-- 
2.19.2




[Qemu-devel] [PULL 35/64] slirp: improve a bit the debug macros

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

Let them accept multiple arguments. Simplify the inner argument
handling of DEBUG_ARGS/DEBUG_MISC_DEBUG_ERROR.

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 slirp/arp_table.c  | 12 ++--
 slirp/bootp.c  |  3 +--
 slirp/cksum.c  |  4 ++--
 slirp/debug.h  | 47 --
 slirp/dhcpv6.c | 11 +--
 slirp/ip6_icmp.c   |  2 +-
 slirp/ip_icmp.c| 18 +-
 slirp/mbuf.c   |  2 +-
 slirp/ndp_table.c  | 18 +-
 slirp/slirp.c  | 12 ++--
 slirp/socket.c | 32 +++
 slirp/tcp_input.c  | 15 +++
 slirp/tcp_output.c |  2 +-
 slirp/tcp_subr.c   |  4 ++--
 slirp/udp.c|  6 +++---
 slirp/udp6.c   |  6 +++---
 16 files changed, 109 insertions(+), 85 deletions(-)

diff --git a/slirp/arp_table.c b/slirp/arp_table.c
index f81963bb88..ce19e6e7c0 100644
--- a/slirp/arp_table.c
+++ b/slirp/arp_table.c
@@ -34,9 +34,9 @@ void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t 
ethaddr[ETH_ALEN])
 
 DEBUG_CALL("arp_table_add");
 DEBUG_ARG("ip = %s", inet_ntoa((struct in_addr){.s_addr = ip_addr}));
-DEBUG_ARGS((dfd, " hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
-ethaddr[0], ethaddr[1], ethaddr[2],
-ethaddr[3], ethaddr[4], ethaddr[5]));
+DEBUG_ARGS(" hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
+   ethaddr[0], ethaddr[1], ethaddr[2],
+   ethaddr[3], ethaddr[4], ethaddr[5]);
 
 if (ip_addr == 0 || ip_addr == 0x || ip_addr == broadcast_addr) {
 /* Do not register broadcast addresses */
@@ -79,9 +79,9 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
 for (i = 0; i < ARP_TABLE_SIZE; i++) {
 if (arptbl->table[i].ar_sip == ip_addr) {
 memcpy(out_ethaddr, arptbl->table[i].ar_sha,  ETH_ALEN);
-DEBUG_ARGS((dfd, " found hw addr = 
%02x:%02x:%02x:%02x:%02x:%02x\n",
-out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
-out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]));
+DEBUG_ARGS(" found hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
+   out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
+   out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]);
 return 1;
 }
 }
diff --git a/slirp/bootp.c b/slirp/bootp.c
index 7b1af73c95..5ab6692038 100644
--- a/slirp/bootp.c
+++ b/slirp/bootp.c
@@ -37,8 +37,7 @@
 static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE };
 
 #ifdef DEBUG
-#define DPRINTF(fmt, ...) \
-do if (slirp_debug & DBG_CALL) { fprintf(dfd, fmt, ##  __VA_ARGS__); 
fflush(dfd); } while (0)
+#define DPRINTF(fmt, ...) DEBUG_CALL(fmt, ##__VA_ARGS__)
 #else
 #define DPRINTF(fmt, ...) do{}while(0)
 #endif
diff --git a/slirp/cksum.c b/slirp/cksum.c
index 6d73abf4a0..b9466485b5 100644
--- a/slirp/cksum.c
+++ b/slirp/cksum.c
@@ -124,8 +124,8 @@ int cksum(struct mbuf *m, int len)
 cont:
 #ifdef DEBUG
if (len) {
-   DEBUG_ERROR((dfd, "cksum: out of data\n"));
-   DEBUG_ERROR((dfd, " len = %d\n", len));
+   DEBUG_ERROR("cksum: out of data\n");
+   DEBUG_ERROR(" len = %d\n", len);
}
 #endif
if (mlen == -1) {
diff --git a/slirp/debug.h b/slirp/debug.h
index 6cfa61edb3..ca3a4b04da 100644
--- a/slirp/debug.h
+++ b/slirp/debug.h
@@ -17,18 +17,45 @@
 
 extern int slirp_debug;
 
-#define DEBUG_CALL(x) if (slirp_debug & DBG_CALL) { fprintf(dfd, "%s...\n", 
x); fflush(dfd); }
-#define DEBUG_ARG(x, y) if (slirp_debug & DBG_CALL) { fputc(' ', dfd); 
fprintf(dfd, x, y); fputc('\n', dfd); fflush(dfd); }
-#define DEBUG_ARGS(x) if (slirp_debug & DBG_CALL) { fprintf x ; fflush(dfd); }
-#define DEBUG_MISC(x) if (slirp_debug & DBG_MISC) { fprintf x ; fflush(dfd); }
-#define DEBUG_ERROR(x) if (slirp_debug & DBG_ERROR) {fprintf x ; fflush(dfd); }
+#define DEBUG_CALL(fmt, ...) do {   \
+if (slirp_debug & DBG_CALL) {   \
+fprintf(dfd, fmt, ##__VA_ARGS__);   \
+fprintf(dfd, "...\n");  \
+fflush(dfd);\
+}   \
+} while (0)
+
+#define DEBUG_ARG(fmt, ...) do {\
+if (slirp_debug & DBG_CALL) {   \
+fputc(' ', dfd);\
+fprintf(dfd, fmt, ##__VA_ARGS__);   \
+fputc('\n', dfd);   \
+fflush(dfd);\
+}   \
+} while (0)
+
+#define DEBUG_ARGS(fmt, ...) DEBUG_ARG(fmt, ##__VA_ARGS__)
+
+#define DEBUG_MISC(fmt, ...) do {   \
+if (sl

[Qemu-devel] [PULL 30/64] slirp: replace HOST_WORDS_BIGENDIAN with glib equivalent

2018-12-18 Thread Samuel Thibault
From: Marc-André Lureau 

One more step towards making the project independent from QEMU.

Signed-off-by: Marc-André Lureau 
Reviewed-by: Philippe Mathieu-Daudé 
Reviewed-by: Daniel P. Berrangé 
Signed-off-by: Samuel Thibault 
---
 slirp/ip.h   | 8 +---
 slirp/ip6.h  | 3 ++-
 slirp/ip6_icmp.h | 6 +++---
 slirp/slirp_config.h | 3 ---
 slirp/tcp.h  | 4 +++-
 5 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/slirp/ip.h b/slirp/ip.h
index 59cf4aa918..83fc9cdfbf 100644
--- a/slirp/ip.h
+++ b/slirp/ip.h
@@ -33,7 +33,9 @@
 #ifndef IP_H
 #define IP_H
 
-#ifdef HOST_WORDS_BIGENDIAN
+#include 
+
+#if G_BYTE_ORDER == G_BIG_ENDIAN
 # undef NTOHL
 # undef NTOHS
 # undef HTONL
@@ -69,7 +71,7 @@ typedef uint32_t n_long; /* long as received 
from the net */
  * Structure of an internet header, naked of options.
  */
 struct ip {
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
uint8_t ip_v:4, /* version */
ip_hl:4;/* header length */
 #else
@@ -135,7 +137,7 @@ struct  ip_timestamp {
uint8_t ipt_code;   /* IPOPT_TS */
uint8_t ipt_len;/* size of structure (variable) */
uint8_t ipt_ptr;/* index of current entry */
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
uint8_t ipt_oflw:4, /* overflow counter */
ipt_flg:4;  /* flags, see below */
 #else
diff --git a/slirp/ip6.h b/slirp/ip6.h
index b1bea43b3c..14e9c78735 100644
--- a/slirp/ip6.h
+++ b/slirp/ip6.h
@@ -6,6 +6,7 @@
 #ifndef SLIRP_IP6_H
 #define SLIRP_IP6_H
 
+#include 
 #include "net/eth.h"
 
 #define ALLNODES_MULTICAST  { .s6_addr = \
@@ -113,7 +114,7 @@ static inline void in6_compute_ethaddr(struct in6_addr ip,
  * Structure of an internet header, naked of options.
  */
 struct ip6 {
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
 uint32_t
 ip_v:4, /* version */
 ip_tc_hi:4, /* traffic class */
diff --git a/slirp/ip6_icmp.h b/slirp/ip6_icmp.h
index b3378b17b5..32b0914055 100644
--- a/slirp/ip6_icmp.h
+++ b/slirp/ip6_icmp.h
@@ -34,7 +34,7 @@ struct ndp_rs { /* Router Solicitation Message */
 
 struct ndp_ra { /* Router Advertisement Message */
 uint8_t chl;/* Cur Hop Limit */
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
 uint8_t
 M:1,
 O:1,
@@ -56,7 +56,7 @@ struct ndp_ns { /* Neighbor Solicitation Message */
 } QEMU_PACKED;
 
 struct ndp_na { /* Neighbor Advertisement Message */
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
 uint32_t
 R:1,/* Router Flag */
 S:1,/* Solicited Flag */
@@ -125,7 +125,7 @@ struct ndpopt {
 #define ndpopt_linklayer ndpopt_body.linklayer_addr
 struct prefixinfo { /* Prefix Information */
 uint8_t prefix_length;
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
 uint8_t L:1, A:1, reserved1:6;
 #else
 uint8_t reserved1:6, A:1, L:1;
diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h
index 5126711849..b2def6d20c 100644
--- a/slirp/slirp_config.h
+++ b/slirp/slirp_config.h
@@ -11,8 +11,5 @@
  * You shouldn't need to touch any of these
  */
 
-/* Define if the machine is big endian */
-//#undef HOST_WORDS_BIGENDIAN
-
 /* Define to sizeof(char *) */
 #define SIZEOF_CHAR_P (HOST_LONG_BITS / 8)
diff --git a/slirp/tcp.h b/slirp/tcp.h
index 174d3d960c..47aaea6c5b 100644
--- a/slirp/tcp.h
+++ b/slirp/tcp.h
@@ -33,6 +33,8 @@
 #ifndef TCP_H
 #define TCP_H
 
+#include 
+
 typedefuint32_t tcp_seq;
 
 #define  PR_SLOWHZ   2   /* 2 slow timeouts per second 
(approx) */
@@ -51,7 +53,7 @@ struct tcphdr {
uint16_t th_dport;  /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
-#ifdef HOST_WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
uint8_t th_off:4,   /* data offset */
th_x2:4;/* (unused) */
 #else
-- 
2.19.2




<    1   2   3   4   5   6   7   8   9   10   >