diff options
-rw-r--r-- | net.c | 9 | ||||
-rw-r--r-- | net.h | 1 | ||||
-rw-r--r-- | slirp/libslirp.h | 14 | ||||
-rw-r--r-- | slirp/slirp.c | 20 | ||||
-rw-r--r-- | vl.c | 23 |
5 files changed, 32 insertions, 35 deletions
@@ -120,9 +120,7 @@ #include "qemu_socket.h" #include "qemu-log.h" -#if defined(CONFIG_SLIRP) -#include "libslirp.h" -#endif +#include "slirp/libslirp.h" static VLANState *first_vlan; @@ -712,11 +710,6 @@ void slirp_output(const uint8_t *pkt, int pkt_len) qemu_send_packet(slirp_vc, pkt, pkt_len); } -int slirp_is_inited(void) -{ - return slirp_inited; -} - static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size) { #ifdef DEBUG_SLIRP @@ -138,7 +138,6 @@ void net_slirp_hostfwd_add(Monitor *mon, const char *redir_str); void net_slirp_hostfwd_remove(Monitor *mon, const char *src_str); void net_slirp_redir(const char *redir_str); void net_cleanup(void); -int slirp_is_inited(void); void net_client_check(void); void net_set_boot_mask(int boot_mask); void net_host_device_add(Monitor *mon, const char *device, const char *opts); diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 8117187f94..b0496d546f 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -3,6 +3,8 @@ #include <qemu-common.h> +#ifdef CONFIG_SLIRP + void slirp_init(int restricted, struct in_addr vnetwork, struct in_addr vnetmask, struct in_addr vhost, const char *vhostname, const char *tftp_path, @@ -12,7 +14,8 @@ void slirp_init(int restricted, struct in_addr vnetwork, void slirp_select_fill(int *pnfds, fd_set *readfds, fd_set *writefds, fd_set *xfds); -void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds); +void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, + int select_error); void slirp_input(const uint8_t *pkt, int pkt_len); @@ -32,4 +35,13 @@ void slirp_socket_recv(struct in_addr guest_addr, int guest_port, const uint8_t *buf, int size); size_t slirp_socket_can_recv(struct in_addr guest_addr, int guest_port); +#else /* !CONFIG_SLIRP */ + +static inline void slirp_select_fill(int *pnfds, fd_set *readfds, + fd_set *writefds, fd_set *xfds) { } + +static inline void slirp_select_poll(fd_set *readfds, fd_set *writefds, + fd_set *xfds, int select_error) { } +#endif /* !CONFIG_SLIRP */ + #endif diff --git a/slirp/slirp.c b/slirp/slirp.c index 20c691f3e3..cf52d36ece 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -271,6 +271,10 @@ void slirp_select_fill(int *pnfds, int nfds; int tmp_time; + if (!link_up) { + return; + } + /* fail safe */ global_readfds = NULL; global_writefds = NULL; @@ -281,7 +285,7 @@ void slirp_select_fill(int *pnfds, * First, TCP sockets */ do_slowtimo = 0; - if (link_up) { + /* * *_slowtimo needs calling if there are IP fragments * in the fragment queue, or there are TCP connections active @@ -375,7 +379,6 @@ void slirp_select_fill(int *pnfds, UPD_NFDS(so->s); } } - } /* * Setup timeout to use minimum CPU usage, especially when idle @@ -413,11 +416,16 @@ void slirp_select_fill(int *pnfds, *pnfds = nfds; } -void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) +void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, + int select_error) { struct socket *so, *so_next; int ret; + if (!link_up) { + return; + } + global_readfds = readfds; global_writefds = writefds; global_xfds = xfds; @@ -428,7 +436,6 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) /* * See if anything has timed out */ - if (link_up) { if (time_fasttimo && ((curtime - time_fasttimo) >= 2)) { tcp_fasttimo(); time_fasttimo = 0; @@ -438,12 +445,11 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) tcp_slowtimo(); last_slowtimo = curtime; } - } /* * Check sockets */ - if (link_up) { + if (!select_error) { /* * Check TCP sockets */ @@ -576,7 +582,7 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) /* * See if we can start outputting */ - if (if_queued && link_up) + if (if_queued) if_start(); /* clear global file descriptor sets. @@ -165,9 +165,7 @@ int main(int argc, char **argv) #include "qemu_socket.h" -#if defined(CONFIG_SLIRP) -#include "libslirp.h" -#endif +#include "slirp/libslirp.h" //#define DEBUG_UNUSED_IOPORT //#define DEBUG_IOPORT @@ -4266,11 +4264,8 @@ void main_loop_wait(int timeout) tv.tv_sec = timeout / 1000; tv.tv_usec = (timeout % 1000) * 1000; -#if defined(CONFIG_SLIRP) - if (slirp_is_inited()) { - slirp_select_fill(&nfds, &rfds, &wfds, &xfds); - } -#endif + slirp_select_fill(&nfds, &rfds, &wfds, &xfds); + qemu_mutex_unlock_iothread(); ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv); qemu_mutex_lock_iothread(); @@ -4297,16 +4292,8 @@ void main_loop_wait(int timeout) pioh = &ioh->next; } } -#if defined(CONFIG_SLIRP) - if (slirp_is_inited()) { - if (ret < 0) { - FD_ZERO(&rfds); - FD_ZERO(&wfds); - FD_ZERO(&xfds); - } - slirp_select_poll(&rfds, &wfds, &xfds); - } -#endif + + slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0)); /* rearm timer, if not periodic */ if (alarm_timer->flags & ALARM_FLAG_EXPIRED) { |