]> git.proxmox.com Git - qemu.git/commit - stubs/slirp.c
slirp: switch to GPollFD
authorStefan Hajnoczi <stefanha@redhat.com>
Wed, 20 Feb 2013 10:28:28 +0000 (11:28 +0100)
committerAnthony Liguori <aliguori@us.ibm.com>
Thu, 21 Feb 2013 22:17:31 +0000 (16:17 -0600)
commit8917c3bdba37d6fe4393db0fad3fabbde9530d6b
treee8bfffeae2063d62a6a7069ebd903d27fd5db2f3
parentcf1d078e4ea094e516faab49678fbea3a34b7848
slirp: switch to GPollFD

Slirp uses rfds/wfds/xfds more extensively than other QEMU components.

The rarely-used out-of-band TCP data feature is used.  That means we
need the full table of select(2) to g_poll(3) events:

  rfds -> G_IO_IN | G_IO_HUP | G_IO_ERR
  wfds -> G_IO_OUT | G_IO_ERR
  xfds -> G_IO_PRI

I came up with this table by looking at Linux fs/select.c which maps
select(2) to poll(2) internally.

Another detail to watch out for are the global variables that reference
rfds/wfds/xfds during slirp_select_poll().  sofcantrcvmore() and
sofcantsendmore() use these globals to clear fd_set bits.  When
sofcantrcvmore() is called, the wfds bit is cleared so that the write
handler will no longer be run for this iteration of the event loop.

This actually seems buggy to me since TCP connections can be half-closed
and we'd still want to handle data in half-duplex fashion.  I think the
real intention is to avoid running the read/write handler when the
socket has been fully closed.  This is indicated with the SS_NOFDREF
state bit so we now check for it before invoking the TCP write handler.
Note that UDP/ICMP code paths don't care because they are
connectionless.

Note that slirp/ has a lot of tabs and sometimes mixed tabs with spaces.
I followed the style of the surrounding code.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Message-id: 1361356113-11049-6-git-send-email-stefanha@redhat.com
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
main-loop.c
slirp/libslirp.h
slirp/main.h
slirp/slirp.c
slirp/socket.c
slirp/socket.h
stubs/slirp.c