xemu/slirp
Stefan Hajnoczi 8917c3bdba 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>
2013-02-21 16:17:31 -06:00
..
arp_table.c slirp: Don't crash on packets from 0.0.0.0/8. 2012-11-15 10:27:14 +01:00
bootp.c slirp: Add domain-search option to slirp's DHCP server 2012-11-15 10:27:14 +01:00
bootp.h janitor: add guards to headers 2012-12-19 08:31:31 +01:00
cksum.c slirp: Fix compiler warning for w64 2012-03-13 16:15:19 +01:00
COPYRIGHT Remove the advertising clause from the slirp license 2009-01-26 19:37:41 +00:00
debug.h slirp: Cleanup and basic reanimation of debug code 2009-06-29 08:52:46 -05:00
dnssearch.c slirp: Add domain-search option to slirp's DHCP server 2012-11-15 10:27:14 +01:00
if.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
if.h slirp: Clean up ifs_init 2012-02-27 14:54:49 +01:00
ip_icmp.c Fix comments (adress -> address, layed -> laid, wierd -> weird) 2012-12-07 12:34:11 +01:00
ip_icmp.h slirp: Fix spelling in comment (enought -> enough, insure -> ensure) 2012-10-05 14:24:37 +02:00
ip_input.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
ip_output.c slirp: Replace m_freem with m_free 2011-07-23 10:19:49 -05:00
ip.h slirp: Avoid statements without effect on Big Endian host 2012-05-28 22:31:07 +02:00
libslirp.h slirp: switch to GPollFD 2013-02-21 16:17:31 -06:00
main.h slirp: switch to GPollFD 2013-02-21 16:17:31 -06:00
Makefile.objs slirp: Add domain-search option to slirp's DHCP server 2012-11-15 10:27:14 +01:00
mbuf.c slirp: Cleanup resources on instance removal 2012-03-13 14:05:49 +01:00
mbuf.h slirp: Cleanup resources on instance removal 2012-03-13 14:05:49 +01:00
misc.c monitor: move include files to include/monitor/ 2012-12-19 08:31:32 +01:00
misc.h slirp: remove unused function u_sleep 2012-11-10 13:49:20 +00:00
sbuf.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
sbuf.h Fix breakage by obsolete _P() for good 2009-07-01 19:11:17 +00:00
slirp_config.h slirp: Remove unused code for bad sprintf 2010-11-21 09:16:57 -06:00
slirp.c slirp: switch to GPollFD 2013-02-21 16:17:31 -06:00
slirp.h slirp: remove unused field tt 2013-01-12 12:26:16 +00:00
socket.c slirp: switch to GPollFD 2013-02-21 16:17:31 -06:00
socket.h slirp: switch to GPollFD 2013-02-21 16:17:31 -06:00
tcp_input.c cleanup useless return sentence 2012-10-05 15:10:21 +02:00
tcp_output.c slirp: Avoid redefining MAX_TCPOPTLEN 2012-05-28 22:44:27 +02:00
tcp_subr.c slirp: Fix error reported by static code analysis 2012-09-13 12:38:14 +02:00
tcp_timer.c More NULL pointer fixes 2009-08-01 10:13:20 +00:00
tcp_timer.h Fix breakage by obsolete _P() for good 2009-07-01 19:11:17 +00:00
tcp_var.h slirp: Replace u_int8_t, u_int16_t, u_int32_t, u_int64_t by standard int types 2010-07-25 16:59:41 +02:00
tcp.h slirp: Untangle TCPOLEN_* from TCPOPT_* 2012-05-28 13:45:33 +02:00
tcpip.h Remove the advertising clause from the slirp license 2009-01-26 19:37:41 +00:00
tftp.c slirp: Implement TFTP Blocksize option 2012-09-14 00:26:55 +02:00
tftp.h janitor: add guards to headers 2012-12-19 08:31:31 +01:00
udp.c cleanup useless return sentence 2012-10-05 15:10:21 +02:00
udp.h slirp: Cleanup resources on instance removal 2012-03-13 14:05:49 +01:00