From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547725563830122.87817081906246; Thu, 17 Jan 2019 03:46:03 -0800 (PST) Received: from localhost ([127.0.0.1]:42600 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk67W-0006CT-Lu for importer@patchew.org; Thu, 17 Jan 2019 06:46:02 -0500 Received: from eggs.gnu.org ([209.51.188.92]:56981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk65l-00054h-4p for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk65i-0004A6-LG for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:13 -0500 Received: from mx1.redhat.com ([209.132.183.28]:30835) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk65i-00049d-Cf for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:10 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 80EF381DE9; Thu, 17 Jan 2019 11:44:09 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1455919C7F; Thu, 17 Jan 2019 11:44:07 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:33 +0400 Message-Id: <20190117114359.5164-2-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 17 Jan 2019 11:44:09 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 01/27] slirp: generalize guestfwd with a callback based approach X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Instead of calling into QEMU chardev directly, and mixing it with slirp_add_exec() handling, add a new function slirp_add_guestfwd() which takes a write callback. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/libslirp.h | 6 +++++- slirp/misc.h | 15 +++++++++++++-- slirp/socket.h | 4 +++- net/slirp.c | 14 ++++++++++---- slirp/misc.c | 37 +++++++++++++++++++++++-------------- slirp/slirp.c | 27 +++++++++++++++++++-------- slirp/tcp_subr.c | 4 ++-- 7 files changed, 75 insertions(+), 32 deletions(-) diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 4611a7447b5..ea019828e8d 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -5,6 +5,8 @@ =20 typedef struct Slirp Slirp; =20 +typedef int (*SlirpWriteCb)(const void *buf, size_t len, void *opaque); + /* * Callbacks from slirp * @@ -45,7 +47,9 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr guest_addr, int guest_port); int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, int host_port); -int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline, +int slirp_add_exec(Slirp *slirp, const char *cmdline, + struct in_addr *guest_addr, int guest_port); +int slirp_add_guestfwd(Slirp *slirp, SlirpWriteCb write_cb, void *opaque, struct in_addr *guest_addr, int guest_port); =20 char *slirp_connection_info(Slirp *slirp); diff --git a/slirp/misc.h b/slirp/misc.h index 1df707c052d..c2ceadb591b 100644 --- a/slirp/misc.h +++ b/slirp/misc.h @@ -8,8 +8,11 @@ #ifndef MISC_H #define MISC_H =20 +#include "libslirp.h" + struct gfwd_list { - void *ex_chardev; + SlirpWriteCb write_cb; + void *opaque; struct in_addr ex_addr; /* Server address */ int ex_fport; /* Port to telnet to */ char *ex_exec; /* Command line of what to exec */ @@ -51,7 +54,15 @@ struct slirp_quehead { =20 void slirp_insque(void *, void *); void slirp_remque(void *); -int add_exec(struct gfwd_list **, void *, const char *, struct in_addr, in= t); int fork_exec(struct socket *so, const char *ex); =20 +struct gfwd_list * +add_guestfwd(struct gfwd_list **ex_ptr, + SlirpWriteCb write_cb, void *opaque, + struct in_addr addr, int port); + +struct gfwd_list * +add_exec(struct gfwd_list **ex_ptr, const char *cmdline, + struct in_addr addr, int port); + #endif diff --git a/slirp/socket.h b/slirp/socket.h index 930ed95972f..fc35ca5f72a 100644 --- a/slirp/socket.h +++ b/slirp/socket.h @@ -8,6 +8,8 @@ #ifndef SLIRP_SOCKET_H #define SLIRP_SOCKET_H =20 +#include "misc.h" + #define SO_EXPIRE 240000 #define SO_EXPIREFAST 10000 =20 @@ -25,6 +27,7 @@ struct socket { struct socket *so_next,*so_prev; /* For a linked list of sockets */ =20 int s; /* The actual socket */ + struct gfwd_list *guestfwd; =20 int pollfds_idx; /* GPollFD GArray index */ =20 @@ -67,7 +70,6 @@ struct socket { =20 struct sbuf so_rcv; /* Receive buffer */ struct sbuf so_snd; /* Send buffer */ - void * chardev; }; =20 =20 diff --git a/net/slirp.c b/net/slirp.c index f98425ee9f4..ec07f662c00 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -704,8 +704,8 @@ static int slirp_smb(SlirpState* s, const char *exporte= d_dir, CONFIG_SMBD_COMMAND, s->smb_dir, smb_conf); g_free(smb_conf); =20 - if (slirp_add_exec(s->slirp, NULL, smb_cmdline, &vserver_addr, 139) < = 0 || - slirp_add_exec(s->slirp, NULL, smb_cmdline, &vserver_addr, 445) < = 0) { + if (slirp_add_exec(s->slirp, smb_cmdline, &vserver_addr, 139) < 0 || + slirp_add_exec(s->slirp, smb_cmdline, &vserver_addr, 445) < 0) { slirp_smb_cleanup(s); g_free(smb_cmdline); error_setg(errp, "Conflicting/invalid smbserver address"); @@ -736,6 +736,11 @@ static void guestfwd_read(void *opaque, const uint8_t = *buf, int size) slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size); } =20 +static int guestfwd_write(const void *buf, size_t len, void *chr) +{ + return qemu_chr_fe_write_all(chr, buf, len); +} + static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **e= rrp) { struct in_addr server =3D { .s_addr =3D 0 }; @@ -769,7 +774,7 @@ static int slirp_guestfwd(SlirpState *s, const char *co= nfig_str, Error **errp) snprintf(buf, sizeof(buf), "guestfwd.tcp.%d", port); =20 if ((strlen(p) > 4) && !strncmp(p, "cmd:", 4)) { - if (slirp_add_exec(s->slirp, NULL, &p[4], &server, port) < 0) { + if (slirp_add_exec(s->slirp, &p[4], &server, port) < 0) { error_setg(errp, "Conflicting/invalid host:port in guest " "forwarding rule '%s'", config_str); return -1; @@ -796,7 +801,8 @@ static int slirp_guestfwd(SlirpState *s, const char *co= nfig_str, Error **errp) return -1; } =20 - if (slirp_add_exec(s->slirp, &fwd->hd, NULL, &server, port) < 0) { + if (slirp_add_guestfwd(s->slirp, guestfwd_write, &fwd->hd, + &server, port) < 0) { error_setg(errp, "Conflicting/invalid host:port in guest " "forwarding rule '%s'", config_str); g_free(fwd); diff --git a/slirp/misc.c b/slirp/misc.c index eae9596a55d..b8a2bf971af 100644 --- a/slirp/misc.c +++ b/slirp/misc.c @@ -32,24 +32,33 @@ remque(void *a) element->qh_rlink =3D NULL; } =20 -int add_exec(struct gfwd_list **ex_ptr, void *chardev, const char *cmdline, +struct gfwd_list * +add_guestfwd(struct gfwd_list **ex_ptr, + SlirpWriteCb write_cb, void *opaque, struct in_addr addr, int port) { - struct gfwd_list *tmp_ptr; - - tmp_ptr =3D *ex_ptr; - *ex_ptr =3D g_new0(struct gfwd_list, 1); - (*ex_ptr)->ex_fport =3D port; - (*ex_ptr)->ex_addr =3D addr; - if (chardev) { - (*ex_ptr)->ex_chardev =3D chardev; - } else { - (*ex_ptr)->ex_exec =3D g_strdup(cmdline); - } - (*ex_ptr)->ex_next =3D tmp_ptr; - return 0; + struct gfwd_list *f =3D g_new0(struct gfwd_list, 1); + + f->write_cb =3D write_cb; + f->opaque =3D opaque; + f->ex_fport =3D port; + f->ex_addr =3D addr; + f->ex_next =3D *ex_ptr; + *ex_ptr =3D f; + + return f; } =20 +struct gfwd_list * +add_exec(struct gfwd_list **ex_ptr, const char *cmdline, + struct in_addr addr, int port) +{ + struct gfwd_list *f =3D add_guestfwd(ex_ptr, NULL, NULL, addr, port); + + f->ex_exec =3D g_strdup(cmdline); + + return f; +} =20 static int slirp_socketpair_with_oob(int sv[2]) diff --git a/slirp/slirp.c b/slirp/slirp.c index a9674ab0909..7b23722d5db 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -25,7 +25,6 @@ #include "qemu-common.h" #include "qemu/timer.h" #include "qemu/error-report.h" -#include "chardev/char-fe.h" #include "migration/register.h" #include "slirp.h" #include "hw/hw.h" @@ -1068,23 +1067,35 @@ check_guestfwd(Slirp *slirp, struct in_addr *guest_= addr, int guest_port) return true; } =20 -int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline, +int slirp_add_exec(Slirp *slirp, const char *cmdline, struct in_addr *guest_addr, int guest_port) { if (!check_guestfwd(slirp, guest_addr, guest_port)) { return -1; } =20 - return add_exec(&slirp->guestfwd_list, chardev, cmdline, *guest_addr, - htons(guest_port)); + add_exec(&slirp->guestfwd_list, cmdline, *guest_addr, htons(guest_port= )); + return 0; +} + +int slirp_add_guestfwd(Slirp *slirp, SlirpWriteCb write_cb, void *opaque, + struct in_addr *guest_addr, int guest_port) +{ + if (!check_guestfwd(slirp, guest_addr, guest_port)) { + return -1; + } + + add_guestfwd(&slirp->guestfwd_list, write_cb, opaque, + *guest_addr, htons(guest_port)); + return 0; } =20 ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int fla= gs) { - if (so->s =3D=3D -1 && so->chardev) { + if (so->s =3D=3D -1 && so->guestfwd) { /* XXX this blocks entire thread. Rewrite to use * qemu_chr_fe_write and background I/O callbacks */ - qemu_chr_fe_write_all(so->chardev, buf, len); + so->guestfwd->write_cb(buf, len, so->guestfwd->opaque); return len; } =20 @@ -1449,7 +1460,7 @@ static void slirp_state_save(QEMUFile *f, void *opaqu= e) struct gfwd_list *ex_ptr; =20 for (ex_ptr =3D slirp->guestfwd_list; ex_ptr; ex_ptr =3D ex_ptr->ex_ne= xt) - if (ex_ptr->ex_chardev) { + if (ex_ptr->write_cb) { struct socket *so; so =3D slirp_find_ctl_socket(slirp, ex_ptr->ex_addr, ntohs(ex_ptr->ex_fport)); @@ -1484,7 +1495,7 @@ static int slirp_state_load(QEMUFile *f, void *opaque= , int version_id) return -EINVAL; } for (ex_ptr =3D slirp->guestfwd_list; ex_ptr; ex_ptr =3D ex_ptr->e= x_next) { - if (ex_ptr->ex_chardev && + if (ex_ptr->write_cb && so->so_faddr.s_addr =3D=3D ex_ptr->ex_addr.s_addr && so->so_fport =3D=3D ex_ptr->ex_fport) { break; diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index 23a841f26e4..4e81736d6fd 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -964,9 +964,9 @@ int tcp_ctl(struct socket *so) for (ex_ptr =3D slirp->guestfwd_list; ex_ptr; ex_ptr =3D ex_ptr->e= x_next) { if (ex_ptr->ex_fport =3D=3D so->so_fport && so->so_faddr.s_addr =3D=3D ex_ptr->ex_addr.s_addr) { - if (ex_ptr->ex_chardev) { + if (ex_ptr->write_cb) { so->s =3D -1; - so->chardev =3D ex_ptr->ex_chardev; + so->guestfwd =3D ex_ptr; return 1; } DEBUG_MISC(" executing %s", ex_ptr->ex_exec); --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547725757007604.8975072765453; Thu, 17 Jan 2019 03:49:17 -0800 (PST) Received: from localhost ([127.0.0.1]:42624 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6Ae-0008Rm-1D for importer@patchew.org; Thu, 17 Jan 2019 06:49:16 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57003) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk65o-00056Z-PW for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk65n-0004CS-Nx for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:16 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59288) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk65n-0004Bs-1N for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:15 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3679680F75; Thu, 17 Jan 2019 11:44:14 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 29BDB19751; Thu, 17 Jan 2019 11:44:12 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:34 +0400 Message-Id: <20190117114359.5164-3-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 17 Jan 2019 11:44:14 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 02/27] net/slirp: simplify checking for cmd: prefix X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau --- net/slirp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/slirp.c b/net/slirp.c index ec07f662c00..b91741b8fc1 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -773,7 +773,7 @@ static int slirp_guestfwd(SlirpState *s, const char *co= nfig_str, Error **errp) =20 snprintf(buf, sizeof(buf), "guestfwd.tcp.%d", port); =20 - if ((strlen(p) > 4) && !strncmp(p, "cmd:", 4)) { + if (g_str_has_prefix(p, "cmd:")) { if (slirp_add_exec(s->slirp, &p[4], &server, port) < 0) { error_setg(errp, "Conflicting/invalid host:port in guest " "forwarding rule '%s'", config_str); --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547725778379385.708852157971; Thu, 17 Jan 2019 03:49:38 -0800 (PST) Received: from localhost ([127.0.0.1]:42626 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6Ay-0000Dx-W6 for importer@patchew.org; Thu, 17 Jan 2019 06:49:37 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57134) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66G-0005S8-7j for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66E-0004TW-93 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:44 -0500 Received: from mx1.redhat.com ([209.132.183.28]:20070) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66D-0004E4-SW for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:42 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CEF37C05D3ED; Thu, 17 Jan 2019 11:44:18 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8B292601A6; Thu, 17 Jan 2019 11:44:17 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:35 +0400 Message-Id: <20190117114359.5164-4-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 17 Jan 2019 11:44:18 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 03/27] net/slirp: free forwarding rules on cleanup X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau --- net/slirp.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/net/slirp.c b/net/slirp.c index b91741b8fc1..750105a466e 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -75,6 +75,13 @@ struct slirp_config_str { char str[1024]; }; =20 +struct GuestFwd { + CharBackend hd; + struct in_addr server; + int port; + Slirp *slirp; +}; + typedef struct SlirpState { NetClientState nc; QTAILQ_ENTRY(SlirpState) entry; @@ -83,6 +90,7 @@ typedef struct SlirpState { #ifndef _WIN32 gchar *smb_dir; #endif + GSList *fwd; } SlirpState; =20 static struct slirp_config_str *slirp_configs; @@ -122,10 +130,19 @@ static void slirp_smb_exit(Notifier *n, void *data) slirp_smb_cleanup(s); } =20 +static void slirp_free_fwd(gpointer data) +{ + struct GuestFwd *fwd =3D data; + + qemu_chr_fe_deinit(&fwd->hd, true); + g_free(data); +} + static void net_slirp_cleanup(NetClientState *nc) { SlirpState *s =3D DO_UPCAST(SlirpState, nc, nc); =20 + g_slist_free_full(s->fwd, slirp_free_fwd); slirp_cleanup(s->slirp); if (s->exit_notifier.notify) { qemu_remove_exit_notifier(&s->exit_notifier); @@ -717,13 +734,6 @@ static int slirp_smb(SlirpState* s, const char *export= ed_dir, =20 #endif /* !defined(_WIN32) */ =20 -struct GuestFwd { - CharBackend hd; - struct in_addr server; - int port; - Slirp *slirp; -}; - static int guestfwd_can_read(void *opaque) { struct GuestFwd *fwd =3D opaque; @@ -814,6 +824,7 @@ static int slirp_guestfwd(SlirpState *s, const char *co= nfig_str, Error **errp) =20 qemu_chr_fe_set_handlers(&fwd->hd, guestfwd_can_read, guestfwd_rea= d, NULL, NULL, fwd, NULL, true); + s->fwd =3D g_slist_append(s->fwd, fwd); } return 0; =20 --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547725608040509.8866570049124; Thu, 17 Jan 2019 03:46:48 -0800 (PST) Received: from localhost ([127.0.0.1]:42603 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk68E-0006mh-2o for importer@patchew.org; Thu, 17 Jan 2019 06:46:46 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57092) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66F-0005R3-2z for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:43 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66D-0004SQ-Bb for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:43 -0500 Received: from mx1.redhat.com ([209.132.183.28]:48918) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66D-0004Fl-50 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:41 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D3744C062EB5; Thu, 17 Jan 2019 11:44:23 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 97C34104810E; Thu, 17 Jan 2019 11:44:22 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:36 +0400 Message-Id: <20190117114359.5164-5-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 17 Jan 2019 11:44:23 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 04/27] net/slirp: fix leaks on forwaring rule registration error X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau --- net/slirp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/net/slirp.c b/net/slirp.c index 750105a466e..0b15f427f5c 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -807,6 +807,7 @@ static int slirp_guestfwd(SlirpState *s, const char *co= nfig_str, Error **errp) qemu_chr_fe_init(&fwd->hd, chr, &err); if (err) { error_propagate(errp, err); + object_unparent(OBJECT(chr)); g_free(fwd); return -1; } @@ -815,6 +816,7 @@ static int slirp_guestfwd(SlirpState *s, const char *co= nfig_str, Error **errp) &server, port) < 0) { error_setg(errp, "Conflicting/invalid host:port in guest " "forwarding rule '%s'", config_str); + qemu_chr_fe_deinit(&fwd->hd, true); g_free(fwd); return -1; } --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547725967501784.6013181993123; Thu, 17 Jan 2019 03:52:47 -0800 (PST) Received: from localhost ([127.0.0.1]:42677 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6E2-0002ZP-D8 for importer@patchew.org; Thu, 17 Jan 2019 06:52:46 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57135) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66G-0005SB-8i for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66D-0004Sn-S7 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:44 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55142) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66D-0004Ii-GK for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:41 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0C3CB37E60; Thu, 17 Jan 2019 11:44:29 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id AE1BE601A6; Thu, 17 Jan 2019 11:44:27 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:37 +0400 Message-Id: <20190117114359.5164-6-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 17 Jan 2019 11:44:29 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 05/27] slirp: add callbacks for timer X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/libslirp.h | 14 +++++++++++--- slirp/slirp.h | 2 +- net/slirp.c | 21 +++++++++++++++++++++ slirp/ip6_icmp.c | 16 +++++++--------- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/slirp/libslirp.h b/slirp/libslirp.h index ea019828e8d..3e75dadfa31 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -6,19 +6,27 @@ typedef struct Slirp Slirp; =20 typedef int (*SlirpWriteCb)(const void *buf, size_t len, void *opaque); +typedef void (*SlirpTimerCb)(void *opaque); =20 /* * Callbacks from slirp - * - * The opaque parameter comes from the opaque parameter given to slirp_ini= t(). */ typedef struct SlirpCb { - /* Send an ethernet frame to the guest network. */ + /* + * Send an ethernet frame to the guest network. The opaque parameter + * is the one given to slirp_init(). + */ void (*output)(void *opaque, const uint8_t *pkt, int pkt_len); /* Print a message for an error due to guest misbehavior. */ void (*guest_error)(const char *msg); /* Return the virtual clock value in nanoseconds */ int64_t (*clock_get_ns)(void); + /* Create a new timer with the given callback and opaque data */ + void *(*timer_new)(SlirpTimerCb cb, void *opaque); + /* Remove and free a timer */ + void (*timer_free)(void *timer); + /* Modify a timer to expire at @expire_time */ + void (*timer_mod)(void *timer, int64_t expire_time); } SlirpCb; =20 =20 diff --git a/slirp/slirp.h b/slirp/slirp.h index 9aa245715dd..17056f4b836 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -193,7 +193,7 @@ struct Slirp { NdpTable ndp_table; =20 GRand *grand; - QEMUTimer *ra_timer; + void *ra_timer; =20 const SlirpCb *cb; void *opaque; diff --git a/net/slirp.c b/net/slirp.c index 0b15f427f5c..c24a779425b 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -168,10 +168,31 @@ static int64_t net_slirp_clock_get_ns(void) return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); } =20 +static void *net_slirp_timer_new(SlirpTimerCb cb, void *opaque) +{ + return timer_new_full(NULL, QEMU_CLOCK_VIRTUAL, + SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL, + cb, opaque); +} + +static void net_slirp_timer_free(void *timer) +{ + timer_del(timer); + timer_free(timer); +} + +static void net_slirp_timer_mod(void *timer, int64_t expire_timer) +{ + timer_mod(timer, expire_timer); +} + static const SlirpCb slirp_cb =3D { .output =3D net_slirp_output, .guest_error =3D net_slirp_guest_error, .clock_get_ns =3D net_slirp_clock_get_ns, + .timer_new =3D net_slirp_timer_new, + .timer_free =3D net_slirp_timer_free, + .timer_mod =3D net_slirp_timer_mod, }; =20 static int net_slirp_init(NetClientState *peer, const char *model, diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c index 5261baae271..e72c57a81dc 100644 --- a/slirp/ip6_icmp.c +++ b/slirp/ip6_icmp.c @@ -16,8 +16,9 @@ static void ra_timer_handler(void *opaque) { Slirp *slirp =3D opaque; - timer_mod(slirp->ra_timer, - slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval); + + slirp->cb->timer_mod(slirp->ra_timer, + slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interv= al); ndp_send_ra(slirp); } =20 @@ -27,11 +28,9 @@ void icmp6_init(Slirp *slirp) return; } =20 - slirp->ra_timer =3D timer_new_full(NULL, QEMU_CLOCK_VIRTUAL, - SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL, - ra_timer_handler, slirp); - timer_mod(slirp->ra_timer, - slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval); + slirp->ra_timer =3D slirp->cb->timer_new(ra_timer_handler, slirp); + slirp->cb->timer_mod(slirp->ra_timer, + slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interv= al); } =20 void icmp6_cleanup(Slirp *slirp) @@ -40,8 +39,7 @@ void icmp6_cleanup(Slirp *slirp) return; } =20 - timer_del(slirp->ra_timer); - timer_free(slirp->ra_timer); + slirp->cb->timer_free(slirp->ra_timer); } =20 static void icmp6_send_echoreply(struct mbuf *m, Slirp *slirp, struct ip6 = *ip, --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 154772602826178.99722462031173; Thu, 17 Jan 2019 03:53:48 -0800 (PST) Received: from localhost ([127.0.0.1]:42684 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6F1-0003Lp-6H for importer@patchew.org; Thu, 17 Jan 2019 06:53:47 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57172) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66H-0005Tn-Tx for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66F-0004Up-9E for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:45 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39456) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66F-0004Q5-04 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:43 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 55F6636809; Thu, 17 Jan 2019 11:44:35 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id A1FB45D757; Thu, 17 Jan 2019 11:44:32 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:38 +0400 Message-Id: <20190117114359.5164-7-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 17 Jan 2019 11:44:35 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 06/27] slirp: replace trace functions with DEBUG calls X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Remove a dependency on QEMU. Use the existing logging facilities. Set SLIRP_DEBUG=3Dtftp to get tftp log. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/debug.h | 13 ++++++++++--- slirp/slirp.c | 1 + slirp/tftp.c | 7 ++++--- Makefile.objs | 1 - slirp/trace-events | 5 ----- 5 files changed, 15 insertions(+), 12 deletions(-) delete mode 100644 slirp/trace-events diff --git a/slirp/debug.h b/slirp/debug.h index 269d97d8073..f6a048450dd 100644 --- a/slirp/debug.h +++ b/slirp/debug.h @@ -8,9 +8,10 @@ #ifndef DEBUG_H_ #define DEBUG_H_ =20 -#define DBG_CALL 0x1 -#define DBG_MISC 0x2 -#define DBG_ERROR 0x4 +#define DBG_CALL (1 << 0) +#define DBG_MISC (1 << 1) +#define DBG_ERROR (1 << 2) +#define DBG_TFTP (1 << 3) =20 extern int slirp_debug; =20 @@ -38,4 +39,10 @@ extern int slirp_debug; } \ } while (0) =20 +#define DEBUG_TFTP(fmt, ...) do { \ + if (slirp_debug & DBG_TFTP) { \ + g_debug(fmt, ##__VA_ARGS__); \ + } \ +} while (0) + #endif /* DEBUG_H_ */ diff --git a/slirp/slirp.c b/slirp/slirp.c index 7b23722d5db..dd72829017f 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -270,6 +270,7 @@ static void slirp_init_once(void) { "call", DBG_CALL }, { "misc", DBG_MISC }, { "error", DBG_ERROR }, + { "tftp", DBG_TFTP }, }; slirp_debug =3D g_parse_debug_string(debug, keys, G_N_ELEMENTS(key= s)); } diff --git a/slirp/tftp.c b/slirp/tftp.c index a9ba1480db4..6fb381ef337 100644 --- a/slirp/tftp.c +++ b/slirp/tftp.c @@ -26,7 +26,6 @@ #include "slirp.h" #include "qemu-common.h" #include "qemu/cutils.h" -#include "trace.h" =20 static inline int tftp_session_in_use(struct tftp_session *spt) { @@ -205,7 +204,8 @@ static void tftp_send_error(struct tftp_session *spt, struct mbuf *m; struct tftp_t *tp; =20 - trace_slirp_tftp_error(msg); + DEBUG_TFTP("tftp error msg: %s", msg); + m =3D m_get(spt->slirp); =20 if (!m) { @@ -325,7 +325,8 @@ static void tftp_handle_rrq(Slirp *slirp, struct sockad= dr_storage *srcsas, break; } } - trace_slirp_tftp_rrq(req_fname); + + DEBUG_TFTP("tftp rrq file: %s", req_fname); =20 /* check mode */ if ((pktlen - k) < 6) { diff --git a/Makefile.objs b/Makefile.objs index 67a054b08af..b7aae33367f 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -192,7 +192,6 @@ trace-events-subdirs +=3D net trace-events-subdirs +=3D qapi trace-events-subdirs +=3D qom trace-events-subdirs +=3D scsi -trace-events-subdirs +=3D slirp trace-events-subdirs +=3D target/arm trace-events-subdirs +=3D target/i386 trace-events-subdirs +=3D target/mips diff --git a/slirp/trace-events b/slirp/trace-events deleted file mode 100644 index ff8f656e8c5..00000000000 --- a/slirp/trace-events +++ /dev/null @@ -1,5 +0,0 @@ -# See docs/devel/tracing.txt for syntax documentation. - -# slirp/tftp.c -slirp_tftp_rrq(const char *file) "file: %s" -slirp_tftp_error(const char *file) "msg: %s" --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547725822387598.8408299172465; Thu, 17 Jan 2019 03:50:22 -0800 (PST) Received: from localhost ([127.0.0.1]:42628 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6Bh-0000p0-8L for importer@patchew.org; Thu, 17 Jan 2019 06:50:21 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57149) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66G-0005SX-LY for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66E-0004Tz-DT for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:44 -0500 Received: from mx1.redhat.com ([209.132.183.28]:35728) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66E-0004Rs-2H for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:42 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8009A80467; Thu, 17 Jan 2019 11:44:40 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 12BC9601A6; Thu, 17 Jan 2019 11:44:38 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:39 +0400 Message-Id: <20190117114359.5164-8-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 17 Jan 2019 11:44:40 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 07/27] slirp: replace QEMU_PACKED with SLIRP_PACKED X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/ip.h | 14 +++++++------- slirp/ip6.h | 4 ++-- slirp/ip6_icmp.h | 16 ++++++++-------- slirp/slirp.h | 5 +++-- slirp/util.h | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 slirp/util.h diff --git a/slirp/ip.h b/slirp/ip.h index 243b6c8b249..cd6ddf2bb7a 100644 --- a/slirp/ip.h +++ b/slirp/ip.h @@ -89,7 +89,7 @@ struct ip { uint8_t ip_p; /* protocol */ uint16_t ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ -} QEMU_PACKED; +} SLIRP_PACKED; =20 #define IP_MAXPACKET 65535 /* maximum packet size */ =20 @@ -151,7 +151,7 @@ struct ip_timestamp { n_long ipt_time; } ipt_ta[1]; } ipt_timestamp; -} QEMU_PACKED; +} SLIRP_PACKED; =20 /* flag bits for ipt_flg */ #define IPOPT_TS_TSONLY 0 /* timestamps only */ @@ -181,11 +181,11 @@ struct ip_timestamp { struct mbuf_ptr { struct mbuf *mptr; uint32_t dummy; -} QEMU_PACKED; +} SLIRP_PACKED; #else struct mbuf_ptr { struct mbuf *mptr; -} QEMU_PACKED; +} SLIRP_PACKED; #endif struct qlink { void *next, *prev; @@ -201,7 +201,7 @@ struct ipovly { uint16_t ih_len; /* protocol length */ struct in_addr ih_src; /* source internet address */ struct in_addr ih_dst; /* destination internet address */ -} QEMU_PACKED; +} SLIRP_PACKED; =20 /* * Ip reassembly queue structure. Each fragment @@ -217,7 +217,7 @@ struct ipq { uint8_t ipq_p; /* protocol of this fragment */ uint16_t ipq_id; /* sequence id for reassembly */ struct in_addr ipq_src,ipq_dst; -} QEMU_PACKED; +} SLIRP_PACKED; =20 /* * Ip header, when holding a fragment. @@ -227,7 +227,7 @@ struct ipq { struct ipasfrag { struct qlink ipf_link; struct ip ipf_ip; -} QEMU_PACKED; +} SLIRP_PACKED; =20 #define ipf_off ipf_ip.ip_off #define ipf_tos ipf_ip.ip_tos diff --git a/slirp/ip6.h b/slirp/ip6.h index 14e9c787357..b6ba0a63927 100644 --- a/slirp/ip6.h +++ b/slirp/ip6.h @@ -133,7 +133,7 @@ struct ip6 { uint8_t ip_nh; /* next header */ uint8_t ip_hl; /* hop limit */ struct in6_addr ip_src, ip_dst; /* source and dest address */ -} QEMU_PACKED; +} SLIRP_PACKED; =20 /* * IPv6 pseudo-header used by upper-layer protocols @@ -145,7 +145,7 @@ struct ip6_pseudohdr { uint16_t ih_zero_hi; /* zero */ uint8_t ih_zero_lo; /* zero */ uint8_t ih_nh; /* next header */ -} QEMU_PACKED; +} SLIRP_PACKED; =20 =20 #endif diff --git a/slirp/ip6_icmp.h b/slirp/ip6_icmp.h index 32b0914055a..1f09b485e32 100644 --- a/slirp/ip6_icmp.h +++ b/slirp/ip6_icmp.h @@ -48,12 +48,12 @@ struct ndp_ra { /* Router Advertisement Message */ uint16_t lifetime; /* Router Lifetime */ uint32_t reach_time; /* Reachable Time */ uint32_t retrans_time; /* Retrans Timer */ -} QEMU_PACKED; +} SLIRP_PACKED; =20 struct ndp_ns { /* Neighbor Solicitation Message */ uint32_t reserved; struct in6_addr target; /* Target Address */ -} QEMU_PACKED; +} SLIRP_PACKED; =20 struct ndp_na { /* Neighbor Advertisement Message */ #if G_BYTE_ORDER =3D=3D G_BIG_ENDIAN @@ -72,13 +72,13 @@ struct ndp_na { /* Neighbor Advertisement Message */ reserved_lo:24; #endif struct in6_addr target; /* Target Address */ -} QEMU_PACKED; +} SLIRP_PACKED; =20 struct ndp_redirect { uint32_t reserved; struct in6_addr target; /* Target Address */ struct in6_addr dest; /* Destination Address */ -} QEMU_PACKED; +} SLIRP_PACKED; =20 /* * Structure of an icmpv6 header. @@ -103,7 +103,7 @@ struct icmp6 { #define icmp6_nns icmp6_body.ndp_ns #define icmp6_nna icmp6_body.ndp_na #define icmp6_redirect icmp6_body.ndp_redirect -} QEMU_PACKED; +} SLIRP_PACKED; =20 #define ICMP6_MINLEN 4 #define ICMP6_ERROR_MINLEN 8 @@ -134,16 +134,16 @@ struct ndpopt { uint32_t pref_lt; /* Preferred Lifetime */ uint32_t reserved2; struct in6_addr prefix; - } QEMU_PACKED prefixinfo; + } SLIRP_PACKED prefixinfo; #define ndpopt_prefixinfo ndpopt_body.prefixinfo struct rdnss { uint16_t reserved; uint32_t lifetime; struct in6_addr addr; - } QEMU_PACKED rdnss; + } SLIRP_PACKED rdnss; #define ndpopt_rdnss ndpopt_body.rdnss } ndpopt_body; -} QEMU_PACKED; +} SLIRP_PACKED; =20 /* NDP options type */ #define NDPOPT_LINKLAYER_SOURCE 1 /* Source Link-Layer Address */ diff --git a/slirp/slirp.h b/slirp/slirp.h index 17056f4b836..67ff4d610c4 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -45,6 +45,7 @@ typedef char *caddr_t; #define quehead slirp_quehead =20 #include "debug.h" +#include "util.h" =20 #include "qemu/queue.h" #include "qemu/sockets.h" @@ -93,7 +94,7 @@ struct slirp_arphdr { uint32_t ar_sip; /* sender IP address */ unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ uint32_t ar_tip; /* target IP address */ -} QEMU_PACKED; +} SLIRP_PACKED; =20 #define ARP_TABLE_SIZE 16 =20 @@ -110,7 +111,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 */ -} QEMU_PACKED; +} SLIRP_PACKED; =20 #define NDP_TABLE_SIZE 16 =20 diff --git a/slirp/util.h b/slirp/util.h new file mode 100644 index 00000000000..00291c30a67 --- /dev/null +++ b/slirp/util.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003-2008 Fabrice Bellard + * Copyright (c) 2010-2019 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"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * 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 OT= HER + * 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 UTIL_H_ +#define UTIL_H_ + +#if defined(_WIN32) +# define SLIRP_PACKED __attribute__((gcc_struct, packed)) +#else +# define SLIRP_PACKED __attribute__((packed)) +#endif + +#endif --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726157349591.3471215478772; Thu, 17 Jan 2019 03:55:57 -0800 (PST) Received: from localhost ([127.0.0.1]:42736 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6H6-00057O-75 for importer@patchew.org; Thu, 17 Jan 2019 06:55:56 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57247) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66M-0005YE-DL for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66K-0004cW-Bm for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:50 -0500 Received: from mx1.redhat.com ([209.132.183.28]:49156) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66J-0004Z6-H4 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:48 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 32479C0528AA; Thu, 17 Jan 2019 11:44:46 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2452819751; Thu, 17 Jan 2019 11:44:43 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:40 +0400 Message-Id: <20190117114359.5164-9-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 17 Jan 2019 11:44:46 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 08/27] slirp: replace most qemu socket utilities with slirp own version X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" qemu_set_nonblock() is slightly more problematic and will be dealt with in a separate patch. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/util.h | 59 +++++++++++++++ slirp/ip_icmp.c | 6 +- slirp/misc.c | 20 ++--- slirp/socket.c | 18 ++--- slirp/tcp_subr.c | 18 ++--- slirp/udp.c | 8 +- slirp/util.c | 176 ++++++++++++++++++++++++++++++++++++++++++++ slirp/Makefile.objs | 1 + 8 files changed, 271 insertions(+), 35 deletions(-) create mode 100644 slirp/util.c diff --git a/slirp/util.h b/slirp/util.h index 00291c30a67..050ca7f1a3f 100644 --- a/slirp/util.h +++ b/slirp/util.h @@ -23,10 +23,69 @@ #ifndef UTIL_H_ #define UTIL_H_ =20 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#else +#include +#include +#include +#endif + #if defined(_WIN32) # define SLIRP_PACKED __attribute__((gcc_struct, packed)) #else # define SLIRP_PACKED __attribute__((packed)) #endif =20 +#ifdef _WIN32 +int slirp_closesocket(int fd); +int slirp_ioctlsocket(int fd, int req, void *val); +int inet_aton(const char *cp, struct in_addr *ia); +#define slirp_getsockopt(sockfd, level, optname, optval, optlen) \ + getsockopt(sockfd, level, optname, (void *)optval, optlen) +#define slirp_setsockopt(sockfd, level, optname, optval, optlen) \ + setsockopt(sockfd, level, optname, (const void *)optval, optlen) +#define slirp_recv(sockfd, buf, len, flags) recv(sockfd, (void *)buf, len,= flags) +#else +#define slirp_setsockopt setsockopt +#define slirp_getsockopt getsockopt +#define slirp_recv recv +#define slirp_closesocket close +#define slirp_ioctlsocket ioctl +#endif + +int slirp_socket(int domain, int type, int protocol); + +static inline int slirp_socket_set_nodelay(int fd) +{ + int v =3D 1; + return slirp_setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v)); +} + +static inline int slirp_socket_set_fast_reuse(int fd) +{ +#ifndef _WIN32 + int v =3D 1; + return slirp_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(v)); +#else + /* Enabling the reuse of an endpoint that was used by a socket still in + * TIME_WAIT state is usually performed by setting SO_REUSEADDR. On Wi= ndows + * fast reuse is the default and SO_REUSEADDR does strange things. So = we + * don't have to do anything here. More info can be found at: + * http://msdn.microsoft.com/en-us/library/windows/desktop/ms740621.as= px */ + return 0; +#endif +} + #endif diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c index 7c7e042049d..b59daa801d1 100644 --- a/slirp/ip_icmp.c +++ b/slirp/ip_icmp.c @@ -83,7 +83,7 @@ static int icmp_send(struct socket *so, struct mbuf *m, i= nt hlen) struct ip *ip =3D mtod(m, struct ip *); struct sockaddr_in addr; =20 - so->s =3D qemu_socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP); + so->s =3D slirp_socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP); if (so->s =3D=3D -1) { return -1; } @@ -114,7 +114,7 @@ static int icmp_send(struct socket *so, struct mbuf *m,= int hlen) =20 void icmp_detach(struct socket *so) { - closesocket(so->s); + slirp_closesocket(so->s); sofree(so); } =20 @@ -421,7 +421,7 @@ void icmp_receive(struct socket *so) icp =3D mtod(m, struct icmp *); =20 id =3D icp->icmp_id; - len =3D qemu_recv(so->s, icp, M_ROOM(m), 0); + len =3D slirp_recv(so->s, icp, M_ROOM(m), 0); /* * The behavior of reading SOCK_DGRAM+IPPROTO_ICMP sockets is inconsis= tent * between host OSes. On Linux, only the ICMP header and payload is diff --git a/slirp/misc.c b/slirp/misc.c index b8a2bf971af..32ec02a5251 100644 --- a/slirp/misc.c +++ b/slirp/misc.c @@ -72,14 +72,14 @@ slirp_socketpair_with_oob(int sv[2]) int ret, s; =20 sv[1] =3D -1; - s =3D qemu_socket(AF_INET, SOCK_STREAM, 0); + s =3D slirp_socket(AF_INET, SOCK_STREAM, 0); if (s < 0 || bind(s, (struct sockaddr *)&addr, addrlen) < 0 || listen(s, 1) < 0 || getsockname(s, (struct sockaddr *)&addr, &addrlen) < 0) { goto err; } =20 - sv[1] =3D qemu_socket(AF_INET, SOCK_STREAM, 0); + sv[1] =3D slirp_socket(AF_INET, SOCK_STREAM, 0); if (sv[1] < 0) { goto err; } @@ -102,16 +102,16 @@ slirp_socketpair_with_oob(int sv[2]) goto err; } =20 - closesocket(s); + slirp_closesocket(s); return 0; =20 err: g_critical("slirp_socketpair(): %s", strerror(errno)); if (s >=3D 0) { - closesocket(s); + slirp_closesocket(s); } if (sv[1] >=3D 0) { - closesocket(sv[1]); + slirp_closesocket(sv[1]); } return -1; } @@ -153,16 +153,16 @@ fork_exec(struct socket *so, const char *ex) if (err) { g_critical("fork_exec: %s", err->message); g_error_free(err); - closesocket(sp[0]); - closesocket(sp[1]); + slirp_closesocket(sp[0]); + slirp_closesocket(sp[1]); return 0; } =20 so->s =3D sp[0]; - closesocket(sp[1]); - socket_set_fast_reuse(so->s); + slirp_closesocket(sp[1]); + slirp_socket_set_fast_reuse(so->s); opt =3D 1; - qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); + slirp_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); qemu_set_nonblock(so->s); return 1; } diff --git a/slirp/socket.c b/slirp/socket.c index 5ffbaa064a5..5805d30f3d8 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -187,7 +187,7 @@ soread(struct socket *so) */ sopreprbuf(so, iov, &n); =20 - nn =3D qemu_recv(so->s, iov[0].iov_base, iov[0].iov_len,0); + nn =3D slirp_recv(so->s, iov[0].iov_base, iov[0].iov_len,0); if (nn <=3D 0) { if (nn < 0 && (errno =3D=3D EINTR || errno =3D=3D EAGAIN)) return 0; @@ -203,7 +203,7 @@ soread(struct socket *so) if (getpeername(so->s, paddr, &alen) < 0) { err =3D errno; } else { - getsockopt(so->s, SOL_SOCKET, SO_ERROR, + slirp_getsockopt(so->s, SOL_SOCKET, SO_ERROR, &err, &elen); } } @@ -233,7 +233,7 @@ soread(struct socket *so) */ if (n =3D=3D 2 && nn =3D=3D iov[0].iov_len) { int ret; - ret =3D qemu_recv(so->s, iov[1].iov_base, iov[1].iov_len,0); + ret =3D slirp_recv(so->s, iov[1].iov_base, iov[1].iov_len,0); if (ret > 0) nn +=3D ret; } @@ -554,7 +554,7 @@ sorecvfrom(struct socket *so) */ len =3D M_FREEROOM(m); /* if (so->so_fport !=3D htons(53)) { */ - ioctlsocket(so->s, FIONREAD, &n); + slirp_ioctlsocket(so->s, FIONREAD, &n); =20 if (n > len) { n =3D (m->m_data - m->m_dat) + m->m_len + n + 1; @@ -719,14 +719,14 @@ tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport,= uint32_t laddr, addr.sin_addr.s_addr =3D haddr; addr.sin_port =3D hport; =20 - if (((s =3D qemu_socket(AF_INET,SOCK_STREAM,0)) < 0) || - (socket_set_fast_reuse(s) < 0) || + if (((s =3D slirp_socket(AF_INET,SOCK_STREAM,0)) < 0) || + (slirp_socket_set_fast_reuse(s) < 0) || (bind(s,(struct sockaddr *)&addr, sizeof(addr)) < 0) || (listen(s,1) < 0)) { int tmperrno =3D errno; /* Don't clobber the real reason we failed */ =20 if (s >=3D 0) { - closesocket(s); + slirp_closesocket(s); } sofree(so); /* Restore the real errno */ @@ -737,9 +737,9 @@ tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, u= int32_t laddr, #endif return NULL; } - qemu_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); + slirp_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); opt =3D 1; - qemu_setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int)); + slirp_setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int)); =20 getsockname(s,(struct sockaddr *)&addr,&addrlen); so->so_ffamily =3D AF_INET; diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index 4e81736d6fd..3567f320ff0 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -337,7 +337,7 @@ tcp_close(struct tcpcb *tp) /* clobber input socket cache if we're closing the cached connection */ if (so =3D=3D slirp->tcp_last_so) slirp->tcp_last_so =3D &slirp->tcb; - closesocket(so->s); + slirp_closesocket(so->s); sbfree(&so->so_rcv); sbfree(&so->so_snd); sofree(so); @@ -407,17 +407,17 @@ int tcp_fconnect(struct socket *so, unsigned short af) DEBUG_CALL("tcp_fconnect"); DEBUG_ARG("so =3D %p", so); =20 - ret =3D so->s =3D qemu_socket(af, SOCK_STREAM, 0); + ret =3D so->s =3D slirp_socket(af, SOCK_STREAM, 0); if (ret >=3D 0) { int opt, s=3Dso->s; struct sockaddr_storage addr; =20 qemu_set_nonblock(s); - socket_set_fast_reuse(s); + slirp_socket_set_fast_reuse(s); opt =3D 1; - qemu_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(opt)); + slirp_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(opt)); opt =3D 1; - qemu_setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)); + slirp_setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)); =20 addr =3D so->fhost.ss; DEBUG_CALL(" connect()ing"); @@ -485,10 +485,10 @@ void tcp_connect(struct socket *inso) return; } qemu_set_nonblock(s); - socket_set_fast_reuse(s); + slirp_socket_set_fast_reuse(s); opt =3D 1; - qemu_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); - socket_set_nodelay(s); + slirp_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); + slirp_socket_set_nodelay(s); =20 so->fhost.ss =3D addr; sotranslate_accept(so); @@ -496,7 +496,7 @@ void tcp_connect(struct socket *inso) /* Close the accept() socket, set right state */ if (inso->so_state & SS_FACCEPTONCE) { /* If we only accept once, close the accept() socket */ - closesocket(so->s); + slirp_closesocket(so->s); =20 /* Don't select it yet, even though we have an FD */ /* if it's not FACCEPTONCE, it's already NOFDREF */ diff --git a/slirp/udp.c b/slirp/udp.c index 309feb9aaef..6c3fb9a29ff 100644 --- a/slirp/udp.c +++ b/slirp/udp.c @@ -281,7 +281,7 @@ int udp_output(struct socket *so, struct mbuf *m, int udp_attach(struct socket *so, unsigned short af) { - so->s =3D qemu_socket(af, SOCK_DGRAM, 0); + so->s =3D slirp_socket(af, SOCK_DGRAM, 0); if (so->s !=3D -1) { so->so_expire =3D curtime + SO_EXPIRE; insque(so, &so->slirp->udb); @@ -292,7 +292,7 @@ udp_attach(struct socket *so, unsigned short af) void udp_detach(struct socket *so) { - closesocket(so->s); + slirp_closesocket(so->s); sofree(so); } =20 @@ -327,7 +327,7 @@ udp_listen(Slirp *slirp, uint32_t haddr, u_int hport, u= int32_t laddr, socklen_t addrlen =3D sizeof(struct sockaddr_in); =20 so =3D socreate(slirp); - so->s =3D qemu_socket(AF_INET,SOCK_DGRAM,0); + so->s =3D slirp_socket(AF_INET,SOCK_DGRAM,0); if (so->s < 0) { sofree(so); return NULL; @@ -343,7 +343,7 @@ udp_listen(Slirp *slirp, uint32_t haddr, u_int hport, u= int32_t laddr, udp_detach(so); return NULL; } - socket_set_fast_reuse(so->s); + slirp_socket_set_fast_reuse(so->s); =20 getsockname(so->s,(struct sockaddr *)&addr,&addrlen); so->fhost.sin =3D addr; diff --git a/slirp/util.c b/slirp/util.c new file mode 100644 index 00000000000..b1a36b27bc5 --- /dev/null +++ b/slirp/util.c @@ -0,0 +1,176 @@ +/* + * util.c (mostly based on QEMU os-win32.c) + * + * Copyright (c) 2003-2008 Fabrice Bellard + * Copyright (c) 2010-2016 Red Hat, Inc. + * + * QEMU library functions for win32 which are shared between QEMU and + * the QEMU tools. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * 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 OT= HER + * 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 "util.h" + +#include +#include +#include + +#if defined(_WIN32) && !defined(WITH_QEMU) +int inet_aton(const char *cp, struct in_addr *ia) +{ + uint32_t addr =3D inet_addr(cp); + if (addr =3D=3D 0xffffffff) { + return 0; + } + ia->s_addr =3D addr; + return 1; +} +#endif + +static void slirp_set_cloexec(int fd) +{ +#ifndef _WIN32 + int f; + f =3D fcntl(fd, F_GETFD); + assert(f !=3D -1); + f =3D fcntl(fd, F_SETFD, f | FD_CLOEXEC); + assert(f !=3D -1); +#endif +} + +/* + * Opens a socket with FD_CLOEXEC set + */ +int slirp_socket(int domain, int type, int protocol) +{ + int ret; + +#ifdef SOCK_CLOEXEC + ret =3D socket(domain, type | SOCK_CLOEXEC, protocol); + if (ret !=3D -1 || errno !=3D EINVAL) { + return ret; + } +#endif + ret =3D socket(domain, type, protocol); + if (ret >=3D 0) { + slirp_set_cloexec(ret); + } + + return ret; +} + +#ifdef _WIN32 +static int socket_error(void) +{ + switch (WSAGetLastError()) { + case 0: + return 0; + case WSAEINTR: + return EINTR; + case WSAEINVAL: + return EINVAL; + case WSA_INVALID_HANDLE: + return EBADF; + case WSA_NOT_ENOUGH_MEMORY: + return ENOMEM; + case WSA_INVALID_PARAMETER: + return EINVAL; + case WSAENAMETOOLONG: + return ENAMETOOLONG; + case WSAENOTEMPTY: + return ENOTEMPTY; + case WSAEWOULDBLOCK: + /* not using EWOULDBLOCK as we don't want code to have + * to check both EWOULDBLOCK and EAGAIN */ + return EAGAIN; + case WSAEINPROGRESS: + return EINPROGRESS; + case WSAEALREADY: + return EALREADY; + case WSAENOTSOCK: + return ENOTSOCK; + case WSAEDESTADDRREQ: + return EDESTADDRREQ; + case WSAEMSGSIZE: + return EMSGSIZE; + case WSAEPROTOTYPE: + return EPROTOTYPE; + case WSAENOPROTOOPT: + return ENOPROTOOPT; + case WSAEPROTONOSUPPORT: + return EPROTONOSUPPORT; + case WSAEOPNOTSUPP: + return EOPNOTSUPP; + case WSAEAFNOSUPPORT: + return EAFNOSUPPORT; + case WSAEADDRINUSE: + return EADDRINUSE; + case WSAEADDRNOTAVAIL: + return EADDRNOTAVAIL; + case WSAENETDOWN: + return ENETDOWN; + case WSAENETUNREACH: + return ENETUNREACH; + case WSAENETRESET: + return ENETRESET; + case WSAECONNABORTED: + return ECONNABORTED; + case WSAECONNRESET: + return ECONNRESET; + case WSAENOBUFS: + return ENOBUFS; + case WSAEISCONN: + return EISCONN; + case WSAENOTCONN: + return ENOTCONN; + case WSAETIMEDOUT: + return ETIMEDOUT; + case WSAECONNREFUSED: + return ECONNREFUSED; + case WSAELOOP: + return ELOOP; + case WSAEHOSTUNREACH: + return EHOSTUNREACH; + default: + return EIO; + } +} + +#undef ioctlsocket +int slirp_ioctlsocket(int fd, int req, void *val) +{ + int ret; + ret =3D ioctlsocket(fd, req, val); + if (ret < 0) { + errno =3D socket_error(); + } + return ret; +} + +#undef closesocket +int slirp_closesocket(int fd) +{ + int ret; + ret =3D closesocket(fd); + if (ret < 0) { + errno =3D socket_error(); + } + return ret; +} +#endif /* WIN32 */ diff --git a/slirp/Makefile.objs b/slirp/Makefile.objs index 959558c7328..38ebdb416e3 100644 --- a/slirp/Makefile.objs +++ b/slirp/Makefile.objs @@ -27,6 +27,7 @@ slirp.mo-objs =3D \ tftp.o \ udp.o \ udp6.o \ + util.o \ $(NULL) =20 slirp.mo-cflags =3D -DG_LOG_DOMAIN=3D\"Slirp\" --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726347050666.8976815983025; Thu, 17 Jan 2019 03:59:07 -0800 (PST) Received: from localhost ([127.0.0.1]:42761 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6K9-0007Si-UR for importer@patchew.org; Thu, 17 Jan 2019 06:59:05 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57327) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66S-0005cl-Nj for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66P-0004i2-0X for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:55 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59608) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66O-0004fg-O7 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:44:52 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2137680F75; Thu, 17 Jan 2019 11:44:51 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id E31AF5D9CA; Thu, 17 Jan 2019 11:44:49 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:41 +0400 Message-Id: <20190117114359.5164-10-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 17 Jan 2019 11:44:51 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 09/27] slirp: replace qemu_set_nonblock() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Replace qemu_set_nonblock() with slirp_set_nonblock() qemu_set_nonblock() does some event registration with the main loop. Add a new callback register_poll_fd() for that reason. Always build the fd-register stub, to avoid #if WIN32. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/libslirp.h | 2 ++ slirp/util.h | 1 + net/slirp.c | 6 ++++++ slirp/misc.c | 3 ++- slirp/tcp_subr.c | 6 ++++-- slirp/util.c | 12 ++++++++++++ stubs/Makefile.objs | 2 +- 7 files changed, 28 insertions(+), 4 deletions(-) diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 3e75dadfa31..70e99139bf6 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -27,6 +27,8 @@ typedef struct SlirpCb { void (*timer_free)(void *timer); /* Modify a timer to expire at @expire_time */ void (*timer_mod)(void *timer, int64_t expire_time); + /* Register a fd for future polling */ + void (*register_poll_fd)(int fd); } SlirpCb; =20 =20 diff --git a/slirp/util.h b/slirp/util.h index 050ca7f1a3f..782ae8ef0ee 100644 --- a/slirp/util.h +++ b/slirp/util.h @@ -66,6 +66,7 @@ int inet_aton(const char *cp, struct in_addr *ia); #endif =20 int slirp_socket(int domain, int type, int protocol); +void slirp_set_nonblock(int fd); =20 static inline int slirp_socket_set_nodelay(int fd) { diff --git a/net/slirp.c b/net/slirp.c index c24a779425b..6f756a4dccc 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -186,6 +186,11 @@ static void net_slirp_timer_mod(void *timer, int64_t e= xpire_timer) timer_mod(timer, expire_timer); } =20 +static void net_slirp_register_poll_fd(int fd) +{ + qemu_fd_register(fd); +} + static const SlirpCb slirp_cb =3D { .output =3D net_slirp_output, .guest_error =3D net_slirp_guest_error, @@ -193,6 +198,7 @@ static const SlirpCb slirp_cb =3D { .timer_new =3D net_slirp_timer_new, .timer_free =3D net_slirp_timer_free, .timer_mod =3D net_slirp_timer_mod, + .register_poll_fd =3D net_slirp_register_poll_fd, }; =20 static int net_slirp_init(NetClientState *peer, const char *model, diff --git a/slirp/misc.c b/slirp/misc.c index 32ec02a5251..4ee20a10e44 100644 --- a/slirp/misc.c +++ b/slirp/misc.c @@ -163,7 +163,8 @@ fork_exec(struct socket *so, const char *ex) slirp_socket_set_fast_reuse(so->s); opt =3D 1; slirp_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); - qemu_set_nonblock(so->s); + slirp_set_nonblock(so->s); + so->slirp->cb->register_poll_fd(so->s); return 1; } =20 diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index 3567f320ff0..8087ffc047f 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -412,7 +412,8 @@ int tcp_fconnect(struct socket *so, unsigned short af) int opt, s=3Dso->s; struct sockaddr_storage addr; =20 - qemu_set_nonblock(s); + slirp_set_nonblock(s); + so->slirp->cb->register_poll_fd(so->s); slirp_socket_set_fast_reuse(s); opt =3D 1; slirp_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(opt)); @@ -484,7 +485,8 @@ void tcp_connect(struct socket *inso) tcp_close(sototcpcb(so)); /* This will sofree() as well */ return; } - qemu_set_nonblock(s); + slirp_set_nonblock(s); + so->slirp->cb->register_poll_fd(so->s); slirp_socket_set_fast_reuse(s); opt =3D 1; slirp_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); diff --git a/slirp/util.c b/slirp/util.c index b1a36b27bc5..499c5cea46f 100644 --- a/slirp/util.c +++ b/slirp/util.c @@ -43,6 +43,18 @@ int inet_aton(const char *cp, struct in_addr *ia) } #endif =20 +void slirp_set_nonblock(int fd) +{ +#ifndef _WIN32 + int f; + f =3D fcntl(fd, F_GETFL); + fcntl(fd, F_SETFL, f | O_NONBLOCK); +#else + unsigned long opt =3D 1; + ioctlsocket(fd, FIONBIO, &opt); +#endif +} + static void slirp_set_cloexec(int fd) { #ifndef _WIN32 diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs index 5dd0aeeec69..cda0efa4e86 100644 --- a/stubs/Makefile.objs +++ b/stubs/Makefile.objs @@ -33,7 +33,7 @@ stub-obj-y +=3D trace-control.o stub-obj-y +=3D uuid.o stub-obj-y +=3D vm-stop.o stub-obj-y +=3D vmstate.o -stub-obj-$(CONFIG_WIN32) +=3D fd-register.o +stub-obj-y +=3D fd-register.o stub-obj-y +=3D qmp_memory_device.o stub-obj-y +=3D target-monitor-defs.o stub-obj-y +=3D target-get-monitor-def.o --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547725643353247.0268130759174; Thu, 17 Jan 2019 03:47:23 -0800 (PST) Received: from localhost ([127.0.0.1]:42605 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk68m-0007Ar-LK for importer@patchew.org; Thu, 17 Jan 2019 06:47:20 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57391) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66e-0005p9-Al for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66c-0004tj-8X for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:08 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55420) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66a-0004lo-8C for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:06 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6B9A737E60; Thu, 17 Jan 2019 11:44:56 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id D699960933; Thu, 17 Jan 2019 11:44:54 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:42 +0400 Message-Id: <20190117114359.5164-11-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 17 Jan 2019 11:44:56 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 10/27] slirp: add unregister_poll_fd() callback X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Add a counter-part to register_poll_fd() for completeness. (so far, register_poll_fd() is called only on struct socket fd) Suggested-by: Paolo Bonzini Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/libslirp.h | 2 ++ net/slirp.c | 6 ++++++ slirp/ip_icmp.c | 1 + slirp/slirp.c | 3 ++- slirp/tcp_subr.c | 2 ++ slirp/udp.c | 1 + 6 files changed, 14 insertions(+), 1 deletion(-) diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 70e99139bf6..8ce69f0be39 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -29,6 +29,8 @@ typedef struct SlirpCb { void (*timer_mod)(void *timer, int64_t expire_time); /* Register a fd for future polling */ void (*register_poll_fd)(int fd); + /* Unregister a fd */ + void (*unregister_poll_fd)(int fd); } SlirpCb; =20 =20 diff --git a/net/slirp.c b/net/slirp.c index 6f756a4dccc..78ba96b63f7 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -191,6 +191,11 @@ static void net_slirp_register_poll_fd(int fd) qemu_fd_register(fd); } =20 +static void net_slirp_unregister_poll_fd(int fd) +{ + /* no qemu_fd_unregister */ +} + static const SlirpCb slirp_cb =3D { .output =3D net_slirp_output, .guest_error =3D net_slirp_guest_error, @@ -199,6 +204,7 @@ static const SlirpCb slirp_cb =3D { .timer_free =3D net_slirp_timer_free, .timer_mod =3D net_slirp_timer_mod, .register_poll_fd =3D net_slirp_register_poll_fd, + .unregister_poll_fd =3D net_slirp_unregister_poll_fd, }; =20 static int net_slirp_init(NetClientState *peer, const char *model, diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c index b59daa801d1..19e247f773e 100644 --- a/slirp/ip_icmp.c +++ b/slirp/ip_icmp.c @@ -114,6 +114,7 @@ static int icmp_send(struct socket *so, struct mbuf *m,= int hlen) =20 void icmp_detach(struct socket *so) { + so->slirp->cb->unregister_poll_fd(so->s); slirp_closesocket(so->s); sofree(so); } diff --git a/slirp/slirp.c b/slirp/slirp.c index dd72829017f..fdf26d5e626 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -1015,7 +1015,8 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, st= ruct in_addr host_addr, getsockname(so->s, (struct sockaddr *)&addr, &addr_len) =3D=3D= 0 && addr.sin_addr.s_addr =3D=3D host_addr.s_addr && addr.sin_port =3D=3D port) { - close(so->s); + so->slirp->cb->unregister_poll_fd(so->s); + slirp_closesocket(so->s); sofree(so); return 0; } diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index 8087ffc047f..d8846a33b0c 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -337,6 +337,7 @@ tcp_close(struct tcpcb *tp) /* clobber input socket cache if we're closing the cached connection */ if (so =3D=3D slirp->tcp_last_so) slirp->tcp_last_so =3D &slirp->tcb; + so->slirp->cb->unregister_poll_fd(so->s); slirp_closesocket(so->s); sbfree(&so->so_rcv); sbfree(&so->so_snd); @@ -498,6 +499,7 @@ void tcp_connect(struct socket *inso) /* Close the accept() socket, set right state */ if (inso->so_state & SS_FACCEPTONCE) { /* If we only accept once, close the accept() socket */ + so->slirp->cb->unregister_poll_fd(so->s); slirp_closesocket(so->s); =20 /* Don't select it yet, even though we have an FD */ diff --git a/slirp/udp.c b/slirp/udp.c index 6c3fb9a29ff..3915971b506 100644 --- a/slirp/udp.c +++ b/slirp/udp.c @@ -292,6 +292,7 @@ udp_attach(struct socket *so, unsigned short af) void udp_detach(struct socket *so) { + so->slirp->cb->unregister_poll_fd(so->s); slirp_closesocket(so->s); sofree(so); } --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547725867563531.5760373853906; Thu, 17 Jan 2019 03:51:07 -0800 (PST) Received: from localhost ([127.0.0.1]:42657 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6CI-0001Gz-Pm for importer@patchew.org; Thu, 17 Jan 2019 06:50:58 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57392) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66e-0005pA-Av for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66a-0004sO-95 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:08 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55426) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66Y-0004pa-9m for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:04 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 54868C056794; Thu, 17 Jan 2019 11:45:01 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4B17F19C7F; Thu, 17 Jan 2019 11:44:59 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:43 +0400 Message-Id: <20190117114359.5164-12-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 17 Jan 2019 11:45:01 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 11/27] slirp: replace qemu_notify_event() with a callback X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Introduce a SlirpCb callback to kick the main io-thread. Add an intermediary sodrop() function that will call SlirpCb.notify callback when sbdrop() returns true. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/libslirp.h | 2 ++ slirp/sbuf.h | 2 +- slirp/socket.h | 1 + net/slirp.c | 1 + slirp/sbuf.c | 6 ++++-- slirp/socket.c | 7 +++++++ slirp/tcp_input.c | 6 +++--- 7 files changed, 19 insertions(+), 6 deletions(-) diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 8ce69f0be39..679a25422b9 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -31,6 +31,8 @@ typedef struct SlirpCb { void (*register_poll_fd)(int fd); /* Unregister a fd */ void (*unregister_poll_fd)(int fd); + /* Kick the io-thread, to signal that new events may be processed */ + void (*notify)(void); } SlirpCb; =20 =20 diff --git a/slirp/sbuf.h b/slirp/sbuf.h index 644c2013413..1cb9a428341 100644 --- a/slirp/sbuf.h +++ b/slirp/sbuf.h @@ -21,7 +21,7 @@ struct sbuf { }; =20 void sbfree(struct sbuf *); -void sbdrop(struct sbuf *, int); +bool sbdrop(struct sbuf *, int); void sbreserve(struct sbuf *, int); void sbappend(struct socket *, struct mbuf *); void sbcopy(struct sbuf *, int, int, char *); diff --git a/slirp/socket.h b/slirp/socket.h index fc35ca5f72a..1c1c8b5871c 100644 --- a/slirp/socket.h +++ b/slirp/socket.h @@ -156,6 +156,7 @@ int soreadbuf(struct socket *so, const char *buf, int s= ize); void sotranslate_out(struct socket *, struct sockaddr_storage *); void sotranslate_in(struct socket *, struct sockaddr_storage *); void sotranslate_accept(struct socket *); +void sodrop(struct socket *, int num); =20 =20 #endif /* SLIRP_SOCKET_H */ diff --git a/net/slirp.c b/net/slirp.c index 78ba96b63f7..7b4f9f5c5ee 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -205,6 +205,7 @@ static const SlirpCb slirp_cb =3D { .timer_mod =3D net_slirp_timer_mod, .register_poll_fd =3D net_slirp_register_poll_fd, .unregister_poll_fd =3D net_slirp_unregister_poll_fd, + .notify =3D qemu_notify_event, }; =20 static int net_slirp_init(NetClientState *peer, const char *model, diff --git a/slirp/sbuf.c b/slirp/sbuf.c index 912f235f652..17f28e97a63 100644 --- a/slirp/sbuf.c +++ b/slirp/sbuf.c @@ -17,7 +17,7 @@ sbfree(struct sbuf *sb) free(sb->sb_data); } =20 -void +bool sbdrop(struct sbuf *sb, int num) { int limit =3D sb->sb_datalen / 2; @@ -34,8 +34,10 @@ sbdrop(struct sbuf *sb, int num) sb->sb_rptr -=3D sb->sb_datalen; =20 if (sb->sb_cc < limit && sb->sb_cc + num >=3D limit) { - qemu_notify_event(); + return true; } + + return false; } =20 void diff --git a/slirp/socket.c b/slirp/socket.c index 5805d30f3d8..2e8dc22fb62 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -928,3 +928,10 @@ void sotranslate_accept(struct socket *so) break; } } + +void sodrop(struct socket *s, int num) +{ + if (sbdrop(&s->so_snd, num)) { + s->slirp->cb->notify(); + } +} diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c index de5b74a52b1..7c1fe18fec1 100644 --- a/slirp/tcp_input.c +++ b/slirp/tcp_input.c @@ -506,7 +506,7 @@ findso: SEQ_GT(ti->ti_ack, tp->t_rtseq)) tcp_xmit_timer(tp, tp->t_rtt); acked =3D ti->ti_ack - tp->snd_una; - sbdrop(&so->so_snd, acked); + sodrop(so, acked); tp->snd_una =3D ti->ti_ack; m_free(m); =20 @@ -1118,10 +1118,10 @@ trimthenstep6: } if (acked > so->so_snd.sb_cc) { tp->snd_wnd -=3D so->so_snd.sb_cc; - sbdrop(&so->so_snd, (int )so->so_snd.sb_cc); + sodrop(so, (int)so->so_snd.sb_cc); ourfinisacked =3D 1; } else { - sbdrop(&so->so_snd, acked); + sodrop(so, acked); tp->snd_wnd -=3D acked; ourfinisacked =3D 0; } --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 154772622409664.81956891448738; Thu, 17 Jan 2019 03:57:04 -0800 (PST) Received: from localhost ([127.0.0.1]:42739 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6IA-0005sL-Mg for importer@patchew.org; Thu, 17 Jan 2019 06:57:02 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57572) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66u-00066N-Fh for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66m-000561-11 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52244) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66g-0004wG-Fy for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:12 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4803B9D41A; Thu, 17 Jan 2019 11:45:09 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id EA6C2601A6; Thu, 17 Jan 2019 11:45:04 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:44 +0400 Message-Id: <20190117114359.5164-13-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 17 Jan 2019 11:45:09 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 12/27] slirp: move QEMU state saving to a separate unit X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Make state saving optional: this will allow to build SLIRP without QEMU. (eventually, the vmstate helpers will be extracted, so an external project & process could save its state) Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/slirp.h | 3 + slirp/state.h | 9 + slirp/slirp.c | 372 ++--------------------------------------- slirp/state.c | 394 ++++++++++++++++++++++++++++++++++++++++++++ slirp/Makefile.objs | 3 +- 5 files changed, 419 insertions(+), 362 deletions(-) create mode 100644 slirp/state.h create mode 100644 slirp/state.c diff --git a/slirp/slirp.h b/slirp/slirp.h index 67ff4d610c4..8d9d72ca9d0 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -271,4 +271,7 @@ int tcp_emu(struct socket *, struct mbuf *); int tcp_ctl(struct socket *); struct tcpcb *tcp_drop(struct tcpcb *tp, int err); =20 +struct socket * +slirp_find_ctl_socket(Slirp *slirp, struct in_addr guest_addr, int guest_p= ort); + #endif diff --git a/slirp/state.h b/slirp/state.h new file mode 100644 index 00000000000..154866898f5 --- /dev/null +++ b/slirp/state.h @@ -0,0 +1,9 @@ +#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_ */ diff --git a/slirp/slirp.c b/slirp/slirp.c index fdf26d5e626..5450b52dbf4 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -30,6 +30,10 @@ #include "hw/hw.h" #include "qemu/cutils.h" =20 +#ifdef WITH_QEMU +#include "state.h" +#endif + #ifndef _WIN32 #include #endif @@ -278,14 +282,6 @@ static void slirp_init_once(void) =20 } =20 -static void slirp_state_save(QEMUFile *f, void *opaque); -static int slirp_state_load(QEMUFile *f, void *opaque, int version_id); - -static SaveVMHandlers savevm_slirp_state =3D { - .save_state =3D slirp_state_save, - .load_state =3D slirp_state_load, -}; - Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork, struct in_addr vnetmask, struct in_addr vhost, bool in6_enabled, @@ -341,8 +337,9 @@ Slirp *slirp_init(int restricted, bool in_enabled, stru= ct in_addr vnetwork, =20 slirp->opaque =3D opaque; =20 - register_savevm_live(NULL, "slirp", 0, 4, &savevm_slirp_state, slirp); - +#ifdef WITH_QEMU + slirp_state_register(slirp); +#endif QTAILQ_INSERT_TAIL(&slirp_instances, slirp, entry); =20 return slirp; @@ -359,9 +356,9 @@ void slirp_cleanup(Slirp *slirp) } =20 QTAILQ_REMOVE(&slirp_instances, slirp, entry); - - unregister_savevm(NULL, "slirp", slirp); - +#ifdef WITH_QEMU + slirp_state_unregister(slirp); +#endif ip_cleanup(slirp); ip6_cleanup(slirp); m_cleanup(slirp); @@ -1115,7 +1112,7 @@ ssize_t slirp_send(struct socket *so, const void *buf= , size_t len, int flags) return send(so->s, buf, len, flags); } =20 -static struct socket * +struct socket * slirp_find_ctl_socket(Slirp *slirp, struct in_addr guest_addr, int guest_p= ort) { struct socket *so; @@ -1162,350 +1159,3 @@ void slirp_socket_recv(Slirp *slirp, struct in_addr= guest_addr, int guest_port, if (ret > 0) tcp_output(sototcpcb(so)); } - -static int slirp_tcp_post_load(void *opaque, int version) -{ - tcp_template((struct tcpcb *)opaque); - - return 0; -} - -static const VMStateDescription vmstate_slirp_tcp =3D { - .name =3D "slirp-tcp", - .version_id =3D 0, - .post_load =3D slirp_tcp_post_load, - .fields =3D (VMStateField[]) { - VMSTATE_INT16(t_state, struct tcpcb), - VMSTATE_INT16_ARRAY(t_timer, struct tcpcb, TCPT_NTIMERS), - VMSTATE_INT16(t_rxtshift, struct tcpcb), - VMSTATE_INT16(t_rxtcur, struct tcpcb), - VMSTATE_INT16(t_dupacks, struct tcpcb), - VMSTATE_UINT16(t_maxseg, struct tcpcb), - VMSTATE_UINT8(t_force, struct tcpcb), - VMSTATE_UINT16(t_flags, struct tcpcb), - VMSTATE_UINT32(snd_una, struct tcpcb), - VMSTATE_UINT32(snd_nxt, struct tcpcb), - VMSTATE_UINT32(snd_up, struct tcpcb), - VMSTATE_UINT32(snd_wl1, struct tcpcb), - VMSTATE_UINT32(snd_wl2, struct tcpcb), - VMSTATE_UINT32(iss, struct tcpcb), - VMSTATE_UINT32(snd_wnd, struct tcpcb), - VMSTATE_UINT32(rcv_wnd, struct tcpcb), - VMSTATE_UINT32(rcv_nxt, struct tcpcb), - VMSTATE_UINT32(rcv_up, struct tcpcb), - VMSTATE_UINT32(irs, struct tcpcb), - VMSTATE_UINT32(rcv_adv, struct tcpcb), - VMSTATE_UINT32(snd_max, struct tcpcb), - VMSTATE_UINT32(snd_cwnd, struct tcpcb), - VMSTATE_UINT32(snd_ssthresh, struct tcpcb), - VMSTATE_INT16(t_idle, struct tcpcb), - VMSTATE_INT16(t_rtt, struct tcpcb), - VMSTATE_UINT32(t_rtseq, struct tcpcb), - VMSTATE_INT16(t_srtt, struct tcpcb), - VMSTATE_INT16(t_rttvar, struct tcpcb), - VMSTATE_UINT16(t_rttmin, struct tcpcb), - VMSTATE_UINT32(max_sndwnd, struct tcpcb), - VMSTATE_UINT8(t_oobflags, struct tcpcb), - VMSTATE_UINT8(t_iobc, struct tcpcb), - VMSTATE_INT16(t_softerror, struct tcpcb), - VMSTATE_UINT8(snd_scale, struct tcpcb), - VMSTATE_UINT8(rcv_scale, struct tcpcb), - VMSTATE_UINT8(request_r_scale, struct tcpcb), - VMSTATE_UINT8(requested_s_scale, struct tcpcb), - VMSTATE_UINT32(ts_recent, struct tcpcb), - VMSTATE_UINT32(ts_recent_age, struct tcpcb), - VMSTATE_UINT32(last_ack_sent, struct tcpcb), - VMSTATE_END_OF_LIST() - } -}; - -/* The sbuf has a pair of pointers that are migrated as offsets; - * we calculate the offsets and restore the pointers using - * pre_save/post_load on a tmp structure. - */ -struct sbuf_tmp { - struct sbuf *parent; - uint32_t roff, woff; -}; - -static int sbuf_tmp_pre_save(void *opaque) -{ - struct sbuf_tmp *tmp =3D opaque; - tmp->woff =3D tmp->parent->sb_wptr - tmp->parent->sb_data; - tmp->roff =3D tmp->parent->sb_rptr - tmp->parent->sb_data; - - return 0; -} - -static int sbuf_tmp_post_load(void *opaque, int version) -{ - struct sbuf_tmp *tmp =3D opaque; - uint32_t requested_len =3D tmp->parent->sb_datalen; - - /* Allocate the buffer space used by the field after the tmp */ - sbreserve(tmp->parent, tmp->parent->sb_datalen); - - if (tmp->parent->sb_datalen !=3D requested_len) { - return -ENOMEM; - } - if (tmp->woff >=3D requested_len || - tmp->roff >=3D requested_len) { - g_critical("invalid sbuf offsets r/w=3D%u/%u len=3D%u", - tmp->roff, tmp->woff, requested_len); - return -EINVAL; - } - - tmp->parent->sb_wptr =3D tmp->parent->sb_data + tmp->woff; - tmp->parent->sb_rptr =3D tmp->parent->sb_data + tmp->roff; - - return 0; -} - - -static const VMStateDescription vmstate_slirp_sbuf_tmp =3D { - .name =3D "slirp-sbuf-tmp", - .post_load =3D sbuf_tmp_post_load, - .pre_save =3D sbuf_tmp_pre_save, - .version_id =3D 0, - .fields =3D (VMStateField[]) { - VMSTATE_UINT32(woff, struct sbuf_tmp), - VMSTATE_UINT32(roff, struct sbuf_tmp), - VMSTATE_END_OF_LIST() - } -}; - -static const VMStateDescription vmstate_slirp_sbuf =3D { - .name =3D "slirp-sbuf", - .version_id =3D 0, - .fields =3D (VMStateField[]) { - VMSTATE_UINT32(sb_cc, struct sbuf), - VMSTATE_UINT32(sb_datalen, struct sbuf), - VMSTATE_WITH_TMP(struct sbuf, struct sbuf_tmp, vmstate_slirp_sbuf_= tmp), - VMSTATE_VBUFFER_UINT32(sb_data, struct sbuf, 0, NULL, sb_datalen), - VMSTATE_END_OF_LIST() - } -}; - -static bool slirp_older_than_v4(void *opaque, int version_id) -{ - return version_id < 4; -} - -static bool slirp_family_inet(void *opaque, int version_id) -{ - union slirp_sockaddr *ssa =3D (union slirp_sockaddr *)opaque; - return ssa->ss.ss_family =3D=3D AF_INET; -} - -static int slirp_socket_pre_load(void *opaque) -{ - struct socket *so =3D opaque; - if (tcp_attach(so) < 0) { - return -ENOMEM; - } - /* Older versions don't load these fields */ - so->so_ffamily =3D AF_INET; - so->so_lfamily =3D AF_INET; - return 0; -} - -#ifndef _WIN32 -#define VMSTATE_SIN4_ADDR(f, s, t) VMSTATE_UINT32_TEST(f, s, t) -#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) -#endif - -/* The OS provided ss_family field isn't that portable; it's size - * and type varies (16/8 bit, signed, unsigned) - * and the values it contains aren't fully portable. - */ -typedef struct SS_FamilyTmpStruct { - union slirp_sockaddr *parent; - uint16_t portable_family; -} SS_FamilyTmpStruct; - -#define SS_FAMILY_MIG_IPV4 2 /* Linux, BSD, Win... */ -#define SS_FAMILY_MIG_IPV6 10 /* Linux */ -#define SS_FAMILY_MIG_OTHER 0xffff - -static int ss_family_pre_save(void *opaque) -{ - SS_FamilyTmpStruct *tss =3D opaque; - - tss->portable_family =3D SS_FAMILY_MIG_OTHER; - - if (tss->parent->ss.ss_family =3D=3D AF_INET) { - tss->portable_family =3D SS_FAMILY_MIG_IPV4; - } else if (tss->parent->ss.ss_family =3D=3D AF_INET6) { - tss->portable_family =3D SS_FAMILY_MIG_IPV6; - } - - return 0; -} - -static int ss_family_post_load(void *opaque, int version_id) -{ - SS_FamilyTmpStruct *tss =3D opaque; - - switch (tss->portable_family) { - case SS_FAMILY_MIG_IPV4: - tss->parent->ss.ss_family =3D AF_INET; - break; - case SS_FAMILY_MIG_IPV6: - case 23: /* compatibility: AF_INET6 from mingw */ - case 28: /* compatibility: AF_INET6 from FreeBSD sys/socket.h */ - tss->parent->ss.ss_family =3D AF_INET6; - break; - default: - g_critical("invalid ss_family type %x", tss->portable_family); - return -EINVAL; - } - - return 0; -} - -static const VMStateDescription vmstate_slirp_ss_family =3D { - .name =3D "slirp-socket-addr/ss_family", - .pre_save =3D ss_family_pre_save, - .post_load =3D ss_family_post_load, - .fields =3D (VMStateField[]) { - VMSTATE_UINT16(portable_family, SS_FamilyTmpStruct), - VMSTATE_END_OF_LIST() - } -}; - -static const VMStateDescription vmstate_slirp_socket_addr =3D { - .name =3D "slirp-socket-addr", - .version_id =3D 4, - .fields =3D (VMStateField[]) { - VMSTATE_WITH_TMP(union slirp_sockaddr, SS_FamilyTmpStruct, - vmstate_slirp_ss_family), - VMSTATE_SIN4_ADDR(sin.sin_addr.s_addr, union slirp_sockaddr, - slirp_family_inet), - VMSTATE_UINT16_TEST(sin.sin_port, union slirp_sockaddr, - slirp_family_inet), - -#if 0 - /* Untested: Needs checking by someone with IPv6 test */ - VMSTATE_BUFFER_TEST(sin6.sin6_addr, union slirp_sockaddr, - slirp_family_inet6), - VMSTATE_UINT16_TEST(sin6.sin6_port, union slirp_sockaddr, - slirp_family_inet6), - VMSTATE_UINT32_TEST(sin6.sin6_flowinfo, union slirp_sockaddr, - slirp_family_inet6), - VMSTATE_UINT32_TEST(sin6.sin6_scope_id, union slirp_sockaddr, - slirp_family_inet6), -#endif - - VMSTATE_END_OF_LIST() - } -}; - -static const VMStateDescription vmstate_slirp_socket =3D { - .name =3D "slirp-socket", - .version_id =3D 4, - .pre_load =3D slirp_socket_pre_load, - .fields =3D (VMStateField[]) { - VMSTATE_UINT32(so_urgc, struct socket), - /* Pre-v4 versions */ - VMSTATE_SIN4_ADDR(so_faddr.s_addr, struct socket, - slirp_older_than_v4), - VMSTATE_SIN4_ADDR(so_laddr.s_addr, struct socket, - slirp_older_than_v4), - VMSTATE_UINT16_TEST(so_fport, struct socket, slirp_older_than_v4), - VMSTATE_UINT16_TEST(so_lport, struct socket, slirp_older_than_v4), - /* v4 and newer */ - VMSTATE_STRUCT(fhost, struct socket, 4, vmstate_slirp_socket_addr, - union slirp_sockaddr), - VMSTATE_STRUCT(lhost, struct socket, 4, vmstate_slirp_socket_addr, - union slirp_sockaddr), - - VMSTATE_UINT8(so_iptos, struct socket), - VMSTATE_UINT8(so_emu, struct socket), - VMSTATE_UINT8(so_type, struct socket), - VMSTATE_INT32(so_state, struct socket), - VMSTATE_STRUCT(so_rcv, struct socket, 0, vmstate_slirp_sbuf, - struct sbuf), - VMSTATE_STRUCT(so_snd, struct socket, 0, vmstate_slirp_sbuf, - struct sbuf), - VMSTATE_STRUCT_POINTER(so_tcpcb, struct socket, vmstate_slirp_tcp, - struct tcpcb), - VMSTATE_END_OF_LIST() - } -}; - -static const VMStateDescription vmstate_slirp_bootp_client =3D { - .name =3D "slirp_bootpclient", - .fields =3D (VMStateField[]) { - VMSTATE_UINT16(allocated, BOOTPClient), - VMSTATE_BUFFER(macaddr, BOOTPClient), - VMSTATE_END_OF_LIST() - } -}; - -static const VMStateDescription vmstate_slirp =3D { - .name =3D "slirp", - .version_id =3D 4, - .fields =3D (VMStateField[]) { - VMSTATE_UINT16_V(ip_id, Slirp, 2), - VMSTATE_STRUCT_ARRAY(bootp_clients, Slirp, NB_BOOTP_CLIENTS, 3, - vmstate_slirp_bootp_client, BOOTPClient), - VMSTATE_END_OF_LIST() - } -}; - -static void slirp_state_save(QEMUFile *f, void *opaque) -{ - Slirp *slirp =3D opaque; - struct gfwd_list *ex_ptr; - - for (ex_ptr =3D slirp->guestfwd_list; ex_ptr; ex_ptr =3D ex_ptr->ex_ne= xt) - if (ex_ptr->write_cb) { - struct socket *so; - so =3D slirp_find_ctl_socket(slirp, ex_ptr->ex_addr, - ntohs(ex_ptr->ex_fport)); - if (!so) - continue; - - qemu_put_byte(f, 42); - vmstate_save_state(f, &vmstate_slirp_socket, so, NULL); - } - qemu_put_byte(f, 0); - - vmstate_save_state(f, &vmstate_slirp, slirp, NULL); -} - - -static int slirp_state_load(QEMUFile *f, void *opaque, int version_id) -{ - Slirp *slirp =3D opaque; - struct gfwd_list *ex_ptr; - - while (qemu_get_byte(f)) { - int ret; - struct socket *so =3D socreate(slirp); - - ret =3D vmstate_load_state(f, &vmstate_slirp_socket, so, version_i= d); - - if (ret < 0) - return ret; - - if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) !=3D - slirp->vnetwork_addr.s_addr) { - return -EINVAL; - } - for (ex_ptr =3D slirp->guestfwd_list; ex_ptr; ex_ptr =3D ex_ptr->e= x_next) { - if (ex_ptr->write_cb && - so->so_faddr.s_addr =3D=3D ex_ptr->ex_addr.s_addr && - so->so_fport =3D=3D ex_ptr->ex_fport) { - break; - } - } - if (!ex_ptr) - return -EINVAL; - } - - return vmstate_load_state(f, &vmstate_slirp, slirp, version_id); -} diff --git a/slirp/state.c b/slirp/state.c new file mode 100644 index 00000000000..0e5a706e877 --- /dev/null +++ b/slirp/state.c @@ -0,0 +1,394 @@ +/* + * libslirp + * + * Copyright (c) 2004-2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * 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 OT= HER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING= FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN + * THE SOFTWARE. + */ +#include "qemu/osdep.h" + +#include "slirp.h" +#include "state.h" +#include "migration/vmstate.h" +#include "migration/qemu-file-types.h" +#include "migration/register.h" + +static int slirp_tcp_post_load(void *opaque, int version) +{ + tcp_template((struct tcpcb *)opaque); + + return 0; +} + +static const VMStateDescription vmstate_slirp_tcp =3D { + .name =3D "slirp-tcp", + .version_id =3D 0, + .post_load =3D slirp_tcp_post_load, + .fields =3D (VMStateField[]) { + VMSTATE_INT16(t_state, struct tcpcb), + VMSTATE_INT16_ARRAY(t_timer, struct tcpcb, TCPT_NTIMERS), + VMSTATE_INT16(t_rxtshift, struct tcpcb), + VMSTATE_INT16(t_rxtcur, struct tcpcb), + VMSTATE_INT16(t_dupacks, struct tcpcb), + VMSTATE_UINT16(t_maxseg, struct tcpcb), + VMSTATE_UINT8(t_force, struct tcpcb), + VMSTATE_UINT16(t_flags, struct tcpcb), + VMSTATE_UINT32(snd_una, struct tcpcb), + VMSTATE_UINT32(snd_nxt, struct tcpcb), + VMSTATE_UINT32(snd_up, struct tcpcb), + VMSTATE_UINT32(snd_wl1, struct tcpcb), + VMSTATE_UINT32(snd_wl2, struct tcpcb), + VMSTATE_UINT32(iss, struct tcpcb), + VMSTATE_UINT32(snd_wnd, struct tcpcb), + VMSTATE_UINT32(rcv_wnd, struct tcpcb), + VMSTATE_UINT32(rcv_nxt, struct tcpcb), + VMSTATE_UINT32(rcv_up, struct tcpcb), + VMSTATE_UINT32(irs, struct tcpcb), + VMSTATE_UINT32(rcv_adv, struct tcpcb), + VMSTATE_UINT32(snd_max, struct tcpcb), + VMSTATE_UINT32(snd_cwnd, struct tcpcb), + VMSTATE_UINT32(snd_ssthresh, struct tcpcb), + VMSTATE_INT16(t_idle, struct tcpcb), + VMSTATE_INT16(t_rtt, struct tcpcb), + VMSTATE_UINT32(t_rtseq, struct tcpcb), + VMSTATE_INT16(t_srtt, struct tcpcb), + VMSTATE_INT16(t_rttvar, struct tcpcb), + VMSTATE_UINT16(t_rttmin, struct tcpcb), + VMSTATE_UINT32(max_sndwnd, struct tcpcb), + VMSTATE_UINT8(t_oobflags, struct tcpcb), + VMSTATE_UINT8(t_iobc, struct tcpcb), + VMSTATE_INT16(t_softerror, struct tcpcb), + VMSTATE_UINT8(snd_scale, struct tcpcb), + VMSTATE_UINT8(rcv_scale, struct tcpcb), + VMSTATE_UINT8(request_r_scale, struct tcpcb), + VMSTATE_UINT8(requested_s_scale, struct tcpcb), + VMSTATE_UINT32(ts_recent, struct tcpcb), + VMSTATE_UINT32(ts_recent_age, struct tcpcb), + VMSTATE_UINT32(last_ack_sent, struct tcpcb), + VMSTATE_END_OF_LIST() + } +}; + +/* The sbuf has a pair of pointers that are migrated as offsets; + * we calculate the offsets and restore the pointers using + * pre_save/post_load on a tmp structure. + */ +struct sbuf_tmp { + struct sbuf *parent; + uint32_t roff, woff; +}; + +static int sbuf_tmp_pre_save(void *opaque) +{ + struct sbuf_tmp *tmp =3D opaque; + tmp->woff =3D tmp->parent->sb_wptr - tmp->parent->sb_data; + tmp->roff =3D tmp->parent->sb_rptr - tmp->parent->sb_data; + + return 0; +} + +static int sbuf_tmp_post_load(void *opaque, int version) +{ + struct sbuf_tmp *tmp =3D opaque; + uint32_t requested_len =3D tmp->parent->sb_datalen; + + /* Allocate the buffer space used by the field after the tmp */ + sbreserve(tmp->parent, tmp->parent->sb_datalen); + + if (tmp->parent->sb_datalen !=3D requested_len) { + return -ENOMEM; + } + if (tmp->woff >=3D requested_len || + tmp->roff >=3D requested_len) { + g_critical("invalid sbuf offsets r/w=3D%u/%u len=3D%u", + tmp->roff, tmp->woff, requested_len); + return -EINVAL; + } + + tmp->parent->sb_wptr =3D tmp->parent->sb_data + tmp->woff; + tmp->parent->sb_rptr =3D tmp->parent->sb_data + tmp->roff; + + return 0; +} + + +static const VMStateDescription vmstate_slirp_sbuf_tmp =3D { + .name =3D "slirp-sbuf-tmp", + .post_load =3D sbuf_tmp_post_load, + .pre_save =3D sbuf_tmp_pre_save, + .version_id =3D 0, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(woff, struct sbuf_tmp), + VMSTATE_UINT32(roff, struct sbuf_tmp), + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_slirp_sbuf =3D { + .name =3D "slirp-sbuf", + .version_id =3D 0, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(sb_cc, struct sbuf), + VMSTATE_UINT32(sb_datalen, struct sbuf), + VMSTATE_WITH_TMP(struct sbuf, struct sbuf_tmp, vmstate_slirp_sbuf_= tmp), + VMSTATE_VBUFFER_UINT32(sb_data, struct sbuf, 0, NULL, sb_datalen), + VMSTATE_END_OF_LIST() + } +}; + +static bool slirp_older_than_v4(void *opaque, int version_id) +{ + return version_id < 4; +} + +static bool slirp_family_inet(void *opaque, int version_id) +{ + union slirp_sockaddr *ssa =3D (union slirp_sockaddr *)opaque; + return ssa->ss.ss_family =3D=3D AF_INET; +} + +static int slirp_socket_pre_load(void *opaque) +{ + struct socket *so =3D opaque; + if (tcp_attach(so) < 0) { + return -ENOMEM; + } + /* Older versions don't load these fields */ + so->so_ffamily =3D AF_INET; + so->so_lfamily =3D AF_INET; + return 0; +} + +#ifndef _WIN32 +#define VMSTATE_SIN4_ADDR(f, s, t) VMSTATE_UINT32_TEST(f, s, t) +#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) +#endif + +/* The OS provided ss_family field isn't that portable; it's size + * and type varies (16/8 bit, signed, unsigned) + * and the values it contains aren't fully portable. + */ +typedef struct SS_FamilyTmpStruct { + union slirp_sockaddr *parent; + uint16_t portable_family; +} SS_FamilyTmpStruct; + +#define SS_FAMILY_MIG_IPV4 2 /* Linux, BSD, Win... */ +#define SS_FAMILY_MIG_IPV6 10 /* Linux */ +#define SS_FAMILY_MIG_OTHER 0xffff + +static int ss_family_pre_save(void *opaque) +{ + SS_FamilyTmpStruct *tss =3D opaque; + + tss->portable_family =3D SS_FAMILY_MIG_OTHER; + + if (tss->parent->ss.ss_family =3D=3D AF_INET) { + tss->portable_family =3D SS_FAMILY_MIG_IPV4; + } else if (tss->parent->ss.ss_family =3D=3D AF_INET6) { + tss->portable_family =3D SS_FAMILY_MIG_IPV6; + } + + return 0; +} + +static int ss_family_post_load(void *opaque, int version_id) +{ + SS_FamilyTmpStruct *tss =3D opaque; + + switch (tss->portable_family) { + case SS_FAMILY_MIG_IPV4: + tss->parent->ss.ss_family =3D AF_INET; + break; + case SS_FAMILY_MIG_IPV6: + case 23: /* compatibility: AF_INET6 from mingw */ + case 28: /* compatibility: AF_INET6 from FreeBSD sys/socket.h */ + tss->parent->ss.ss_family =3D AF_INET6; + break; + default: + g_critical("invalid ss_family type %x", tss->portable_family); + return -EINVAL; + } + + return 0; +} + +static const VMStateDescription vmstate_slirp_ss_family =3D { + .name =3D "slirp-socket-addr/ss_family", + .pre_save =3D ss_family_pre_save, + .post_load =3D ss_family_post_load, + .fields =3D (VMStateField[]) { + VMSTATE_UINT16(portable_family, SS_FamilyTmpStruct), + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_slirp_socket_addr =3D { + .name =3D "slirp-socket-addr", + .version_id =3D 4, + .fields =3D (VMStateField[]) { + VMSTATE_WITH_TMP(union slirp_sockaddr, SS_FamilyTmpStruct, + vmstate_slirp_ss_family), + VMSTATE_SIN4_ADDR(sin.sin_addr.s_addr, union slirp_sockaddr, + slirp_family_inet), + VMSTATE_UINT16_TEST(sin.sin_port, union slirp_sockaddr, + slirp_family_inet), + +#if 0 + /* Untested: Needs checking by someone with IPv6 test */ + VMSTATE_BUFFER_TEST(sin6.sin6_addr, union slirp_sockaddr, + slirp_family_inet6), + VMSTATE_UINT16_TEST(sin6.sin6_port, union slirp_sockaddr, + slirp_family_inet6), + VMSTATE_UINT32_TEST(sin6.sin6_flowinfo, union slirp_sockaddr, + slirp_family_inet6), + VMSTATE_UINT32_TEST(sin6.sin6_scope_id, union slirp_sockaddr, + slirp_family_inet6), +#endif + + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_slirp_socket =3D { + .name =3D "slirp-socket", + .version_id =3D 4, + .pre_load =3D slirp_socket_pre_load, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(so_urgc, struct socket), + /* Pre-v4 versions */ + VMSTATE_SIN4_ADDR(so_faddr.s_addr, struct socket, + slirp_older_than_v4), + VMSTATE_SIN4_ADDR(so_laddr.s_addr, struct socket, + slirp_older_than_v4), + VMSTATE_UINT16_TEST(so_fport, struct socket, slirp_older_than_v4), + VMSTATE_UINT16_TEST(so_lport, struct socket, slirp_older_than_v4), + /* v4 and newer */ + VMSTATE_STRUCT(fhost, struct socket, 4, vmstate_slirp_socket_addr, + union slirp_sockaddr), + VMSTATE_STRUCT(lhost, struct socket, 4, vmstate_slirp_socket_addr, + union slirp_sockaddr), + + VMSTATE_UINT8(so_iptos, struct socket), + VMSTATE_UINT8(so_emu, struct socket), + VMSTATE_UINT8(so_type, struct socket), + VMSTATE_INT32(so_state, struct socket), + VMSTATE_STRUCT(so_rcv, struct socket, 0, vmstate_slirp_sbuf, + struct sbuf), + VMSTATE_STRUCT(so_snd, struct socket, 0, vmstate_slirp_sbuf, + struct sbuf), + VMSTATE_STRUCT_POINTER(so_tcpcb, struct socket, vmstate_slirp_tcp, + struct tcpcb), + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_slirp_bootp_client =3D { + .name =3D "slirp_bootpclient", + .fields =3D (VMStateField[]) { + VMSTATE_UINT16(allocated, BOOTPClient), + VMSTATE_BUFFER(macaddr, BOOTPClient), + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_slirp =3D { + .name =3D "slirp", + .version_id =3D 4, + .fields =3D (VMStateField[]) { + VMSTATE_UINT16_V(ip_id, Slirp, 2), + VMSTATE_STRUCT_ARRAY(bootp_clients, Slirp, NB_BOOTP_CLIENTS, 3, + vmstate_slirp_bootp_client, BOOTPClient), + VMSTATE_END_OF_LIST() + } +}; + +static void slirp_state_save(QEMUFile *f, void *opaque) +{ + Slirp *slirp =3D opaque; + struct gfwd_list *ex_ptr; + + for (ex_ptr =3D slirp->guestfwd_list; ex_ptr; ex_ptr =3D ex_ptr->ex_ne= xt) + if (ex_ptr->write_cb) { + struct socket *so; + so =3D slirp_find_ctl_socket(slirp, ex_ptr->ex_addr, + ntohs(ex_ptr->ex_fport)); + if (!so) { + continue; + } + + qemu_put_byte(f, 42); + vmstate_save_state(f, &vmstate_slirp_socket, so, NULL); + } + qemu_put_byte(f, 0); + + vmstate_save_state(f, &vmstate_slirp, slirp, NULL); +} + + +static int slirp_state_load(QEMUFile *f, void *opaque, int version_id) +{ + Slirp *slirp =3D opaque; + struct gfwd_list *ex_ptr; + + while (qemu_get_byte(f)) { + int ret; + struct socket *so =3D socreate(slirp); + + ret =3D vmstate_load_state(f, &vmstate_slirp_socket, so, version_i= d); + if (ret < 0) { + return ret; + } + + if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) !=3D + slirp->vnetwork_addr.s_addr) { + return -EINVAL; + } + for (ex_ptr =3D slirp->guestfwd_list; ex_ptr; ex_ptr =3D ex_ptr->e= x_next) { + if (ex_ptr->write_cb && + so->so_faddr.s_addr =3D=3D ex_ptr->ex_addr.s_addr && + so->so_fport =3D=3D ex_ptr->ex_fport) { + break; + } + } + if (!ex_ptr) { + return -EINVAL; + } + } + + return vmstate_load_state(f, &vmstate_slirp, slirp, version_id); +} + +void slirp_state_register(Slirp *slirp) +{ + static SaveVMHandlers savevm_slirp_state =3D { + .save_state =3D slirp_state_save, + .load_state =3D slirp_state_load, + }; + + register_savevm_live(NULL, "slirp", 0, 4, &savevm_slirp_state, slirp); +} + +void slirp_state_unregister(Slirp *slirp) +{ + unregister_savevm(NULL, "slirp", slirp); +} diff --git a/slirp/Makefile.objs b/slirp/Makefile.objs index 38ebdb416e3..61cdcc6877f 100644 --- a/slirp/Makefile.objs +++ b/slirp/Makefile.objs @@ -20,6 +20,7 @@ slirp.mo-objs =3D \ sbuf.o \ slirp.o \ socket.o \ + state.o \ tcp_input.o \ tcp_output.o \ tcp_subr.o \ @@ -30,4 +31,4 @@ slirp.mo-objs =3D \ util.o \ $(NULL) =20 -slirp.mo-cflags =3D -DG_LOG_DOMAIN=3D\"Slirp\" +slirp.mo-cflags =3D -DG_LOG_DOMAIN=3D\"Slirp\" -DWITH_QEMU=3D1 --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726062949703.4570144586477; Thu, 17 Jan 2019 03:54:22 -0800 (PST) Received: from localhost ([127.0.0.1]:42686 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6FZ-0003hq-Ka for importer@patchew.org; Thu, 17 Jan 2019 06:54:21 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57509) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk66n-0005yc-8b for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk66m-000577-EP for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:17 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52290) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66m-00052Q-72 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:16 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3AF6272672; Thu, 17 Jan 2019 11:45:14 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 44C965C543; Thu, 17 Jan 2019 11:45:12 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:45 +0400 Message-Id: <20190117114359.5164-14-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 17 Jan 2019 11:45:14 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 13/27] slirp: do not include qemu headers in libslirp.h public API header X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/libslirp.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 679a25422b9..02cbec9f8be 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -1,7 +1,17 @@ #ifndef LIBSLIRP_H #define LIBSLIRP_H =20 -#include "qemu-common.h" +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#else +#include +#include +#endif =20 typedef struct Slirp Slirp; =20 --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726246948175.77009714872167; Thu, 17 Jan 2019 03:57:26 -0800 (PST) Received: from localhost ([127.0.0.1]:42741 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6IX-0006Bz-UA for importer@patchew.org; Thu, 17 Jan 2019 06:57:25 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57614) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk674-0006HT-Ar for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk670-0005VU-T2 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:33 -0500 Received: from mx1.redhat.com ([209.132.183.28]:44954) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk66q-0005Cd-NO for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:24 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 69CDDC05D3E1; Thu, 17 Jan 2019 11:45:18 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7CDBC5D6A6; Thu, 17 Jan 2019 11:45:17 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:46 +0400 Message-Id: <20190117114359.5164-15-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 17 Jan 2019 11:45:18 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 14/27] slirp: improve windows headers inclusion X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Our API usage requires Vista, set WIN32_LEAN_AND_MEAN to fix a number of issues (winsock2.h include order for ex, which is better to include first for legacy reasons). While at it, group redundants #ifndef _WIN32 blocks. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/slirp.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/slirp/slirp.h b/slirp/slirp.h index 8d9d72ca9d0..5a830ddcb86 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -3,10 +3,19 @@ =20 #ifdef _WIN32 =20 +/* as defined in sdkddkver.h */ +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0600 /* Vista */ +#endif +/* reduces the number of implicitly included headers */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + typedef char *caddr_t; =20 -# include # include +# include # include # include # include @@ -19,19 +28,10 @@ typedef char *caddr_t; =20 #ifndef _WIN32 #include -#endif - -#ifndef _WIN32 #include #include -#endif - -#ifndef _WIN32 #include -#endif - -#ifndef _WIN32 -# include +#include #endif =20 #ifdef __APPLE__ --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726431776419.3085436051083; Thu, 17 Jan 2019 04:00:31 -0800 (PST) Received: from localhost ([127.0.0.1]:42767 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6LR-00007L-NK for importer@patchew.org; Thu, 17 Jan 2019 07:00:25 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57720) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk678-0006LJ-5a for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk677-0005gK-8n for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:38 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36022) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk675-0005L8-Am for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:37 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 88AB15AF7B; Thu, 17 Jan 2019 11:45:23 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 465385C57C; Thu, 17 Jan 2019 11:45:21 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:47 +0400 Message-Id: <20190117114359.5164-16-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 17 Jan 2019 11:45:23 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 15/27] slirp: add slirp own version of pstrcpy X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Remove a dependency on qemu util. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/util.h | 2 ++ slirp/slirp.c | 4 ++-- slirp/tftp.c | 2 +- slirp/util.c | 17 +++++++++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/slirp/util.h b/slirp/util.h index 782ae8ef0ee..e3332cdcd60 100644 --- a/slirp/util.h +++ b/slirp/util.h @@ -89,4 +89,6 @@ static inline int slirp_socket_set_fast_reuse(int fd) #endif } =20 +void slirp_pstrcpy(char *buf, int buf_size, const char *str); + #endif diff --git a/slirp/slirp.c b/slirp/slirp.c index 5450b52dbf4..9e38d3f8cb3 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -320,8 +320,8 @@ Slirp *slirp_init(int restricted, bool in_enabled, stru= ct in_addr vnetwork, slirp->vprefix_len =3D vprefix_len; slirp->vhost_addr6 =3D vhost6; if (vhostname) { - pstrcpy(slirp->client_hostname, sizeof(slirp->client_hostname), - vhostname); + slirp_pstrcpy(slirp->client_hostname, sizeof(slirp->client_hostnam= e), + vhostname); } slirp->tftp_prefix =3D g_strdup(tftp_path); slirp->bootp_filename =3D g_strdup(bootfile); diff --git a/slirp/tftp.c b/slirp/tftp.c index 6fb381ef337..f0bcc72c925 100644 --- a/slirp/tftp.c +++ b/slirp/tftp.c @@ -216,7 +216,7 @@ static void tftp_send_error(struct tftp_session *spt, =20 tp->tp_op =3D htons(TFTP_ERROR); tp->x.tp_error.tp_error_code =3D htons(errorcode); - pstrcpy((char *)tp->x.tp_error.tp_msg, sizeof(tp->x.tp_error.tp_msg), ms= g); + slirp_pstrcpy((char *)tp->x.tp_error.tp_msg, sizeof(tp->x.tp_error.tp_ms= g), msg); =20 m->m_len =3D sizeof(struct tftp_t) - (TFTP_BLOCKSIZE_MAX + 2) + 3 + strl= en(msg) - sizeof(struct udphdr); diff --git a/slirp/util.c b/slirp/util.c index 499c5cea46f..60f474f0aab 100644 --- a/slirp/util.c +++ b/slirp/util.c @@ -186,3 +186,20 @@ int slirp_closesocket(int fd) return ret; } #endif /* WIN32 */ + +void slirp_pstrcpy(char *buf, int buf_size, const char *str) +{ + int c; + char *q =3D buf; + + if (buf_size <=3D 0) + return; + + for(;;) { + c =3D *str++; + if (c =3D=3D 0 || q >=3D buf + buf_size - 1) + break; + *q++ =3D c; + } + *q =3D '\0'; +} --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726547786965.8286599631896; Thu, 17 Jan 2019 04:02:27 -0800 (PST) Received: from localhost ([127.0.0.1]:42823 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6NL-0001aj-5R for importer@patchew.org; Thu, 17 Jan 2019 07:02:23 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57660) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk675-0006IU-9q for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk674-0005Za-D8 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:35 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59966) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk671-0005T6-GU for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:33 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5BDB380F7D; Thu, 17 Jan 2019 11:45:28 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 324345D6AA; Thu, 17 Jan 2019 11:45:26 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:48 +0400 Message-Id: <20190117114359.5164-17-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 17 Jan 2019 11:45:28 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 16/27] slirp: remove qemu timer.h dependency X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/util.h | 2 ++ slirp/if.c | 1 - slirp/ip6_icmp.c | 1 - slirp/slirp.c | 1 - 4 files changed, 2 insertions(+), 3 deletions(-) diff --git a/slirp/util.h b/slirp/util.h index e3332cdcd60..4664e8159ba 100644 --- a/slirp/util.h +++ b/slirp/util.h @@ -48,6 +48,8 @@ # define SLIRP_PACKED __attribute__((packed)) #endif =20 +#define SCALE_MS 1000000 + #ifdef _WIN32 int slirp_closesocket(int fd); int slirp_ioctlsocket(int fd, int req, void *val); diff --git a/slirp/if.c b/slirp/if.c index 73e3705740f..90b9078687f 100644 --- a/slirp/if.c +++ b/slirp/if.c @@ -7,7 +7,6 @@ =20 #include "qemu/osdep.h" #include "slirp.h" -#include "qemu/timer.h" =20 static void ifs_insque(struct mbuf *ifm, struct mbuf *ifmhead) diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c index e72c57a81dc..682597e6762 100644 --- a/slirp/ip6_icmp.c +++ b/slirp/ip6_icmp.c @@ -6,7 +6,6 @@ #include "qemu/osdep.h" #include "slirp.h" #include "ip6_icmp.h" -#include "qemu/timer.h" #include "qemu/error-report.h" #include "qemu/log.h" =20 diff --git a/slirp/slirp.c b/slirp/slirp.c index 9e38d3f8cb3..8067b624eaf 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -23,7 +23,6 @@ */ #include "qemu/osdep.h" #include "qemu-common.h" -#include "qemu/timer.h" #include "qemu/error-report.h" #include "migration/register.h" #include "slirp.h" --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726738851557.5792113462861; Thu, 17 Jan 2019 04:05:38 -0800 (PST) Received: from localhost ([127.0.0.1]:42855 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6QO-00043z-0Z for importer@patchew.org; Thu, 17 Jan 2019 07:05:32 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57729) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk678-0006LZ-GD for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk677-0005gm-Hl for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:38 -0500 Received: from mx1.redhat.com ([209.132.183.28]:60088) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk677-0005eW-77 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:37 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0F43D80F81; Thu, 17 Jan 2019 11:45:36 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4FCBE5D9CA; Thu, 17 Jan 2019 11:45:31 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:49 +0400 Message-Id: <20190117114359.5164-18-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 17 Jan 2019 11:45:36 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 17/27] slirp: remove now useless QEMU headers inclusions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Some of those could have been squashed earlier, but it is easier to do it all here. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/slirp.h | 1 - slirp/dhcpv6.c | 1 - slirp/ip6_icmp.c | 2 -- slirp/misc.c | 2 -- slirp/sbuf.c | 1 - slirp/slirp.c | 4 ---- slirp/tftp.c | 1 - 7 files changed, 12 deletions(-) diff --git a/slirp/slirp.h b/slirp/slirp.h index 5a830ddcb86..5707805be22 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -48,7 +48,6 @@ typedef char *caddr_t; #include "util.h" =20 #include "qemu/queue.h" -#include "qemu/sockets.h" #include "net/eth.h" =20 #include "libslirp.h" diff --git a/slirp/dhcpv6.c b/slirp/dhcpv6.c index 752df405361..e27d9a46f84 100644 --- a/slirp/dhcpv6.c +++ b/slirp/dhcpv6.c @@ -21,7 +21,6 @@ */ =20 #include "qemu/osdep.h" -#include "qemu/log.h" #include "slirp.h" #include "dhcpv6.h" =20 diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c index 682597e6762..b3b7e50a311 100644 --- a/slirp/ip6_icmp.c +++ b/slirp/ip6_icmp.c @@ -6,8 +6,6 @@ #include "qemu/osdep.h" #include "slirp.h" #include "ip6_icmp.h" -#include "qemu/error-report.h" -#include "qemu/log.h" =20 #define NDP_Interval g_rand_int_range(slirp->grand, \ NDP_MinRtrAdvInterval, NDP_MaxRtrAdvInterval) diff --git a/slirp/misc.c b/slirp/misc.c index 4ee20a10e44..a77cc34b305 100644 --- a/slirp/misc.c +++ b/slirp/misc.c @@ -8,8 +8,6 @@ #include "qemu/osdep.h" #include "slirp.h" #include "libslirp.h" -#include "qemu/error-report.h" -#include "qemu/main-loop.h" =20 inline void insque(void *a, void *b) diff --git a/slirp/sbuf.c b/slirp/sbuf.c index 17f28e97a63..c83e4dd8ed1 100644 --- a/slirp/sbuf.c +++ b/slirp/sbuf.c @@ -7,7 +7,6 @@ =20 #include "qemu/osdep.h" #include "slirp.h" -#include "qemu/main-loop.h" =20 static void sbappendsb(struct sbuf *sb, struct mbuf *m); =20 diff --git a/slirp/slirp.c b/slirp/slirp.c index 8067b624eaf..cfce82bbb5b 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -23,11 +23,7 @@ */ #include "qemu/osdep.h" #include "qemu-common.h" -#include "qemu/error-report.h" -#include "migration/register.h" #include "slirp.h" -#include "hw/hw.h" -#include "qemu/cutils.h" =20 #ifdef WITH_QEMU #include "state.h" diff --git a/slirp/tftp.c b/slirp/tftp.c index f0bcc72c925..5c31886190f 100644 --- a/slirp/tftp.c +++ b/slirp/tftp.c @@ -25,7 +25,6 @@ #include "qemu/osdep.h" #include "slirp.h" #include "qemu-common.h" -#include "qemu/cutils.h" =20 static inline int tftp_session_in_use(struct tftp_session *spt) { --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726065464674.9073508201983; Thu, 17 Jan 2019 03:54:25 -0800 (PST) Received: from localhost ([127.0.0.1]:42690 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6Fc-0003kJ-CK for importer@patchew.org; Thu, 17 Jan 2019 06:54:24 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57784) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk67C-0006Op-7u for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk67B-0005lL-Iw for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:42 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55886) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk67B-0005ks-Bm for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:41 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8BCF837E60; Thu, 17 Jan 2019 11:45:40 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 943A119C7F; Thu, 17 Jan 2019 11:45:39 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:50 +0400 Message-Id: <20190117114359.5164-19-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 17 Jan 2019 11:45:40 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 18/27] slirp: replace net/eth.h inclusion with own defines X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/ip6.h | 1 - slirp/slirp.h | 1 - slirp/util.h | 10 ++++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/slirp/ip6.h b/slirp/ip6.h index b6ba0a63927..e0a13dec1cc 100644 --- a/slirp/ip6.h +++ b/slirp/ip6.h @@ -7,7 +7,6 @@ #define SLIRP_IP6_H =20 #include -#include "net/eth.h" =20 #define ALLNODES_MULTICAST { .s6_addr =3D \ { 0xff, 0x02, 0x00, 0x00,\ diff --git a/slirp/slirp.h b/slirp/slirp.h index 5707805be22..c9f91438016 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -48,7 +48,6 @@ typedef char *caddr_t; #include "util.h" =20 #include "qemu/queue.h" -#include "net/eth.h" =20 #include "libslirp.h" #include "ip.h" diff --git a/slirp/util.h b/slirp/util.h index 4664e8159ba..ef758045602 100644 --- a/slirp/util.h +++ b/slirp/util.h @@ -50,6 +50,16 @@ =20 #define SCALE_MS 1000000 =20 +#define ETH_ALEN 6 +#define ETH_HLEN 14 +#define ETH_P_IP (0x0800) /* Internet Protocol packe= t */ +#define ETH_P_ARP (0x0806) /* Address Resolution pack= et */ +#define ETH_P_IPV6 (0x86dd) +#define ETH_P_VLAN (0x8100) +#define ETH_P_DVLAN (0x88a8) +#define ETH_P_NCSI (0x88f8) +#define ETH_P_UNKNOWN (0xffff) + #ifdef _WIN32 int slirp_closesocket(int fd); int slirp_ioctlsocket(int fd, int req, void *val); --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726252551112.57824342579477; Thu, 17 Jan 2019 03:57:32 -0800 (PST) Received: from localhost ([127.0.0.1]:42743 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6Id-0006FL-Cr for importer@patchew.org; Thu, 17 Jan 2019 06:57:31 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57863) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk67I-0006V8-S1 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk67H-0005p7-HG for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:48 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46496) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk67H-0005oO-81 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:47 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2F70D81DF0; Thu, 17 Jan 2019 11:45:46 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 95EFD19C7F; Thu, 17 Jan 2019 11:45:44 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:51 +0400 Message-Id: <20190117114359.5164-20-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 17 Jan 2019 11:45:46 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 19/27] slirp: replace qemu qtailq with slirp own copy X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/qtailq.h | 193 +++++++++++++++++++++++++++++++++++++++++++++++++ slirp/slirp.h | 3 +- 2 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 slirp/qtailq.h diff --git a/slirp/qtailq.h b/slirp/qtailq.h new file mode 100644 index 00000000000..a89b0c439a9 --- /dev/null +++ b/slirp/qtailq.h @@ -0,0 +1,193 @@ +/* $NetBSD: queue.h,v 1.52 2009/04/20 09:56:08 mschuett Exp $ */ + +/* + * slirp version: Copy from QEMU, removed all but tail queues. + */ + +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURP= OSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENT= IAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STR= ICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY W= AY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + */ + +#ifndef QTAILQ_H +#define QTAILQ_H + +/* + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + */ +typedef struct QTailQLink { + void *tql_next; + struct QTailQLink *tql_prev; +} QTailQLink; + +/* + * Tail queue definitions. The union acts as a poor man template, as if + * it were QTailQLink. + */ +#define QTAILQ_HEAD(name, type) \ + union name { \ + struct type *tqh_first; /* first element */ \ + QTailQLink tqh_circ; /* link for circular backwards list = */ \ + } + +#define QTAILQ_HEAD_INITIALIZER(head) \ + { .tqh_circ =3D { NULL, &(head).tqh_circ } } + +#define QTAILQ_ENTRY(type) \ + union { \ + struct type *tqe_next; /* next element */ \ + QTailQLink tqe_circ; /* link for circular backwards list = */ \ + } + +#define QTAILQ_INIT(head) do { \ + (head)->tqh_first =3D NULL; \ + (head)->tqh_circ.tql_prev =3D &(head)->tqh_circ; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.tqe_next =3D (head)->tqh_first) !=3D NULL) = \ + (head)->tqh_first->field.tqe_circ.tql_prev =3D \ + &(elm)->field.tqe_circ; \ + else \ + (head)->tqh_circ.tql_prev =3D &(elm)->field.tqe_circ; \ + (head)->tqh_first =3D (elm); \ + (elm)->field.tqe_circ.tql_prev =3D &(head)->tqh_circ; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.tqe_next =3D NULL; \ + (elm)->field.tqe_circ.tql_prev =3D (head)->tqh_circ.tql_prev; \ + (head)->tqh_circ.tql_prev->tql_next =3D (elm); \ + (head)->tqh_circ.tql_prev =3D &(elm)->field.tqe_circ; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.tqe_next =3D (listelm)->field.tqe_next) !=3D NUL= L)\ + (elm)->field.tqe_next->field.tqe_circ.tql_prev =3D \ + &(elm)->field.tqe_circ; \ + else \ + (head)->tqh_circ.tql_prev =3D &(elm)->field.tqe_circ; \ + (listelm)->field.tqe_next =3D (elm); \ + (elm)->field.tqe_circ.tql_prev =3D &(listelm)->field.tqe_circ; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_INSERT_BEFORE(listelm, elm, field) do { = \ + (elm)->field.tqe_circ.tql_prev =3D (listelm)->field.tqe_circ.tql_p= rev; \ + (elm)->field.tqe_next =3D (listelm); = \ + (listelm)->field.tqe_circ.tql_prev->tql_next =3D (elm); = \ + (listelm)->field.tqe_circ.tql_prev =3D &(elm)->field.tqe_circ; = \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_REMOVE(head, elm, field) do { \ + if (((elm)->field.tqe_next) !=3D NULL) \ + (elm)->field.tqe_next->field.tqe_circ.tql_prev =3D \ + (elm)->field.tqe_circ.tql_prev; \ + else \ + (head)->tqh_circ.tql_prev =3D (elm)->field.tqe_circ.tql_prev; \ + (elm)->field.tqe_circ.tql_prev->tql_next =3D (elm)->field.tqe_next= ; \ + (elm)->field.tqe_circ.tql_prev =3D NULL; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_FOREACH(var, head, field) \ + for ((var) =3D ((head)->tqh_first); \ + (var); \ + (var) =3D ((var)->field.tqe_next)) + +#define QTAILQ_FOREACH_SAFE(var, head, field, next_var) \ + for ((var) =3D ((head)->tqh_first); \ + (var) && ((next_var) =3D ((var)->field.tqe_next), 1); \ + (var) =3D (next_var)) + +#define QTAILQ_FOREACH_REVERSE(var, head, field) \ + for ((var) =3D QTAILQ_LAST(head); \ + (var); \ + (var) =3D QTAILQ_PREV(var, field)) + +#define QTAILQ_FOREACH_REVERSE_SAFE(var, head, field, prev_var) \ + for ((var) =3D QTAILQ_LAST(head); \ + (var) && ((prev_var) =3D QTAILQ_PREV(var, field)); \ + (var) =3D (prev_var)) + +/* + * Tail queue access methods. + */ +#define QTAILQ_EMPTY(head) ((head)->tqh_first =3D=3D NULL) +#define QTAILQ_FIRST(head) ((head)->tqh_first) +#define QTAILQ_NEXT(elm, field) ((elm)->field.tqe_next) +#define QTAILQ_IN_USE(elm, field) ((elm)->field.tqe_circ.tql_prev != =3D NULL) + +#define QTAILQ_LINK_PREV(link) \ + ((link).tql_prev->tql_prev->tql_next) +#define QTAILQ_LAST(head) \ + ((typeof((head)->tqh_first)) QTAILQ_LINK_PREV((head)->tqh_circ)) +#define QTAILQ_PREV(elm, field) \ + ((typeof((elm)->field.tqe_next)) QTAILQ_LINK_PREV((elm)->field.tqe= _circ)) + +#define field_at_offset(base, offset, type) = \ + ((type *) (((char *) (base)) + (offset))) + +/* + * Raw access of elements of a tail queue head. Offsets are all zero + * because it's a union. + */ +#define QTAILQ_RAW_FIRST(head) = \ + field_at_offset(head, 0, void *) +#define QTAILQ_RAW_TQH_CIRC(head) = \ + field_at_offset(head, 0, QTailQLink) + +/* + * Raw access of elements of a tail entry + */ +#define QTAILQ_RAW_NEXT(elm, entry) = \ + field_at_offset(elm, entry, void *) +#define QTAILQ_RAW_TQE_CIRC(elm, entry) = \ + field_at_offset(elm, entry, QTailQLink) +/* + * Tail queue traversal using pointer arithmetic. + */ +#define QTAILQ_RAW_FOREACH(elm, head, entry) = \ + for ((elm) =3D *QTAILQ_RAW_FIRST(head); = \ + (elm); = \ + (elm) =3D *QTAILQ_RAW_NEXT(elm, entry)) +/* + * Tail queue insertion using pointer arithmetic. + */ +#define QTAILQ_RAW_INSERT_TAIL(head, elm, entry) do { = \ + *QTAILQ_RAW_NEXT(elm, entry) =3D NULL; = \ + QTAILQ_RAW_TQE_CIRC(elm, entry)->tql_prev =3D QTAILQ_RAW_TQH_CIRC(= head)->tql_prev; \ + QTAILQ_RAW_TQH_CIRC(head)->tql_prev->tql_next =3D (elm); = \ + QTAILQ_RAW_TQH_CIRC(head)->tql_prev =3D QTAILQ_RAW_TQE_CIRC(elm, e= ntry); \ +} while (/*CONSTCOND*/0) + +#endif /* QTAILQ_H */ diff --git a/slirp/slirp.h b/slirp/slirp.h index c9f91438016..0e4d973c2ab 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -46,8 +46,7 @@ typedef char *caddr_t; =20 #include "debug.h" #include "util.h" - -#include "qemu/queue.h" +#include "qtailq.h" =20 #include "libslirp.h" #include "ip.h" --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726809062546.1153548844135; Thu, 17 Jan 2019 04:06:49 -0800 (PST) Received: from localhost ([127.0.0.1]:42891 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6Rb-0004zt-VA for importer@patchew.org; Thu, 17 Jan 2019 07:06:47 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57894) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk67O-0006a6-Kn for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk67M-0005rc-Vj for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:54 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55998) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk67M-0005rF-MI for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:52 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D7D7E18B320; Thu, 17 Jan 2019 11:45:51 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0971C1048116; Thu, 17 Jan 2019 11:45:49 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:52 +0400 Message-Id: <20190117114359.5164-21-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 17 Jan 2019 11:45:51 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 20/27] slirp: replace remaining qemu headers dependency X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Except for the migration code which is gated by WITH_QEMU, only include our own headers, so libslirp can be built standalone. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/util.h | 22 ++++++++++++++++++++++ slirp/arp_table.c | 1 - slirp/bootp.c | 1 - slirp/cksum.c | 1 - slirp/dhcpv6.c | 1 - slirp/dnssearch.c | 1 - slirp/if.c | 1 - slirp/ip6_icmp.c | 1 - slirp/ip6_input.c | 1 - slirp/ip6_output.c | 2 -- slirp/ip_icmp.c | 1 - slirp/ip_input.c | 1 - slirp/ip_output.c | 1 - slirp/mbuf.c | 1 - slirp/misc.c | 2 -- slirp/ncsi.c | 1 - slirp/ndp_table.c | 2 -- slirp/sbuf.c | 1 - slirp/slirp.c | 2 -- slirp/socket.c | 2 -- slirp/tcp_input.c | 1 - slirp/tcp_output.c | 1 - slirp/tcp_subr.c | 1 - slirp/tcp_timer.c | 1 - slirp/tftp.c | 6 ++++-- slirp/udp.c | 1 - slirp/udp6.c | 2 -- 27 files changed, 26 insertions(+), 33 deletions(-) diff --git a/slirp/util.h b/slirp/util.h index ef758045602..1937ffaacc0 100644 --- a/slirp/util.h +++ b/slirp/util.h @@ -48,6 +48,28 @@ # define SLIRP_PACKED __attribute__((packed)) #endif =20 +#ifndef DIV_ROUND_UP +#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +#endif + +#ifndef container_of +#define container_of(ptr, type, member) __extension__ ({ \ + void *__mptr =3D (void *)(ptr); \ + ((type *)(__mptr - offsetof(type, member))); }) +#endif + +#if defined(_WIN32) /* CONFIG_IOVEC */ +# if !defined(IOV_MAX) /* XXX: to avoid duplicate with QEMU osdep.h */ +struct iovec { + void *iov_base; + size_t iov_len; +}; +# endif +#else +#include +#endif + + #define SCALE_MS 1000000 =20 #define ETH_ALEN 6 diff --git a/slirp/arp_table.c b/slirp/arp_table.c index bf71b984ad7..8ea655f79d2 100644 --- a/slirp/arp_table.c +++ b/slirp/arp_table.c @@ -22,7 +22,6 @@ * THE SOFTWARE. */ =20 -#include "qemu/osdep.h" #include "slirp.h" =20 void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t ethaddr[ETH_ALE= N]) diff --git a/slirp/bootp.c b/slirp/bootp.c index 4c9a77eb98f..d396849a05e 100644 --- a/slirp/bootp.c +++ b/slirp/bootp.c @@ -21,7 +21,6 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN * THE SOFTWARE. */ -#include "qemu/osdep.h" #include "slirp.h" =20 #if defined(_WIN32) diff --git a/slirp/cksum.c b/slirp/cksum.c index 84c858fafb1..25bfa67348e 100644 --- a/slirp/cksum.c +++ b/slirp/cksum.c @@ -30,7 +30,6 @@ * in_cksum.c,v 1.2 1994/08/02 07:48:16 davidg Exp */ =20 -#include "qemu/osdep.h" #include "slirp.h" =20 /* diff --git a/slirp/dhcpv6.c b/slirp/dhcpv6.c index e27d9a46f84..9ffba38e8f4 100644 --- a/slirp/dhcpv6.c +++ b/slirp/dhcpv6.c @@ -20,7 +20,6 @@ * along with this program; if not, see . */ =20 -#include "qemu/osdep.h" #include "slirp.h" #include "dhcpv6.h" =20 diff --git a/slirp/dnssearch.c b/slirp/dnssearch.c index 8fb563321bc..c459cece8d6 100644 --- a/slirp/dnssearch.c +++ b/slirp/dnssearch.c @@ -22,7 +22,6 @@ * THE SOFTWARE. */ =20 -#include "qemu/osdep.h" #include "slirp.h" =20 static const uint8_t RFC3397_OPT_DOMAIN_SEARCH =3D 119; diff --git a/slirp/if.c b/slirp/if.c index 90b9078687f..2ad03b8a79b 100644 --- a/slirp/if.c +++ b/slirp/if.c @@ -5,7 +5,6 @@ * terms and conditions of the copyright. */ =20 -#include "qemu/osdep.h" #include "slirp.h" =20 static void diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c index b3b7e50a311..2a432ebbd48 100644 --- a/slirp/ip6_icmp.c +++ b/slirp/ip6_icmp.c @@ -3,7 +3,6 @@ * Guillaume Subiron, Yann Bordenave, Serigne Modou Wagne. */ =20 -#include "qemu/osdep.h" #include "slirp.h" #include "ip6_icmp.h" =20 diff --git a/slirp/ip6_input.c b/slirp/ip6_input.c index ab656a0a9de..1b8c003c660 100644 --- a/slirp/ip6_input.c +++ b/slirp/ip6_input.c @@ -3,7 +3,6 @@ * Guillaume Subiron, Yann Bordenave, Serigne Modou Wagne. */ =20 -#include "qemu/osdep.h" #include "slirp.h" #include "ip6_icmp.h" =20 diff --git a/slirp/ip6_output.c b/slirp/ip6_output.c index 52c88ad6911..19d1ae77489 100644 --- a/slirp/ip6_output.c +++ b/slirp/ip6_output.c @@ -3,8 +3,6 @@ * Guillaume Subiron, Yann Bordenave, Serigne Modou Wagne. */ =20 -#include "qemu/osdep.h" -#include "qemu-common.h" #include "slirp.h" =20 /* Number of packets queued before we start sending diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c index 19e247f773e..6b6344b7769 100644 --- a/slirp/ip_icmp.c +++ b/slirp/ip_icmp.c @@ -30,7 +30,6 @@ * ip_icmp.c,v 1.7 1995/05/30 08:09:42 rgrimes Exp */ =20 -#include "qemu/osdep.h" #include "slirp.h" #include "ip_icmp.h" =20 diff --git a/slirp/ip_input.c b/slirp/ip_input.c index d3606208383..774ce662e60 100644 --- a/slirp/ip_input.c +++ b/slirp/ip_input.c @@ -38,7 +38,6 @@ * terms and conditions of the copyright. */ =20 -#include "qemu/osdep.h" #include "slirp.h" #include "ip_icmp.h" =20 diff --git a/slirp/ip_output.c b/slirp/ip_output.c index db403f04c1e..f6ec141df59 100644 --- a/slirp/ip_output.c +++ b/slirp/ip_output.c @@ -38,7 +38,6 @@ * terms and conditions of the copyright. */ =20 -#include "qemu/osdep.h" #include "slirp.h" =20 /* Number of packets queued before we start sending diff --git a/slirp/mbuf.c b/slirp/mbuf.c index d8d275e0e7b..521c02c9673 100644 --- a/slirp/mbuf.c +++ b/slirp/mbuf.c @@ -15,7 +15,6 @@ * the flags */ =20 -#include "qemu/osdep.h" #include "slirp.h" =20 #define MBUF_THRESH 30 diff --git a/slirp/misc.c b/slirp/misc.c index a77cc34b305..4662071be0a 100644 --- a/slirp/misc.c +++ b/slirp/misc.c @@ -5,9 +5,7 @@ * terms and conditions of the copyright. */ =20 -#include "qemu/osdep.h" #include "slirp.h" -#include "libslirp.h" =20 inline void insque(void *a, void *b) diff --git a/slirp/ncsi.c b/slirp/ncsi.c index 85943822708..327f17543ce 100644 --- a/slirp/ncsi.c +++ b/slirp/ncsi.c @@ -6,7 +6,6 @@ * This code is licensed under the GPL version 2 or later. See the * COPYING file in the top-level directory. */ -#include "qemu/osdep.h" #include "slirp.h" =20 #include "ncsi-pkt.h" diff --git a/slirp/ndp_table.c b/slirp/ndp_table.c index b7b73722f79..34ea4fdf1fc 100644 --- a/slirp/ndp_table.c +++ b/slirp/ndp_table.c @@ -3,8 +3,6 @@ * Guillaume Subiron, Yann Bordenave, Serigne Modou Wagne. */ =20 -#include "qemu/osdep.h" -#include "qemu-common.h" #include "slirp.h" =20 void ndp_table_add(Slirp *slirp, struct in6_addr ip_addr, diff --git a/slirp/sbuf.c b/slirp/sbuf.c index c83e4dd8ed1..51a9f0cc7d4 100644 --- a/slirp/sbuf.c +++ b/slirp/sbuf.c @@ -5,7 +5,6 @@ * terms and conditions of the copyright. */ =20 -#include "qemu/osdep.h" #include "slirp.h" =20 static void sbappendsb(struct sbuf *sb, struct mbuf *m); diff --git a/slirp/slirp.c b/slirp/slirp.c index cfce82bbb5b..2c0ccc621b4 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -21,8 +21,6 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN * THE SOFTWARE. */ -#include "qemu/osdep.h" -#include "qemu-common.h" #include "slirp.h" =20 #ifdef WITH_QEMU diff --git a/slirp/socket.c b/slirp/socket.c index 2e8dc22fb62..dea201f5ce9 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -5,8 +5,6 @@ * terms and conditions of the copyright. */ =20 -#include "qemu/osdep.h" -#include "qemu-common.h" #include "slirp.h" #include "ip_icmp.h" #ifdef __sun__ diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c index 7c1fe18fec1..864da7d857d 100644 --- a/slirp/tcp_input.c +++ b/slirp/tcp_input.c @@ -38,7 +38,6 @@ * terms and conditions of the copyright. */ =20 -#include "qemu/osdep.h" #include "slirp.h" #include "ip_icmp.h" =20 diff --git a/slirp/tcp_output.c b/slirp/tcp_output.c index 6dd1ecf5d9e..2b4335eb34a 100644 --- a/slirp/tcp_output.c +++ b/slirp/tcp_output.c @@ -38,7 +38,6 @@ * terms and conditions of the copyright. */ =20 -#include "qemu/osdep.h" #include "slirp.h" =20 static const u_char tcp_outflags[TCP_NSTATES] =3D { diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index d8846a33b0c..879a7dcd296 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -38,7 +38,6 @@ * terms and conditions of the copyright. */ =20 -#include "qemu/osdep.h" #include "slirp.h" =20 /* patchable/settable parameters for tcp */ diff --git a/slirp/tcp_timer.c b/slirp/tcp_timer.c index a843e57a2b9..703907eb37a 100644 --- a/slirp/tcp_timer.c +++ b/slirp/tcp_timer.c @@ -30,7 +30,6 @@ * tcp_timer.c,v 1.2 1994/08/02 07:49:10 davidg Exp */ =20 -#include "qemu/osdep.h" #include "slirp.h" =20 static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer); diff --git a/slirp/tftp.c b/slirp/tftp.c index 5c31886190f..2d8f9787862 100644 --- a/slirp/tftp.c +++ b/slirp/tftp.c @@ -22,9 +22,11 @@ * THE SOFTWARE. */ =20 -#include "qemu/osdep.h" #include "slirp.h" -#include "qemu-common.h" + +#include +#include +#include =20 static inline int tftp_session_in_use(struct tftp_session *spt) { diff --git a/slirp/udp.c b/slirp/udp.c index 3915971b506..ac42be0d8e9 100644 --- a/slirp/udp.c +++ b/slirp/udp.c @@ -38,7 +38,6 @@ * terms and conditions of the copyright. */ =20 -#include "qemu/osdep.h" #include "slirp.h" #include "ip_icmp.h" =20 diff --git a/slirp/udp6.c b/slirp/udp6.c index fa531e03c4b..be5cba1f54d 100644 --- a/slirp/udp6.c +++ b/slirp/udp6.c @@ -3,8 +3,6 @@ * Guillaume Subiron */ =20 -#include "qemu/osdep.h" -#include "qemu-common.h" #include "slirp.h" #include "udp.h" #include "dhcpv6.h" --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726492289477.69806180549324; Thu, 17 Jan 2019 04:01:32 -0800 (PST) Received: from localhost ([127.0.0.1]:42808 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6MV-0000yo-4r for importer@patchew.org; Thu, 17 Jan 2019 07:01:31 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57982) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk67Z-0006lF-DF for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk67V-0005vj-DS for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:05 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46660) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk67T-0005uH-At for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:45:59 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 34AFF81DED; Thu, 17 Jan 2019 11:45:58 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id D670160BF6; Thu, 17 Jan 2019 11:45:55 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:53 +0400 Message-Id: <20190117114359.5164-22-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 17 Jan 2019 11:45:58 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 21/27] slirp: prefer c99 types over BSD kind X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Replace: - u_char -> uint8_t - u_short -> uint16_t - u_long -> uint32_t - u_int -> unsigned - caddr_t -> char * (indentation mess is hopefully going to be fixed when slirp is made a separate project and clang-format is applied over the history) Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/ip_icmp.h | 18 +++++++++--------- slirp/main.h | 2 +- slirp/mbuf.h | 2 +- slirp/slirp.h | 8 +++----- slirp/socket.h | 4 ++-- slirp/tcp_var.h | 14 +++++++------- slirp/udp.h | 2 +- slirp/ip_icmp.c | 6 +++--- slirp/ip_input.c | 4 ++-- slirp/slirp.c | 12 ++++++------ slirp/socket.c | 6 +++--- slirp/tcp_input.c | 22 +++++++++++----------- slirp/tcp_output.c | 12 ++++++------ slirp/tcp_subr.c | 18 +++++++++--------- slirp/tcp_timer.c | 2 +- slirp/udp.c | 6 +++--- util/osdep.c | 2 +- 17 files changed, 69 insertions(+), 71 deletions(-) diff --git a/slirp/ip_icmp.h b/slirp/ip_icmp.h index d88ab34c1ba..a4e5b8b2657 100644 --- a/slirp/ip_icmp.h +++ b/slirp/ip_icmp.h @@ -44,22 +44,22 @@ typedef uint32_t n_time; * Structure of an icmp header. */ struct icmp { - u_char icmp_type; /* type of message, see below */ - u_char icmp_code; /* type sub code */ - u_short icmp_cksum; /* ones complement cksum of struct */ + uint8_t icmp_type; /* type of message, see below */ + uint8_t icmp_code; /* type sub code */ + uint16_t icmp_cksum; /* ones complement cksum of struct */ union { - u_char ih_pptr; /* ICMP_PARAMPROB */ + uint8_t ih_pptr; /* ICMP_PARAMPROB */ struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ struct ih_idseq { - u_short icd_id; - u_short icd_seq; + uint16_t icd_id; + uint16_t icd_seq; } ih_idseq; int ih_void; =20 /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ struct ih_pmtu { - u_short ipm_void; - u_short ipm_nextmtu; + uint16_t ipm_void; + uint16_t ipm_nextmtu; } ih_pmtu; } icmp_hun; #define icmp_pptr icmp_hun.ih_pptr @@ -156,7 +156,7 @@ struct icmp { void icmp_init(Slirp *slirp); void icmp_cleanup(Slirp *slirp); void icmp_input(struct mbuf *, int); -void icmp_send_error(struct mbuf *msrc, u_char type, u_char code, int mins= ize, +void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int mi= nsize, const char *message); void icmp_reflect(struct mbuf *); void icmp_receive(struct socket *so); diff --git a/slirp/main.h b/slirp/main.h index 4bc05fb904b..f11d4572b76 100644 --- a/slirp/main.h +++ b/slirp/main.h @@ -8,7 +8,7 @@ #ifndef SLIRP_MAIN_H #define SLIRP_MAIN_H =20 -extern u_int curtime; +extern unsigned curtime; extern struct in_addr loopback_addr; extern unsigned long loopback_mask; =20 diff --git a/slirp/mbuf.h b/slirp/mbuf.h index cbf17e136b1..e2d443418ab 100644 --- a/slirp/mbuf.h +++ b/slirp/mbuf.h @@ -85,7 +85,7 @@ struct mbuf { int m_size; /* Size of mbuf, from m_dat or m_ext */ struct socket *m_so; =20 - caddr_t m_data; /* Current location of data */ + char *m_data; /* Current location of data */ int m_len; /* Amount of data in this mbuf, from m_data */ =20 Slirp *slirp; diff --git a/slirp/slirp.h b/slirp/slirp.h index 0e4d973c2ab..05b8364c07c 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -12,8 +12,6 @@ #define WIN32_LEAN_AND_MEAN #endif =20 -typedef char *caddr_t; - # include # include # include @@ -124,8 +122,8 @@ bool ndp_table_search(Slirp *slirp, struct in6_addr ip_= addr, =20 struct Slirp { QTAILQ_ENTRY(Slirp) entry; - u_int time_fasttimo; - u_int last_slowtimo; + unsigned time_fasttimo; + unsigned last_slowtimo; bool do_slowtimo; =20 bool in_enabled, in6_enabled; @@ -245,7 +243,7 @@ int ip6_output(struct socket *, struct mbuf *, int fast= ); =20 /* tcp_input.c */ void tcp_input(register struct mbuf *, int, struct socket *, unsigned shor= t af); -int tcp_mss(register struct tcpcb *, u_int); +int tcp_mss(register struct tcpcb *, unsigned); =20 /* tcp_output.c */ int tcp_output(register struct tcpcb *); diff --git a/slirp/socket.h b/slirp/socket.h index 1c1c8b5871c..e4d12cd5911 100644 --- a/slirp/socket.h +++ b/slirp/socket.h @@ -61,7 +61,7 @@ struct socket { int32_t so_state; /* internal state flags SS_*, below */ =20 struct tcpcb *so_tcpcb; /* pointer to TCP protocol control block */ - u_int so_expire; /* When the socket will expire */ + unsigned so_expire; /* When the socket will expire */ =20 int so_queued; /* Number of packets queued from this socket */ int so_nqueued; /* Number of packets queued in a row @@ -144,7 +144,7 @@ int sosendoob(struct socket *); int sowrite(struct socket *); void sorecvfrom(struct socket *); int sosendto(struct socket *, struct mbuf *); -struct socket * tcp_listen(Slirp *, uint32_t, u_int, uint32_t, u_int, +struct socket * tcp_listen(Slirp *, uint32_t, unsigned, uint32_t, unsigned, int); void soisfconnecting(register struct socket *); void soisfconnected(register struct socket *); diff --git a/slirp/tcp_var.h b/slirp/tcp_var.h index 895ef6df1e4..27ef1a51cb4 100644 --- a/slirp/tcp_var.h +++ b/slirp/tcp_var.h @@ -47,9 +47,9 @@ struct tcpcb { short t_rxtshift; /* log(2) of rexmt exp. backoff */ short t_rxtcur; /* current retransmit value */ short t_dupacks; /* consecutive dup acks recd */ - u_short t_maxseg; /* maximum segment size */ + uint16_t t_maxseg; /* maximum segment size */ uint8_t t_force; /* 1 if forcing out a byte */ - u_short t_flags; + uint16_t t_flags; #define TF_ACKNOW 0x0001 /* ack peer immediately */ #define TF_DELACK 0x0002 /* ack, but try to delay it */ #define TF_NODELAY 0x0004 /* don't delay packets to coalesce */ @@ -105,7 +105,7 @@ struct tcpcb { tcp_seq t_rtseq; /* sequence number being timed */ short t_srtt; /* smoothed round-trip time */ short t_rttvar; /* variance in round-trip time */ - u_short t_rttmin; /* minimum rtt allowed */ + uint16_t t_rttmin; /* minimum rtt allowed */ uint32_t max_sndwnd; /* largest window peer has offered */ =20 /* out-of-band data */ @@ -116,10 +116,10 @@ struct tcpcb { short t_softerror; /* possible error not yet reported */ =20 /* RFC 1323 variables */ - u_char snd_scale; /* window scaling for send window */ - u_char rcv_scale; /* window scaling for recv window */ - u_char request_r_scale; /* pending window scaling */ - u_char requested_s_scale; + uint8_t snd_scale; /* window scaling for send window */ + uint8_t rcv_scale; /* window scaling for recv window */ + uint8_t request_r_scale; /* pending window scaling */ + uint8_t requested_s_scale; uint32_t ts_recent; /* timestamp echo data */ uint32_t ts_recent_age; /* when last updated */ tcp_seq last_ack_sent; diff --git a/slirp/udp.h b/slirp/udp.h index be657cf9229..3d29504caa6 100644 --- a/slirp/udp.h +++ b/slirp/udp.h @@ -78,7 +78,7 @@ void udp_cleanup(Slirp *); void udp_input(register struct mbuf *, int); int udp_attach(struct socket *, unsigned short af); void udp_detach(struct socket *); -struct socket * udp_listen(Slirp *, uint32_t, u_int, uint32_t, u_int, +struct socket * udp_listen(Slirp *, uint32_t, unsigned, uint32_t, unsigned, int); int udp_output(struct socket *so, struct mbuf *m, struct sockaddr_in *saddr, struct sockaddr_in *daddr, diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c index 6b6344b7769..7c5cb75ae51 100644 --- a/slirp/ip_icmp.c +++ b/slirp/ip_icmp.c @@ -240,7 +240,7 @@ end_error: =20 #define ICMP_MAXDATALEN (IP_MSS-28) void -icmp_send_error(struct mbuf *msrc, u_char type, u_char code, int minsize, +icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, const char *message) { unsigned hlen, shlen, s_ip_len; @@ -388,7 +388,7 @@ icmp_reflect(struct mbuf *m) * Strip out original options by copying rest of first * mbuf's data back, and adjust the IP length. */ - memmove((caddr_t)(ip + 1), (caddr_t)ip + hlen, + memmove((char *)(ip + 1), (char *)ip + hlen, (unsigned )(m->m_len - hlen)); hlen -=3D optlen; ip->ip_hl =3D hlen >> 2; @@ -412,7 +412,7 @@ void icmp_receive(struct socket *so) struct mbuf *m =3D so->so_m; struct ip *ip =3D mtod(m, struct ip *); int hlen =3D ip->ip_hl << 2; - u_char error_code; + uint8_t error_code; struct icmp *icp; int id, len; =20 diff --git a/slirp/ip_input.c b/slirp/ip_input.c index 774ce662e60..e0b94b0e426 100644 --- a/slirp/ip_input.c +++ b/slirp/ip_input.c @@ -458,11 +458,11 @@ ip_stripoptions(register struct mbuf *m, struct mbuf = *mopt) { register int i; struct ip *ip =3D mtod(m, struct ip *); - register caddr_t opts; + register char *opts; int olen; =20 olen =3D (ip->ip_hl<<2) - sizeof (struct ip); - opts =3D (caddr_t)(ip + 1); + opts =3D (char *)(ip + 1); i =3D m->m_len - (sizeof (struct ip) + olen); memcpy(opts, opts + olen, (unsigned)i); m->m_len -=3D olen; diff --git a/slirp/slirp.c b/slirp/slirp.c index 2c0ccc621b4..c7e15e88c0c 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -46,7 +46,7 @@ static const uint8_t special_ethaddr[ETH_ALEN] =3D { 0x52, 0x55, 0x00, 0x00, 0x00, 0x00 }; =20 -u_int curtime; +unsigned curtime; =20 static QTAILQ_HEAD(, Slirp) slirp_instances =3D QTAILQ_HEAD_INITIALIZER(slirp_instances); @@ -55,9 +55,9 @@ static struct in_addr dns_addr; #ifndef _WIN32 static struct in6_addr dns6_addr; #endif -static u_int dns_addr_time; +static unsigned dns_addr_time; #ifndef _WIN32 -static u_int dns6_addr_time; +static unsigned dns6_addr_time; #endif =20 #define TIMEOUT_FAST 2 /* milliseconds */ @@ -92,7 +92,7 @@ int get_dns_addr(struct in_addr *pdns_addr) } =20 if ((ret =3D GetNetworkParams(FixedInfo, &BufLen)) !=3D ERROR_SUCCESS)= { - printf("GetNetworkParams failed. ret =3D %08x\n", (u_int)ret ); + printf("GetNetworkParams failed. ret =3D %08x\n", (unsigned)ret ); if (FixedInfo) { GlobalFree(FixedInfo); FixedInfo =3D NULL; @@ -126,7 +126,7 @@ static void winsock_cleanup(void) =20 static int get_dns_addr_cached(void *pdns_addr, void *cached_addr, socklen_t addrlen, - struct stat *cached_stat, u_int *cached_tim= e) + struct stat *cached_stat, unsigned *cached_= time) { struct stat old_stat; if (curtime - *cached_time < TIMEOUT_DEFAULT) { @@ -149,7 +149,7 @@ static int get_dns_addr_cached(void *pdns_addr, void *c= ached_addr, =20 static int get_dns_addr_resolv_conf(int af, void *pdns_addr, void *cached_= addr, socklen_t addrlen, uint32_t *scope_id, - u_int *cached_time) + unsigned *cached_time) { char buff[512]; char buff2[257]; diff --git a/slirp/socket.c b/slirp/socket.c index dea201f5ce9..c896fa6da33 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -506,7 +506,7 @@ sorecvfrom(struct socket *so) /* XXX Check if reply is "correct"? */ =20 if(len =3D=3D -1 || len =3D=3D 0) { - u_char code=3DICMP_UNREACH_PORT; + uint8_t code=3DICMP_UNREACH_PORT; =20 if(errno =3D=3D EHOSTUNREACH) code=3DICMP_UNREACH_HOST; else if(errno =3D=3D ENETUNREACH) code=3DICMP_UNREACH_NET; @@ -676,8 +676,8 @@ sosendto(struct socket *so, struct mbuf *m) * Listen for incoming TCP connections */ struct socket * -tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr, - u_int lport, int flags) +tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, uint32_t laddr, + unsigned lport, int flags) { struct sockaddr_in addr; struct socket *so; diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c index 864da7d857d..6749b32f5d9 100644 --- a/slirp/tcp_input.c +++ b/slirp/tcp_input.c @@ -76,7 +76,7 @@ } \ } =20 -static void tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt, +static void tcp_dooptions(struct tcpcb *tp, uint8_t *cp, int cnt, struct tcpiphdr *ti); static void tcp_xmit_timer(register struct tcpcb *tp, int rtt); =20 @@ -197,7 +197,7 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *in= so, unsigned short af) struct ip save_ip, *ip; struct ip6 save_ip6, *ip6; register struct tcpiphdr *ti; - caddr_t optp =3D NULL; + char *optp =3D NULL; int optlen =3D 0; int len, tlen, off; register struct tcpcb *tp =3D NULL; @@ -205,7 +205,7 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *in= so, unsigned short af) struct socket *so =3D NULL; int todrop, acked, ourfinisacked, needoutput =3D 0; int iss =3D 0; - u_long tiwin; + uint32_t tiwin; int ret; struct sockaddr_storage lhost, fhost; struct sockaddr_in *lhost4, *fhost4; @@ -327,7 +327,7 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *in= so, unsigned short af) ti->ti_len =3D tlen; if (off > sizeof (struct tcphdr)) { optlen =3D off - sizeof (struct tcphdr); - optp =3D mtod(m, caddr_t) + sizeof (struct tcpiphdr); + optp =3D mtod(m, char *) + sizeof (struct tcpiphdr); } tiflags =3D ti->ti_flags; =20 @@ -469,7 +469,7 @@ findso: * else do it below (after getting remote address). */ if (optp && tp->t_state !=3D TCPS_LISTEN) - tcp_dooptions(tp, (u_char *)optp, optlen, ti); + tcp_dooptions(tp, (uint8_t *)optp, optlen, ti); =20 /* * Header prediction: check for the two common cases @@ -724,7 +724,7 @@ findso: tcp_template(tp); =20 if (optp) - tcp_dooptions(tp, (u_char *)optp, optlen, ti); + tcp_dooptions(tp, (uint8_t *)optp, optlen, ti); =20 if (iss) tp->iss =3D iss; @@ -1039,7 +1039,7 @@ trimthenstep6: tp->t_dupacks =3D 0; else if (++tp->t_dupacks =3D=3D TCPREXMTTHRESH) { tcp_seq onxt =3D tp->snd_nxt; - u_int win =3D + unsigned win =3D MIN(tp->snd_wnd, tp->snd_c= wnd) / 2 / tp->t_maxseg; =20 @@ -1108,8 +1108,8 @@ trimthenstep6: * (maxseg^2 / cwnd per packet). */ { - register u_int cw =3D tp->snd_cwnd; - register u_int incr =3D tp->t_maxseg; + register unsigned cw =3D tp->snd_cwnd; + register unsigned incr =3D tp->t_maxseg; =20 if (cw > tp->snd_ssthresh) incr =3D incr * incr / cw; @@ -1381,7 +1381,7 @@ drop: } =20 static void -tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt, struct tcpiphdr *ti) +tcp_dooptions(struct tcpcb *tp, uint8_t *cp, int cnt, struct tcpiphdr *ti) { uint16_t mss; int opt, optlen; @@ -1511,7 +1511,7 @@ tcp_xmit_timer(register struct tcpcb *tp, int rtt) */ =20 int -tcp_mss(struct tcpcb *tp, u_int offer) +tcp_mss(struct tcpcb *tp, unsigned offer) { struct socket *so =3D tp->t_socket; int mss; diff --git a/slirp/tcp_output.c b/slirp/tcp_output.c index 2b4335eb34a..e9674df1216 100644 --- a/slirp/tcp_output.c +++ b/slirp/tcp_output.c @@ -40,7 +40,7 @@ =20 #include "slirp.h" =20 -static const u_char tcp_outflags[TCP_NSTATES] =3D { +static const uint8_t tcp_outflags[TCP_NSTATES] =3D { TH_RST|TH_ACK, 0, TH_SYN, TH_SYN|TH_ACK, TH_ACK, TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_ACK, TH_ACK, @@ -63,7 +63,7 @@ tcp_output(struct tcpcb *tp) register struct tcpiphdr *ti, tcpiph_save; struct ip *ip; struct ip6 *ip6; - u_char opt[MAX_TCPOPTLEN]; + uint8_t opt[MAX_TCPOPTLEN]; unsigned optlen, hdrlen; int idle, sendalot; =20 @@ -271,7 +271,7 @@ send: opt[0] =3D TCPOPT_MAXSEG; opt[1] =3D 4; mss =3D htons((uint16_t) tcp_mss(tp, 0)); - memcpy((caddr_t)(opt + 2), (caddr_t)&mss, sizeof(mss)); + memcpy((char *)(opt + 2), (char *)&mss, sizeof(mss)); optlen =3D 4; } } @@ -301,7 +301,7 @@ send: m->m_data +=3D IF_MAXLINKHDR; m->m_len =3D hdrlen; =20 - sbcopy(&so->so_snd, off, (int) len, mtod(m, caddr_t) + hdrlen); + sbcopy(&so->so_snd, off, (int) len, mtod(m, char *) + hdrlen); m->m_len +=3D len; =20 /* @@ -324,7 +324,7 @@ send: =20 ti =3D mtod(m, struct tcpiphdr *); =20 - memcpy((caddr_t)ti, &tp->t_template, sizeof (struct tcpiphdr)); + memcpy((char *)ti, &tp->t_template, sizeof (struct tcpiphdr)); =20 /* * Fill in fields, remembering maximum advertised @@ -353,7 +353,7 @@ send: ti->ti_seq =3D htonl(tp->snd_max); ti->ti_ack =3D htonl(tp->rcv_nxt); if (optlen) { - memcpy((caddr_t)(ti + 1), (caddr_t)opt, optlen); + memcpy((char *)(ti + 1), (char *)opt, optlen); ti->ti_off =3D (sizeof (struct tcphdr) + optlen) >> 2; } ti->ti_flags =3D flags; diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index 879a7dcd296..e35628a892a 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -163,7 +163,7 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, stru= ct mbuf *m, * ti points into m so the next line is just making * the mbuf point to ti */ - m->m_data =3D (caddr_t)ti; + m->m_data =3D (char *)ti; =20 m->m_len =3D sizeof (struct tcpiphdr); tlen =3D 0; @@ -182,7 +182,7 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, stru= ct mbuf *m, } #undef xchg } - ti->ti_len =3D htons((u_short)(sizeof (struct tcphdr) + tlen)); + ti->ti_len =3D htons((uint16_t)(sizeof (struct tcphdr) + tlen)); tlen +=3D sizeof (struct tcpiphdr); m->m_len =3D tlen; =20 @@ -613,10 +613,10 @@ int tcp_emu(struct socket *so, struct mbuf *m) { Slirp *slirp =3D so->slirp; - u_int n1, n2, n3, n4, n5, n6; + unsigned n1, n2, n3, n4, n5, n6; char buff[257]; uint32_t laddr; - u_int lport; + unsigned lport; char *bptr; =20 DEBUG_CALL("tcp_emu"); @@ -853,7 +853,7 @@ tcp_emu(struct socket *so, struct mbuf *m) =20 bptr =3D m->m_data; while (bptr < m->m_data + m->m_len) { - u_short p; + uint16_t p; static int ra =3D 0; char ra_tbl[4]; =20 @@ -909,8 +909,8 @@ tcp_emu(struct socket *so, struct mbuf *m) /* This is the field containing the port * number that RA-player is listening to. */ - lport =3D (((u_char*)bptr)[0] << 8) - + ((u_char *)bptr)[1]; + lport =3D (((uint8_t*)bptr)[0] << 8) + + ((uint8_t *)bptr)[1]; if (lport < 6970) lport +=3D 256; /* don't know why */ if (lport < 6970 || lport > 7170) @@ -928,8 +928,8 @@ tcp_emu(struct socket *so, struct mbuf *m) } if (p =3D=3D 7071) p =3D 0; - *(u_char *)bptr++ =3D (p >> 8) & 0xff; - *(u_char *)bptr =3D p & 0xff; + *(uint8_t *)bptr++ =3D (p >> 8) & 0xff; + *(uint8_t *)bptr =3D p & 0xff; ra =3D 0; return 1; /* port redirected, we're done */ break; diff --git a/slirp/tcp_timer.c b/slirp/tcp_timer.c index 703907eb37a..7be54570af0 100644 --- a/slirp/tcp_timer.c +++ b/slirp/tcp_timer.c @@ -232,7 +232,7 @@ tcp_timers(register struct tcpcb *tp, int timer) * to go below this.) */ { - u_int win =3D MIN(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_m= axseg; + unsigned win =3D MIN(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->= t_maxseg; if (win < 2) win =3D 2; tp->snd_cwnd =3D tp->t_maxseg; diff --git a/slirp/udp.c b/slirp/udp.c index ac42be0d8e9..5baa604b33a 100644 --- a/slirp/udp.c +++ b/slirp/udp.c @@ -92,7 +92,7 @@ udp_input(register struct mbuf *m, int iphlen) * Get IP and UDP header together in first mbuf. */ ip =3D mtod(m, struct ip *); - uh =3D (struct udphdr *)((caddr_t)ip + iphlen); + uh =3D (struct udphdr *)((char *)ip + iphlen); =20 /* * Make mbuf data length reflect UDP length. @@ -319,8 +319,8 @@ udp_tos(struct socket *so) } =20 struct socket * -udp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr, - u_int lport, int flags) +udp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, uint32_t laddr, + unsigned lport, int flags) { struct sockaddr_in addr; struct socket *so; diff --git a/util/osdep.c b/util/osdep.c index 4b5dc7287db..3f04326040d 100644 --- a/util/osdep.c +++ b/util/osdep.c @@ -29,7 +29,7 @@ #include /* See MySQL bug #7156 (http://bugs.mysql.com/bug.php?id=3D7156) for discussion about Solaris header problems */ -extern int madvise(caddr_t, size_t, int); +extern int madvise(char *, size_t, int); #endif =20 #include "qemu-common.h" --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726905893906.6703354525883; Thu, 17 Jan 2019 04:08:25 -0800 (PST) Received: from localhost ([127.0.0.1]:42907 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6T8-00065J-Cf for importer@patchew.org; Thu, 17 Jan 2019 07:08:22 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58017) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk67d-0006nl-BG for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk67b-0005zf-9B for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:09 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40540) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk67Z-0005xT-BO for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:06 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7B4B7A786E; Thu, 17 Jan 2019 11:46:03 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 059D21835A; Thu, 17 Jan 2019 11:46:01 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:54 +0400 Message-Id: <20190117114359.5164-23-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 17 Jan 2019 11:46:03 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 22/27] slirp: improve send_packet() callback X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Use a more descriptive name for the callback. Reuse the SlirpWriteCb type. Wrap it to check that all data has been writte= n. Return a ssize_t for potential error handling and data-loss reporting. Signed-off-by: Marc-Andr=C3=A9 Lureau --- include/net/net.h | 2 +- slirp/libslirp.h | 11 +++++++---- slirp/slirp.h | 2 ++ net/net.c | 4 ++-- net/slirp.c | 9 +++++---- slirp/ncsi.c | 2 +- slirp/slirp.c | 17 ++++++++++++++--- 7 files changed, 32 insertions(+), 15 deletions(-) diff --git a/include/net/net.h b/include/net/net.h index 643295d1637..075cc012671 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -146,7 +146,7 @@ ssize_t qemu_sendv_packet(NetClientState *nc, const str= uct iovec *iov, int iovcnt); ssize_t qemu_sendv_packet_async(NetClientState *nc, const struct iovec *io= v, int iovcnt, NetPacketSent *sent_cb); -void qemu_send_packet(NetClientState *nc, const uint8_t *buf, int size); +ssize_t qemu_send_packet(NetClientState *nc, const uint8_t *buf, int size); ssize_t qemu_send_packet_raw(NetClientState *nc, const uint8_t *buf, int s= ize); ssize_t qemu_send_packet_async(NetClientState *nc, const uint8_t *buf, int size, NetPacketSent *sent_cb); diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 02cbec9f8be..8e5d4ed11b5 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -15,7 +15,7 @@ =20 typedef struct Slirp Slirp; =20 -typedef int (*SlirpWriteCb)(const void *buf, size_t len, void *opaque); +typedef ssize_t (*SlirpWriteCb)(const void *buf, size_t len, void *opaque); typedef void (*SlirpTimerCb)(void *opaque); =20 /* @@ -23,10 +23,13 @@ typedef void (*SlirpTimerCb)(void *opaque); */ typedef struct SlirpCb { /* - * Send an ethernet frame to the guest network. The opaque parameter - * is the one given to slirp_init(). + * Send an ethernet frame to the guest network. The opaque + * parameter is the one given to slirp_init(). The function + * doesn't need to send all the data and may return nc, pkt, pkt_len); + return qemu_send_packet(&s->nc, pkt, pkt_len); } =20 static ssize_t net_slirp_receive(NetClientState *nc, const uint8_t *buf, s= ize_t size) @@ -197,7 +198,7 @@ static void net_slirp_unregister_poll_fd(int fd) } =20 static const SlirpCb slirp_cb =3D { - .output =3D net_slirp_output, + .send_packet =3D net_slirp_send_packet, .guest_error =3D net_slirp_guest_error, .clock_get_ns =3D net_slirp_clock_get_ns, .timer_new =3D net_slirp_timer_new, @@ -780,7 +781,7 @@ static void guestfwd_read(void *opaque, const uint8_t *= buf, int size) slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size); } =20 -static int guestfwd_write(const void *buf, size_t len, void *chr) +static ssize_t guestfwd_write(const void *buf, size_t len, void *chr) { return qemu_chr_fe_write_all(chr, buf, len); } diff --git a/slirp/ncsi.c b/slirp/ncsi.c index 327f17543ce..359f52c2840 100644 --- a/slirp/ncsi.c +++ b/slirp/ncsi.c @@ -162,5 +162,5 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int p= kt_len) *pchecksum =3D htonl(checksum); ncsi_rsp_len +=3D 4; =20 - slirp->cb->output(slirp->opaque, ncsi_reply, ETH_HLEN + ncsi_rsp_len); + slirp_send_packet_all(slirp, ncsi_reply, ETH_HLEN + ncsi_rsp_len); } diff --git a/slirp/slirp.c b/slirp/slirp.c index c7e15e88c0c..f42d31fb632 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -800,7 +800,7 @@ static void arp_input(Slirp *slirp, const uint8_t *pkt,= int pkt_len) rah->ar_sip =3D ah->ar_tip; memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN); rah->ar_tip =3D ah->ar_sip; - slirp->cb->output(slirp->opaque, arp_reply, sizeof(arp_reply)); + slirp_send_packet_all(slirp, arp_reply, sizeof(arp_reply)); } break; case ARPOP_REPLY: @@ -900,7 +900,7 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, st= ruct ethhdr *eh, /* target IP */ rah->ar_tip =3D iph->ip_dst.s_addr; slirp->client_ipaddr =3D iph->ip_dst; - slirp->cb->output(slirp->opaque, arp_req, sizeof(arp_req)); + slirp_send_packet_all(slirp, arp_req, sizeof(arp_req)); ifm->resolution_requested =3D true; =20 /* Expire request and drop outgoing packet after 1 second */ @@ -985,7 +985,7 @@ int if_encap(Slirp *slirp, struct mbuf *ifm) eh->h_dest[0], eh->h_dest[1], eh->h_dest[2], eh->h_dest[3], eh->h_dest[4], eh->h_dest[5]); memcpy(buf + sizeof(struct ethhdr), ifm->m_data, ifm->m_len); - slirp->cb->output(slirp->opaque, buf, ifm->m_len + ETH_HLEN); + slirp_send_packet_all(slirp, buf, ifm->m_len + ETH_HLEN); return 1; } =20 @@ -1152,3 +1152,14 @@ void slirp_socket_recv(Slirp *slirp, struct in_addr = guest_addr, int guest_port, if (ret > 0) tcp_output(sototcpcb(so)); } + +void slirp_send_packet_all(Slirp *slirp, const void *buf, size_t len) +{ + ssize_t ret =3D slirp->cb->send_packet(buf, len, slirp->opaque); + + if (ret < 0) { + g_critical("Failed to send packet, ret: %zd", ret); + } else if (ret < len) { + DEBUG_ERROR("send_packet() didn't send all data: %zd < %zu", ret, = len); + } +} --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726857942616.6678865393841; Thu, 17 Jan 2019 04:07:37 -0800 (PST) Received: from localhost ([127.0.0.1]:42899 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6SO-0005Zh-Ed for importer@patchew.org; Thu, 17 Jan 2019 07:07:36 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58066) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk67j-0006rD-A6 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk67g-00064p-VT for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:15 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46750) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk67f-00061R-2a for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:11 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EB4A781DE9; Thu, 17 Jan 2019 11:46:09 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id AA4335DD6D; Thu, 17 Jan 2019 11:46:07 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:55 +0400 Message-Id: <20190117114359.5164-24-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 17 Jan 2019 11:46:10 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 23/27] slirp: replace global polling with per-instance & notifier X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Remove hard-coded dependency on slirp in main-loop, and use a "poll" notifier instead. The notifier is registered per slirp instance. Signed-off-by: Marc-Andr=C3=A9 Lureau --- include/qemu/main-loop.h | 15 ++ slirp/libslirp.h | 4 +- net/slirp.c | 24 ++ slirp/slirp.c | 555 +++++++++++++++++++-------------------- stubs/slirp.c | 13 - util/main-loop.c | 30 ++- stubs/Makefile.objs | 1 - 7 files changed, 333 insertions(+), 309 deletions(-) delete mode 100644 stubs/slirp.c diff --git a/include/qemu/main-loop.h b/include/qemu/main-loop.h index e59f9ae1e9d..f6ba78ea739 100644 --- a/include/qemu/main-loop.h +++ b/include/qemu/main-loop.h @@ -302,4 +302,19 @@ void qemu_fd_register(int fd); QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque); void qemu_bh_schedule_idle(QEMUBH *bh); =20 +enum { + MAIN_LOOP_POLL_FILL, + MAIN_LOOP_POLL_ERR, + MAIN_LOOP_POLL_OK, +}; + +typedef struct MainLoopPoll { + int state; + uint32_t timeout; + GArray *pollfds; +} MainLoopPoll; + +void main_loop_poll_add_notifier(Notifier *notify); +void main_loop_poll_remove_notifier(Notifier *notify); + #endif diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 8e5d4ed11b5..18d5fb01335 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -63,9 +63,9 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct= in_addr vnetwork, void *opaque); void slirp_cleanup(Slirp *slirp); =20 -void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout); +void slirp_pollfds_fill(Slirp *slirp, GArray *pollfds, uint32_t *timeout); =20 -void slirp_pollfds_poll(GArray *pollfds, int select_error); +void slirp_pollfds_poll(Slirp *slirp, GArray *pollfds, int select_error); =20 void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len); =20 diff --git a/net/slirp.c b/net/slirp.c index 664ff1c0022..4d55f641684 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -86,6 +86,7 @@ typedef struct SlirpState { NetClientState nc; QTAILQ_ENTRY(SlirpState) entry; Slirp *slirp; + Notifier poll_notifier; Notifier exit_notifier; #ifndef _WIN32 gchar *smb_dir; @@ -144,6 +145,7 @@ static void net_slirp_cleanup(NetClientState *nc) SlirpState *s =3D DO_UPCAST(SlirpState, nc, nc); =20 g_slist_free_full(s->fwd, slirp_free_fwd); + main_loop_poll_remove_notifier(&s->poll_notifier); slirp_cleanup(s->slirp); if (s->exit_notifier.notify) { qemu_remove_exit_notifier(&s->exit_notifier); @@ -209,6 +211,25 @@ static const SlirpCb slirp_cb =3D { .notify =3D qemu_notify_event, }; =20 +static void net_slirp_poll_notify(Notifier *notifier, void *data) +{ + MainLoopPoll *poll =3D data; + SlirpState *s =3D container_of(notifier, SlirpState, poll_notifier); + + switch (poll->state) { + case MAIN_LOOP_POLL_FILL: + slirp_pollfds_fill(s->slirp, poll->pollfds, &poll->timeout); + break; + case MAIN_LOOP_POLL_OK: + case MAIN_LOOP_POLL_ERR: + slirp_pollfds_poll(s->slirp, poll->pollfds, + poll->state =3D=3D MAIN_LOOP_POLL_ERR); + break; + default: + g_assert_not_reached(); + } +} + static int net_slirp_init(NetClientState *peer, const char *model, const char *name, int restricted, bool ipv4, const char *vnetwork, const char *vho= st, @@ -429,6 +450,9 @@ static int net_slirp_init(NetClientState *peer, const c= har *model, &slirp_cb, s); QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry); =20 + s->poll_notifier.notify =3D net_slirp_poll_notify; + main_loop_poll_add_notifier(&s->poll_notifier); + for (config =3D slirp_configs; config; config =3D config->next) { if (config->flags & SLIRP_CFG_HOSTFWD) { if (slirp_hostfwd(s, config->str, errp) < 0) { diff --git a/slirp/slirp.c b/slirp/slirp.c index f42d31fb632..35630efe5db 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -368,9 +368,8 @@ void slirp_cleanup(Slirp *slirp) #define CONN_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNE= CTED)) =3D=3D SS_ISFCONNECTED) #define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECT= ED)) =3D=3D SS_ISFCONNECTED) =20 -static void slirp_update_timeout(uint32_t *timeout) +static void slirp_update_timeout(Slirp *slirp, uint32_t *timeout) { - Slirp *slirp; uint32_t t; =20 if (*timeout <=3D TIMEOUT_FAST) { @@ -382,370 +381,352 @@ static void slirp_update_timeout(uint32_t *timeout) /* If we have tcp timeout with slirp, then we will fill @timeout with * more precise value. */ - QTAILQ_FOREACH(slirp, &slirp_instances, entry) { - if (slirp->time_fasttimo) { - *timeout =3D TIMEOUT_FAST; - return; - } - if (slirp->do_slowtimo) { - t =3D MIN(TIMEOUT_SLOW, t); - } + if (slirp->time_fasttimo) { + *timeout =3D TIMEOUT_FAST; + return; + } + if (slirp->do_slowtimo) { + t =3D MIN(TIMEOUT_SLOW, t); } *timeout =3D t; } =20 -void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout) +void slirp_pollfds_fill(Slirp *slirp, GArray *pollfds, uint32_t *timeout) { - Slirp *slirp; struct socket *so, *so_next; =20 - if (QTAILQ_EMPTY(&slirp_instances)) { - return; - } - /* * First, TCP sockets */ =20 - QTAILQ_FOREACH(slirp, &slirp_instances, entry) { - /* - * *_slowtimo needs calling if there are IP fragments - * in the fragment queue, or there are TCP connections active - */ - slirp->do_slowtimo =3D ((slirp->tcb.so_next !=3D &slirp->tcb) || - (&slirp->ipq.ip_link !=3D slirp->ipq.ip_link.next)); - - for (so =3D slirp->tcb.so_next; so !=3D &slirp->tcb; - so =3D so_next) { - int events =3D 0; - - so_next =3D so->so_next; + /* + * *_slowtimo needs calling if there are IP fragments + * in the fragment queue, or there are TCP connections active + */ + slirp->do_slowtimo =3D ((slirp->tcb.so_next !=3D &slirp->tcb) || + (&slirp->ipq.ip_link !=3D slirp->ipq.ip_link.nex= t)); =20 - so->pollfds_idx =3D -1; + for (so =3D slirp->tcb.so_next; so !=3D &slirp->tcb; so =3D so_next) { + int events =3D 0; =20 - /* - * See if we need a tcp_fasttimo - */ - if (slirp->time_fasttimo =3D=3D 0 && - so->so_tcpcb->t_flags & TF_DELACK) { - slirp->time_fasttimo =3D curtime; /* Flag when want a fast= timo */ - } + so_next =3D so->so_next; =20 - /* - * NOFDREF can include still connecting to local-host, - * newly socreated() sockets etc. Don't want to select these. - */ - if (so->so_state & SS_NOFDREF || so->s =3D=3D -1) { - continue; - } + so->pollfds_idx =3D -1; =20 - /* - * Set for reading sockets which are accepting - */ - if (so->so_state & SS_FACCEPTCONN) { - GPollFD pfd =3D { - .fd =3D so->s, - .events =3D G_IO_IN | G_IO_HUP | G_IO_ERR, - }; - so->pollfds_idx =3D pollfds->len; - g_array_append_val(pollfds, pfd); - continue; - } + /* + * See if we need a tcp_fasttimo + */ + if (slirp->time_fasttimo =3D=3D 0 && + so->so_tcpcb->t_flags & TF_DELACK) { + slirp->time_fasttimo =3D curtime; /* Flag when want a fasttimo= */ + } =20 - /* - * Set for writing sockets which are connecting - */ - if (so->so_state & SS_ISFCONNECTING) { - GPollFD pfd =3D { - .fd =3D so->s, - .events =3D G_IO_OUT | G_IO_ERR, - }; - so->pollfds_idx =3D pollfds->len; - g_array_append_val(pollfds, pfd); - continue; - } + /* + * NOFDREF can include still connecting to local-host, + * newly socreated() sockets etc. Don't want to select these. + */ + if (so->so_state & SS_NOFDREF || so->s =3D=3D -1) { + continue; + } =20 - /* - * Set for writing if we are connected, can send more, and - * we have something to send - */ - if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) { - events |=3D G_IO_OUT | G_IO_ERR; - } + /* + * Set for reading sockets which are accepting + */ + if (so->so_state & SS_FACCEPTCONN) { + GPollFD pfd =3D { + .fd =3D so->s, + .events =3D G_IO_IN | G_IO_HUP | G_IO_ERR, + }; + so->pollfds_idx =3D pollfds->len; + g_array_append_val(pollfds, pfd); + continue; + } =20 - /* - * Set for reading (and urgent data) if we are connected, can - * receive more, and we have room for it XXX /2 ? - */ - if (CONN_CANFRCV(so) && - (so->so_snd.sb_cc < (so->so_snd.sb_datalen/2))) { - events |=3D G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI; - } + /* + * Set for writing sockets which are connecting + */ + if (so->so_state & SS_ISFCONNECTING) { + GPollFD pfd =3D { + .fd =3D so->s, + .events =3D G_IO_OUT | G_IO_ERR, + }; + so->pollfds_idx =3D pollfds->len; + g_array_append_val(pollfds, pfd); + continue; + } =20 - if (events) { - GPollFD pfd =3D { - .fd =3D so->s, - .events =3D events, - }; - so->pollfds_idx =3D pollfds->len; - g_array_append_val(pollfds, pfd); - } + /* + * Set for writing if we are connected, can send more, and + * we have something to send + */ + if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) { + events |=3D G_IO_OUT | G_IO_ERR; } =20 /* - * UDP sockets + * Set for reading (and urgent data) if we are connected, can + * receive more, and we have room for it XXX /2 ? */ - for (so =3D slirp->udb.so_next; so !=3D &slirp->udb; - so =3D so_next) { - so_next =3D so->so_next; + if (CONN_CANFRCV(so) && + (so->so_snd.sb_cc < (so->so_snd.sb_datalen/2))) { + events |=3D G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI; + } =20 - so->pollfds_idx =3D -1; + if (events) { + GPollFD pfd =3D { + .fd =3D so->s, + .events =3D events, + }; + so->pollfds_idx =3D pollfds->len; + g_array_append_val(pollfds, pfd); + } + } =20 - /* - * See if it's timed out - */ - if (so->so_expire) { - if (so->so_expire <=3D curtime) { - udp_detach(so); - continue; - } else { - slirp->do_slowtimo =3D true; /* Let socket expire */ - } - } + /* + * UDP sockets + */ + for (so =3D slirp->udb.so_next; so !=3D &slirp->udb; so =3D so_next) { + so_next =3D so->so_next; =20 - /* - * When UDP packets are received from over the - * link, they're sendto()'d straight away, so - * no need for setting for writing - * Limit the number of packets queued by this session - * to 4. Note that even though we try and limit this - * to 4 packets, the session could have more queued - * if the packets needed to be fragmented - * (XXX <=3D 4 ?) - */ - if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <=3D 4) { - GPollFD pfd =3D { - .fd =3D so->s, - .events =3D G_IO_IN | G_IO_HUP | G_IO_ERR, - }; - so->pollfds_idx =3D pollfds->len; - g_array_append_val(pollfds, pfd); + so->pollfds_idx =3D -1; + + /* + * See if it's timed out + */ + if (so->so_expire) { + if (so->so_expire <=3D curtime) { + udp_detach(so); + continue; + } else { + slirp->do_slowtimo =3D true; /* Let socket expire */ } } =20 /* - * ICMP sockets + * When UDP packets are received from over the + * link, they're sendto()'d straight away, so + * no need for setting for writing + * Limit the number of packets queued by this session + * to 4. Note that even though we try and limit this + * to 4 packets, the session could have more queued + * if the packets needed to be fragmented + * (XXX <=3D 4 ?) */ - for (so =3D slirp->icmp.so_next; so !=3D &slirp->icmp; - so =3D so_next) { - so_next =3D so->so_next; + if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <=3D 4) { + GPollFD pfd =3D { + .fd =3D so->s, + .events =3D G_IO_IN | G_IO_HUP | G_IO_ERR, + }; + so->pollfds_idx =3D pollfds->len; + g_array_append_val(pollfds, pfd); + } + } =20 - so->pollfds_idx =3D -1; + /* + * ICMP sockets + */ + for (so =3D slirp->icmp.so_next; so !=3D &slirp->icmp; so =3D so_next)= { + so_next =3D so->so_next; =20 - /* - * See if it's timed out - */ - if (so->so_expire) { - if (so->so_expire <=3D curtime) { - icmp_detach(so); - continue; - } else { - slirp->do_slowtimo =3D true; /* Let socket expire */ - } - } + so->pollfds_idx =3D -1; =20 - if (so->so_state & SS_ISFCONNECTED) { - GPollFD pfd =3D { - .fd =3D so->s, - .events =3D G_IO_IN | G_IO_HUP | G_IO_ERR, - }; - so->pollfds_idx =3D pollfds->len; - g_array_append_val(pollfds, pfd); + /* + * See if it's timed out + */ + if (so->so_expire) { + if (so->so_expire <=3D curtime) { + icmp_detach(so); + continue; + } else { + slirp->do_slowtimo =3D true; /* Let socket expire */ } } + + if (so->so_state & SS_ISFCONNECTED) { + GPollFD pfd =3D { + .fd =3D so->s, + .events =3D G_IO_IN | G_IO_HUP | G_IO_ERR, + }; + so->pollfds_idx =3D pollfds->len; + g_array_append_val(pollfds, pfd); + } } - slirp_update_timeout(timeout); + + slirp_update_timeout(slirp, timeout); } =20 -void slirp_pollfds_poll(GArray *pollfds, int select_error) +void slirp_pollfds_poll(Slirp *slirp, GArray *pollfds, int select_error) { - Slirp *slirp =3D QTAILQ_FIRST(&slirp_instances); struct socket *so, *so_next; int ret; =20 - if (!slirp) { - return; - } - curtime =3D slirp->cb->clock_get_ns() / SCALE_MS; =20 - QTAILQ_FOREACH(slirp, &slirp_instances, entry) { - /* - * See if anything has timed out - */ - if (slirp->time_fasttimo && - ((curtime - slirp->time_fasttimo) >=3D TIMEOUT_FAST)) { - tcp_fasttimo(slirp); - slirp->time_fasttimo =3D 0; - } - if (slirp->do_slowtimo && - ((curtime - slirp->last_slowtimo) >=3D TIMEOUT_SLOW)) { - ip_slowtimo(slirp); - tcp_slowtimo(slirp); - slirp->last_slowtimo =3D curtime; - } + /* + * See if anything has timed out + */ + if (slirp->time_fasttimo && + ((curtime - slirp->time_fasttimo) >=3D TIMEOUT_FAST)) { + tcp_fasttimo(slirp); + slirp->time_fasttimo =3D 0; + } + if (slirp->do_slowtimo && + ((curtime - slirp->last_slowtimo) >=3D TIMEOUT_SLOW)) { + ip_slowtimo(slirp); + tcp_slowtimo(slirp); + slirp->last_slowtimo =3D curtime; + } =20 + /* + * Check sockets + */ + if (!select_error) { /* - * Check sockets + * Check TCP sockets */ - if (!select_error) { - /* - * Check TCP sockets - */ - for (so =3D slirp->tcb.so_next; so !=3D &slirp->tcb; - so =3D so_next) { - int revents; + for (so =3D slirp->tcb.so_next; so !=3D &slirp->tcb; + so =3D so_next) { + int revents; =20 - so_next =3D so->so_next; + so_next =3D so->so_next; =20 - revents =3D 0; - if (so->pollfds_idx !=3D -1) { - revents =3D g_array_index(pollfds, GPollFD, - so->pollfds_idx).revents; - } + revents =3D 0; + if (so->pollfds_idx !=3D -1) { + revents =3D g_array_index(pollfds, GPollFD, + so->pollfds_idx).revents; + } =20 - if (so->so_state & SS_NOFDREF || so->s =3D=3D -1) { + if (so->so_state & SS_NOFDREF || so->s =3D=3D -1) { + continue; + } + + /* + * Check for URG data + * This will soread as well, so no need to + * test for G_IO_IN below if this succeeds + */ + if (revents & G_IO_PRI) { + ret =3D sorecvoob(so); + if (ret < 0) { + /* Socket error might have resulted in the socket being + * removed, do not try to do anything more with it. */ continue; } - + } + /* + * Check sockets for reading + */ + else if (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR)) { /* - * Check for URG data - * This will soread as well, so no need to - * test for G_IO_IN below if this succeeds + * Check for incoming connections */ - if (revents & G_IO_PRI) { - ret =3D sorecvoob(so); - if (ret < 0) { - /* Socket error might have resulted in the socket = being - * removed, do not try to do anything more with it= . */ - continue; - } + if (so->so_state & SS_FACCEPTCONN) { + tcp_connect(so); + continue; + } /* else */ + ret =3D soread(so); + + /* Output it if we read something */ + if (ret > 0) { + tcp_output(sototcpcb(so)); + } + if (ret < 0) { + /* Socket error might have resulted in the socket being + * removed, do not try to do anything more with it. */ + continue; } + } + + /* + * Check sockets for writing + */ + if (!(so->so_state & SS_NOFDREF) && + (revents & (G_IO_OUT | G_IO_ERR))) { /* - * Check sockets for reading + * Check for non-blocking, still-connecting sockets */ - else if (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR)) { - /* - * Check for incoming connections - */ - if (so->so_state & SS_FACCEPTCONN) { - tcp_connect(so); - continue; - } /* else */ - ret =3D soread(so); + if (so->so_state & SS_ISFCONNECTING) { + /* Connected */ + so->so_state &=3D ~SS_ISFCONNECTING; =20 - /* Output it if we read something */ - if (ret > 0) { - tcp_output(sototcpcb(so)); - } + ret =3D send(so->s, (const void *) &ret, 0, 0); if (ret < 0) { - /* Socket error might have resulted in the socket = being - * removed, do not try to do anything more with it= . */ - continue; + /* XXXXX Must fix, zero bytes is a NOP */ + if (errno =3D=3D EAGAIN || errno =3D=3D EWOULDBLOC= K || + errno =3D=3D EINPROGRESS || errno =3D=3D ENOTC= ONN) { + continue; + } + + /* else failed */ + so->so_state &=3D SS_PERSISTENT_MASK; + so->so_state |=3D SS_NOFDREF; } - } + /* else so->so_state &=3D ~SS_ISFCONNECTING; */ =20 - /* - * Check sockets for writing - */ - if (!(so->so_state & SS_NOFDREF) && - (revents & (G_IO_OUT | G_IO_ERR))) { /* - * Check for non-blocking, still-connecting sockets + * Continue tcp_input */ - if (so->so_state & SS_ISFCONNECTING) { - /* Connected */ - so->so_state &=3D ~SS_ISFCONNECTING; - - ret =3D send(so->s, (const void *) &ret, 0, 0); - if (ret < 0) { - /* XXXXX Must fix, zero bytes is a NOP */ - if (errno =3D=3D EAGAIN || errno =3D=3D EWOULD= BLOCK || - errno =3D=3D EINPROGRESS || errno =3D=3D E= NOTCONN) { - continue; - } - - /* else failed */ - so->so_state &=3D SS_PERSISTENT_MASK; - so->so_state |=3D SS_NOFDREF; - } - /* else so->so_state &=3D ~SS_ISFCONNECTING; */ - - /* - * Continue tcp_input - */ - tcp_input((struct mbuf *)NULL, sizeof(struct ip), = so, - so->so_ffamily); - /* continue; */ - } else { - ret =3D sowrite(so); - if (ret > 0) { - /* Call tcp_output in case we need to send a w= indow - * update to the guest, otherwise it will be s= tuck - * until it sends a window probe. */ - tcp_output(sototcpcb(so)); - } + tcp_input((struct mbuf *)NULL, sizeof(struct ip), so, + so->so_ffamily); + /* continue; */ + } else { + ret =3D sowrite(so); + if (ret > 0) { + /* Call tcp_output in case we need to send a window + * update to the guest, otherwise it will be stuck + * until it sends a window probe. */ + tcp_output(sototcpcb(so)); } } } + } =20 - /* - * Now UDP sockets. - * Incoming packets are sent straight away, they're not buffer= ed. - * Incoming UDP data isn't buffered either. - */ - for (so =3D slirp->udb.so_next; so !=3D &slirp->udb; - so =3D so_next) { - int revents; + /* + * Now UDP sockets. + * Incoming packets are sent straight away, they're not buffered. + * Incoming UDP data isn't buffered either. + */ + for (so =3D slirp->udb.so_next; so !=3D &slirp->udb; + so =3D so_next) { + int revents; =20 - so_next =3D so->so_next; + so_next =3D so->so_next; =20 - revents =3D 0; - if (so->pollfds_idx !=3D -1) { - revents =3D g_array_index(pollfds, GPollFD, - so->pollfds_idx).revents; - } + revents =3D 0; + if (so->pollfds_idx !=3D -1) { + revents =3D g_array_index(pollfds, GPollFD, + so->pollfds_idx).revents; + } =20 - if (so->s !=3D -1 && - (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR))) { - sorecvfrom(so); - } + if (so->s !=3D -1 && + (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR))) { + sorecvfrom(so); } + } =20 - /* - * Check incoming ICMP relies. - */ - for (so =3D slirp->icmp.so_next; so !=3D &slirp->icmp; - so =3D so_next) { - int revents; + /* + * Check incoming ICMP relies. + */ + for (so =3D slirp->icmp.so_next; so !=3D &slirp->icmp; + so =3D so_next) { + int revents; =20 - so_next =3D so->so_next; + so_next =3D so->so_next; =20 - revents =3D 0; - if (so->pollfds_idx !=3D -1) { - revents =3D g_array_index(pollfds, GPollFD, - so->pollfds_idx).revents; - } + revents =3D 0; + if (so->pollfds_idx !=3D -1) { + revents =3D g_array_index(pollfds, GPollFD, + so->pollfds_idx).revents; + } =20 - if (so->s !=3D -1 && - (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR))) { - icmp_receive(so); - } + if (so->s !=3D -1 && + (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR))) { + icmp_receive(so); } } - - if_start(slirp); } + + if_start(slirp); } =20 static void arp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len) diff --git a/stubs/slirp.c b/stubs/slirp.c deleted file mode 100644 index 70704346fdf..00000000000 --- a/stubs/slirp.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "qemu/osdep.h" -#include "qemu-common.h" -#include "qemu/host-utils.h" -#include "slirp/libslirp.h" - -void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout) -{ -} - -void slirp_pollfds_poll(GArray *pollfds, int select_error) -{ -} - diff --git a/util/main-loop.c b/util/main-loop.c index affe0403c58..5f15cdf88d1 100644 --- a/util/main-loop.c +++ b/util/main-loop.c @@ -469,25 +469,42 @@ static int os_host_main_loop_wait(int64_t timeout) } #endif =20 +static NotifierList main_loop_poll_notifiers =3D + NOTIFIER_LIST_INITIALIZER(main_loop_poll_notifiers); + +void main_loop_poll_add_notifier(Notifier *notify) +{ + notifier_list_add(&main_loop_poll_notifiers, notify); +} + +void main_loop_poll_remove_notifier(Notifier *notify) +{ + notifier_remove(notify); +} + void main_loop_wait(int nonblocking) { + MainLoopPoll mlpoll =3D { + .state =3D MAIN_LOOP_POLL_FILL, + .timeout =3D UINT32_MAX, + .pollfds =3D gpollfds, + }; int ret; - uint32_t timeout =3D UINT32_MAX; int64_t timeout_ns; =20 if (nonblocking) { - timeout =3D 0; + mlpoll.timeout =3D 0; } =20 /* poll any events */ g_array_set_size(gpollfds, 0); /* reset for new iteration */ /* XXX: separate device handlers from system ones */ - slirp_pollfds_fill(gpollfds, &timeout); + notifier_list_notify(&main_loop_poll_notifiers, &mlpoll); =20 - if (timeout =3D=3D UINT32_MAX) { + if (mlpoll.timeout =3D=3D UINT32_MAX) { timeout_ns =3D -1; } else { - timeout_ns =3D (uint64_t)timeout * (int64_t)(SCALE_MS); + timeout_ns =3D (uint64_t)mlpoll.timeout * (int64_t)(SCALE_MS); } =20 timeout_ns =3D qemu_soonest_timeout(timeout_ns, @@ -495,7 +512,8 @@ void main_loop_wait(int nonblocking) &main_loop_tlg)); =20 ret =3D os_host_main_loop_wait(timeout_ns); - slirp_pollfds_poll(gpollfds, (ret < 0)); + mlpoll.state =3D ret < 0 ? MAIN_LOOP_POLL_ERR : MAIN_LOOP_POLL_OK; + notifier_list_notify(&main_loop_poll_notifiers, &mlpoll); =20 /* CPU thread can infinitely wait for event after missing the warp */ diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs index cda0efa4e86..1558ff1fe72 100644 --- a/stubs/Makefile.objs +++ b/stubs/Makefile.objs @@ -26,7 +26,6 @@ stub-obj-y +=3D qtest.o stub-obj-y +=3D replay.o stub-obj-y +=3D runstate-check.o stub-obj-y +=3D set-fd-handler.o -stub-obj-y +=3D slirp.o stub-obj-y +=3D sysbus.o stub-obj-y +=3D tpm.o stub-obj-y +=3D trace-control.o --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726698123985.7706228460161; Thu, 17 Jan 2019 04:04:58 -0800 (PST) Received: from localhost ([127.0.0.1]:42837 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6Pl-0003Xk-FV for importer@patchew.org; Thu, 17 Jan 2019 07:04:53 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58081) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk67k-0006sN-G3 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk67j-00068M-RS for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:16 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45498) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk67j-00067v-L2 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:15 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D7D74C057F37; Thu, 17 Jan 2019 11:46:14 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id C3B085D6AA; Thu, 17 Jan 2019 11:46:13 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:56 +0400 Message-Id: <20190117114359.5164-25-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 17 Jan 2019 11:46:14 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 24/27] slirp: remove slirp_instances list X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Now that polling is done per-instance, we don't need a global list of slirp instances. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/slirp.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/slirp/slirp.c b/slirp/slirp.c index 35630efe5db..98ff23723d9 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -48,9 +48,6 @@ static const uint8_t special_ethaddr[ETH_ALEN] =3D { =20 unsigned curtime; =20 -static QTAILQ_HEAD(, Slirp) slirp_instances =3D - QTAILQ_HEAD_INITIALIZER(slirp_instances); - static struct in_addr dns_addr; #ifndef _WIN32 static struct in6_addr dns6_addr; @@ -333,7 +330,6 @@ Slirp *slirp_init(int restricted, bool in_enabled, stru= ct in_addr vnetwork, #ifdef WITH_QEMU slirp_state_register(slirp); #endif - QTAILQ_INSERT_TAIL(&slirp_instances, slirp, entry); =20 return slirp; } @@ -348,7 +344,6 @@ void slirp_cleanup(Slirp *slirp) g_free(e); } =20 - QTAILQ_REMOVE(&slirp_instances, slirp, entry); #ifdef WITH_QEMU slirp_state_unregister(slirp); #endif --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547727011402871.9459037704769; Thu, 17 Jan 2019 04:10:11 -0800 (PST) Received: from localhost ([127.0.0.1]:42921 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6Us-0007Pl-AD for importer@patchew.org; Thu, 17 Jan 2019 07:10:10 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58171) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk67s-0006zZ-Sk for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk67p-0006B3-R8 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:24 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46916) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk67p-0006Ac-62 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:21 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 66C5881DF1; Thu, 17 Jan 2019 11:46:20 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 845261001947; Thu, 17 Jan 2019 11:46:18 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:57 +0400 Message-Id: <20190117114359.5164-26-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 17 Jan 2019 11:46:20 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 25/27] slirp: use polling callbacks, drop glib requirement X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" It would be legitimate to use libslirp without glib. Let's add_poll/get_revents pair of callbacks to provide the same functionality. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/libslirp.h | 17 ++++++++++-- net/slirp.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++-- slirp/slirp.c | 72 +++++++++++++++++------------------------------- 3 files changed, 109 insertions(+), 52 deletions(-) diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 18d5fb01335..b5c1b2122bc 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -1,7 +1,6 @@ #ifndef LIBSLIRP_H #define LIBSLIRP_H =20 -#include #include #include =20 @@ -15,8 +14,18 @@ =20 typedef struct Slirp Slirp; =20 +enum { + SLIRP_POLL_IN =3D 1 << 0, + SLIRP_POLL_OUT =3D 1 << 1, + SLIRP_POLL_PRI =3D 1 << 2, + SLIRP_POLL_ERR =3D 1 << 3, + SLIRP_POLL_HUP =3D 1 << 4, +}; + 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); +typedef int (*SlirpGetREventsCb)(int idx, void *opaque); =20 /* * Callbacks from slirp @@ -63,9 +72,11 @@ Slirp *slirp_init(int restricted, bool in_enabled, struc= t in_addr vnetwork, void *opaque); void slirp_cleanup(Slirp *slirp); =20 -void slirp_pollfds_fill(Slirp *slirp, GArray *pollfds, uint32_t *timeout); +void slirp_pollfds_fill(Slirp *slirp, uint32_t *timeout, + SlirpAddPollCb add_poll, void *opaque); =20 -void slirp_pollfds_poll(Slirp *slirp, GArray *pollfds, int select_error); +void slirp_pollfds_poll(Slirp *slirp, int select_error, + SlirpGetREventsCb get_revents, void *opaque); =20 void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len); =20 diff --git a/net/slirp.c b/net/slirp.c index 4d55f641684..a85e42ff432 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -211,6 +211,71 @@ static const SlirpCb slirp_cb =3D { .notify =3D qemu_notify_event, }; =20 +static int slirp_poll_to_gio(int events) +{ + int ret =3D 0; + + if (events & SLIRP_POLL_IN) { + ret |=3D G_IO_IN; + } + if (events & SLIRP_POLL_OUT) { + ret |=3D G_IO_OUT; + } + if (events & SLIRP_POLL_PRI) { + ret |=3D G_IO_PRI; + } + if (events & SLIRP_POLL_ERR) { + ret |=3D G_IO_ERR; + } + if (events & SLIRP_POLL_HUP) { + ret |=3D G_IO_HUP; + } + + return ret; +} + +static int net_slirp_add_poll(int fd, int events, void *opaque) +{ + GArray *pollfds =3D opaque; + GPollFD pfd =3D { + .fd =3D fd, + .events =3D slirp_poll_to_gio(events), + }; + int idx =3D pollfds->len; + g_array_append_val(pollfds, pfd); + return idx; +} + +static int slirp_gio_to_poll(int events) +{ + int ret =3D 0; + + if (events & G_IO_IN) { + ret |=3D SLIRP_POLL_IN; + } + if (events & G_IO_OUT) { + ret |=3D SLIRP_POLL_OUT; + } + if (events & G_IO_PRI) { + ret |=3D SLIRP_POLL_PRI; + } + if (events & G_IO_ERR) { + ret |=3D SLIRP_POLL_ERR; + } + if (events & G_IO_HUP) { + ret |=3D SLIRP_POLL_HUP; + } + + return ret; +} + +static int net_slirp_get_revents(int idx, void *opaque) +{ + GArray *pollfds =3D opaque; + + return slirp_gio_to_poll(g_array_index(pollfds, GPollFD, idx).revents); +} + static void net_slirp_poll_notify(Notifier *notifier, void *data) { MainLoopPoll *poll =3D data; @@ -218,12 +283,13 @@ static void net_slirp_poll_notify(Notifier *notifier,= void *data) =20 switch (poll->state) { case MAIN_LOOP_POLL_FILL: - slirp_pollfds_fill(s->slirp, poll->pollfds, &poll->timeout); + slirp_pollfds_fill(s->slirp, &poll->timeout, + net_slirp_add_poll, poll->pollfds); break; case MAIN_LOOP_POLL_OK: case MAIN_LOOP_POLL_ERR: - slirp_pollfds_poll(s->slirp, poll->pollfds, - poll->state =3D=3D MAIN_LOOP_POLL_ERR); + slirp_pollfds_poll(s->slirp, poll->state =3D=3D MAIN_LOOP_POLL_ERR, + net_slirp_get_revents, poll->pollfds); break; default: g_assert_not_reached(); diff --git a/slirp/slirp.c b/slirp/slirp.c index 98ff23723d9..8fb3ae06c41 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -386,7 +386,8 @@ static void slirp_update_timeout(Slirp *slirp, uint32_t= *timeout) *timeout =3D t; } =20 -void slirp_pollfds_fill(Slirp *slirp, GArray *pollfds, uint32_t *timeout) +void slirp_pollfds_fill(Slirp *slirp, uint32_t *timeout, + SlirpAddPollCb add_poll, void *opaque) { struct socket *so, *so_next; =20 @@ -428,12 +429,8 @@ void slirp_pollfds_fill(Slirp *slirp, GArray *pollfds,= uint32_t *timeout) * Set for reading sockets which are accepting */ if (so->so_state & SS_FACCEPTCONN) { - GPollFD pfd =3D { - .fd =3D so->s, - .events =3D G_IO_IN | G_IO_HUP | G_IO_ERR, - }; - so->pollfds_idx =3D pollfds->len; - g_array_append_val(pollfds, pfd); + so->pollfds_idx =3D add_poll(so->s, + SLIRP_POLL_IN | SLIRP_POLL_HUP | SLIRP_POLL_ERR, opaque); continue; } =20 @@ -441,12 +438,8 @@ void slirp_pollfds_fill(Slirp *slirp, GArray *pollfds,= uint32_t *timeout) * Set for writing sockets which are connecting */ if (so->so_state & SS_ISFCONNECTING) { - GPollFD pfd =3D { - .fd =3D so->s, - .events =3D G_IO_OUT | G_IO_ERR, - }; - so->pollfds_idx =3D pollfds->len; - g_array_append_val(pollfds, pfd); + so->pollfds_idx =3D add_poll(so->s, + SLIRP_POLL_OUT | SLIRP_POLL_ERR, opaque); continue; } =20 @@ -455,7 +448,7 @@ void slirp_pollfds_fill(Slirp *slirp, GArray *pollfds, = uint32_t *timeout) * we have something to send */ if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) { - events |=3D G_IO_OUT | G_IO_ERR; + events |=3D SLIRP_POLL_OUT | SLIRP_POLL_ERR; } =20 /* @@ -464,16 +457,12 @@ void slirp_pollfds_fill(Slirp *slirp, GArray *pollfds= , uint32_t *timeout) */ if (CONN_CANFRCV(so) && (so->so_snd.sb_cc < (so->so_snd.sb_datalen/2))) { - events |=3D G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI; + events |=3D SLIRP_POLL_IN | SLIRP_POLL_HUP | + SLIRP_POLL_ERR | SLIRP_POLL_PRI; } =20 if (events) { - GPollFD pfd =3D { - .fd =3D so->s, - .events =3D events, - }; - so->pollfds_idx =3D pollfds->len; - g_array_append_val(pollfds, pfd); + so->pollfds_idx =3D add_poll(so->s, events, opaque); } } =20 @@ -508,12 +497,8 @@ void slirp_pollfds_fill(Slirp *slirp, GArray *pollfds,= uint32_t *timeout) * (XXX <=3D 4 ?) */ if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <=3D 4) { - GPollFD pfd =3D { - .fd =3D so->s, - .events =3D G_IO_IN | G_IO_HUP | G_IO_ERR, - }; - so->pollfds_idx =3D pollfds->len; - g_array_append_val(pollfds, pfd); + so->pollfds_idx =3D add_poll(so->s, + SLIRP_POLL_IN | SLIRP_POLL_HUP | SLIRP_POLL_ERR, opaque); } } =20 @@ -538,19 +523,16 @@ void slirp_pollfds_fill(Slirp *slirp, GArray *pollfds= , uint32_t *timeout) } =20 if (so->so_state & SS_ISFCONNECTED) { - GPollFD pfd =3D { - .fd =3D so->s, - .events =3D G_IO_IN | G_IO_HUP | G_IO_ERR, - }; - so->pollfds_idx =3D pollfds->len; - g_array_append_val(pollfds, pfd); + so->pollfds_idx =3D add_poll(so->s, + SLIRP_POLL_IN | SLIRP_POLL_HUP | SLIRP_POLL_ERR, opaque); } } =20 slirp_update_timeout(slirp, timeout); } =20 -void slirp_pollfds_poll(Slirp *slirp, GArray *pollfds, int select_error) +void slirp_pollfds_poll(Slirp *slirp, int select_error, + SlirpGetREventsCb get_revents, void *opaque) { struct socket *so, *so_next; int ret; @@ -587,8 +569,7 @@ void slirp_pollfds_poll(Slirp *slirp, GArray *pollfds, = int select_error) =20 revents =3D 0; if (so->pollfds_idx !=3D -1) { - revents =3D g_array_index(pollfds, GPollFD, - so->pollfds_idx).revents; + revents =3D get_revents(so->pollfds_idx, opaque); } =20 if (so->so_state & SS_NOFDREF || so->s =3D=3D -1) { @@ -598,9 +579,9 @@ void slirp_pollfds_poll(Slirp *slirp, GArray *pollfds, = int select_error) /* * Check for URG data * This will soread as well, so no need to - * test for G_IO_IN below if this succeeds + * test for SLIRP_POLL_IN below if this succeeds */ - if (revents & G_IO_PRI) { + if (revents & SLIRP_POLL_PRI) { ret =3D sorecvoob(so); if (ret < 0) { /* Socket error might have resulted in the socket being @@ -611,7 +592,8 @@ void slirp_pollfds_poll(Slirp *slirp, GArray *pollfds, = int select_error) /* * Check sockets for reading */ - else if (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR)) { + else if (revents & + (SLIRP_POLL_IN | SLIRP_POLL_HUP | SLIRP_POLL_ERR)) { /* * Check for incoming connections */ @@ -636,7 +618,7 @@ void slirp_pollfds_poll(Slirp *slirp, GArray *pollfds, = int select_error) * Check sockets for writing */ if (!(so->so_state & SS_NOFDREF) && - (revents & (G_IO_OUT | G_IO_ERR))) { + (revents & (SLIRP_POLL_OUT | SLIRP_POLL_ERR))) { /* * Check for non-blocking, still-connecting sockets */ @@ -689,12 +671,11 @@ void slirp_pollfds_poll(Slirp *slirp, GArray *pollfds= , int select_error) =20 revents =3D 0; if (so->pollfds_idx !=3D -1) { - revents =3D g_array_index(pollfds, GPollFD, - so->pollfds_idx).revents; + revents =3D get_revents(so->pollfds_idx, opaque); } =20 if (so->s !=3D -1 && - (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR))) { + (revents & (SLIRP_POLL_IN | SLIRP_POLL_HUP | SLIRP_POLL_ER= R))) { sorecvfrom(so); } } @@ -710,12 +691,11 @@ void slirp_pollfds_poll(Slirp *slirp, GArray *pollfds= , int select_error) =20 revents =3D 0; if (so->pollfds_idx !=3D -1) { - revents =3D g_array_index(pollfds, GPollFD, - so->pollfds_idx).revents; + revents =3D get_revents(so->pollfds_idx, opaque); } =20 if (so->s !=3D -1 && - (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR))) { + (revents & (SLIRP_POLL_IN | SLIRP_POLL_HUP | SLIRP_POLL_ER= R))) { icmp_receive(so); } } --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547726960150602.9893462795999; Thu, 17 Jan 2019 04:09:20 -0800 (PST) Received: from localhost ([127.0.0.1]:42913 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6U3-0006j6-27 for importer@patchew.org; Thu, 17 Jan 2019 07:09:19 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58202) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk67y-00074m-IR for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk67w-0006DS-MD for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:30 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53072) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk67u-0006CT-Ne for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:28 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E559B5F726; Thu, 17 Jan 2019 11:46:25 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 43A375D9CA; Thu, 17 Jan 2019 11:46:23 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:58 +0400 Message-Id: <20190117114359.5164-27-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 17 Jan 2019 11:46:26 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 26/27] slirp: pass opaque to all callbacks X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" This is friendlier for FFI bindings. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/libslirp.h | 16 ++++++++-------- net/slirp.c | 25 ++++++++++++++++--------- slirp/dhcpv6.c | 2 +- slirp/if.c | 2 +- slirp/ip6_icmp.c | 15 +++++++++------ slirp/ip_icmp.c | 2 +- slirp/misc.c | 2 +- slirp/slirp.c | 13 ++++++------- slirp/socket.c | 2 +- slirp/tcp_subr.c | 8 ++++---- slirp/udp.c | 2 +- 11 files changed, 49 insertions(+), 40 deletions(-) diff --git a/slirp/libslirp.h b/slirp/libslirp.h index b5c1b2122bc..9b13d8250c6 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -40,21 +40,21 @@ typedef struct SlirpCb { */ SlirpWriteCb send_packet; /* Print a message for an error due to guest misbehavior. */ - void (*guest_error)(const char *msg); + void (*guest_error)(const char *msg, void *opaque); /* Return the virtual clock value in nanoseconds */ - int64_t (*clock_get_ns)(void); + int64_t (*clock_get_ns)(void *opaque); /* Create a new timer with the given callback and opaque data */ - void *(*timer_new)(SlirpTimerCb cb, void *opaque); + void *(*timer_new)(SlirpTimerCb cb, void *cb_opaque, void *opaque); /* Remove and free a timer */ - void (*timer_free)(void *timer); + void (*timer_free)(void *timer, void *opaque); /* Modify a timer to expire at @expire_time */ - void (*timer_mod)(void *timer, int64_t expire_time); + void (*timer_mod)(void *timer, int64_t expire_time, void *opaque); /* Register a fd for future polling */ - void (*register_poll_fd)(int fd); + void (*register_poll_fd)(int fd, void *opaque); /* Unregister a fd */ - void (*unregister_poll_fd)(int fd); + void (*unregister_poll_fd)(int fd, void *opaque); /* Kick the io-thread, to signal that new events may be processed */ - void (*notify)(void); + void (*notify)(void *opaque); } SlirpCb; =20 =20 diff --git a/net/slirp.c b/net/slirp.c index a85e42ff432..7a16d8d6150 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -161,44 +161,51 @@ static NetClientInfo net_slirp_info =3D { .cleanup =3D net_slirp_cleanup, }; =20 -static void net_slirp_guest_error(const char *msg) +static void net_slirp_guest_error(const char *msg, void *opaque) { qemu_log_mask(LOG_GUEST_ERROR, "%s", msg); } =20 -static int64_t net_slirp_clock_get_ns(void) +static int64_t net_slirp_clock_get_ns(void *opaque) { return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); } =20 -static void *net_slirp_timer_new(SlirpTimerCb cb, void *opaque) +static void *net_slirp_timer_new(SlirpTimerCb cb, + void *cb_opaque, void *opaque) { return timer_new_full(NULL, QEMU_CLOCK_VIRTUAL, SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL, - cb, opaque); + cb, cb_opaque); } =20 -static void net_slirp_timer_free(void *timer) +static void net_slirp_timer_free(void *timer, void *opaque) { timer_del(timer); timer_free(timer); } =20 -static void net_slirp_timer_mod(void *timer, int64_t expire_timer) +static void net_slirp_timer_mod(void *timer, int64_t expire_timer, + void *opaque) { timer_mod(timer, expire_timer); } =20 -static void net_slirp_register_poll_fd(int fd) +static void net_slirp_register_poll_fd(int fd, void *opaque) { qemu_fd_register(fd); } =20 -static void net_slirp_unregister_poll_fd(int fd) +static void net_slirp_unregister_poll_fd(int fd, void *opaque) { /* no qemu_fd_unregister */ } =20 +static void net_slirp_notify(void *opaque) +{ + qemu_notify_event(); +} + static const SlirpCb slirp_cb =3D { .send_packet =3D net_slirp_send_packet, .guest_error =3D net_slirp_guest_error, @@ -208,7 +215,7 @@ static const SlirpCb slirp_cb =3D { .timer_mod =3D net_slirp_timer_mod, .register_poll_fd =3D net_slirp_register_poll_fd, .unregister_poll_fd =3D net_slirp_unregister_poll_fd, - .notify =3D qemu_notify_event, + .notify =3D net_slirp_notify, }; =20 static int slirp_poll_to_gio(int events) diff --git a/slirp/dhcpv6.c b/slirp/dhcpv6.c index 9ffba38e8f4..e655c7d5b10 100644 --- a/slirp/dhcpv6.c +++ b/slirp/dhcpv6.c @@ -59,7 +59,7 @@ static int dhcpv6_parse_info_request(Slirp *slirp, uint8_= t *odata, int olen, int len =3D odata[2] << 8 | odata[3]; =20 if (len + 4 > olen) { - slirp->cb->guest_error("Guest sent bad DHCPv6 packet!"); + slirp->cb->guest_error("Guest sent bad DHCPv6 packet!", slirp-= >opaque); return -E2BIG; } =20 diff --git a/slirp/if.c b/slirp/if.c index 2ad03b8a79b..1830cc396c5 100644 --- a/slirp/if.c +++ b/slirp/if.c @@ -146,7 +146,7 @@ diddit: */ void if_start(Slirp *slirp) { - uint64_t now =3D slirp->cb->clock_get_ns(); + uint64_t now =3D slirp->cb->clock_get_ns(slirp->opaque); bool from_batchq =3D false; struct mbuf *ifm, *ifm_next, *ifqt; =20 diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c index 2a432ebbd48..c1e3d30470a 100644 --- a/slirp/ip6_icmp.c +++ b/slirp/ip6_icmp.c @@ -14,7 +14,8 @@ static void ra_timer_handler(void *opaque) Slirp *slirp =3D opaque; =20 slirp->cb->timer_mod(slirp->ra_timer, - slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interv= al); + slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS + NDP_Interval, + slirp->opaque); ndp_send_ra(slirp); } =20 @@ -24,9 +25,10 @@ void icmp6_init(Slirp *slirp) return; } =20 - slirp->ra_timer =3D slirp->cb->timer_new(ra_timer_handler, slirp); + slirp->ra_timer =3D slirp->cb->timer_new(ra_timer_handler, slirp, slir= p->opaque); slirp->cb->timer_mod(slirp->ra_timer, - slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interv= al); + slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS + NDP_Interval, + slirp->opaque); } =20 void icmp6_cleanup(Slirp *slirp) @@ -35,7 +37,7 @@ void icmp6_cleanup(Slirp *slirp) return; } =20 - slirp->cb->timer_free(slirp->ra_timer); + slirp->cb->timer_free(slirp->ra_timer, slirp->opaque); } =20 static void icmp6_send_echoreply(struct mbuf *m, Slirp *slirp, struct ip6 = *ip, @@ -334,7 +336,8 @@ static void ndp_input(struct mbuf *m, Slirp *slirp, str= uct ip6 *ip, =20 case ICMP6_NDP_RA: DEBUG_CALL(" type =3D Router Advertisement"); - slirp->cb->guest_error("Warning: guest sent NDP RA, but shouldn't"= ); + slirp->cb->guest_error("Warning: guest sent NDP RA, but shouldn't", + slirp->opaque); break; =20 case ICMP6_NDP_NS: @@ -368,7 +371,7 @@ static void ndp_input(struct mbuf *m, Slirp *slirp, str= uct ip6 *ip, case ICMP6_NDP_REDIRECT: DEBUG_CALL(" type =3D Redirect"); slirp->cb->guest_error( - "Warning: guest sent NDP REDIRECT, but shouldn't"); + "Warning: guest sent NDP REDIRECT, but shouldn't", slirp->opaq= ue); break; } } diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c index 7c5cb75ae51..ce79c0b051c 100644 --- a/slirp/ip_icmp.c +++ b/slirp/ip_icmp.c @@ -113,7 +113,7 @@ static int icmp_send(struct socket *so, struct mbuf *m,= int hlen) =20 void icmp_detach(struct socket *so) { - so->slirp->cb->unregister_poll_fd(so->s); + so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque); slirp_closesocket(so->s); sofree(so); } diff --git a/slirp/misc.c b/slirp/misc.c index 4662071be0a..edb0d187d7d 100644 --- a/slirp/misc.c +++ b/slirp/misc.c @@ -160,7 +160,7 @@ fork_exec(struct socket *so, const char *ex) opt =3D 1; slirp_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); slirp_set_nonblock(so->s); - so->slirp->cb->register_poll_fd(so->s); + so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); return 1; } =20 diff --git a/slirp/slirp.c b/slirp/slirp.c index 8fb3ae06c41..b50fba95853 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -289,6 +289,7 @@ Slirp *slirp_init(int restricted, bool in_enabled, stru= ct in_addr vnetwork, =20 slirp_init_once(); =20 + slirp->opaque =3D opaque; slirp->cb =3D callbacks; slirp->grand =3D g_rand_new(); slirp->restricted =3D restricted; @@ -325,12 +326,9 @@ Slirp *slirp_init(int restricted, bool in_enabled, str= uct in_addr vnetwork, translate_dnssearch(slirp, vdnssearch); } =20 - slirp->opaque =3D opaque; - #ifdef WITH_QEMU slirp_state_register(slirp); #endif - return slirp; } =20 @@ -537,7 +535,7 @@ void slirp_pollfds_poll(Slirp *slirp, int select_error, struct socket *so, *so_next; int ret; =20 - curtime =3D slirp->cb->clock_get_ns() / SCALE_MS; + curtime =3D slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS; =20 /* * See if anything has timed out @@ -860,7 +858,8 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, st= ruct ethhdr *eh, ifm->resolution_requested =3D true; =20 /* Expire request and drop outgoing packet after 1 second */ - ifm->expiration_date =3D slirp->cb->clock_get_ns() + 100000000= 0ULL; + ifm->expiration_date =3D + slirp->cb->clock_get_ns(slirp->opaque) + 1000000000ULL; } return 0; } else { @@ -886,7 +885,7 @@ static int if_encap6(Slirp *slirp, struct mbuf *ifm, st= ruct ethhdr *eh, if (!ifm->resolution_requested) { ndp_send_ns(slirp, ip6h->ip_dst); ifm->resolution_requested =3D true; - ifm->expiration_date =3D slirp->cb->clock_get_ns() + 100000000= 0ULL; + ifm->expiration_date =3D slirp->cb->clock_get_ns(slirp->opaque= ) + 1000000000ULL; } return 0; } else { @@ -961,7 +960,7 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, stru= ct in_addr host_addr, getsockname(so->s, (struct sockaddr *)&addr, &addr_len) =3D=3D= 0 && addr.sin_addr.s_addr =3D=3D host_addr.s_addr && addr.sin_port =3D=3D port) { - so->slirp->cb->unregister_poll_fd(so->s); + so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque); slirp_closesocket(so->s); sofree(so); return 0; diff --git a/slirp/socket.c b/slirp/socket.c index c896fa6da33..ce1d6ffa1d2 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -930,6 +930,6 @@ void sotranslate_accept(struct socket *so) void sodrop(struct socket *s, int num) { if (sbdrop(&s->so_snd, num)) { - s->slirp->cb->notify(); + s->slirp->cb->notify(s->slirp->opaque); } } diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index e35628a892a..cda94815f62 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -336,7 +336,7 @@ tcp_close(struct tcpcb *tp) /* clobber input socket cache if we're closing the cached connection */ if (so =3D=3D slirp->tcp_last_so) slirp->tcp_last_so =3D &slirp->tcb; - so->slirp->cb->unregister_poll_fd(so->s); + so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque); slirp_closesocket(so->s); sbfree(&so->so_rcv); sbfree(&so->so_snd); @@ -413,7 +413,7 @@ int tcp_fconnect(struct socket *so, unsigned short af) struct sockaddr_storage addr; =20 slirp_set_nonblock(s); - so->slirp->cb->register_poll_fd(so->s); + so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); slirp_socket_set_fast_reuse(s); opt =3D 1; slirp_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(opt)); @@ -486,7 +486,7 @@ void tcp_connect(struct socket *inso) return; } slirp_set_nonblock(s); - so->slirp->cb->register_poll_fd(so->s); + so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); slirp_socket_set_fast_reuse(s); opt =3D 1; slirp_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); @@ -498,7 +498,7 @@ void tcp_connect(struct socket *inso) /* Close the accept() socket, set right state */ if (inso->so_state & SS_FACCEPTONCE) { /* If we only accept once, close the accept() socket */ - so->slirp->cb->unregister_poll_fd(so->s); + so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque); slirp_closesocket(so->s); =20 /* Don't select it yet, even though we have an FD */ diff --git a/slirp/udp.c b/slirp/udp.c index 5baa604b33a..29a31e9400d 100644 --- a/slirp/udp.c +++ b/slirp/udp.c @@ -291,7 +291,7 @@ udp_attach(struct socket *so, unsigned short af) void udp_detach(struct socket *so) { - so->slirp->cb->unregister_poll_fd(so->s); + so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque); slirp_closesocket(so->s); sofree(so); } --=20 2.20.1.98.gecbdaf0899 From nobody Mon Sep 29 02:05:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 154772716434317.419185274636106; Thu, 17 Jan 2019 04:12:44 -0800 (PST) Received: from localhost ([127.0.0.1]:42978 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk6XL-0000r5-Ac for importer@patchew.org; Thu, 17 Jan 2019 07:12:43 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58261) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gk68F-0007Fd-M7 for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gk68C-0006Hz-Pv for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:47 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36806) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gk689-0006EZ-HW for qemu-devel@nongnu.org; Thu, 17 Jan 2019 06:46:41 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3C6BC8046D; Thu, 17 Jan 2019 11:46:31 +0000 (UTC) Received: from localhost (unknown [10.36.112.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 44AA960933; Thu, 17 Jan 2019 11:46:29 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 17 Jan 2019 15:43:59 +0400 Message-Id: <20190117114359.5164-28-marcandre.lureau@redhat.com> In-Reply-To: <20190117114359.5164-1-marcandre.lureau@redhat.com> References: <20190117114359.5164-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 17 Jan 2019 11:46:31 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 27/27] slirp: API is extern C X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Zhijian , Jan Kiszka , Jason Wang , Zhang Chen , Samuel Thibault , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Make it possible to use headers easily with C++ projects. Signed-off-by: Marc-Andr=C3=A9 Lureau --- slirp/libslirp.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 9b13d8250c6..fccab425187 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -12,6 +12,10 @@ #include #endif =20 +#ifdef __cplusplus +extern "C" { +#endif + typedef struct Slirp Slirp; =20 enum { @@ -96,5 +100,8 @@ void slirp_socket_recv(Slirp *slirp, struct in_addr gues= t_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); - +#ifdef __cplusplus +} /* extern "C" */ #endif + +#endif /* LIBSLIRP_H */ --=20 2.20.1.98.gecbdaf0899