All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 00/12] slirp updates
@ 2019-03-06 23:58 Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 01/12] slirp: Fix build with gcc 9 Samuel Thibault
                   ` (13 more replies)
  0 siblings, 14 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell; +Cc: Samuel Thibault, stefanha, jan.kiszka

The following changes since commit 32694e98b8d7a246345448a8f707d2e11d6c65e2:

  Merge remote-tracking branch 'remotes/ehabkost/tags/machine-next-pull-request' into staging (2019-03-06 18:52:19 +0000)

are available in the Git repository at:

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

for you to fetch changes up to dd9eff6c839db3996c157f0a6a4e18f95683e58c:

  slirp: remove QEMU Makefile.objs (2019-03-07 00:12:34 +0100)

----------------------------------------------------------------
Slirp updates

Greg Kurz (1):
  slirp: Fix build with gcc 9

Marc-André Lureau (7):
  slirp: adapt a subset of QEMU vmstate code
  slirp: use libslirp migration code
  slirp: use "slirp_" prefix for inet_aton() win32 implementation
  slirp: move sources to src/ subdirectory
  slirp: add a standalone Makefile
  build-sys: link with slirp as an external project
  slirp: remove QEMU Makefile.objs

Samuel Thibault (2):
  slirp: fix big/little endian conversion in ident protocol
  slirp: Mark pieces missing IPv6 support

Vic Lee (1):
  slirp: check for ioctlsocket error and 0-length udp payload.

William Bowling (1):
  slirp: check sscanf result when emulating ident

----------------------------------------------------------------
Greg Kurz (1):
      slirp: Fix build with gcc 9

Marc-André Lureau (7):
      slirp: adapt a subset of QEMU vmstate code
      slirp: use libslirp migration code
      slirp: use "slirp_" prefix for inet_aton() win32 implementation
      slirp: move sources to src/ subdirectory
      slirp: add a standalone Makefile
      build-sys: link with slirp as an external project
      slirp: remove QEMU Makefile.objs

Samuel Thibault (2):
      slirp: fix big/little endian conversion in ident protocol
      slirp: Mark pieces missing IPv6 support

Vic Lee (1):
      slirp: check for ioctlsocket error and 0-length udp payload.

William Bowling (1):
      slirp: check sscanf result when emulating ident

 Makefile                            |   8 +-
 Makefile.objs                       |   1 -
 Makefile.target                     |   5 +-
 configure                           |  65 +++++-
 include/migration/qemu-file-types.h |   2 +
 migration/qemu-file.h               |   1 -
 net/Makefile.objs                   |   2 +
 net/slirp.c                         |  58 ++++-
 slirp/Makefile                      |  47 ++++
 slirp/Makefile.objs                 |  34 ---
 slirp/{ => src}/arp_table.c         |   0
 slirp/{ => src}/bootp.c             |   0
 slirp/{ => src}/bootp.h             |   0
 slirp/{ => src}/cksum.c             |   0
 slirp/{ => src}/debug.h             |   0
 slirp/{ => src}/dhcpv6.c            |   0
 slirp/{ => src}/dhcpv6.h            |   0
 slirp/{ => src}/dnssearch.c         |   0
 slirp/{ => src}/if.c                |   0
 slirp/{ => src}/if.h                |   0
 slirp/{ => src}/ip.h                |   0
 slirp/{ => src}/ip6.h               |   0
 slirp/{ => src}/ip6_icmp.c          |   0
 slirp/{ => src}/ip6_icmp.h          |   0
 slirp/{ => src}/ip6_input.c         |   0
 slirp/{ => src}/ip6_output.c        |   0
 slirp/{ => src}/ip_icmp.c           |   0
 slirp/{ => src}/ip_icmp.h           |   0
 slirp/{ => src}/ip_input.c          |   0
 slirp/{ => src}/ip_output.c         |   0
 slirp/{ => src}/libslirp.h          |   9 +
 slirp/{ => src}/main.h              |   0
 slirp/{ => src}/mbuf.c              |   0
 slirp/{ => src}/mbuf.h              |   0
 slirp/{ => src}/misc.c              |   3 +
 slirp/{ => src}/misc.h              |   0
 slirp/{ => src}/ncsi-pkt.h          |   0
 slirp/{ => src}/ncsi.c              |   0
 slirp/{ => src}/ndp_table.c         |   0
 slirp/{ => src}/qtailq.h            |   0
 slirp/{ => src}/sbuf.c              |   0
 slirp/{ => src}/sbuf.h              |   0
 slirp/{ => src}/slirp.c             |  14 +-
 slirp/{ => src}/slirp.h             |   2 +-
 slirp/{ => src}/socket.c            |  11 +-
 slirp/{ => src}/socket.h            |   0
 slirp/{ => src}/state.c             |  52 ++---
 slirp/src/state.h                   |   0
 slirp/src/stream.c                  | 119 +++++++++++
 slirp/src/stream.h                  |  34 +++
 slirp/{ => src}/tcp.h               |   0
 slirp/{ => src}/tcp_input.c         |   2 +
 slirp/{ => src}/tcp_output.c        |   0
 slirp/{ => src}/tcp_subr.c          |  16 +-
 slirp/{ => src}/tcp_timer.c         |   0
 slirp/{ => src}/tcp_timer.h         |   0
 slirp/{ => src}/tcp_var.h           |   0
 slirp/{ => src}/tcpip.h             |   0
 slirp/{ => src}/tftp.c              |   0
 slirp/{ => src}/tftp.h              |   0
 slirp/{ => src}/udp.c               |   1 +
 slirp/{ => src}/udp.h               |   0
 slirp/{ => src}/udp6.c              |   0
 slirp/{ => src}/util.c              |   4 +-
 slirp/{ => src}/util.h              |   4 +-
 slirp/src/vmstate.c                 | 413 ++++++++++++++++++++++++++++++++++++
 slirp/src/vmstate.h                 | 396 ++++++++++++++++++++++++++++++++++
 slirp/state.h                       |   9 -
 util/Makefile.objs                  |   1 +
 util/main-loop.c                    |   2 -
 vl.c                                |   3 -
 71 files changed, 1207 insertions(+), 111 deletions(-)
 create mode 100644 slirp/Makefile
 delete mode 100644 slirp/Makefile.objs
 rename slirp/{ => src}/arp_table.c (100%)
 rename slirp/{ => src}/bootp.c (100%)
 rename slirp/{ => src}/bootp.h (100%)
 rename slirp/{ => src}/cksum.c (100%)
 rename slirp/{ => src}/debug.h (100%)
 rename slirp/{ => src}/dhcpv6.c (100%)
 rename slirp/{ => src}/dhcpv6.h (100%)
 rename slirp/{ => src}/dnssearch.c (100%)
 rename slirp/{ => src}/if.c (100%)
 rename slirp/{ => src}/if.h (100%)
 rename slirp/{ => src}/ip.h (100%)
 rename slirp/{ => src}/ip6.h (100%)
 rename slirp/{ => src}/ip6_icmp.c (100%)
 rename slirp/{ => src}/ip6_icmp.h (100%)
 rename slirp/{ => src}/ip6_input.c (100%)
 rename slirp/{ => src}/ip6_output.c (100%)
 rename slirp/{ => src}/ip_icmp.c (100%)
 rename slirp/{ => src}/ip_icmp.h (100%)
 rename slirp/{ => src}/ip_input.c (100%)
 rename slirp/{ => src}/ip_output.c (100%)
 rename slirp/{ => src}/libslirp.h (93%)
 rename slirp/{ => src}/main.h (100%)
 rename slirp/{ => src}/mbuf.c (100%)
 rename slirp/{ => src}/mbuf.h (100%)
 rename slirp/{ => src}/misc.c (99%)
 rename slirp/{ => src}/misc.h (100%)
 rename slirp/{ => src}/ncsi-pkt.h (100%)
 rename slirp/{ => src}/ncsi.c (100%)
 rename slirp/{ => src}/ndp_table.c (100%)
 rename slirp/{ => src}/qtailq.h (100%)
 rename slirp/{ => src}/sbuf.c (100%)
 rename slirp/{ => src}/sbuf.h (100%)
 rename slirp/{ => src}/slirp.c (99%)
 rename slirp/{ => src}/slirp.h (99%)
 rename slirp/{ => src}/socket.c (99%)
 rename slirp/{ => src}/socket.h (100%)
 rename slirp/{ => src}/state.c (91%)
 create mode 100644 slirp/src/state.h
 create mode 100644 slirp/src/stream.c
 create mode 100644 slirp/src/stream.h
 rename slirp/{ => src}/tcp.h (100%)
 rename slirp/{ => src}/tcp_input.c (99%)
 rename slirp/{ => src}/tcp_output.c (100%)
 rename slirp/{ => src}/tcp_subr.c (98%)
 rename slirp/{ => src}/tcp_timer.c (100%)
 rename slirp/{ => src}/tcp_timer.h (100%)
 rename slirp/{ => src}/tcp_var.h (100%)
 rename slirp/{ => src}/tcpip.h (100%)
 rename slirp/{ => src}/tftp.c (100%)
 rename slirp/{ => src}/tftp.h (100%)
 rename slirp/{ => src}/udp.c (99%)
 rename slirp/{ => src}/udp.h (100%)
 rename slirp/{ => src}/udp6.c (100%)
 rename slirp/{ => src}/util.c (98%)
 rename slirp/{ => src}/util.h (98%)
 create mode 100644 slirp/src/vmstate.c
 create mode 100644 slirp/src/vmstate.h
 delete mode 100644 slirp/state.h

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 01/12] slirp: Fix build with gcc 9
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 02/12] slirp: check for ioctlsocket error and 0-length udp payload Samuel Thibault
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: Greg Kurz, stefanha, jan.kiszka, Samuel Thibault

From: Greg Kurz <groug@kaod.org>

Build fails with gcc 9:

  CC      slirp/ndp_table.o
slirp/ndp_table.c: In function ‘ndp_table_add’:
slirp/ndp_table.c:31:23: error: taking address of packed member of ‘struct ndpentry’ may result in an unaligned pointer value [-Werror=address-of-packed-member]
   31 |         if (in6_equal(&ndp_table->table[i].ip_addr, &ip_addr)) {
      |                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
slirp/ndp_table.c: In function ‘ndp_table_search’:
slirp/ndp_table.c:75:23: error: taking address of packed member of ‘struct ndpentry’ may result in an unaligned pointer value [-Werror=address-of-packed-member]
   75 |         if (in6_equal(&ndp_table->table[i].ip_addr, &ip_addr)) {
      |                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors

The ndpentry structure isn't used to model on-the-wire data or anything
else that would care for the struct layout. It doesn't need to be packed
actually. Just drop SLIRP_PACKED.

Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <155143315831.102868.17515265400523392682.stgit@bahia.lan>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
---
 slirp/slirp.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/slirp/slirp.h b/slirp/slirp.h
index 752a4cd8c8..8068ba1d1e 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -106,7 +106,7 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
 struct ndpentry {
     unsigned char   eth_addr[ETH_ALEN];     /* sender hardware address */
     struct in6_addr ip_addr;                /* sender IP address       */
-} SLIRP_PACKED;
+};
 
 #define NDP_TABLE_SIZE 16
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 02/12] slirp: check for ioctlsocket error and 0-length udp payload.
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 01/12] slirp: Fix build with gcc 9 Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 03/12] slirp: check sscanf result when emulating ident Samuel Thibault
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell; +Cc: Vic Lee, stefanha, jan.kiszka, Samuel Thibault

From: Vic Lee <llyzs.vic@gmail.com>

Sometimes sorecvfrom() is called from slirp.c because revents == G_IO_IN,
but there is 0 bytes available and recvfrom could be blocking indefinitely.
This is likely due to 0-length udp payload. This also adds an error
checking for ioctlsocket.

Signed-off-by: Vic Lee <llyzs.vic@gmail.com>
Message-Id: <20190301064809.3074-1-llyzs.vic@gmail.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
---
 slirp/socket.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/slirp/socket.c b/slirp/socket.c
index 4876ea3f31..4dc5e2907d 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -529,6 +529,15 @@ sorecvfrom(struct socket *so)
           int n;
 #endif
 
+	  if (ioctlsocket(so->s, FIONREAD, &n) != 0) {
+	      DEBUG_MISC(" ioctlsocket errno = %d-%s\n",
+			 errno,strerror(errno));
+	      return;
+	  }
+	  if (n == 0) {
+	      return;
+	  }
+
 	  m = m_get(so->slirp);
 	  if (!m) {
 	      return;
@@ -552,7 +561,6 @@ sorecvfrom(struct socket *so)
 	   */
 	  len = M_FREEROOM(m);
 	  /* if (so->so_fport != htons(53)) { */
-	  ioctlsocket(so->s, FIONREAD, &n);
 
 	  if (n > len) {
 	    n = (m->m_data - m->m_dat) + m->m_len + n + 1;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 03/12] slirp: check sscanf result when emulating ident
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 01/12] slirp: Fix build with gcc 9 Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 02/12] slirp: check for ioctlsocket error and 0-length udp payload Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 04/12] slirp: fix big/little endian conversion in ident protocol Samuel Thibault
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: William Bowling, stefanha, jan.kiszka, qemu-stable, secalert,
	Samuel Thibault, Philippe Mathieu-Daudé

From: William Bowling <will@wbowling.info>

When emulating ident in tcp_emu, if the strchr checks passed but the
sscanf check failed, two uninitialized variables would be copied and
sent in the reply, so move this code inside the if(sscanf()) clause.

Signed-off-by: William Bowling <will@wbowling.info>
Cc: qemu-stable@nongnu.org
Cc: secalert@redhat.com
Message-Id: <1551476756-25749-1-git-send-email-will@wbowling.info>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 slirp/tcp_subr.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index 262a42d6c8..ef9d99c154 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -664,12 +664,12 @@ tcp_emu(struct socket *so, struct mbuf *m)
 							break;
 						}
 					}
+					so_rcv->sb_cc = snprintf(so_rcv->sb_data,
+								 so_rcv->sb_datalen,
+								 "%d,%d\r\n", n1, n2);
+					so_rcv->sb_rptr = so_rcv->sb_data;
+					so_rcv->sb_wptr = so_rcv->sb_data + so_rcv->sb_cc;
 				}
-                                so_rcv->sb_cc = snprintf(so_rcv->sb_data,
-                                                         so_rcv->sb_datalen,
-                                                         "%d,%d\r\n", n1, n2);
-				so_rcv->sb_rptr = so_rcv->sb_data;
-				so_rcv->sb_wptr = so_rcv->sb_data + so_rcv->sb_cc;
 			}
 			m_free(m);
 			return 0;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 04/12] slirp: fix big/little endian conversion in ident protocol
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (2 preceding siblings ...)
  2019-03-06 23:58 ` [Qemu-devel] [PULL 03/12] slirp: check sscanf result when emulating ident Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 05/12] slirp: Mark pieces missing IPv6 support Samuel Thibault
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: Samuel Thibault, stefanha, jan.kiszka, Philippe Mathieu-Daudé

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

---
Based-on: <1551476756-25749-1-git-send-email-will@wbowling.info>
---
 slirp/tcp_subr.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index ef9d99c154..1d7e72dca7 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -660,10 +660,12 @@ tcp_emu(struct socket *so, struct mbuf *m)
 						    tmpso->so_fport == n1) {
 							if (getsockname(tmpso->s,
 								(struct sockaddr *)&addr, &addrlen) == 0)
-							   n2 = ntohs(addr.sin_port);
+							   n2 = addr.sin_port;
 							break;
 						}
 					}
+					NTOHS(n1);
+					NTOHS(n2);
 					so_rcv->sb_cc = snprintf(so_rcv->sb_data,
 								 so_rcv->sb_datalen,
 								 "%d,%d\r\n", n1, n2);
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 05/12] slirp: Mark pieces missing IPv6 support
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (3 preceding siblings ...)
  2019-03-06 23:58 ` [Qemu-devel] [PULL 04/12] slirp: fix big/little endian conversion in ident protocol Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 06/12] slirp: adapt a subset of QEMU vmstate code Samuel Thibault
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell; +Cc: Samuel Thibault, stefanha, jan.kiszka

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
---
 net/slirp.c       | 1 +
 slirp/misc.c      | 3 +++
 slirp/slirp.c     | 5 +++++
 slirp/socket.c    | 1 +
 slirp/tcp_input.c | 2 ++
 slirp/tcp_subr.c  | 2 ++
 slirp/udp.c       | 1 +
 7 files changed, 15 insertions(+)

diff --git a/net/slirp.c b/net/slirp.c
index 4ec989b592..a8fd9e6364 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -885,6 +885,7 @@ static ssize_t guestfwd_write(const void *buf, size_t len, void *chr)
 
 static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp)
 {
+    /* TODO: IPv6 */
     struct in_addr server = { .s_addr = 0 };
     struct GuestFwd *fwd;
     const char *p;
diff --git a/slirp/misc.c b/slirp/misc.c
index d9fc586a24..937a418d4e 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -28,6 +28,7 @@ remque(void *a)
   element->qh_rlink = NULL;
 }
 
+/* TODO: IPv6 */
 struct gfwd_list *
 add_guestfwd(struct gfwd_list **ex_ptr,
              SlirpWriteCb write_cb, void *opaque,
@@ -254,6 +255,8 @@ char *slirp_connection_info(Slirp *slirp)
         "  Protocol[State]    FD  Source Address  Port   "
         "Dest. Address  Port RecvQ SendQ\n");
 
+    /* TODO: IPv6 */
+
     for (so = slirp->tcb.so_next; so != &slirp->tcb; so = so->so_next) {
         if (so->so_state & SS_HOSTFWD) {
             state = "HOST_FORWARD";
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 55591430dc..cbdf9f778d 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -729,6 +729,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;
+            /* TODO: IPv6 */
             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;
@@ -945,6 +946,7 @@ int if_encap(Slirp *slirp, struct mbuf *ifm)
 }
 
 /* Drop host forwarding rule, return 0 if found. */
+/* TODO: IPv6 */
 int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr,
                          int host_port)
 {
@@ -970,6 +972,7 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr,
     return -1;
 }
 
+/* TODO: IPv6 */
 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)
 {
@@ -988,6 +991,7 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr,
     return 0;
 }
 
+/* TODO: IPv6 */
 static bool
 check_guestfwd(Slirp *slirp, struct in_addr *guest_addr, int guest_port)
 {
@@ -1065,6 +1069,7 @@ slirp_find_ctl_socket(Slirp *slirp, struct in_addr guest_addr, int guest_port)
 {
     struct socket *so;
 
+    /* TODO: IPv6 */
     for (so = slirp->tcb.so_next; so != &slirp->tcb; so = so->so_next) {
         if (so->so_faddr.s_addr == guest_addr.s_addr &&
             htons(so->so_fport) == guest_port) {
diff --git a/slirp/socket.c b/slirp/socket.c
index 4dc5e2907d..f2428a3ae8 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -687,6 +687,7 @@ struct socket *
 tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, uint32_t laddr,
            unsigned lport, int flags)
 {
+        /* TODO: IPv6 */
 	struct sockaddr_in addr;
 	struct socket *so;
 	int s, opt = 1;
diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c
index 6749b32f5d..b10477fc57 100644
--- a/slirp/tcp_input.c
+++ b/slirp/tcp_input.c
@@ -388,6 +388,7 @@ findso:
 	 * as if it was LISTENING, and continue...
 	 */
         if (so == NULL) {
+          /* TODO: IPv6 */
           if (slirp->restricted) {
             /* Any hostfwds will have an existing socket, so we only get here
              * for non-hostfwd connections. These should be dropped, unless it
@@ -609,6 +610,7 @@ findso:
 	   * If this is destined for the control address, then flag to
 	   * tcp_ctl once connected, otherwise connect
 	   */
+          /* TODO: IPv6 */
 	  if (af == AF_INET &&
 	         (so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
 	         slirp->vnetwork_addr.s_addr) {
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index 1d7e72dca7..1db59caa89 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -626,6 +626,7 @@ tcp_emu(struct socket *so, struct mbuf *m)
 	switch(so->so_emu) {
 		int x, i;
 
+        /* TODO: IPv6 */
 	 case EMU_IDENT:
 		/*
 		 * Identification protocol as per rfc-1413
@@ -964,6 +965,7 @@ int tcp_ctl(struct socket *so)
     DEBUG_CALL("tcp_ctl");
     DEBUG_ARG("so = %p", so);
 
+    /* TODO: IPv6 */
     if (so->so_faddr.s_addr != slirp->vhost_addr.s_addr) {
         /* Check if it's pty_exec */
         for (ex_ptr = slirp->guestfwd_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
diff --git a/slirp/udp.c b/slirp/udp.c
index 3d9a19b85a..fa9f4a08bd 100644
--- a/slirp/udp.c
+++ b/slirp/udp.c
@@ -322,6 +322,7 @@ struct socket *
 udp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, uint32_t laddr,
            unsigned lport, int flags)
 {
+        /* TODO: IPv6 */
 	struct sockaddr_in addr;
 	struct socket *so;
 	socklen_t addrlen = sizeof(struct sockaddr_in);
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 06/12] slirp: adapt a subset of QEMU vmstate code
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (4 preceding siblings ...)
  2019-03-06 23:58 ` [Qemu-devel] [PULL 05/12] slirp: Mark pieces missing IPv6 support Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 07/12] slirp: use libslirp migration code Samuel Thibault
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: Marc-André Lureau, stefanha, jan.kiszka, Samuel Thibault

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Add vmstate serialization code adapted from QEMU.

Keep only the bits that are required for libslirp.

Introduce a IStream/OStream interface to replace QEMU QFile
abstraction.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20190212162524.31504-2-marcandre.lureau@redhat.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
---
 slirp/Makefile.objs |   2 +
 slirp/libslirp.h    |   1 +
 slirp/stream.c      | 119 +++++++++++++
 slirp/stream.h      |  34 ++++
 slirp/vmstate.c     | 413 ++++++++++++++++++++++++++++++++++++++++++++
 slirp/vmstate.h     | 396 ++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 965 insertions(+)
 create mode 100644 slirp/stream.c
 create mode 100644 slirp/stream.h
 create mode 100644 slirp/vmstate.c
 create mode 100644 slirp/vmstate.h

diff --git a/slirp/Makefile.objs b/slirp/Makefile.objs
index 88340a583b..69e140f965 100644
--- a/slirp/Makefile.objs
+++ b/slirp/Makefile.objs
@@ -21,6 +21,7 @@ slirp.mo-objs = \
 	slirp.o \
 	socket.o \
 	state.o \
+	stream.o \
 	tcp_input.o \
 	tcp_output.o \
 	tcp_subr.o \
@@ -29,6 +30,7 @@ slirp.mo-objs = \
 	udp.o \
 	udp6.o \
 	util.o \
+	vmstate.o \
 	$(NULL)
 
 slirp.mo-cflags = -DG_LOG_DOMAIN=\"Slirp\" -DWITH_QEMU
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index fccab42518..18c50bd7ba 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -26,6 +26,7 @@ enum {
     SLIRP_POLL_HUP = 1 << 4,
 };
 
+typedef ssize_t (*SlirpReadCb)(void *buf, size_t len, void *opaque);
 typedef ssize_t (*SlirpWriteCb)(const void *buf, size_t len, void *opaque);
 typedef void (*SlirpTimerCb)(void *opaque);
 typedef int (*SlirpAddPollCb)(int fd, int events, void *opaque);
diff --git a/slirp/stream.c b/slirp/stream.c
new file mode 100644
index 0000000000..d114dde334
--- /dev/null
+++ b/slirp/stream.c
@@ -0,0 +1,119 @@
+/*
+ * libslirp io streams
+ *
+ * Copyright (c) 2018 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "stream.h"
+#include <glib.h>
+
+bool slirp_istream_read(SlirpIStream *f, void *buf, size_t size)
+{
+    return f->read_cb(buf, size, f->opaque) == size;
+}
+
+bool slirp_ostream_write(SlirpOStream *f, const void *buf, size_t size)
+{
+    return f->write_cb(buf, size, f->opaque) == size;
+}
+
+uint8_t slirp_istream_read_u8(SlirpIStream *f)
+{
+    uint8_t b;
+
+    if (slirp_istream_read(f, &b, sizeof(b))) {
+        return b;
+    }
+
+    return 0;
+}
+
+bool slirp_ostream_write_u8(SlirpOStream *f, uint8_t b)
+{
+    return slirp_ostream_write(f, &b, sizeof(b));
+}
+
+uint16_t slirp_istream_read_u16(SlirpIStream *f)
+{
+    uint16_t b;
+
+    if (slirp_istream_read(f, &b, sizeof(b))) {
+        return GUINT16_FROM_BE(b);
+    }
+
+    return 0;
+}
+
+bool slirp_ostream_write_u16(SlirpOStream *f, uint16_t b)
+{
+    b =  GUINT16_TO_BE(b);
+    return slirp_ostream_write(f, &b, sizeof(b));
+}
+
+uint32_t slirp_istream_read_u32(SlirpIStream *f)
+{
+    uint32_t b;
+
+    if (slirp_istream_read(f, &b, sizeof(b))) {
+        return GUINT32_FROM_BE(b);
+    }
+
+    return 0;
+}
+
+bool slirp_ostream_write_u32(SlirpOStream *f, uint32_t b)
+{
+    b = GUINT32_TO_BE(b);
+    return slirp_ostream_write(f, &b, sizeof(b));
+}
+
+int16_t slirp_istream_read_i16(SlirpIStream *f)
+{
+    int16_t b;
+
+    if (slirp_istream_read(f, &b, sizeof(b))) {
+        return GINT16_FROM_BE(b);
+    }
+
+    return 0;
+}
+
+bool slirp_ostream_write_i16(SlirpOStream *f, int16_t b)
+{
+    b = GINT16_TO_BE(b);
+    return slirp_ostream_write(f, &b, sizeof(b));
+}
+
+int32_t slirp_istream_read_i32(SlirpIStream *f)
+{
+    int32_t b;
+
+    if (slirp_istream_read(f, &b, sizeof(b))) {
+        return GINT32_FROM_BE(b);
+    }
+
+    return 0;
+}
+
+bool slirp_ostream_write_i32(SlirpOStream *f, int32_t b)
+{
+    b = GINT32_TO_BE(b);
+    return slirp_ostream_write(f, &b, sizeof(b));
+}
diff --git a/slirp/stream.h b/slirp/stream.h
new file mode 100644
index 0000000000..985334c043
--- /dev/null
+++ b/slirp/stream.h
@@ -0,0 +1,34 @@
+#ifndef STREAM_H_
+#define STREAM_H_
+
+#include "libslirp.h"
+
+typedef struct SlirpIStream {
+    SlirpReadCb read_cb;
+    void *opaque;
+} SlirpIStream;
+
+typedef struct SlirpOStream {
+    SlirpWriteCb write_cb;
+    void *opaque;
+} SlirpOStream;
+
+bool slirp_istream_read(SlirpIStream *f, void *buf, size_t size);
+bool slirp_ostream_write(SlirpOStream *f, const void *buf, size_t size);
+
+uint8_t slirp_istream_read_u8(SlirpIStream *f);
+bool slirp_ostream_write_u8(SlirpOStream *f, uint8_t b);
+
+uint16_t slirp_istream_read_u16(SlirpIStream *f);
+bool slirp_ostream_write_u16(SlirpOStream *f, uint16_t b);
+
+uint32_t slirp_istream_read_u32(SlirpIStream *f);
+bool slirp_ostream_write_u32(SlirpOStream *f, uint32_t b);
+
+int16_t slirp_istream_read_i16(SlirpIStream *f);
+bool slirp_ostream_write_i16(SlirpOStream *f, int16_t b);
+
+int32_t slirp_istream_read_i32(SlirpIStream *f);
+bool slirp_ostream_write_i32(SlirpOStream *f, int32_t b);
+
+#endif /* STREAM_H_ */
diff --git a/slirp/vmstate.c b/slirp/vmstate.c
new file mode 100644
index 0000000000..4d08b47c61
--- /dev/null
+++ b/slirp/vmstate.c
@@ -0,0 +1,413 @@
+/*
+ * VMState interpreter
+ *
+ * Copyright (c) 2009-2018 Red Hat Inc
+ *
+ * Authors:
+ *  Juan Quintela <quintela@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+#include <glib.h>
+
+#include "stream.h"
+#include "vmstate.h"
+
+static int get_nullptr(SlirpIStream *f, void *pv, size_t size,
+                       const VMStateField *field)
+{
+    if (slirp_istream_read_u8(f) == VMS_NULLPTR_MARKER) {
+        return  0;
+    }
+    g_warning("vmstate: get_nullptr expected VMS_NULLPTR_MARKER");
+    return -EINVAL;
+}
+
+static int put_nullptr(SlirpOStream *f, void *pv, size_t size,
+                       const VMStateField *field)
+
+{
+    if (pv == NULL) {
+        slirp_ostream_write_u8(f, VMS_NULLPTR_MARKER);
+        return 0;
+    }
+    g_warning("vmstate: put_nullptr must be called with pv == NULL");
+    return -EINVAL;
+}
+
+const VMStateInfo slirp_vmstate_info_nullptr = {
+    .name = "uint64",
+    .get  = get_nullptr,
+    .put  = put_nullptr,
+};
+
+/* 8 bit unsigned int */
+
+static int get_uint8(SlirpIStream *f, void *pv, size_t size, const VMStateField *field)
+{
+    uint8_t *v = pv;
+    *v = slirp_istream_read_u8(f);
+    return 0;
+}
+
+static int put_uint8(SlirpOStream *f, void *pv, size_t size, const VMStateField *field)
+{
+    uint8_t *v = pv;
+    slirp_ostream_write_u8(f, *v);
+    return 0;
+}
+
+const VMStateInfo slirp_vmstate_info_uint8 = {
+    .name = "uint8",
+    .get  = get_uint8,
+    .put  = put_uint8,
+};
+
+/* 16 bit unsigned int */
+
+static int get_uint16(SlirpIStream *f, void *pv, size_t size,
+                      const VMStateField *field)
+{
+    uint16_t *v = pv;
+    *v = slirp_istream_read_u16(f);
+    return 0;
+}
+
+static int put_uint16(SlirpOStream *f, void *pv, size_t size,
+                      const VMStateField *field)
+{
+    uint16_t *v = pv;
+    slirp_ostream_write_u16(f, *v);
+    return 0;
+}
+
+const VMStateInfo slirp_vmstate_info_uint16 = {
+    .name = "uint16",
+    .get  = get_uint16,
+    .put  = put_uint16,
+};
+
+/* 32 bit unsigned int */
+
+static int get_uint32(SlirpIStream *f, void *pv, size_t size,
+                      const VMStateField *field)
+{
+    uint32_t *v = pv;
+    *v = slirp_istream_read_u32(f);
+    return 0;
+}
+
+static int put_uint32(SlirpOStream *f, void *pv, size_t size,
+                      const VMStateField *field)
+{
+    uint32_t *v = pv;
+    slirp_ostream_write_u32(f, *v);
+    return 0;
+}
+
+const VMStateInfo slirp_vmstate_info_uint32 = {
+    .name = "uint32",
+    .get  = get_uint32,
+    .put  = put_uint32,
+};
+
+/* 16 bit int */
+
+static int get_int16(SlirpIStream *f, void *pv, size_t size, const VMStateField *field)
+{
+    int16_t *v = pv;
+    *v = slirp_istream_read_i16(f);
+    return 0;
+}
+
+static int put_int16(SlirpOStream *f, void *pv, size_t size, const VMStateField *field)
+{
+    int16_t *v = pv;
+    slirp_ostream_write_i16(f, *v);
+    return 0;
+}
+
+const VMStateInfo slirp_vmstate_info_int16 = {
+    .name = "int16",
+    .get  = get_int16,
+    .put  = put_int16,
+};
+
+/* 32 bit int */
+
+static int get_int32(SlirpIStream *f, void *pv, size_t size, const VMStateField *field)
+{
+    int32_t *v = pv;
+    *v = slirp_istream_read_i32(f);
+    return 0;
+}
+
+static int put_int32(SlirpOStream *f, void *pv, size_t size, const VMStateField *field)
+{
+    int32_t *v = pv;
+    slirp_ostream_write_i32(f, *v);
+    return 0;
+}
+
+const VMStateInfo slirp_vmstate_info_int32 = {
+    .name = "int32",
+    .get  = get_int32,
+    .put  = put_int32,
+};
+
+/* vmstate_info_tmp, see VMSTATE_WITH_TMP, the idea is that we allocate
+ * a temporary buffer and the pre_load/pre_save methods in the child vmsd
+ * copy stuff from the parent into the child and do calculations to fill
+ * in fields that don't really exist in the parent but need to be in the
+ * stream.
+ */
+static int get_tmp(SlirpIStream *f, void *pv, size_t size, const VMStateField *field)
+{
+    int ret;
+    const VMStateDescription *vmsd = field->vmsd;
+    int version_id = field->version_id;
+    void *tmp = g_malloc(size);
+
+    /* Writes the parent field which is at the start of the tmp */
+    *(void **)tmp = pv;
+    ret = slirp_vmstate_load_state(f, vmsd, tmp, version_id);
+    g_free(tmp);
+    return ret;
+}
+
+static int put_tmp(SlirpOStream *f, void *pv, size_t size, const VMStateField *field)
+{
+    const VMStateDescription *vmsd = field->vmsd;
+    void *tmp = g_malloc(size);
+    int ret;
+
+    /* Writes the parent field which is at the start of the tmp */
+    *(void **)tmp = pv;
+    ret = slirp_vmstate_save_state(f, vmsd, tmp);
+    g_free(tmp);
+
+    return ret;
+}
+
+const VMStateInfo slirp_vmstate_info_tmp = {
+    .name = "tmp",
+    .get = get_tmp,
+    .put = put_tmp,
+};
+
+/* uint8_t buffers */
+
+static int get_buffer(SlirpIStream *f, void *pv, size_t size,
+                      const VMStateField *field)
+{
+    slirp_istream_read(f, pv, size);
+    return 0;
+}
+
+static int put_buffer(SlirpOStream *f, void *pv, size_t size,
+                      const VMStateField *field)
+{
+    slirp_ostream_write(f, pv, size);
+    return 0;
+}
+
+const VMStateInfo slirp_vmstate_info_buffer = {
+    .name = "buffer",
+    .get  = get_buffer,
+    .put  = put_buffer,
+};
+
+static int vmstate_n_elems(void *opaque, const VMStateField *field)
+{
+    int n_elems = 1;
+
+    if (field->flags & VMS_ARRAY) {
+        n_elems = field->num;
+    } else if (field->flags & VMS_VARRAY_INT32) {
+        n_elems = *(int32_t *)(opaque + field->num_offset);
+    } else if (field->flags & VMS_VARRAY_UINT32) {
+        n_elems = *(uint32_t *)(opaque + field->num_offset);
+    } else if (field->flags & VMS_VARRAY_UINT16) {
+        n_elems = *(uint16_t *)(opaque + field->num_offset);
+    } else if (field->flags & VMS_VARRAY_UINT8) {
+        n_elems = *(uint8_t *)(opaque + field->num_offset);
+    }
+
+    if (field->flags & VMS_MULTIPLY_ELEMENTS) {
+        n_elems *= field->num;
+    }
+
+    return n_elems;
+}
+
+static int vmstate_size(void *opaque, const VMStateField *field)
+{
+    int size = field->size;
+
+    if (field->flags & VMS_VBUFFER) {
+        size = *(int32_t *)(opaque + field->size_offset);
+        if (field->flags & VMS_MULTIPLY) {
+            size *= field->size;
+        }
+    }
+
+    return size;
+}
+
+static int
+vmstate_save_state_v(SlirpOStream *f, const VMStateDescription *vmsd,
+                     void *opaque, int version_id)
+{
+    int ret = 0;
+    const VMStateField *field = vmsd->fields;
+
+    if (vmsd->pre_save) {
+        ret = vmsd->pre_save(opaque);
+        if (ret) {
+            g_warning("pre-save failed: %s", vmsd->name);
+            return ret;
+        }
+    }
+
+    while (field->name) {
+        if ((field->field_exists &&
+             field->field_exists(opaque, version_id)) ||
+            (!field->field_exists &&
+             field->version_id <= version_id)) {
+            void *first_elem = opaque + field->offset;
+            int i, n_elems = vmstate_n_elems(opaque, field);
+            int size = vmstate_size(opaque, field);
+
+            if (field->flags & VMS_POINTER) {
+                first_elem = *(void **)first_elem;
+                assert(first_elem || !n_elems || !size);
+            }
+            for (i = 0; i < n_elems; i++) {
+                void *curr_elem = first_elem + size * i;
+                ret = 0;
+
+                if (field->flags & VMS_ARRAY_OF_POINTER) {
+                    assert(curr_elem);
+                    curr_elem = *(void **)curr_elem;
+                }
+                if (!curr_elem && size) {
+                    /* if null pointer write placeholder and do not follow */
+                    assert(field->flags & VMS_ARRAY_OF_POINTER);
+                    ret = slirp_vmstate_info_nullptr.put(f, curr_elem, size, NULL);
+                } else if (field->flags & VMS_STRUCT) {
+                    ret = slirp_vmstate_save_state(f, field->vmsd, curr_elem);
+                } else if (field->flags & VMS_VSTRUCT) {
+                    ret = vmstate_save_state_v(f, field->vmsd, curr_elem,
+                                               field->struct_version_id);
+                } else {
+                    ret = field->info->put(f, curr_elem, size, field);
+                }
+                if (ret) {
+                    g_warning("Save of field %s/%s failed",
+                              vmsd->name, field->name);
+                    return ret;
+                }
+            }
+        } else {
+            if (field->flags & VMS_MUST_EXIST) {
+                g_warning("Output state validation failed: %s/%s",
+                          vmsd->name, field->name);
+                assert(!(field->flags & VMS_MUST_EXIST));
+            }
+        }
+        field++;
+    }
+
+    return 0;
+}
+
+int slirp_vmstate_save_state(SlirpOStream *f, const VMStateDescription *vmsd,
+                             void *opaque)
+{
+    return vmstate_save_state_v(f, vmsd, opaque, vmsd->version_id);
+}
+
+static void vmstate_handle_alloc(void *ptr, VMStateField *field, void *opaque)
+{
+    if (field->flags & VMS_POINTER && field->flags & VMS_ALLOC) {
+        size_t size = vmstate_size(opaque, field);
+        size *= vmstate_n_elems(opaque, field);
+        if (size) {
+            *(void **)ptr = g_malloc(size);
+        }
+    }
+}
+
+int slirp_vmstate_load_state(SlirpIStream *f, const VMStateDescription *vmsd,
+                             void *opaque, int version_id)
+{
+    VMStateField *field = vmsd->fields;
+    int ret = 0;
+
+    if (version_id > vmsd->version_id) {
+        g_warning("%s: incoming version_id %d is too new "
+                  "for local version_id %d",
+                  vmsd->name, version_id, vmsd->version_id);
+        return -EINVAL;
+    }
+    if (vmsd->pre_load) {
+        int ret = vmsd->pre_load(opaque);
+        if (ret) {
+            return ret;
+        }
+    }
+    while (field->name) {
+        if ((field->field_exists &&
+             field->field_exists(opaque, version_id)) ||
+            (!field->field_exists &&
+             field->version_id <= version_id)) {
+            void *first_elem = opaque + field->offset;
+            int i, n_elems = vmstate_n_elems(opaque, field);
+            int size = vmstate_size(opaque, field);
+
+            vmstate_handle_alloc(first_elem, field, opaque);
+            if (field->flags & VMS_POINTER) {
+                first_elem = *(void **)first_elem;
+                assert(first_elem || !n_elems || !size);
+            }
+            for (i = 0; i < n_elems; i++) {
+                void *curr_elem = first_elem + size * i;
+
+                if (field->flags & VMS_ARRAY_OF_POINTER) {
+                    curr_elem = *(void **)curr_elem;
+                }
+                if (!curr_elem && size) {
+                    /* if null pointer check placeholder and do not follow */
+                    assert(field->flags & VMS_ARRAY_OF_POINTER);
+                    ret = slirp_vmstate_info_nullptr.get(f, curr_elem, size, NULL);
+                } else if (field->flags & VMS_STRUCT) {
+                    ret = slirp_vmstate_load_state(f, field->vmsd, curr_elem,
+                                             field->vmsd->version_id);
+                } else if (field->flags & VMS_VSTRUCT) {
+                    ret = slirp_vmstate_load_state(f, field->vmsd, curr_elem,
+                                             field->struct_version_id);
+                } else {
+                    ret = field->info->get(f, curr_elem, size, field);
+                }
+                if (ret < 0) {
+                    g_warning("Failed to load %s:%s", vmsd->name,
+                              field->name);
+                    return ret;
+                }
+            }
+        } else if (field->flags & VMS_MUST_EXIST) {
+            g_warning("Input validation failed: %s/%s",
+                      vmsd->name, field->name);
+            return -1;
+        }
+        field++;
+    }
+    if (vmsd->post_load) {
+        ret = vmsd->post_load(opaque, version_id);
+    }
+    return ret;
+}
diff --git a/slirp/vmstate.h b/slirp/vmstate.h
new file mode 100644
index 0000000000..cfa7b8c825
--- /dev/null
+++ b/slirp/vmstate.h
@@ -0,0 +1,396 @@
+/*
+ * QEMU migration/snapshot declarations
+ *
+ * Copyright (c) 2009-2011 Red Hat, Inc.
+ *
+ * Original author: Juan Quintela <quintela@redhat.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef VMSTATE_H_
+#define VMSTATE_H_
+
+#include <unistd.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include "slirp.h"
+#include "stream.h"
+
+#define stringify(s) tostring(s)
+#define tostring(s) #s
+
+typedef struct VMStateInfo VMStateInfo;
+typedef struct VMStateDescription VMStateDescription;
+typedef struct VMStateField VMStateField;
+
+int slirp_vmstate_save_state(SlirpOStream *f, const VMStateDescription *vmsd,
+                             void *opaque);
+int slirp_vmstate_load_state(SlirpIStream *f, const VMStateDescription *vmsd,
+                             void *opaque, int version_id);
+
+/* VMStateInfo allows customized migration of objects that don't fit in
+ * any category in VMStateFlags. Additional information is always passed
+ * into get and put in terms of field and vmdesc parameters. However
+ * these two parameters should only be used in cases when customized
+ * handling is needed, such as QTAILQ. For primitive data types such as
+ * integer, field and vmdesc parameters should be ignored inside get/put.
+ */
+struct VMStateInfo {
+    const char *name;
+    int (*get)(SlirpIStream *f, void *pv, size_t size, const VMStateField *field);
+    int (*put)(SlirpOStream *f, void *pv, size_t size, const VMStateField *field);
+};
+
+enum VMStateFlags {
+    /* Ignored */
+    VMS_SINGLE           = 0x001,
+
+    /* The struct member at opaque + VMStateField.offset is a pointer
+     * to the actual field (e.g. struct a { uint8_t *b;
+     * }). Dereference the pointer before using it as basis for
+     * further pointer arithmetic (see e.g. VMS_ARRAY). Does not
+     * affect the meaning of VMStateField.num_offset or
+     * VMStateField.size_offset; see VMS_VARRAY* and VMS_VBUFFER for
+     * those. */
+    VMS_POINTER          = 0x002,
+
+    /* The field is an array of fixed size. VMStateField.num contains
+     * the number of entries in the array. The size of each entry is
+     * given by VMStateField.size and / or opaque +
+     * VMStateField.size_offset; see VMS_VBUFFER and
+     * VMS_MULTIPLY. Each array entry will be processed individually
+     * (VMStateField.info.get()/put() if VMS_STRUCT is not set,
+     * recursion into VMStateField.vmsd if VMS_STRUCT is set). May not
+     * be combined with VMS_VARRAY*. */
+    VMS_ARRAY            = 0x004,
+
+    /* The field is itself a struct, containing one or more
+     * fields. Recurse into VMStateField.vmsd. Most useful in
+     * combination with VMS_ARRAY / VMS_VARRAY*, recursing into each
+     * array entry. */
+    VMS_STRUCT           = 0x008,
+
+    /* The field is an array of variable size. The int32_t at opaque +
+     * VMStateField.num_offset contains the number of entries in the
+     * array. See the VMS_ARRAY description regarding array handling
+     * in general. May not be combined with VMS_ARRAY or any other
+     * VMS_VARRAY*. */
+    VMS_VARRAY_INT32     = 0x010,
+
+    /* Ignored */
+    VMS_BUFFER           = 0x020,
+
+    /* The field is a (fixed-size or variable-size) array of pointers
+     * (e.g. struct a { uint8_t *b[]; }). Dereference each array entry
+     * before using it. Note: Does not imply any one of VMS_ARRAY /
+     * VMS_VARRAY*; these need to be set explicitly. */
+    VMS_ARRAY_OF_POINTER = 0x040,
+
+    /* The field is an array of variable size. The uint16_t at opaque
+     * + VMStateField.num_offset (subject to VMS_MULTIPLY_ELEMENTS)
+     * contains the number of entries in the array. See the VMS_ARRAY
+     * description regarding array handling in general. May not be
+     * combined with VMS_ARRAY or any other VMS_VARRAY*. */
+    VMS_VARRAY_UINT16    = 0x080,
+
+    /* The size of the individual entries (a single array entry if
+     * VMS_ARRAY or any of VMS_VARRAY* are set, or the field itself if
+     * neither is set) is variable (i.e. not known at compile-time),
+     * but the same for all entries. Use the int32_t at opaque +
+     * VMStateField.size_offset (subject to VMS_MULTIPLY) to determine
+     * the size of each (and every) entry. */
+    VMS_VBUFFER          = 0x100,
+
+    /* Multiply the entry size given by the int32_t at opaque +
+     * VMStateField.size_offset (see VMS_VBUFFER description) with
+     * VMStateField.size to determine the number of bytes to be
+     * allocated. Only valid in combination with VMS_VBUFFER. */
+    VMS_MULTIPLY         = 0x200,
+
+    /* The field is an array of variable size. The uint8_t at opaque +
+     * VMStateField.num_offset (subject to VMS_MULTIPLY_ELEMENTS)
+     * contains the number of entries in the array. See the VMS_ARRAY
+     * description regarding array handling in general. May not be
+     * combined with VMS_ARRAY or any other VMS_VARRAY*. */
+    VMS_VARRAY_UINT8     = 0x400,
+
+    /* The field is an array of variable size. The uint32_t at opaque
+     * + VMStateField.num_offset (subject to VMS_MULTIPLY_ELEMENTS)
+     * contains the number of entries in the array. See the VMS_ARRAY
+     * description regarding array handling in general. May not be
+     * combined with VMS_ARRAY or any other VMS_VARRAY*. */
+    VMS_VARRAY_UINT32    = 0x800,
+
+    /* Fail loading the serialised VM state if this field is missing
+     * from the input. */
+    VMS_MUST_EXIST       = 0x1000,
+
+    /* When loading serialised VM state, allocate memory for the
+     * (entire) field. Only valid in combination with
+     * VMS_POINTER. Note: Not all combinations with other flags are
+     * currently supported, e.g. VMS_ALLOC|VMS_ARRAY_OF_POINTER won't
+     * cause the individual entries to be allocated. */
+    VMS_ALLOC            = 0x2000,
+
+    /* Multiply the number of entries given by the integer at opaque +
+     * VMStateField.num_offset (see VMS_VARRAY*) with VMStateField.num
+     * to determine the number of entries in the array. Only valid in
+     * combination with one of VMS_VARRAY*. */
+    VMS_MULTIPLY_ELEMENTS = 0x4000,
+
+    /* A structure field that is like VMS_STRUCT, but uses
+     * VMStateField.struct_version_id to tell which version of the
+     * structure we are referencing to use. */
+    VMS_VSTRUCT           = 0x8000,
+};
+
+struct VMStateField {
+    const char *name;
+    size_t offset;
+    size_t size;
+    size_t start;
+    int num;
+    size_t num_offset;
+    size_t size_offset;
+    const VMStateInfo *info;
+    enum VMStateFlags flags;
+    const VMStateDescription *vmsd;
+    int version_id;
+    int struct_version_id;
+    bool (*field_exists)(void *opaque, int version_id);
+};
+
+struct VMStateDescription {
+    const char *name;
+    int version_id;
+    int (*pre_load)(void *opaque);
+    int (*post_load)(void *opaque, int version_id);
+    int (*pre_save)(void *opaque);
+    VMStateField *fields;
+};
+
+
+extern const VMStateInfo slirp_vmstate_info_int16;
+extern const VMStateInfo slirp_vmstate_info_int32;
+extern const VMStateInfo slirp_vmstate_info_uint8;
+extern const VMStateInfo slirp_vmstate_info_uint16;
+extern const VMStateInfo slirp_vmstate_info_uint32;
+
+/** Put this in the stream when migrating a null pointer.*/
+#define VMS_NULLPTR_MARKER (0x30U) /* '0' */
+extern const VMStateInfo slirp_vmstate_info_nullptr;
+
+extern const VMStateInfo slirp_vmstate_info_buffer;
+extern const VMStateInfo slirp_vmstate_info_tmp;
+
+#define type_check_array(t1,t2,n) ((t1(*)[n])0 - (t2*)0)
+#define type_check_pointer(t1,t2) ((t1**)0 - (t2*)0)
+#define typeof_field(type, field) typeof(((type *)0)->field)
+#define type_check(t1,t2) ((t1*)0 - (t2*)0)
+
+#define vmstate_offset_value(_state, _field, _type)                  \
+    (offsetof(_state, _field) +                                      \
+     type_check(_type, typeof_field(_state, _field)))
+
+#define vmstate_offset_pointer(_state, _field, _type)                \
+    (offsetof(_state, _field) +                                      \
+     type_check_pointer(_type, typeof_field(_state, _field)))
+
+#define vmstate_offset_array(_state, _field, _type, _num)            \
+    (offsetof(_state, _field) +                                      \
+     type_check_array(_type, typeof_field(_state, _field), _num))
+
+#define vmstate_offset_buffer(_state, _field)                        \
+    vmstate_offset_array(_state, _field, uint8_t,                    \
+                         sizeof(typeof_field(_state, _field)))
+
+/* In the macros below, if there is a _version, that means the macro's
+ * field will be processed only if the version being received is >=
+ * the _version specified.  In general, if you add a new field, you
+ * would increment the structure's version and put that version
+ * number into the new field so it would only be processed with the
+ * new version.
+ *
+ * In particular, for VMSTATE_STRUCT() and friends the _version does
+ * *NOT* pick the version of the sub-structure.  It works just as
+ * specified above.  The version of the top-level structure received
+ * is passed down to all sub-structures.  This means that the
+ * sub-structures must have version that are compatible with all the
+ * structures that use them.
+ *
+ * If you want to specify the version of the sub-structure, use
+ * VMSTATE_VSTRUCT(), which allows the specific sub-structure version
+ * to be directly specified.
+ */
+
+#define VMSTATE_SINGLE_TEST(_field, _state, _test, _version, _info, _type) { \
+    .name         = (stringify(_field)),                             \
+    .version_id   = (_version),                                      \
+    .field_exists = (_test),                                         \
+    .size         = sizeof(_type),                                   \
+    .info         = &(_info),                                        \
+    .flags        = VMS_SINGLE,                                      \
+    .offset       = vmstate_offset_value(_state, _field, _type),     \
+}
+
+#define VMSTATE_ARRAY(_field, _state, _num, _version, _info, _type) {\
+    .name       = (stringify(_field)),                               \
+    .version_id = (_version),                                        \
+    .num        = (_num),                                            \
+    .info       = &(_info),                                          \
+    .size       = sizeof(_type),                                     \
+    .flags      = VMS_ARRAY,                                         \
+    .offset     = vmstate_offset_array(_state, _field, _type, _num), \
+}
+
+#define VMSTATE_STRUCT_TEST(_field, _state, _test, _version, _vmsd, _type) { \
+    .name         = (stringify(_field)),                             \
+    .version_id   = (_version),                                      \
+    .field_exists = (_test),                                         \
+    .vmsd         = &(_vmsd),                                        \
+    .size         = sizeof(_type),                                   \
+    .flags        = VMS_STRUCT,                                      \
+    .offset       = vmstate_offset_value(_state, _field, _type),     \
+}
+
+#define VMSTATE_STRUCT_POINTER_V(_field, _state, _version, _vmsd, _type) { \
+    .name         = (stringify(_field)),                             \
+    .version_id   = (_version),                                        \
+    .vmsd         = &(_vmsd),                                        \
+    .size         = sizeof(_type *),                                 \
+    .flags        = VMS_STRUCT|VMS_POINTER,                          \
+    .offset       = vmstate_offset_pointer(_state, _field, _type),   \
+}
+
+#define VMSTATE_STRUCT_ARRAY_TEST(_field, _state, _num, _test, _version, _vmsd, _type) { \
+    .name         = (stringify(_field)),                             \
+    .num          = (_num),                                          \
+    .field_exists = (_test),                                         \
+    .version_id   = (_version),                                      \
+    .vmsd         = &(_vmsd),                                        \
+    .size         = sizeof(_type),                                   \
+    .flags        = VMS_STRUCT|VMS_ARRAY,                            \
+    .offset       = vmstate_offset_array(_state, _field, _type, _num),\
+}
+
+#define VMSTATE_STATIC_BUFFER(_field, _state, _version, _test, _start, _size) { \
+    .name         = (stringify(_field)),                             \
+    .version_id   = (_version),                                      \
+    .field_exists = (_test),                                         \
+    .size         = (_size - _start),                                \
+    .info         = &slirp_vmstate_info_buffer,                      \
+    .flags        = VMS_BUFFER,                                      \
+    .offset       = vmstate_offset_buffer(_state, _field) + _start,  \
+}
+
+#define VMSTATE_VBUFFER_UINT32(_field, _state, _version, _test, _field_size) { \
+    .name         = (stringify(_field)),                             \
+    .version_id   = (_version),                                      \
+    .field_exists = (_test),                                         \
+    .size_offset  = vmstate_offset_value(_state, _field_size, uint32_t),\
+    .info         = &slirp_vmstate_info_buffer,                      \
+    .flags        = VMS_VBUFFER|VMS_POINTER,                         \
+    .offset       = offsetof(_state, _field),                        \
+}
+
+#define QEMU_BUILD_BUG_ON_STRUCT(x)             \
+    struct {                                    \
+        int:(x) ? -1 : 1;                       \
+    }
+
+#define QEMU_BUILD_BUG_ON_ZERO(x) (sizeof(QEMU_BUILD_BUG_ON_STRUCT(x)) - \
+                                   sizeof(QEMU_BUILD_BUG_ON_STRUCT(x)))
+
+/* Allocate a temporary of type 'tmp_type', set tmp->parent to _state
+ * and execute the vmsd on the temporary.  Note that we're working with
+ * the whole of _state here, not a field within it.
+ * We compile time check that:
+ *    That _tmp_type contains a 'parent' member that's a pointer to the
+ *        '_state' type
+ *    That the pointer is right at the start of _tmp_type.
+ */
+#define VMSTATE_WITH_TMP(_state, _tmp_type, _vmsd) {                 \
+    .name         = "tmp",                                           \
+    .size         = sizeof(_tmp_type) +                              \
+                    QEMU_BUILD_BUG_ON_ZERO(offsetof(_tmp_type, parent) != 0) + \
+                    type_check_pointer(_state,                       \
+                        typeof_field(_tmp_type, parent)),            \
+    .vmsd         = &(_vmsd),                                        \
+    .info         = &slirp_vmstate_info_tmp,                         \
+}
+
+#define VMSTATE_SINGLE(_field, _state, _version, _info, _type)          \
+    VMSTATE_SINGLE_TEST(_field, _state, NULL, _version, _info, _type)
+
+#define VMSTATE_STRUCT(_field, _state, _version, _vmsd, _type)        \
+    VMSTATE_STRUCT_TEST(_field, _state, NULL, _version, _vmsd, _type)
+
+#define VMSTATE_STRUCT_POINTER(_field, _state, _vmsd, _type)          \
+    VMSTATE_STRUCT_POINTER_V(_field, _state, 0, _vmsd, _type)
+
+#define VMSTATE_STRUCT_ARRAY(_field, _state, _num, _version, _vmsd, _type) \
+    VMSTATE_STRUCT_ARRAY_TEST(_field, _state, _num, NULL, _version,   \
+            _vmsd, _type)
+
+#define VMSTATE_INT16_V(_f, _s, _v)                                   \
+    VMSTATE_SINGLE(_f, _s, _v, slirp_vmstate_info_int16, int16_t)
+#define VMSTATE_INT32_V(_f, _s, _v)                                   \
+    VMSTATE_SINGLE(_f, _s, _v, slirp_vmstate_info_int32, int32_t)
+
+#define VMSTATE_UINT8_V(_f, _s, _v)                                   \
+    VMSTATE_SINGLE(_f, _s, _v, slirp_vmstate_info_uint8, uint8_t)
+#define VMSTATE_UINT16_V(_f, _s, _v)                                  \
+    VMSTATE_SINGLE(_f, _s, _v, slirp_vmstate_info_uint16, uint16_t)
+#define VMSTATE_UINT32_V(_f, _s, _v)                                  \
+    VMSTATE_SINGLE(_f, _s, _v, slirp_vmstate_info_uint32, uint32_t)
+
+#define VMSTATE_INT16(_f, _s)                                         \
+    VMSTATE_INT16_V(_f, _s, 0)
+#define VMSTATE_INT32(_f, _s)                                         \
+    VMSTATE_INT32_V(_f, _s, 0)
+
+#define VMSTATE_UINT8(_f, _s)                                         \
+    VMSTATE_UINT8_V(_f, _s, 0)
+#define VMSTATE_UINT16(_f, _s)                                        \
+    VMSTATE_UINT16_V(_f, _s, 0)
+#define VMSTATE_UINT32(_f, _s)                                        \
+    VMSTATE_UINT32_V(_f, _s, 0)
+
+#define VMSTATE_UINT16_TEST(_f, _s, _t)                               \
+    VMSTATE_SINGLE_TEST(_f, _s, _t, 0, slirp_vmstate_info_uint16, uint16_t)
+
+#define VMSTATE_UINT32_TEST(_f, _s, _t)                                  \
+    VMSTATE_SINGLE_TEST(_f, _s, _t, 0, slirp_vmstate_info_uint32, uint32_t)
+
+#define VMSTATE_INT16_ARRAY_V(_f, _s, _n, _v)                         \
+    VMSTATE_ARRAY(_f, _s, _n, _v, slirp_vmstate_info_int16, int16_t)
+
+#define VMSTATE_INT16_ARRAY(_f, _s, _n)                               \
+    VMSTATE_INT16_ARRAY_V(_f, _s, _n, 0)
+
+#define VMSTATE_BUFFER_V(_f, _s, _v)                                    \
+    VMSTATE_STATIC_BUFFER(_f, _s, _v, NULL, 0, sizeof(typeof_field(_s, _f)))
+
+#define VMSTATE_BUFFER(_f, _s)                                        \
+    VMSTATE_BUFFER_V(_f, _s, 0)
+
+#define VMSTATE_END_OF_LIST()                                         \
+    {}
+
+#endif
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 07/12] slirp: use libslirp migration code
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (5 preceding siblings ...)
  2019-03-06 23:58 ` [Qemu-devel] [PULL 06/12] slirp: adapt a subset of QEMU vmstate code Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 08/12] slirp: use "slirp_" prefix for inet_aton() win32 implementation Samuel Thibault
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: Marc-André Lureau, stefanha, jan.kiszka, Samuel Thibault

From: Marc-André Lureau <marcandre.lureau@redhat.com>

slirp migration code uses QEMU vmstate so far, when building WITH_QEMU.

Introduce slirp_state_{load,save,version}() functions to move the
state saving handling to libslirp side.

So far, the bitstream compatibility should remain equal with current
QEMU, as this is effectively using the same code, with the same format
etc. When libslirp is made standalone, we will need some mechanism to
ensure bitstream compatibility regardless of the libslirp version
installed. See the FIXME note in the code.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20190212162524.31504-3-marcandre.lureau@redhat.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
---
 include/migration/qemu-file-types.h |  2 ++
 migration/qemu-file.h               |  1 -
 net/slirp.c                         | 55 +++++++++++++++++++++++++++++
 slirp/libslirp.h                    |  8 +++++
 slirp/slirp.c                       |  9 -----
 slirp/state.c                       | 52 ++++++++++++---------------
 slirp/state.h                       |  9 -----
 7 files changed, 88 insertions(+), 48 deletions(-)

diff --git a/include/migration/qemu-file-types.h b/include/migration/qemu-file-types.h
index bd6d7dd7f9..bbe04d4484 100644
--- a/include/migration/qemu-file-types.h
+++ b/include/migration/qemu-file-types.h
@@ -25,6 +25,8 @@
 #ifndef QEMU_FILE_H
 #define QEMU_FILE_H
 
+int qemu_file_get_error(QEMUFile *f);
+
 void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size);
 void qemu_put_byte(QEMUFile *f, int v);
 
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
index 2ccfcfb2a8..13baf896bd 100644
--- a/migration/qemu-file.h
+++ b/migration/qemu-file.h
@@ -149,7 +149,6 @@ void qemu_update_position(QEMUFile *f, size_t size);
 void qemu_file_reset_rate_limit(QEMUFile *f);
 void qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate);
 int64_t qemu_file_get_rate_limit(QEMUFile *f);
-int qemu_file_get_error(QEMUFile *f);
 void qemu_file_set_error(QEMUFile *f, int ret);
 int qemu_file_shutdown(QEMUFile *f);
 QEMUFile *qemu_file_get_return_path(QEMUFile *f);
diff --git a/net/slirp.c b/net/slirp.c
index a8fd9e6364..059b2d9b08 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -44,6 +44,8 @@
 #include "qapi/error.h"
 #include "qapi/qmp/qdict.h"
 #include "util.h"
+#include "migration/register.h"
+#include "migration/qemu-file-types.h"
 
 static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
 {
@@ -146,6 +148,7 @@ static void net_slirp_cleanup(NetClientState *nc)
 
     g_slist_free_full(s->fwd, slirp_free_fwd);
     main_loop_poll_remove_notifier(&s->poll_notifier);
+    unregister_savevm(NULL, "slirp", s->slirp);
     slirp_cleanup(s->slirp);
     if (s->exit_notifier.notify) {
         qemu_remove_exit_notifier(&s->exit_notifier);
@@ -303,6 +306,46 @@ static void net_slirp_poll_notify(Notifier *notifier, void *data)
     }
 }
 
+static ssize_t
+net_slirp_stream_read(void *buf, size_t size, void *opaque)
+{
+    QEMUFile *f = opaque;
+
+    return qemu_get_buffer(f, buf, size);
+}
+
+static ssize_t
+net_slirp_stream_write(const void *buf, size_t size, void *opaque)
+{
+    QEMUFile *f = opaque;
+
+    qemu_put_buffer(f, buf, size);
+    if (qemu_file_get_error(f)) {
+        return -1;
+    }
+
+    return size;
+}
+
+static int net_slirp_state_load(QEMUFile *f, void *opaque, int version_id)
+{
+    Slirp *slirp = opaque;
+
+    return slirp_state_load(slirp, version_id, net_slirp_stream_read, f);
+}
+
+static void net_slirp_state_save(QEMUFile *f, void *opaque)
+{
+    Slirp *slirp = opaque;
+
+    slirp_state_save(slirp, net_slirp_stream_write, f);
+}
+
+static SaveVMHandlers savevm_slirp_state = {
+    .save_state = net_slirp_state_save,
+    .load_state = net_slirp_state_load,
+};
+
 static int net_slirp_init(NetClientState *peer, const char *model,
                           const char *name, int restricted,
                           bool ipv4, const char *vnetwork, const char *vhost,
@@ -523,6 +566,18 @@ static int net_slirp_init(NetClientState *peer, const char *model,
                           &slirp_cb, s);
     QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
 
+    /*
+     * Make sure the current bitstream version of slirp is 4, to avoid
+     * QEMU migration incompatibilities, if upstream slirp bumped the
+     * version.
+     *
+     * FIXME: use bitfields of features? teach libslirp to save with
+     * specific version?
+     */
+    g_assert(slirp_state_version() == 4);
+    register_savevm_live(NULL, "slirp", 0, slirp_state_version(),
+                         &savevm_slirp_state, s->slirp);
+
     s->poll_notifier.notify = net_slirp_poll_notify;
     main_loop_poll_add_notifier(&s->poll_notifier);
 
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 18c50bd7ba..7ce1e4d0d4 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -101,6 +101,14 @@ void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr,
                        int guest_port, const uint8_t *buf, int size);
 size_t slirp_socket_can_recv(Slirp *slirp, struct in_addr guest_addr,
                              int guest_port);
+
+void slirp_state_save(Slirp *s, SlirpWriteCb write_cb, void *opaque);
+
+int slirp_state_load(Slirp *s, int version_id,
+                     SlirpReadCb read_cb, void *opaque);
+
+int slirp_state_version(void);
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
diff --git a/slirp/slirp.c b/slirp/slirp.c
index cbdf9f778d..18af670a0a 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -23,9 +23,6 @@
  */
 #include "slirp.h"
 
-#ifdef WITH_QEMU
-#include "state.h"
-#endif
 
 #ifndef _WIN32
 #include <net/if.h>
@@ -326,9 +323,6 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
         translate_dnssearch(slirp, vdnssearch);
     }
 
-#ifdef WITH_QEMU
-    slirp_state_register(slirp);
-#endif
     return slirp;
 }
 
@@ -342,9 +336,6 @@ void slirp_cleanup(Slirp *slirp)
         g_free(e);
     }
 
-#ifdef WITH_QEMU
-    slirp_state_unregister(slirp);
-#endif
     ip_cleanup(slirp);
     ip6_cleanup(slirp);
     m_cleanup(slirp);
diff --git a/slirp/state.c b/slirp/state.c
index 0e5a706e87..f5dd80cdc8 100644
--- a/slirp/state.c
+++ b/slirp/state.c
@@ -21,13 +21,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
-#include "qemu/osdep.h"
-
 #include "slirp.h"
+#include "vmstate.h"
 #include "state.h"
-#include "migration/vmstate.h"
-#include "migration/qemu-file-types.h"
-#include "migration/register.h"
+#include "stream.h"
 
 static int slirp_tcp_post_load(void *opaque, int version)
 {
@@ -180,7 +177,7 @@ static int slirp_socket_pre_load(void *opaque)
 #else
 /* Win uses u_long rather than uint32_t - but it's still 32bits long */
 #define VMSTATE_SIN4_ADDR(f, s, t) VMSTATE_SINGLE_TEST(f, s, t, 0, \
-                                       vmstate_info_uint32, u_long)
+                                       slirp_vmstate_info_uint32, u_long)
 #endif
 
 /* The OS provided ss_family field isn't that portable; it's size
@@ -322,10 +319,13 @@ static const VMStateDescription vmstate_slirp = {
     }
 };
 
-static void slirp_state_save(QEMUFile *f, void *opaque)
+void slirp_state_save(Slirp *slirp, SlirpWriteCb write_cb, void *opaque)
 {
-    Slirp *slirp = opaque;
     struct gfwd_list *ex_ptr;
+    SlirpOStream f = {
+        .write_cb = write_cb,
+        .opaque = opaque,
+    };
 
     for (ex_ptr = slirp->guestfwd_list; ex_ptr; ex_ptr = ex_ptr->ex_next)
         if (ex_ptr->write_cb) {
@@ -336,25 +336,29 @@ static void slirp_state_save(QEMUFile *f, void *opaque)
                 continue;
             }
 
-            qemu_put_byte(f, 42);
-            vmstate_save_state(f, &vmstate_slirp_socket, so, NULL);
+            slirp_ostream_write_u8(&f, 42);
+            slirp_vmstate_save_state(&f, &vmstate_slirp_socket, so);
         }
-    qemu_put_byte(f, 0);
+    slirp_ostream_write_u8(&f, 0);
 
-    vmstate_save_state(f, &vmstate_slirp, slirp, NULL);
+    slirp_vmstate_save_state(&f, &vmstate_slirp, slirp);
 }
 
 
-static int slirp_state_load(QEMUFile *f, void *opaque, int version_id)
+int slirp_state_load(Slirp *slirp, int version_id,
+                     SlirpReadCb read_cb, void *opaque)
 {
-    Slirp *slirp = opaque;
     struct gfwd_list *ex_ptr;
+    SlirpIStream f = {
+        .read_cb = read_cb,
+        .opaque = opaque,
+    };
 
-    while (qemu_get_byte(f)) {
+    while (slirp_istream_read_u8(&f)) {
         int ret;
         struct socket *so = socreate(slirp);
 
-        ret = vmstate_load_state(f, &vmstate_slirp_socket, so, version_id);
+        ret = slirp_vmstate_load_state(&f, &vmstate_slirp_socket, so, version_id);
         if (ret < 0) {
             return ret;
         }
@@ -375,20 +379,10 @@ static int slirp_state_load(QEMUFile *f, void *opaque, int version_id)
         }
     }
 
-    return vmstate_load_state(f, &vmstate_slirp, slirp, version_id);
-}
-
-void slirp_state_register(Slirp *slirp)
-{
-    static SaveVMHandlers savevm_slirp_state = {
-        .save_state = slirp_state_save,
-        .load_state = slirp_state_load,
-    };
-
-    register_savevm_live(NULL, "slirp", 0, 4, &savevm_slirp_state, slirp);
+    return slirp_vmstate_load_state(&f, &vmstate_slirp, slirp, version_id);
 }
 
-void slirp_state_unregister(Slirp *slirp)
+int slirp_state_version(void)
 {
-    unregister_savevm(NULL, "slirp", slirp);
+    return 4;
 }
diff --git a/slirp/state.h b/slirp/state.h
index 154866898f..e69de29bb2 100644
--- a/slirp/state.h
+++ b/slirp/state.h
@@ -1,9 +0,0 @@
-#ifndef SLIRP_STATE_H_
-#define SLIRP_STATE_H_
-
-#include "libslirp.h"
-
-void slirp_state_register(Slirp *slirp);
-void slirp_state_unregister(Slirp *slirp);
-
-#endif /* SLIRP_STATE_H_ */
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 08/12] slirp: use "slirp_" prefix for inet_aton() win32 implementation
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (6 preceding siblings ...)
  2019-03-06 23:58 ` [Qemu-devel] [PULL 07/12] slirp: use libslirp migration code Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 09/12] slirp: move sources to src/ subdirectory Samuel Thibault
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: Marc-André Lureau, stefanha, jan.kiszka, Samuel Thibault

From: Marc-André Lureau <marcandre.lureau@redhat.com>

To avoid conflict with QEMU inet_aton() implementation, let's use the
"slirp_" prefix. This allows to drop the WITH_QEMU, thus the source
won't make a distinction when building with QEMU or not.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20190212162524.31504-4-marcandre.lureau@redhat.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
---
 slirp/Makefile.objs | 2 +-
 slirp/util.c        | 4 ++--
 slirp/util.h        | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/slirp/Makefile.objs b/slirp/Makefile.objs
index 69e140f965..e91daf0e91 100644
--- a/slirp/Makefile.objs
+++ b/slirp/Makefile.objs
@@ -33,4 +33,4 @@ slirp.mo-objs = \
 	vmstate.o \
 	$(NULL)
 
-slirp.mo-cflags = -DG_LOG_DOMAIN=\"Slirp\" -DWITH_QEMU
+slirp.mo-cflags = -DG_LOG_DOMAIN=\"Slirp\"
diff --git a/slirp/util.c b/slirp/util.c
index 1cbaa26b60..5ec2fa87ab 100644
--- a/slirp/util.c
+++ b/slirp/util.c
@@ -31,8 +31,8 @@
 #include <fcntl.h>
 #include <stdint.h>
 
-#if defined(_WIN32) && !defined(WITH_QEMU)
-int inet_aton(const char *cp, struct in_addr *ia)
+#if defined(_WIN32)
+int slirp_inet_aton(const char *cp, struct in_addr *ia)
 {
     uint32_t addr = inet_addr(cp);
     if (addr == 0xffffffff) {
diff --git a/slirp/util.h b/slirp/util.h
index c4207a49d6..e94ee4e7f1 100644
--- a/slirp/util.h
+++ b/slirp/util.h
@@ -138,8 +138,8 @@ int slirp_getsockopt_wrap(int sockfd, int level, int optname,
 #define setsockopt slirp_setsockopt_wrap
 int slirp_setsockopt_wrap(int sockfd, int level, int optname,
                           const void *optval, int optlen);
-
-int inet_aton(const char *cp, struct in_addr *ia);
+#define inet_aton slirp_inet_aton
+int slirp_inet_aton(const char *cp, struct in_addr *ia);
 #else
 #define closesocket(s) close(s)
 #define ioctlsocket(s, r, v) ioctl(s, r, v)
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 09/12] slirp: move sources to src/ subdirectory
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (7 preceding siblings ...)
  2019-03-06 23:58 ` [Qemu-devel] [PULL 08/12] slirp: use "slirp_" prefix for inet_aton() win32 implementation Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 10/12] slirp: add a standalone Makefile Samuel Thibault
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: Marc-André Lureau, stefanha, jan.kiszka, Samuel Thibault

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Prepare for making slirp/ a standalone project.

Remove some useless includes while at it.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20190212162524.31504-5-marcandre.lureau@redhat.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
---
 net/slirp.c                  |  2 +-
 slirp/Makefile.objs          | 60 ++++++++++++++++++------------------
 slirp/{ => src}/arp_table.c  |  0
 slirp/{ => src}/bootp.c      |  0
 slirp/{ => src}/bootp.h      |  0
 slirp/{ => src}/cksum.c      |  0
 slirp/{ => src}/debug.h      |  0
 slirp/{ => src}/dhcpv6.c     |  0
 slirp/{ => src}/dhcpv6.h     |  0
 slirp/{ => src}/dnssearch.c  |  0
 slirp/{ => src}/if.c         |  0
 slirp/{ => src}/if.h         |  0
 slirp/{ => src}/ip.h         |  0
 slirp/{ => src}/ip6.h        |  0
 slirp/{ => src}/ip6_icmp.c   |  0
 slirp/{ => src}/ip6_icmp.h   |  0
 slirp/{ => src}/ip6_input.c  |  0
 slirp/{ => src}/ip6_output.c |  0
 slirp/{ => src}/ip_icmp.c    |  0
 slirp/{ => src}/ip_icmp.h    |  0
 slirp/{ => src}/ip_input.c   |  0
 slirp/{ => src}/ip_output.c  |  0
 slirp/{ => src}/libslirp.h   |  0
 slirp/{ => src}/main.h       |  0
 slirp/{ => src}/mbuf.c       |  0
 slirp/{ => src}/mbuf.h       |  0
 slirp/{ => src}/misc.c       |  0
 slirp/{ => src}/misc.h       |  0
 slirp/{ => src}/ncsi-pkt.h   |  0
 slirp/{ => src}/ncsi.c       |  0
 slirp/{ => src}/ndp_table.c  |  0
 slirp/{ => src}/qtailq.h     |  0
 slirp/{ => src}/sbuf.c       |  0
 slirp/{ => src}/sbuf.h       |  0
 slirp/{ => src}/slirp.c      |  0
 slirp/{ => src}/slirp.h      |  0
 slirp/{ => src}/socket.c     |  0
 slirp/{ => src}/socket.h     |  0
 slirp/{ => src}/state.c      |  0
 slirp/{ => src}/state.h      |  0
 slirp/{ => src}/stream.c     |  0
 slirp/{ => src}/stream.h     |  0
 slirp/{ => src}/tcp.h        |  0
 slirp/{ => src}/tcp_input.c  |  0
 slirp/{ => src}/tcp_output.c |  0
 slirp/{ => src}/tcp_subr.c   |  0
 slirp/{ => src}/tcp_timer.c  |  0
 slirp/{ => src}/tcp_timer.h  |  0
 slirp/{ => src}/tcp_var.h    |  0
 slirp/{ => src}/tcpip.h      |  0
 slirp/{ => src}/tftp.c       |  0
 slirp/{ => src}/tftp.h       |  0
 slirp/{ => src}/udp.c        |  0
 slirp/{ => src}/udp.h        |  0
 slirp/{ => src}/udp6.c       |  0
 slirp/{ => src}/util.c       |  0
 slirp/{ => src}/util.h       |  0
 slirp/{ => src}/vmstate.c    |  0
 slirp/{ => src}/vmstate.h    |  0
 util/main-loop.c             |  2 --
 vl.c                         |  3 --
 61 files changed, 31 insertions(+), 36 deletions(-)
 rename slirp/{ => src}/arp_table.c (100%)
 rename slirp/{ => src}/bootp.c (100%)
 rename slirp/{ => src}/bootp.h (100%)
 rename slirp/{ => src}/cksum.c (100%)
 rename slirp/{ => src}/debug.h (100%)
 rename slirp/{ => src}/dhcpv6.c (100%)
 rename slirp/{ => src}/dhcpv6.h (100%)
 rename slirp/{ => src}/dnssearch.c (100%)
 rename slirp/{ => src}/if.c (100%)
 rename slirp/{ => src}/if.h (100%)
 rename slirp/{ => src}/ip.h (100%)
 rename slirp/{ => src}/ip6.h (100%)
 rename slirp/{ => src}/ip6_icmp.c (100%)
 rename slirp/{ => src}/ip6_icmp.h (100%)
 rename slirp/{ => src}/ip6_input.c (100%)
 rename slirp/{ => src}/ip6_output.c (100%)
 rename slirp/{ => src}/ip_icmp.c (100%)
 rename slirp/{ => src}/ip_icmp.h (100%)
 rename slirp/{ => src}/ip_input.c (100%)
 rename slirp/{ => src}/ip_output.c (100%)
 rename slirp/{ => src}/libslirp.h (100%)
 rename slirp/{ => src}/main.h (100%)
 rename slirp/{ => src}/mbuf.c (100%)
 rename slirp/{ => src}/mbuf.h (100%)
 rename slirp/{ => src}/misc.c (100%)
 rename slirp/{ => src}/misc.h (100%)
 rename slirp/{ => src}/ncsi-pkt.h (100%)
 rename slirp/{ => src}/ncsi.c (100%)
 rename slirp/{ => src}/ndp_table.c (100%)
 rename slirp/{ => src}/qtailq.h (100%)
 rename slirp/{ => src}/sbuf.c (100%)
 rename slirp/{ => src}/sbuf.h (100%)
 rename slirp/{ => src}/slirp.c (100%)
 rename slirp/{ => src}/slirp.h (100%)
 rename slirp/{ => src}/socket.c (100%)
 rename slirp/{ => src}/socket.h (100%)
 rename slirp/{ => src}/state.c (100%)
 rename slirp/{ => src}/state.h (100%)
 rename slirp/{ => src}/stream.c (100%)
 rename slirp/{ => src}/stream.h (100%)
 rename slirp/{ => src}/tcp.h (100%)
 rename slirp/{ => src}/tcp_input.c (100%)
 rename slirp/{ => src}/tcp_output.c (100%)
 rename slirp/{ => src}/tcp_subr.c (100%)
 rename slirp/{ => src}/tcp_timer.c (100%)
 rename slirp/{ => src}/tcp_timer.h (100%)
 rename slirp/{ => src}/tcp_var.h (100%)
 rename slirp/{ => src}/tcpip.h (100%)
 rename slirp/{ => src}/tftp.c (100%)
 rename slirp/{ => src}/tftp.h (100%)
 rename slirp/{ => src}/udp.c (100%)
 rename slirp/{ => src}/udp.h (100%)
 rename slirp/{ => src}/udp6.c (100%)
 rename slirp/{ => src}/util.c (100%)
 rename slirp/{ => src}/util.h (100%)
 rename slirp/{ => src}/vmstate.c (100%)
 rename slirp/{ => src}/vmstate.h (100%)

diff --git a/net/slirp.c b/net/slirp.c
index 059b2d9b08..d2f2138bc5 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -37,7 +37,7 @@
 #include "monitor/monitor.h"
 #include "qemu/error-report.h"
 #include "qemu/sockets.h"
-#include "slirp/libslirp.h"
+#include "slirp/src/libslirp.h"
 #include "chardev/char-fe.h"
 #include "sysemu/sysemu.h"
 #include "qemu/cutils.h"
diff --git a/slirp/Makefile.objs b/slirp/Makefile.objs
index e91daf0e91..0250229dfa 100644
--- a/slirp/Makefile.objs
+++ b/slirp/Makefile.objs
@@ -1,36 +1,36 @@
 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 \
-	state.o \
-	stream.o \
-	tcp_input.o \
-	tcp_output.o \
-	tcp_subr.o \
-	tcp_timer.o \
-	tftp.o \
-	udp.o \
-	udp6.o \
-	util.o \
-	vmstate.o \
+	src/arp_table.o \
+	src/bootp.o \
+	src/cksum.o \
+	src/dhcpv6.o \
+	src/dnssearch.o \
+	src/if.o \
+	src/ip6_icmp.o \
+	src/ip6_input.o \
+	src/ip6_output.o \
+	src/ip_icmp.o \
+	src/ip_input.o \
+	src/ip_output.o \
+	src/mbuf.o \
+	src/misc.o \
+	src/ncsi.o \
+	src/ndp_table.o \
+	src/sbuf.o \
+	src/slirp.o \
+	src/socket.o \
+	src/state.o \
+	src/stream.o \
+	src/tcp_input.o \
+	src/tcp_output.o \
+	src/tcp_subr.o \
+	src/tcp_timer.o \
+	src/tftp.o \
+	src/udp.o \
+	src/udp6.o \
+	src/util.o \
+	src/vmstate.o \
 	$(NULL)
 
 slirp.mo-cflags = -DG_LOG_DOMAIN=\"Slirp\"
diff --git a/slirp/arp_table.c b/slirp/src/arp_table.c
similarity index 100%
rename from slirp/arp_table.c
rename to slirp/src/arp_table.c
diff --git a/slirp/bootp.c b/slirp/src/bootp.c
similarity index 100%
rename from slirp/bootp.c
rename to slirp/src/bootp.c
diff --git a/slirp/bootp.h b/slirp/src/bootp.h
similarity index 100%
rename from slirp/bootp.h
rename to slirp/src/bootp.h
diff --git a/slirp/cksum.c b/slirp/src/cksum.c
similarity index 100%
rename from slirp/cksum.c
rename to slirp/src/cksum.c
diff --git a/slirp/debug.h b/slirp/src/debug.h
similarity index 100%
rename from slirp/debug.h
rename to slirp/src/debug.h
diff --git a/slirp/dhcpv6.c b/slirp/src/dhcpv6.c
similarity index 100%
rename from slirp/dhcpv6.c
rename to slirp/src/dhcpv6.c
diff --git a/slirp/dhcpv6.h b/slirp/src/dhcpv6.h
similarity index 100%
rename from slirp/dhcpv6.h
rename to slirp/src/dhcpv6.h
diff --git a/slirp/dnssearch.c b/slirp/src/dnssearch.c
similarity index 100%
rename from slirp/dnssearch.c
rename to slirp/src/dnssearch.c
diff --git a/slirp/if.c b/slirp/src/if.c
similarity index 100%
rename from slirp/if.c
rename to slirp/src/if.c
diff --git a/slirp/if.h b/slirp/src/if.h
similarity index 100%
rename from slirp/if.h
rename to slirp/src/if.h
diff --git a/slirp/ip.h b/slirp/src/ip.h
similarity index 100%
rename from slirp/ip.h
rename to slirp/src/ip.h
diff --git a/slirp/ip6.h b/slirp/src/ip6.h
similarity index 100%
rename from slirp/ip6.h
rename to slirp/src/ip6.h
diff --git a/slirp/ip6_icmp.c b/slirp/src/ip6_icmp.c
similarity index 100%
rename from slirp/ip6_icmp.c
rename to slirp/src/ip6_icmp.c
diff --git a/slirp/ip6_icmp.h b/slirp/src/ip6_icmp.h
similarity index 100%
rename from slirp/ip6_icmp.h
rename to slirp/src/ip6_icmp.h
diff --git a/slirp/ip6_input.c b/slirp/src/ip6_input.c
similarity index 100%
rename from slirp/ip6_input.c
rename to slirp/src/ip6_input.c
diff --git a/slirp/ip6_output.c b/slirp/src/ip6_output.c
similarity index 100%
rename from slirp/ip6_output.c
rename to slirp/src/ip6_output.c
diff --git a/slirp/ip_icmp.c b/slirp/src/ip_icmp.c
similarity index 100%
rename from slirp/ip_icmp.c
rename to slirp/src/ip_icmp.c
diff --git a/slirp/ip_icmp.h b/slirp/src/ip_icmp.h
similarity index 100%
rename from slirp/ip_icmp.h
rename to slirp/src/ip_icmp.h
diff --git a/slirp/ip_input.c b/slirp/src/ip_input.c
similarity index 100%
rename from slirp/ip_input.c
rename to slirp/src/ip_input.c
diff --git a/slirp/ip_output.c b/slirp/src/ip_output.c
similarity index 100%
rename from slirp/ip_output.c
rename to slirp/src/ip_output.c
diff --git a/slirp/libslirp.h b/slirp/src/libslirp.h
similarity index 100%
rename from slirp/libslirp.h
rename to slirp/src/libslirp.h
diff --git a/slirp/main.h b/slirp/src/main.h
similarity index 100%
rename from slirp/main.h
rename to slirp/src/main.h
diff --git a/slirp/mbuf.c b/slirp/src/mbuf.c
similarity index 100%
rename from slirp/mbuf.c
rename to slirp/src/mbuf.c
diff --git a/slirp/mbuf.h b/slirp/src/mbuf.h
similarity index 100%
rename from slirp/mbuf.h
rename to slirp/src/mbuf.h
diff --git a/slirp/misc.c b/slirp/src/misc.c
similarity index 100%
rename from slirp/misc.c
rename to slirp/src/misc.c
diff --git a/slirp/misc.h b/slirp/src/misc.h
similarity index 100%
rename from slirp/misc.h
rename to slirp/src/misc.h
diff --git a/slirp/ncsi-pkt.h b/slirp/src/ncsi-pkt.h
similarity index 100%
rename from slirp/ncsi-pkt.h
rename to slirp/src/ncsi-pkt.h
diff --git a/slirp/ncsi.c b/slirp/src/ncsi.c
similarity index 100%
rename from slirp/ncsi.c
rename to slirp/src/ncsi.c
diff --git a/slirp/ndp_table.c b/slirp/src/ndp_table.c
similarity index 100%
rename from slirp/ndp_table.c
rename to slirp/src/ndp_table.c
diff --git a/slirp/qtailq.h b/slirp/src/qtailq.h
similarity index 100%
rename from slirp/qtailq.h
rename to slirp/src/qtailq.h
diff --git a/slirp/sbuf.c b/slirp/src/sbuf.c
similarity index 100%
rename from slirp/sbuf.c
rename to slirp/src/sbuf.c
diff --git a/slirp/sbuf.h b/slirp/src/sbuf.h
similarity index 100%
rename from slirp/sbuf.h
rename to slirp/src/sbuf.h
diff --git a/slirp/slirp.c b/slirp/src/slirp.c
similarity index 100%
rename from slirp/slirp.c
rename to slirp/src/slirp.c
diff --git a/slirp/slirp.h b/slirp/src/slirp.h
similarity index 100%
rename from slirp/slirp.h
rename to slirp/src/slirp.h
diff --git a/slirp/socket.c b/slirp/src/socket.c
similarity index 100%
rename from slirp/socket.c
rename to slirp/src/socket.c
diff --git a/slirp/socket.h b/slirp/src/socket.h
similarity index 100%
rename from slirp/socket.h
rename to slirp/src/socket.h
diff --git a/slirp/state.c b/slirp/src/state.c
similarity index 100%
rename from slirp/state.c
rename to slirp/src/state.c
diff --git a/slirp/state.h b/slirp/src/state.h
similarity index 100%
rename from slirp/state.h
rename to slirp/src/state.h
diff --git a/slirp/stream.c b/slirp/src/stream.c
similarity index 100%
rename from slirp/stream.c
rename to slirp/src/stream.c
diff --git a/slirp/stream.h b/slirp/src/stream.h
similarity index 100%
rename from slirp/stream.h
rename to slirp/src/stream.h
diff --git a/slirp/tcp.h b/slirp/src/tcp.h
similarity index 100%
rename from slirp/tcp.h
rename to slirp/src/tcp.h
diff --git a/slirp/tcp_input.c b/slirp/src/tcp_input.c
similarity index 100%
rename from slirp/tcp_input.c
rename to slirp/src/tcp_input.c
diff --git a/slirp/tcp_output.c b/slirp/src/tcp_output.c
similarity index 100%
rename from slirp/tcp_output.c
rename to slirp/src/tcp_output.c
diff --git a/slirp/tcp_subr.c b/slirp/src/tcp_subr.c
similarity index 100%
rename from slirp/tcp_subr.c
rename to slirp/src/tcp_subr.c
diff --git a/slirp/tcp_timer.c b/slirp/src/tcp_timer.c
similarity index 100%
rename from slirp/tcp_timer.c
rename to slirp/src/tcp_timer.c
diff --git a/slirp/tcp_timer.h b/slirp/src/tcp_timer.h
similarity index 100%
rename from slirp/tcp_timer.h
rename to slirp/src/tcp_timer.h
diff --git a/slirp/tcp_var.h b/slirp/src/tcp_var.h
similarity index 100%
rename from slirp/tcp_var.h
rename to slirp/src/tcp_var.h
diff --git a/slirp/tcpip.h b/slirp/src/tcpip.h
similarity index 100%
rename from slirp/tcpip.h
rename to slirp/src/tcpip.h
diff --git a/slirp/tftp.c b/slirp/src/tftp.c
similarity index 100%
rename from slirp/tftp.c
rename to slirp/src/tftp.c
diff --git a/slirp/tftp.h b/slirp/src/tftp.h
similarity index 100%
rename from slirp/tftp.h
rename to slirp/src/tftp.h
diff --git a/slirp/udp.c b/slirp/src/udp.c
similarity index 100%
rename from slirp/udp.c
rename to slirp/src/udp.c
diff --git a/slirp/udp.h b/slirp/src/udp.h
similarity index 100%
rename from slirp/udp.h
rename to slirp/src/udp.h
diff --git a/slirp/udp6.c b/slirp/src/udp6.c
similarity index 100%
rename from slirp/udp6.c
rename to slirp/src/udp6.c
diff --git a/slirp/util.c b/slirp/src/util.c
similarity index 100%
rename from slirp/util.c
rename to slirp/src/util.c
diff --git a/slirp/util.h b/slirp/src/util.h
similarity index 100%
rename from slirp/util.h
rename to slirp/src/util.h
diff --git a/slirp/vmstate.c b/slirp/src/vmstate.c
similarity index 100%
rename from slirp/vmstate.c
rename to slirp/src/vmstate.c
diff --git a/slirp/vmstate.h b/slirp/src/vmstate.h
similarity index 100%
rename from slirp/vmstate.h
rename to slirp/src/vmstate.h
diff --git a/util/main-loop.c b/util/main-loop.c
index d4a521caeb..e1e349ca5c 100644
--- a/util/main-loop.c
+++ b/util/main-loop.c
@@ -26,11 +26,9 @@
 #include "qapi/error.h"
 #include "qemu/cutils.h"
 #include "qemu/timer.h"
-#include "qemu/sockets.h"	// struct in_addr needed for libslirp.h
 #include "sysemu/qtest.h"
 #include "sysemu/cpus.h"
 #include "sysemu/replay.h"
-#include "slirp/libslirp.h"
 #include "qemu/main-loop.h"
 #include "block/aio.h"
 #include "qemu/error-report.h"
diff --git a/vl.c b/vl.c
index 4c5cc0d8ad..4a350de5cd 100644
--- a/vl.c
+++ b/vl.c
@@ -106,9 +106,6 @@ int main(int argc, char **argv)
 
 #include "disas/disas.h"
 
-
-#include "slirp/libslirp.h"
-
 #include "trace-root.h"
 #include "trace/control.h"
 #include "qemu/queue.h"
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 10/12] slirp: add a standalone Makefile
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (8 preceding siblings ...)
  2019-03-06 23:58 ` [Qemu-devel] [PULL 09/12] slirp: move sources to src/ subdirectory Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 11/12] build-sys: link with slirp as an external project Samuel Thibault
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: Marc-André Lureau, stefanha, jan.kiszka, Samuel Thibault

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Add a simple Makefile to build libslirp.a, a static library version of
libslirp, to be used by QEMU during a transition period, until a
shared library is available.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20190212162524.31504-6-marcandre.lureau@redhat.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
---
 slirp/Makefile | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)
 create mode 100644 slirp/Makefile

diff --git a/slirp/Makefile b/slirp/Makefile
new file mode 100644
index 0000000000..6d48f626ba
--- /dev/null
+++ b/slirp/Makefile
@@ -0,0 +1,47 @@
+ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
+BUILD_DIR ?= .
+
+LIBSLIRP = $(BUILD_DIR)/libslirp.a
+
+all: $(LIBSLIRP)
+
+SRCS := $(wildcard src/*.c)
+OBJS := $(SRCS:%.c=$(BUILD_DIR)/%.o)
+DEPS := $(OBJS:%.o=%.d)
+
+INC_DIRS := $(BUILD_DIR)/src
+INC_FLAGS := $(addprefix -I,$(INC_DIRS))
+
+override CFLAGS +=					\
+	-DG_LOG_DOMAIN='"Slirp"'			\
+	$(shell $(PKG_CONFIG) --cflags glib-2.0)	\
+	$(INC_FLAGS)					\
+	-MMD -MP
+override LDFLAGS += $(shell $(PKG_CONFIG) --libs glib-2.0)
+
+$(LIBSLIRP): $(OBJS)
+
+.PHONY: clean
+
+clean:
+	rm -r $(OBJS) $(DEPS) $(LIBSLIRP)
+
+$(BUILD_DIR)/src/%.o: $(ROOT_DIR)/src/%.c
+	@$(MKDIR_P) $(dir $@)
+	$(call quiet-command,$(CC) $(CFLAGS) -c -o $@ $<,"CC","$@")
+
+%.a:
+	$(call quiet-command,rm -f $@ && $(AR) rcs $@ $^,"AR","$@")
+
+PKG_CONFIG ?= pkg-config
+MKDIR_P ?= mkdir -p
+quiet-command-run = $(if $(V),,$(if $2,printf "  %-7s %s\n" $2 $3 && ))$1
+quiet-@ = $(if $(V),,@)
+quiet-command = $(quiet-@)$(call quiet-command-run,$1,$2,$3)
+
+print-%:
+	@echo '$*=$($*)'
+
+.SUFFIXES:
+
+-include $(DEPS)
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 11/12] build-sys: link with slirp as an external project
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (9 preceding siblings ...)
  2019-03-06 23:58 ` [Qemu-devel] [PULL 10/12] slirp: add a standalone Makefile Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-06 23:58 ` [Qemu-devel] [PULL 12/12] slirp: remove QEMU Makefile.objs Samuel Thibault
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: Marc-André Lureau, stefanha, jan.kiszka, Samuel Thibault

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Use the "system" libslirp if its present or requested.

Else build with a static libslirp.a if slirp/ is checked
out ("internal") or a submodule ("git").

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20190212162524.31504-7-marcandre.lureau@redhat.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
---
 Makefile           |  8 +++---
 Makefile.objs      |  1 -
 Makefile.target    |  5 +---
 configure          | 65 +++++++++++++++++++++++++++++++++++++++++++---
 net/Makefile.objs  |  2 ++
 net/slirp.c        |  2 +-
 util/Makefile.objs |  1 +
 7 files changed, 72 insertions(+), 12 deletions(-)

diff --git a/Makefile b/Makefile
index 2208bde419..a99acda9d9 100644
--- a/Makefile
+++ b/Makefile
@@ -383,8 +383,7 @@ dummy := $(call unnest-vars,, \
                 ui-obj-m \
                 audio-obj-y \
                 audio-obj-m \
-                trace-obj-y \
-                slirp-obj-y)
+                trace-obj-y)
 
 include $(SRC_PATH)/tests/Makefile.include
 
@@ -458,7 +457,10 @@ CAP_CFLAGS += -DCAPSTONE_HAS_X86
 subdir-capstone: .git-submodule-status
 	$(call quiet-command,$(MAKE) -C $(SRC_PATH)/capstone CAPSTONE_SHARED=no BUILDDIR="$(BUILD_DIR)/capstone" CC="$(CC)" AR="$(AR)" LD="$(LD)" RANLIB="$(RANLIB)" CFLAGS="$(CAP_CFLAGS)" $(SUBDIR_MAKEFLAGS) $(BUILD_DIR)/capstone/$(LIBCAPSTONE))
 
-$(SUBDIR_RULES): libqemuutil.a $(common-obj-y) $(chardev-obj-y) $(slirp-obj-y) \
+subdir-slirp: .git-submodule-status
+	$(call quiet-command,$(MAKE) -C $(SRC_PATH)/slirp BUILD_DIR="$(BUILD_DIR)/slirp" CC="$(CC)" AR="$(AR)" LD="$(LD)" RANLIB="$(RANLIB)" CFLAGS="$(QEMU_CFLAGS)")
+
+$(SUBDIR_RULES): libqemuutil.a $(common-obj-y) $(chardev-obj-y) \
 	$(qom-obj-y) $(crypto-aes-obj-$(CONFIG_USER_ONLY))
 
 ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS))
diff --git a/Makefile.objs b/Makefile.objs
index 6e91ee5674..ef65a6c12e 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -4,7 +4,6 @@ stub-obj-y = stubs/ util/ crypto/
 util-obj-y = util/ qobject/ qapi/
 
 chardev-obj-y = chardev/
-slirp-obj-$(CONFIG_SLIRP) = slirp/
 
 #######################################################################
 # authz-obj-y is code used by both qemu system emulation and qemu-img
diff --git a/Makefile.target b/Makefile.target
index 3b79e7074c..bd773da756 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -174,7 +174,6 @@ 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)
@@ -188,8 +187,7 @@ dummy := $(call unnest-vars,.., \
                qom-obj-y \
                io-obj-y \
                common-obj-y \
-               common-obj-m \
-               slirp-obj-y)
+               common-obj-m)
 target-obj-y := $(target-obj-y-save)
 all-obj-y += $(common-obj-y)
 all-obj-y += $(target-obj-y)
@@ -199,7 +197,6 @@ all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y) $(chardev-obj-y)
 all-obj-$(CONFIG_USER_ONLY) += $(crypto-aes-obj-y)
 all-obj-$(CONFIG_SOFTMMU) += $(crypto-obj-y)
 all-obj-$(CONFIG_SOFTMMU) += $(io-obj-y)
-all-obj-$(CONFIG_SOFTMMU) += $(slirp-obj-y)
 
 $(QEMU_PROG_BUILD): config-devices.mak
 
diff --git a/configure b/configure
index cefeb8fcce..ec43207c18 100755
--- a/configure
+++ b/configure
@@ -406,7 +406,7 @@ includedir="\${prefix}/include"
 sysconfdir="\${prefix}/etc"
 local_statedir="\${prefix}/var"
 confsuffix="/qemu"
-slirp="yes"
+slirp=""
 oss_lib=""
 bsd="no"
 linux="no"
@@ -1105,6 +1105,10 @@ for opt do
   ;;
   --disable-slirp) slirp="no"
   ;;
+  --enable-slirp=git) slirp="git"
+  ;;
+  --enable-slirp=system) slirp="system"
+  ;;
   --disable-vde) vde="no"
   ;;
   --enable-vde) vde="yes"
@@ -5754,6 +5758,55 @@ if test "$libpmem" != "no"; then
 	fi
 fi
 
+##########################################
+# check for slirp
+
+case "$slirp" in
+  "" | yes)
+    if $pkg_config slirp; then
+      slirp=system
+    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
+      slirp=git
+    elif test -e "${source_path}/slirp/Makefile" ; then
+      slirp=internal
+    elif test -z "$slirp" ; then
+      slirp=no
+    else
+      feature_not_found "slirp" "Install slirp devel or git submodule"
+    fi
+    ;;
+
+  system)
+    if ! $pkg_config slirp; then
+      feature_not_found "slirp" "Install slirp devel"
+    fi
+    ;;
+esac
+
+case "$slirp" in
+  git | internal)
+    if test "$slirp" = git; then
+      git_submodules="${git_submodules} slirp"
+    fi
+    mkdir -p slirp
+    slirp_cflags="-I\$(SRC_PATH)/slirp/src -I\$(BUILD_DIR)/slirp/src"
+    slirp_libs="-L\$(BUILD_DIR)/slirp -lslirp"
+    ;;
+
+  system)
+    slirp_version=$($pkg_config --modversion slirp 2>/dev/null)
+    slirp_cflags=$($pkg_config --cflags slirp 2>/dev/null)
+    slirp_libs=$($pkg_config --libs slirp 2>/dev/null)
+    ;;
+
+  no)
+    ;;
+  *)
+    error_exit "Unknown state for slirp: $slirp"
+    ;;
+esac
+
+
 ##########################################
 # End of CC checks
 # After here, no more $cc or $ld runs
@@ -6111,7 +6164,8 @@ echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
 echo "make              $make"
 echo "install           $install"
 echo "python            $python ($python_version)"
-if test "$slirp" = "yes" ; then
+echo "slirp support     $slirp $(echo_version $slirp $slirp_version)"
+if test "$slirp" != "no" ; then
     echo "smbd              $smbd"
 fi
 echo "module support    $modules"
@@ -6372,9 +6426,14 @@ fi
 if test "$profiler" = "yes" ; then
   echo "CONFIG_PROFILER=y" >> $config_host_mak
 fi
-if test "$slirp" = "yes" ; then
+if test "$slirp" != "no"; then
   echo "CONFIG_SLIRP=y" >> $config_host_mak
   echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
+  echo "SLIRP_CFLAGS=$slirp_cflags" >> $config_host_mak
+  echo "SLIRP_LIBS=$slirp_libs" >> $config_host_mak
+fi
+if [ "$slirp" = "git" -o "$slirp" = "internal" ]; then
+    echo "config-host.h: subdir-slirp" >> $config_host_mak
 fi
 if test "$vde" = "yes" ; then
   echo "CONFIG_VDE=y" >> $config_host_mak
diff --git a/net/Makefile.objs b/net/Makefile.objs
index 8262f033b9..c5d076d19c 100644
--- a/net/Makefile.objs
+++ b/net/Makefile.objs
@@ -8,6 +8,8 @@ common-obj-$(call land,$(CONFIG_VIRTIO_NET),$(CONFIG_VHOST_NET_USER)) += vhost-u
 common-obj-$(call land,$(call lnot,$(CONFIG_VIRTIO_NET)),$(CONFIG_VHOST_NET_USER)) += vhost-user-stub.o
 common-obj-$(CONFIG_ALL) += vhost-user-stub.o
 common-obj-$(CONFIG_SLIRP) += slirp.o
+slirp.o-cflags := $(SLIRP_CFLAGS)
+slirp.o-libs := $(SLIRP_LIBS)
 common-obj-$(CONFIG_VDE) += vde.o
 common-obj-$(CONFIG_NETMAP) += netmap.o
 common-obj-y += filter.o
diff --git a/net/slirp.c b/net/slirp.c
index d2f2138bc5..95934fb36d 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -37,7 +37,7 @@
 #include "monitor/monitor.h"
 #include "qemu/error-report.h"
 #include "qemu/sockets.h"
-#include "slirp/src/libslirp.h"
+#include <libslirp.h>
 #include "chardev/char-fe.h"
 #include "sysemu/sysemu.h"
 #include "qemu/cutils.h"
diff --git a/util/Makefile.objs b/util/Makefile.objs
index 0808575e3e..835fcd69e2 100644
--- a/util/Makefile.objs
+++ b/util/Makefile.objs
@@ -3,6 +3,7 @@ util-obj-y += bufferiszero.o
 util-obj-y += lockcnt.o
 util-obj-y += aiocb.o async.o aio-wait.o thread-pool.o qemu-timer.o
 util-obj-y += main-loop.o iohandler.o
+main-loop.o-cflags := $(SLIRP_CFLAGS)
 util-obj-$(call lnot,$(CONFIG_ATOMIC64)) += atomic64.o
 util-obj-$(CONFIG_POSIX) += aio-posix.o
 util-obj-$(CONFIG_POSIX) += compatfd.o
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PULL 12/12] slirp: remove QEMU Makefile.objs
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (10 preceding siblings ...)
  2019-03-06 23:58 ` [Qemu-devel] [PULL 11/12] build-sys: link with slirp as an external project Samuel Thibault
@ 2019-03-06 23:58 ` Samuel Thibault
  2019-03-07  0:13 ` [Qemu-devel] [PULL 00/12] slirp updates no-reply
  2019-03-07 11:27 ` Peter Maydell
  13 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-06 23:58 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: Marc-André Lureau, stefanha, jan.kiszka, Samuel Thibault

From: Marc-André Lureau <marcandre.lureau@redhat.com>

QEMU no longer includes it, and treats slirp/ as a separate project.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20190212162524.31504-8-marcandre.lureau@redhat.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
---
 slirp/Makefile.objs | 36 ------------------------------------
 1 file changed, 36 deletions(-)
 delete mode 100644 slirp/Makefile.objs

diff --git a/slirp/Makefile.objs b/slirp/Makefile.objs
deleted file mode 100644
index 0250229dfa..0000000000
--- a/slirp/Makefile.objs
+++ /dev/null
@@ -1,36 +0,0 @@
-slirp-obj-y = slirp.mo
-
-slirp.mo-objs = \
-	src/arp_table.o \
-	src/bootp.o \
-	src/cksum.o \
-	src/dhcpv6.o \
-	src/dnssearch.o \
-	src/if.o \
-	src/ip6_icmp.o \
-	src/ip6_input.o \
-	src/ip6_output.o \
-	src/ip_icmp.o \
-	src/ip_input.o \
-	src/ip_output.o \
-	src/mbuf.o \
-	src/misc.o \
-	src/ncsi.o \
-	src/ndp_table.o \
-	src/sbuf.o \
-	src/slirp.o \
-	src/socket.o \
-	src/state.o \
-	src/stream.o \
-	src/tcp_input.o \
-	src/tcp_output.o \
-	src/tcp_subr.o \
-	src/tcp_timer.o \
-	src/tftp.o \
-	src/udp.o \
-	src/udp6.o \
-	src/util.o \
-	src/vmstate.o \
-	$(NULL)
-
-slirp.mo-cflags = -DG_LOG_DOMAIN=\"Slirp\"
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PULL 00/12] slirp updates
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (11 preceding siblings ...)
  2019-03-06 23:58 ` [Qemu-devel] [PULL 12/12] slirp: remove QEMU Makefile.objs Samuel Thibault
@ 2019-03-07  0:13 ` no-reply
  2019-03-07 11:27 ` Peter Maydell
  13 siblings, 0 replies; 16+ messages in thread
From: no-reply @ 2019-03-07  0:13 UTC (permalink / raw)
  To: samuel.thibault; +Cc: fam, qemu-devel, peter.maydell, stefanha, jan.kiszka

Patchew URL: https://patchew.org/QEMU/20190306235850.30110-1-samuel.thibault@ens-lyon.org/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Type: series
Message-id: 20190306235850.30110-1-samuel.thibault@ens-lyon.org
Subject: [Qemu-devel] [PULL 00/12] slirp updates

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git rev-parse base > /dev/null || exit 0
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 * [new tag]               patchew/20190306235850.30110-1-samuel.thibault@ens-lyon.org -> patchew/20190306235850.30110-1-samuel.thibault@ens-lyon.org
Switched to a new branch 'test'
628736a3af slirp: remove QEMU Makefile.objs
79445c6ed6 build-sys: link with slirp as an external project
944c7440ad slirp: add a standalone Makefile
60c072d3bd slirp: move sources to src/ subdirectory
e416d0a345 slirp: use "slirp_" prefix for inet_aton() win32 implementation
efd01958b8 slirp: use libslirp migration code
37616f5620 slirp: adapt a subset of QEMU vmstate code
21b1998b5a slirp: Mark pieces missing IPv6 support
3d70b5116f slirp: fix big/little endian conversion in ident protocol
c5059b2fcb slirp: check sscanf result when emulating ident
c69a201a41 slirp: check for ioctlsocket error and 0-length udp payload.
7b03b19942 slirp: Fix build with gcc 9

=== OUTPUT BEGIN ===
1/12 Checking commit 7b03b1994240 (slirp: Fix build with gcc 9)
2/12 Checking commit c69a201a416f (slirp: check for ioctlsocket error and 0-length udp payload.)
ERROR: code indent should never use tabs
#25: FILE: slirp/socket.c:532:
+^I  if (ioctlsocket(so->s, FIONREAD, &n) != 0) {$

ERROR: suspect code indent for conditional statements (10, 14)
#25: FILE: slirp/socket.c:532:
+         if (ioctlsocket(so->s, FIONREAD, &n) != 0) {
+             DEBUG_MISC(" ioctlsocket errno = %d-%s\n",

ERROR: code indent should never use tabs
#26: FILE: slirp/socket.c:533:
+^I      DEBUG_MISC(" ioctlsocket errno = %d-%s\n",$

ERROR: code indent should never use tabs
#27: FILE: slirp/socket.c:534:
+^I^I^I errno,strerror(errno));$

ERROR: space required after that ',' (ctx:VxV)
#27: FILE: slirp/socket.c:534:
+                        errno,strerror(errno));
                              ^

ERROR: code indent should never use tabs
#28: FILE: slirp/socket.c:535:
+^I      return;$

ERROR: code indent should never use tabs
#29: FILE: slirp/socket.c:536:
+^I  }$

ERROR: code indent should never use tabs
#30: FILE: slirp/socket.c:537:
+^I  if (n == 0) {$

ERROR: suspect code indent for conditional statements (10, 14)
#30: FILE: slirp/socket.c:537:
+         if (n == 0) {
+             return;

ERROR: code indent should never use tabs
#31: FILE: slirp/socket.c:538:
+^I      return;$

ERROR: code indent should never use tabs
#32: FILE: slirp/socket.c:539:
+^I  }$

total: 11 errors, 0 warnings, 22 lines checked

Patch 2/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

3/12 Checking commit c5059b2fcb5b (slirp: check sscanf result when emulating ident)
WARNING: line over 80 characters
#27: FILE: slirp/tcp_subr.c:667:
+                                       so_rcv->sb_cc = snprintf(so_rcv->sb_data,

ERROR: code indent should never use tabs
#27: FILE: slirp/tcp_subr.c:667:
+^I^I^I^I^Iso_rcv->sb_cc = snprintf(so_rcv->sb_data,$

WARNING: line over 80 characters
#28: FILE: slirp/tcp_subr.c:668:
+                                                                so_rcv->sb_datalen,

ERROR: code indent should never use tabs
#28: FILE: slirp/tcp_subr.c:668:
+^I^I^I^I^I^I^I^I so_rcv->sb_datalen,$

WARNING: line over 80 characters
#29: FILE: slirp/tcp_subr.c:669:
+                                                                "%d,%d\r\n", n1, n2);

ERROR: code indent should never use tabs
#29: FILE: slirp/tcp_subr.c:669:
+^I^I^I^I^I^I^I^I "%d,%d\r\n", n1, n2);$

ERROR: code indent should never use tabs
#30: FILE: slirp/tcp_subr.c:670:
+^I^I^I^I^Iso_rcv->sb_rptr = so_rcv->sb_data;$

WARNING: line over 80 characters
#31: FILE: slirp/tcp_subr.c:671:
+                                       so_rcv->sb_wptr = so_rcv->sb_data + so_rcv->sb_cc;

ERROR: code indent should never use tabs
#31: FILE: slirp/tcp_subr.c:671:
+^I^I^I^I^Iso_rcv->sb_wptr = so_rcv->sb_data + so_rcv->sb_cc;$

total: 5 errors, 4 warnings, 17 lines checked

Patch 3/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

4/12 Checking commit 3d70b5116f95 (slirp: fix big/little endian conversion in ident protocol)
ERROR: suspect code indent for conditional statements (56, 59)
#19: FILE: slirp/tcp_subr.c:661:
                                                        if (getsockname(tmpso->s,
[...]
+                                                          n2 = addr.sin_port;

ERROR: code indent should never use tabs
#22: FILE: slirp/tcp_subr.c:663:
+^I^I^I^I^I^I^I   n2 = addr.sin_port;$

ERROR: code indent should never use tabs
#26: FILE: slirp/tcp_subr.c:667:
+^I^I^I^I^INTOHS(n1);$

ERROR: code indent should never use tabs
#27: FILE: slirp/tcp_subr.c:668:
+^I^I^I^I^INTOHS(n2);$

total: 4 errors, 0 warnings, 13 lines checked

Patch 4/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

5/12 Checking commit 21b1998b5a02 (slirp: Mark pieces missing IPv6 support)
ERROR: suspect code indent for conditional statements (8, 10)
#106: FILE: slirp/tcp_input.c:390:
         if (so == NULL) {
+          /* TODO: IPv6 */

total: 1 errors, 0 warnings, 99 lines checked

Patch 5/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

6/12 Checking commit 37616f56208b (slirp: adapt a subset of QEMU vmstate code)
WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#52: 
new file mode 100644

WARNING: line over 80 characters
#271: FILE: slirp/vmstate.c:50:
+static int get_uint8(SlirpIStream *f, void *pv, size_t size, const VMStateField *field)

WARNING: line over 80 characters
#278: FILE: slirp/vmstate.c:57:
+static int put_uint8(SlirpOStream *f, void *pv, size_t size, const VMStateField *field)

WARNING: line over 80 characters
#341: FILE: slirp/vmstate.c:120:
+static int get_int16(SlirpIStream *f, void *pv, size_t size, const VMStateField *field)

WARNING: line over 80 characters
#348: FILE: slirp/vmstate.c:127:
+static int put_int16(SlirpOStream *f, void *pv, size_t size, const VMStateField *field)

WARNING: line over 80 characters
#363: FILE: slirp/vmstate.c:142:
+static int get_int32(SlirpIStream *f, void *pv, size_t size, const VMStateField *field)

WARNING: line over 80 characters
#370: FILE: slirp/vmstate.c:149:
+static int put_int32(SlirpOStream *f, void *pv, size_t size, const VMStateField *field)

WARNING: Block comments use a leading /* on a separate line
#383: FILE: slirp/vmstate.c:162:
+/* vmstate_info_tmp, see VMSTATE_WITH_TMP, the idea is that we allocate

WARNING: line over 80 characters
#389: FILE: slirp/vmstate.c:168:
+static int get_tmp(SlirpIStream *f, void *pv, size_t size, const VMStateField *field)

WARNING: line over 80 characters
#403: FILE: slirp/vmstate.c:182:
+static int put_tmp(SlirpOStream *f, void *pv, size_t size, const VMStateField *field)

WARNING: line over 80 characters
#521: FILE: slirp/vmstate.c:300:
+                    ret = slirp_vmstate_info_nullptr.put(f, curr_elem, size, NULL);

WARNING: line over 80 characters
#607: FILE: slirp/vmstate.c:386:
+                    ret = slirp_vmstate_info_nullptr.get(f, curr_elem, size, NULL);

WARNING: Block comments use a leading /* on a separate line
#687: FILE: slirp/vmstate.h:47:
+/* VMStateInfo allows customized migration of objects that don't fit in

WARNING: line over 80 characters
#696: FILE: slirp/vmstate.h:56:
+    int (*get)(SlirpIStream *f, void *pv, size_t size, const VMStateField *field);

WARNING: line over 80 characters
#697: FILE: slirp/vmstate.h:57:
+    int (*put)(SlirpOStream *f, void *pv, size_t size, const VMStateField *field);

WARNING: Block comments use a leading /* on a separate line
#704: FILE: slirp/vmstate.h:64:
+    /* The struct member at opaque + VMStateField.offset is a pointer

WARNING: Block comments use a trailing */ on a separate line
#710: FILE: slirp/vmstate.h:70:
+     * those. */

WARNING: Block comments use a leading /* on a separate line
#713: FILE: slirp/vmstate.h:73:
+    /* The field is an array of fixed size. VMStateField.num contains

WARNING: Block comments use a trailing */ on a separate line
#720: FILE: slirp/vmstate.h:80:
+     * be combined with VMS_VARRAY*. */

WARNING: Block comments use a leading /* on a separate line
#723: FILE: slirp/vmstate.h:83:
+    /* The field is itself a struct, containing one or more

WARNING: Block comments use a trailing */ on a separate line
#726: FILE: slirp/vmstate.h:86:
+     * array entry. */

WARNING: Block comments use a leading /* on a separate line
#729: FILE: slirp/vmstate.h:89:
+    /* The field is an array of variable size. The int32_t at opaque +

WARNING: Block comments use a trailing */ on a separate line
#733: FILE: slirp/vmstate.h:93:
+     * VMS_VARRAY*. */

WARNING: Block comments use a leading /* on a separate line
#739: FILE: slirp/vmstate.h:99:
+    /* The field is a (fixed-size or variable-size) array of pointers

WARNING: Block comments use a trailing */ on a separate line
#742: FILE: slirp/vmstate.h:102:
+     * VMS_VARRAY*; these need to be set explicitly. */

WARNING: Block comments use a leading /* on a separate line
#745: FILE: slirp/vmstate.h:105:
+    /* The field is an array of variable size. The uint16_t at opaque

WARNING: Block comments use a trailing */ on a separate line
#749: FILE: slirp/vmstate.h:109:
+     * combined with VMS_ARRAY or any other VMS_VARRAY*. */

WARNING: Block comments use a leading /* on a separate line
#752: FILE: slirp/vmstate.h:112:
+    /* The size of the individual entries (a single array entry if

WARNING: Block comments use a trailing */ on a separate line
#757: FILE: slirp/vmstate.h:117:
+     * the size of each (and every) entry. */

WARNING: Block comments use a leading /* on a separate line
#760: FILE: slirp/vmstate.h:120:
+    /* Multiply the entry size given by the int32_t at opaque +

WARNING: Block comments use a trailing */ on a separate line
#763: FILE: slirp/vmstate.h:123:
+     * allocated. Only valid in combination with VMS_VBUFFER. */

WARNING: Block comments use a leading /* on a separate line
#766: FILE: slirp/vmstate.h:126:
+    /* The field is an array of variable size. The uint8_t at opaque +

WARNING: Block comments use a trailing */ on a separate line
#770: FILE: slirp/vmstate.h:130:
+     * combined with VMS_ARRAY or any other VMS_VARRAY*. */

WARNING: Block comments use a leading /* on a separate line
#773: FILE: slirp/vmstate.h:133:
+    /* The field is an array of variable size. The uint32_t at opaque

WARNING: Block comments use a trailing */ on a separate line
#777: FILE: slirp/vmstate.h:137:
+     * combined with VMS_ARRAY or any other VMS_VARRAY*. */

WARNING: Block comments use a leading /* on a separate line
#780: FILE: slirp/vmstate.h:140:
+    /* Fail loading the serialised VM state if this field is missing

WARNING: Block comments use a trailing */ on a separate line
#781: FILE: slirp/vmstate.h:141:
+     * from the input. */

WARNING: Block comments use a leading /* on a separate line
#784: FILE: slirp/vmstate.h:144:
+    /* When loading serialised VM state, allocate memory for the

WARNING: Block comments use a trailing */ on a separate line
#788: FILE: slirp/vmstate.h:148:
+     * cause the individual entries to be allocated. */

WARNING: Block comments use a leading /* on a separate line
#791: FILE: slirp/vmstate.h:151:
+    /* Multiply the number of entries given by the integer at opaque +

WARNING: Block comments use a trailing */ on a separate line
#794: FILE: slirp/vmstate.h:154:
+     * combination with one of VMS_VARRAY*. */

WARNING: Block comments use a leading /* on a separate line
#797: FILE: slirp/vmstate.h:157:
+    /* A structure field that is like VMS_STRUCT, but uses

WARNING: Block comments use a trailing */ on a separate line
#799: FILE: slirp/vmstate.h:159:
+     * structure we are referencing to use. */

ERROR: "(foo*)" should be "(foo *)"
#842: FILE: slirp/vmstate.h:202:
+#define type_check_array(t1,t2,n) ((t1(*)[n])0 - (t2*)0)

ERROR: space required after that ',' (ctx:VxV)
#842: FILE: slirp/vmstate.h:202:
+#define type_check_array(t1,t2,n) ((t1(*)[n])0 - (t2*)0)
                            ^

ERROR: space required after that ',' (ctx:VxV)
#842: FILE: slirp/vmstate.h:202:
+#define type_check_array(t1,t2,n) ((t1(*)[n])0 - (t2*)0)
                               ^

ERROR: "(foo**)" should be "(foo **)"
#843: FILE: slirp/vmstate.h:203:
+#define type_check_pointer(t1,t2) ((t1**)0 - (t2*)0)

ERROR: space required after that ',' (ctx:VxV)
#843: FILE: slirp/vmstate.h:203:
+#define type_check_pointer(t1,t2) ((t1**)0 - (t2*)0)
                              ^

ERROR: "(foo*)" should be "(foo *)"
#845: FILE: slirp/vmstate.h:205:
+#define type_check(t1,t2) ((t1*)0 - (t2*)0)

ERROR: space required after that ',' (ctx:VxV)
#845: FILE: slirp/vmstate.h:205:
+#define type_check(t1,t2) ((t1*)0 - (t2*)0)
                      ^

WARNING: Block comments use a leading /* on a separate line
#863: FILE: slirp/vmstate.h:223:
+/* In the macros below, if there is a _version, that means the macro's

ERROR: spaces required around that '|' (ctx:VxV)
#917: FILE: slirp/vmstate.h:277:
+    .flags        = VMS_STRUCT|VMS_POINTER,                          \
                               ^

WARNING: line over 80 characters
#921: FILE: slirp/vmstate.h:281:
+#define VMSTATE_STRUCT_ARRAY_TEST(_field, _state, _num, _test, _version, _vmsd, _type) { \

ERROR: spaces required around that '|' (ctx:VxV)
#928: FILE: slirp/vmstate.h:288:
+    .flags        = VMS_STRUCT|VMS_ARRAY,                            \
                               ^

WARNING: line over 80 characters
#932: FILE: slirp/vmstate.h:292:
+#define VMSTATE_STATIC_BUFFER(_field, _state, _version, _test, _start, _size) { \

ERROR: spaces required around that '|' (ctx:VxV)
#948: FILE: slirp/vmstate.h:308:
+    .flags        = VMS_VBUFFER|VMS_POINTER,                         \
                                ^

WARNING: Block comments use a leading /* on a separate line
#960: FILE: slirp/vmstate.h:320:
+/* Allocate a temporary of type 'tmp_type', set tmp->parent to _state

total: 10 errors, 47 warnings, 983 lines checked

Patch 6/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

7/12 Checking commit efd01958b8fe (slirp: use libslirp migration code)
WARNING: line over 80 characters
#267: FILE: slirp/state.c:361:
+        ret = slirp_vmstate_load_state(&f, &vmstate_slirp_socket, so, version_id);

total: 0 errors, 1 warnings, 233 lines checked

Patch 7/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
8/12 Checking commit e416d0a345d9 (slirp: use "slirp_" prefix for inet_aton() win32 implementation)
9/12 Checking commit 60c072d3bd62 (slirp: move sources to src/ subdirectory)
WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#102: 
rename from slirp/arp_table.c

total: 0 errors, 1 warnings, 94 lines checked

Patch 9/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
10/12 Checking commit 944c7440adcb (slirp: add a standalone Makefile)
WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#17: 
new file mode 100644

total: 0 errors, 1 warnings, 47 lines checked

Patch 10/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
11/12 Checking commit 79445c6ed614 (build-sys: link with slirp as an external project)
12/12 Checking commit 628736a3afc6 (slirp: remove QEMU Makefile.objs)
WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#15: 
deleted file mode 100644

total: 0 errors, 1 warnings, 0 lines checked

Patch 12/12 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/20190306235850.30110-1-samuel.thibault@ens-lyon.org/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PULL 00/12] slirp updates
  2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
                   ` (12 preceding siblings ...)
  2019-03-07  0:13 ` [Qemu-devel] [PULL 00/12] slirp updates no-reply
@ 2019-03-07 11:27 ` Peter Maydell
  2019-03-07 11:52   ` Samuel Thibault
  13 siblings, 1 reply; 16+ messages in thread
From: Peter Maydell @ 2019-03-07 11:27 UTC (permalink / raw)
  To: Samuel Thibault; +Cc: QEMU Developers, Stefan Hajnoczi, Jan Kiszka

On Wed, 6 Mar 2019 at 23:59, Samuel Thibault
<samuel.thibault@ens-lyon.org> wrote:
>
> The following changes since commit 32694e98b8d7a246345448a8f707d2e11d6c65e2:
>
>   Merge remote-tracking branch 'remotes/ehabkost/tags/machine-next-pull-request' into staging (2019-03-06 18:52:19 +0000)
>
> are available in the Git repository at:
>
>   https://people.debian.org/~sthibault/qemu.git tags/samuel-thibault
>
> for you to fetch changes up to dd9eff6c839db3996c157f0a6a4e18f95683e58c:
>
>   slirp: remove QEMU Makefile.objs (2019-03-07 00:12:34 +0100)
>
> ----------------------------------------------------------------

Hi; this fails to build on FreeBSD, I'm afraid:

In file included from /var/tmp/qemu-test.Sn5gQz/slirp/src/stream.c:24:
In file included from /var/tmp/qemu-test.Sn5gQz/slirp/src/stream.h:4:
/var/tmp/qemu-test.Sn5gQz/slirp/src/libslirp.h:29:19: warning: type
specifier missing, defaults to 'int' [-Wimplicit-int]
typedef ssize_t (*SlirpReadCb)(void *buf, size_t len, void *opaque);
                  ^
/var/tmp/qemu-test.Sn5gQz/slirp/src/libslirp.h:29:9: warning: type
specifier missing, defaults to 'int' [-Wimplicit-int]
typedef ssize_t (*SlirpReadCb)(void *buf, size_t len, void *opaque);
~~~~~~~ ^
/var/tmp/qemu-test.Sn5gQz/slirp/src/libslirp.h:29:17: error: function
cannot return function type 'int (void *, size_t, void *)' (aka 'int
(void *, unsigned
long, void *)')
typedef ssize_t (*SlirpReadCb)(void *buf, size_t len, void *opaque);
                ^
/var/tmp/qemu-test.Sn5gQz/slirp/src/libslirp.h:30:32: error: function
cannot return function type 'ssize_t' (aka 'int (int *)')
typedef ssize_t (*SlirpWriteCb)(const void *buf, size_t len, void *opaque);
                               ^
/var/tmp/qemu-test.Sn5gQz/slirp/src/libslirp.h:108:22: error: unknown
type name 'SlirpReadCb'
                     SlirpReadCb read_cb, void *opaque);
                     ^
In file included from /var/tmp/qemu-test.Sn5gQz/slirp/src/stream.c:24:
/var/tmp/qemu-test.Sn5gQz/slirp/src/stream.h:7:5: error: unknown type
name 'SlirpReadCb'
    SlirpReadCb read_cb;
    ^
2 warnings and 4 errors generated.

I think this is a missing #include of <sys/types.h> which is where
ssize_t comes from -- on the other OSes it likely gets dragged in
by default.

thanks
-- PMM

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PULL 00/12] slirp updates
  2019-03-07 11:27 ` Peter Maydell
@ 2019-03-07 11:52   ` Samuel Thibault
  0 siblings, 0 replies; 16+ messages in thread
From: Samuel Thibault @ 2019-03-07 11:52 UTC (permalink / raw)
  To: Peter Maydell; +Cc: QEMU Developers, Stefan Hajnoczi, Jan Kiszka

Peter Maydell, le jeu. 07 mars 2019 11:27:38 +0000, a ecrit:
> Hi; this fails to build on FreeBSD, I'm afraid:
> 
> /var/tmp/qemu-test.Sn5gQz/slirp/src/libslirp.h:29:19: warning: type
> specifier missing, defaults to 'int' [-Wimplicit-int]
> typedef ssize_t (*SlirpReadCb)(void *buf, size_t len, void *opaque);
>                   ^

> I think this is a missing #include of <sys/types.h> which is where
> ssize_t comes from -- on the other OSes it likely gets dragged in
> by default.

That's probably it indeed. I have resubmitted the series with it.

Samuel

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2019-03-07 11:52 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-06 23:58 [Qemu-devel] [PULL 00/12] slirp updates Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 01/12] slirp: Fix build with gcc 9 Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 02/12] slirp: check for ioctlsocket error and 0-length udp payload Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 03/12] slirp: check sscanf result when emulating ident Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 04/12] slirp: fix big/little endian conversion in ident protocol Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 05/12] slirp: Mark pieces missing IPv6 support Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 06/12] slirp: adapt a subset of QEMU vmstate code Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 07/12] slirp: use libslirp migration code Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 08/12] slirp: use "slirp_" prefix for inet_aton() win32 implementation Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 09/12] slirp: move sources to src/ subdirectory Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 10/12] slirp: add a standalone Makefile Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 11/12] build-sys: link with slirp as an external project Samuel Thibault
2019-03-06 23:58 ` [Qemu-devel] [PULL 12/12] slirp: remove QEMU Makefile.objs Samuel Thibault
2019-03-07  0:13 ` [Qemu-devel] [PULL 00/12] slirp updates no-reply
2019-03-07 11:27 ` Peter Maydell
2019-03-07 11:52   ` Samuel Thibault

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.