Commit d918f23efaf486293b96418fe5deaff8a5583304

Authored by Jan Kiszka
Committed by Anthony Liguori
1 parent 8ec7f4ed

slirp: Kill slirp_is_inited

Avoid the need for slirp_is_inited by refactoring the protected
slirp_select_* functions. This also avoids the clearing of all fd sets
on select errors.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
... ... @@ -120,9 +120,7 @@
120 120 #include "qemu_socket.h"
121 121 #include "qemu-log.h"
122 122  
123   -#if defined(CONFIG_SLIRP)
124   -#include "libslirp.h"
125   -#endif
  123 +#include "slirp/libslirp.h"
126 124  
127 125  
128 126 static VLANState *first_vlan;
... ... @@ -712,11 +710,6 @@ void slirp_output(const uint8_t *pkt, int pkt_len)
712 710 qemu_send_packet(slirp_vc, pkt, pkt_len);
713 711 }
714 712  
715   -int slirp_is_inited(void)
716   -{
717   - return slirp_inited;
718   -}
719   -
720 713 static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
721 714 {
722 715 #ifdef DEBUG_SLIRP
... ...
... ... @@ -138,7 +138,6 @@ void net_slirp_hostfwd_add(Monitor *mon, const char *redir_str);
138 138 void net_slirp_hostfwd_remove(Monitor *mon, const char *src_str);
139 139 void net_slirp_redir(const char *redir_str);
140 140 void net_cleanup(void);
141   -int slirp_is_inited(void);
142 141 void net_client_check(void);
143 142 void net_set_boot_mask(int boot_mask);
144 143 void net_host_device_add(Monitor *mon, const char *device, const char *opts);
... ...
slirp/libslirp.h
... ... @@ -3,6 +3,8 @@
3 3  
4 4 #include <qemu-common.h>
5 5  
  6 +#ifdef CONFIG_SLIRP
  7 +
6 8 void slirp_init(int restricted, struct in_addr vnetwork,
7 9 struct in_addr vnetmask, struct in_addr vhost,
8 10 const char *vhostname, const char *tftp_path,
... ... @@ -12,7 +14,8 @@ void slirp_init(int restricted, struct in_addr vnetwork,
12 14 void slirp_select_fill(int *pnfds,
13 15 fd_set *readfds, fd_set *writefds, fd_set *xfds);
14 16  
15   -void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds);
  17 +void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds,
  18 + int select_error);
16 19  
17 20 void slirp_input(const uint8_t *pkt, int pkt_len);
18 21  
... ... @@ -32,4 +35,13 @@ void slirp_socket_recv(struct in_addr guest_addr, int guest_port,
32 35 const uint8_t *buf, int size);
33 36 size_t slirp_socket_can_recv(struct in_addr guest_addr, int guest_port);
34 37  
  38 +#else /* !CONFIG_SLIRP */
  39 +
  40 +static inline void slirp_select_fill(int *pnfds, fd_set *readfds,
  41 + fd_set *writefds, fd_set *xfds) { }
  42 +
  43 +static inline void slirp_select_poll(fd_set *readfds, fd_set *writefds,
  44 + fd_set *xfds, int select_error) { }
  45 +#endif /* !CONFIG_SLIRP */
  46 +
35 47 #endif
... ...
slirp/slirp.c
... ... @@ -271,6 +271,10 @@ void slirp_select_fill(int *pnfds,
271 271 int nfds;
272 272 int tmp_time;
273 273  
  274 + if (!link_up) {
  275 + return;
  276 + }
  277 +
274 278 /* fail safe */
275 279 global_readfds = NULL;
276 280 global_writefds = NULL;
... ... @@ -281,7 +285,7 @@ void slirp_select_fill(int *pnfds,
281 285 * First, TCP sockets
282 286 */
283 287 do_slowtimo = 0;
284   - if (link_up) {
  288 +
285 289 /*
286 290 * *_slowtimo needs calling if there are IP fragments
287 291 * in the fragment queue, or there are TCP connections active
... ... @@ -375,7 +379,6 @@ void slirp_select_fill(int *pnfds,
375 379 UPD_NFDS(so->s);
376 380 }
377 381 }
378   - }
379 382  
380 383 /*
381 384 * Setup timeout to use minimum CPU usage, especially when idle
... ... @@ -413,11 +416,16 @@ void slirp_select_fill(int *pnfds,
413 416 *pnfds = nfds;
414 417 }
415 418  
416   -void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds)
  419 +void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds,
  420 + int select_error)
417 421 {
418 422 struct socket *so, *so_next;
419 423 int ret;
420 424  
  425 + if (!link_up) {
  426 + return;
  427 + }
  428 +
421 429 global_readfds = readfds;
422 430 global_writefds = writefds;
423 431 global_xfds = xfds;
... ... @@ -428,7 +436,6 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds)
428 436 /*
429 437 * See if anything has timed out
430 438 */
431   - if (link_up) {
432 439 if (time_fasttimo && ((curtime - time_fasttimo) >= 2)) {
433 440 tcp_fasttimo();
434 441 time_fasttimo = 0;
... ... @@ -438,12 +445,11 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds)
438 445 tcp_slowtimo();
439 446 last_slowtimo = curtime;
440 447 }
441   - }
442 448  
443 449 /*
444 450 * Check sockets
445 451 */
446   - if (link_up) {
  452 + if (!select_error) {
447 453 /*
448 454 * Check TCP sockets
449 455 */
... ... @@ -576,7 +582,7 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds)
576 582 /*
577 583 * See if we can start outputting
578 584 */
579   - if (if_queued && link_up)
  585 + if (if_queued)
580 586 if_start();
581 587  
582 588 /* clear global file descriptor sets.
... ...
... ... @@ -165,9 +165,7 @@ int main(int argc, char **argv)
165 165  
166 166 #include "qemu_socket.h"
167 167  
168   -#if defined(CONFIG_SLIRP)
169   -#include "libslirp.h"
170   -#endif
  168 +#include "slirp/libslirp.h"
171 169  
172 170 //#define DEBUG_UNUSED_IOPORT
173 171 //#define DEBUG_IOPORT
... ... @@ -4266,11 +4264,8 @@ void main_loop_wait(int timeout)
4266 4264 tv.tv_sec = timeout / 1000;
4267 4265 tv.tv_usec = (timeout % 1000) * 1000;
4268 4266  
4269   -#if defined(CONFIG_SLIRP)
4270   - if (slirp_is_inited()) {
4271   - slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
4272   - }
4273   -#endif
  4267 + slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
  4268 +
4274 4269 qemu_mutex_unlock_iothread();
4275 4270 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
4276 4271 qemu_mutex_lock_iothread();
... ... @@ -4297,16 +4292,8 @@ void main_loop_wait(int timeout)
4297 4292 pioh = &ioh->next;
4298 4293 }
4299 4294 }
4300   -#if defined(CONFIG_SLIRP)
4301   - if (slirp_is_inited()) {
4302   - if (ret < 0) {
4303   - FD_ZERO(&rfds);
4304   - FD_ZERO(&wfds);
4305   - FD_ZERO(&xfds);
4306   - }
4307   - slirp_select_poll(&rfds, &wfds, &xfds);
4308   - }
4309   -#endif
  4295 +
  4296 + slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0));
4310 4297  
4311 4298 /* rearm timer, if not periodic */
4312 4299 if (alarm_timer->flags & ALARM_FLAG_EXPIRED) {
... ...