From patchwork Tue Feb 5 18:28:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 1037139 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ens-lyon.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43vFJJ4nRlz9s7h for ; Wed, 6 Feb 2019 06:39:12 +1100 (AEDT) Received: from localhost ([127.0.0.1]:38920 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gr6Yo-0002ay-MO for incoming@patchwork.ozlabs.org; Tue, 05 Feb 2019 14:39:10 -0500 Received: from eggs.gnu.org ([209.51.188.92]:42289) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gr5T3-0004zk-Qa for qemu-devel@nongnu.org; Tue, 05 Feb 2019 13:29:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gr5T0-0005S4-7O for qemu-devel@nongnu.org; Tue, 05 Feb 2019 13:29:07 -0500 Received: from hera.aquilenet.fr ([2a0c:e300::1]:42700) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gr5Sz-0005Q1-O5 for qemu-devel@nongnu.org; Tue, 05 Feb 2019 13:29:06 -0500 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 92646C110; Tue, 5 Feb 2019 19:29:04 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id S1oAFncJmvn8; Tue, 5 Feb 2019 19:29:02 +0100 (CET) Received: from function (unknown [188.164.201.34]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 03CC8C11C; Tue, 5 Feb 2019 19:28:55 +0100 (CET) Received: from samy by function with local (Exim 4.92-RC4) (envelope-from ) id 1gr5Sj-0007ng-K2; Tue, 05 Feb 2019 19:28:49 +0100 From: Samuel Thibault To: qemu-devel@nongnu.org, peter.maydell@linaro.org Date: Tue, 5 Feb 2019 20:28:29 +0200 Message-Id: <20190205182848.29887-14-samuel.thibault@ens-lyon.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190205182848.29887-1-samuel.thibault@ens-lyon.org> References: <20190205182848.29887-1-samuel.thibault@ens-lyon.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a0c:e300::1 Subject: [Qemu-devel] [PULLv3 13/32] 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: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Samuel Thibault , stefanha@redhat.com, jan.kiszka@siemens.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Marc-André Lureau 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é Lureau Signed-off-by: Samuel Thibault --- net/slirp.c | 6 ++++++ slirp/ip_icmp.c | 1 + slirp/libslirp.h | 2 ++ slirp/slirp.c | 3 ++- slirp/tcp_subr.c | 2 ++ slirp/udp.c | 1 + 6 files changed, 14 insertions(+), 1 deletion(-) diff --git a/net/slirp.c b/net/slirp.c index 6f756a4dcc..78ba96b63f 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); } +static void net_slirp_unregister_poll_fd(int fd) +{ + /* no qemu_fd_unregister */ +} + static const SlirpCb slirp_cb = { .output = net_slirp_output, .guest_error = net_slirp_guest_error, @@ -199,6 +204,7 @@ static const SlirpCb slirp_cb = { .timer_free = net_slirp_timer_free, .timer_mod = net_slirp_timer_mod, .register_poll_fd = net_slirp_register_poll_fd, + .unregister_poll_fd = net_slirp_unregister_poll_fd, }; static int net_slirp_init(NetClientState *peer, const char *model, diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c index b59daa801d..19e247f773 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) void icmp_detach(struct socket *so) { + so->slirp->cb->unregister_poll_fd(so->s); slirp_closesocket(so->s); sofree(so); } diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 70e99139bf..8ce69f0be3 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; diff --git a/slirp/slirp.c b/slirp/slirp.c index 12677e5da7..f0bd59fd6f 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -1015,7 +1015,8 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, getsockname(so->s, (struct sockaddr *)&addr, &addr_len) == 0 && addr.sin_addr.s_addr == host_addr.s_addr && addr.sin_port == 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 8087ffc047..d8846a33b0 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 == slirp->tcp_last_so) slirp->tcp_last_so = &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); /* Don't select it yet, even though we have an FD */ diff --git a/slirp/udp.c b/slirp/udp.c index 6c3fb9a29f..3915971b50 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); }