Commit d918f23efaf486293b96418fe5deaff8a5583304
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>
Showing
5 changed files
with
32 additions
and
35 deletions
net.c
@@ -120,9 +120,7 @@ | @@ -120,9 +120,7 @@ | ||
120 | #include "qemu_socket.h" | 120 | #include "qemu_socket.h" |
121 | #include "qemu-log.h" | 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 | static VLANState *first_vlan; | 126 | static VLANState *first_vlan; |
@@ -712,11 +710,6 @@ void slirp_output(const uint8_t *pkt, int pkt_len) | @@ -712,11 +710,6 @@ void slirp_output(const uint8_t *pkt, int pkt_len) | ||
712 | qemu_send_packet(slirp_vc, pkt, pkt_len); | 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 | static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size) | 713 | static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size) |
721 | { | 714 | { |
722 | #ifdef DEBUG_SLIRP | 715 | #ifdef DEBUG_SLIRP |
net.h
@@ -138,7 +138,6 @@ void net_slirp_hostfwd_add(Monitor *mon, const char *redir_str); | @@ -138,7 +138,6 @@ void net_slirp_hostfwd_add(Monitor *mon, const char *redir_str); | ||
138 | void net_slirp_hostfwd_remove(Monitor *mon, const char *src_str); | 138 | void net_slirp_hostfwd_remove(Monitor *mon, const char *src_str); |
139 | void net_slirp_redir(const char *redir_str); | 139 | void net_slirp_redir(const char *redir_str); |
140 | void net_cleanup(void); | 140 | void net_cleanup(void); |
141 | -int slirp_is_inited(void); | ||
142 | void net_client_check(void); | 141 | void net_client_check(void); |
143 | void net_set_boot_mask(int boot_mask); | 142 | void net_set_boot_mask(int boot_mask); |
144 | void net_host_device_add(Monitor *mon, const char *device, const char *opts); | 143 | void net_host_device_add(Monitor *mon, const char *device, const char *opts); |
slirp/libslirp.h
@@ -3,6 +3,8 @@ | @@ -3,6 +3,8 @@ | ||
3 | 3 | ||
4 | #include <qemu-common.h> | 4 | #include <qemu-common.h> |
5 | 5 | ||
6 | +#ifdef CONFIG_SLIRP | ||
7 | + | ||
6 | void slirp_init(int restricted, struct in_addr vnetwork, | 8 | void slirp_init(int restricted, struct in_addr vnetwork, |
7 | struct in_addr vnetmask, struct in_addr vhost, | 9 | struct in_addr vnetmask, struct in_addr vhost, |
8 | const char *vhostname, const char *tftp_path, | 10 | const char *vhostname, const char *tftp_path, |
@@ -12,7 +14,8 @@ void slirp_init(int restricted, struct in_addr vnetwork, | @@ -12,7 +14,8 @@ void slirp_init(int restricted, struct in_addr vnetwork, | ||
12 | void slirp_select_fill(int *pnfds, | 14 | void slirp_select_fill(int *pnfds, |
13 | fd_set *readfds, fd_set *writefds, fd_set *xfds); | 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 | void slirp_input(const uint8_t *pkt, int pkt_len); | 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,4 +35,13 @@ void slirp_socket_recv(struct in_addr guest_addr, int guest_port, | ||
32 | const uint8_t *buf, int size); | 35 | const uint8_t *buf, int size); |
33 | size_t slirp_socket_can_recv(struct in_addr guest_addr, int guest_port); | 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 | #endif | 47 | #endif |
slirp/slirp.c
@@ -271,6 +271,10 @@ void slirp_select_fill(int *pnfds, | @@ -271,6 +271,10 @@ void slirp_select_fill(int *pnfds, | ||
271 | int nfds; | 271 | int nfds; |
272 | int tmp_time; | 272 | int tmp_time; |
273 | 273 | ||
274 | + if (!link_up) { | ||
275 | + return; | ||
276 | + } | ||
277 | + | ||
274 | /* fail safe */ | 278 | /* fail safe */ |
275 | global_readfds = NULL; | 279 | global_readfds = NULL; |
276 | global_writefds = NULL; | 280 | global_writefds = NULL; |
@@ -281,7 +285,7 @@ void slirp_select_fill(int *pnfds, | @@ -281,7 +285,7 @@ void slirp_select_fill(int *pnfds, | ||
281 | * First, TCP sockets | 285 | * First, TCP sockets |
282 | */ | 286 | */ |
283 | do_slowtimo = 0; | 287 | do_slowtimo = 0; |
284 | - if (link_up) { | 288 | + |
285 | /* | 289 | /* |
286 | * *_slowtimo needs calling if there are IP fragments | 290 | * *_slowtimo needs calling if there are IP fragments |
287 | * in the fragment queue, or there are TCP connections active | 291 | * in the fragment queue, or there are TCP connections active |
@@ -375,7 +379,6 @@ void slirp_select_fill(int *pnfds, | @@ -375,7 +379,6 @@ void slirp_select_fill(int *pnfds, | ||
375 | UPD_NFDS(so->s); | 379 | UPD_NFDS(so->s); |
376 | } | 380 | } |
377 | } | 381 | } |
378 | - } | ||
379 | 382 | ||
380 | /* | 383 | /* |
381 | * Setup timeout to use minimum CPU usage, especially when idle | 384 | * Setup timeout to use minimum CPU usage, especially when idle |
@@ -413,11 +416,16 @@ void slirp_select_fill(int *pnfds, | @@ -413,11 +416,16 @@ void slirp_select_fill(int *pnfds, | ||
413 | *pnfds = nfds; | 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 | struct socket *so, *so_next; | 422 | struct socket *so, *so_next; |
419 | int ret; | 423 | int ret; |
420 | 424 | ||
425 | + if (!link_up) { | ||
426 | + return; | ||
427 | + } | ||
428 | + | ||
421 | global_readfds = readfds; | 429 | global_readfds = readfds; |
422 | global_writefds = writefds; | 430 | global_writefds = writefds; |
423 | global_xfds = xfds; | 431 | global_xfds = xfds; |
@@ -428,7 +436,6 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | @@ -428,7 +436,6 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | ||
428 | /* | 436 | /* |
429 | * See if anything has timed out | 437 | * See if anything has timed out |
430 | */ | 438 | */ |
431 | - if (link_up) { | ||
432 | if (time_fasttimo && ((curtime - time_fasttimo) >= 2)) { | 439 | if (time_fasttimo && ((curtime - time_fasttimo) >= 2)) { |
433 | tcp_fasttimo(); | 440 | tcp_fasttimo(); |
434 | time_fasttimo = 0; | 441 | time_fasttimo = 0; |
@@ -438,12 +445,11 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | @@ -438,12 +445,11 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | ||
438 | tcp_slowtimo(); | 445 | tcp_slowtimo(); |
439 | last_slowtimo = curtime; | 446 | last_slowtimo = curtime; |
440 | } | 447 | } |
441 | - } | ||
442 | 448 | ||
443 | /* | 449 | /* |
444 | * Check sockets | 450 | * Check sockets |
445 | */ | 451 | */ |
446 | - if (link_up) { | 452 | + if (!select_error) { |
447 | /* | 453 | /* |
448 | * Check TCP sockets | 454 | * Check TCP sockets |
449 | */ | 455 | */ |
@@ -576,7 +582,7 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | @@ -576,7 +582,7 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds) | ||
576 | /* | 582 | /* |
577 | * See if we can start outputting | 583 | * See if we can start outputting |
578 | */ | 584 | */ |
579 | - if (if_queued && link_up) | 585 | + if (if_queued) |
580 | if_start(); | 586 | if_start(); |
581 | 587 | ||
582 | /* clear global file descriptor sets. | 588 | /* clear global file descriptor sets. |
vl.c
@@ -165,9 +165,7 @@ int main(int argc, char **argv) | @@ -165,9 +165,7 @@ int main(int argc, char **argv) | ||
165 | 165 | ||
166 | #include "qemu_socket.h" | 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 | //#define DEBUG_UNUSED_IOPORT | 170 | //#define DEBUG_UNUSED_IOPORT |
173 | //#define DEBUG_IOPORT | 171 | //#define DEBUG_IOPORT |
@@ -4266,11 +4264,8 @@ void main_loop_wait(int timeout) | @@ -4266,11 +4264,8 @@ void main_loop_wait(int timeout) | ||
4266 | tv.tv_sec = timeout / 1000; | 4264 | tv.tv_sec = timeout / 1000; |
4267 | tv.tv_usec = (timeout % 1000) * 1000; | 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 | qemu_mutex_unlock_iothread(); | 4269 | qemu_mutex_unlock_iothread(); |
4275 | ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv); | 4270 | ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv); |
4276 | qemu_mutex_lock_iothread(); | 4271 | qemu_mutex_lock_iothread(); |
@@ -4297,16 +4292,8 @@ void main_loop_wait(int timeout) | @@ -4297,16 +4292,8 @@ void main_loop_wait(int timeout) | ||
4297 | pioh = &ioh->next; | 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 | /* rearm timer, if not periodic */ | 4298 | /* rearm timer, if not periodic */ |
4312 | if (alarm_timer->flags & ALARM_FLAG_EXPIRED) { | 4299 | if (alarm_timer->flags & ALARM_FLAG_EXPIRED) { |