]> git.proxmox.com Git - mirror_qemu.git/commitdiff
slirp: add unregister_poll_fd() callback
authorMarc-André Lureau <marcandre.lureau@redhat.com>
Thu, 17 Jan 2019 11:43:42 +0000 (15:43 +0400)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Thu, 7 Feb 2019 13:49:08 +0000 (15:49 +0200)
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 <pbonzini@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
net/slirp.c
slirp/ip_icmp.c
slirp/libslirp.h
slirp/slirp.c
slirp/tcp_subr.c
slirp/udp.c

index 6f756a4dccca51654708e98f2a8ca51af87888b3..78ba96b63f7228e427992625f160fc08cb96c49b 100644 (file)
@@ -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,
index b59daa801d16cf65b9b4adade6e9325589943a90..19e247f773eb664ecb5e6a3632195cc232c96f1d 100644 (file)
@@ -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);
 }
index 70e99139bf60c55345a8fba1146fab566e811402..8ce69f0be391047c2047ff4e7e55265eaca87550 100644 (file)
@@ -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;
 
 
index 12677e5da76fd15759db81ef2cbea77ccfb40f23..f0bd59fd6f17b3b92905d297f95da54e6b63bedb 100644 (file)
@@ -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;
         }
index 8087ffc047fd57ca7eeb83ae5db7fb84158de67c..d8846a33b0c7ee5e8d10d434567c4c0b13d69449 100644 (file)
@@ -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 */
index 6c3fb9a29ff5a50a96c08a5d9f76e6e9eb858332..3915971b506224674f5ba013ab1170a4fb85e9be 100644 (file)
@@ -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);
 }