Commit f749998939e564d8b8363bd6148b7a067d6bc9e3
1 parent
e5b0bc44
Add nodelay option for TCP character devices.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2362 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
17 additions
and
3 deletions
qemu-doc.texi
... | ... | @@ -576,13 +576,14 @@ localhost 5555 |
576 | 576 | @end table |
577 | 577 | |
578 | 578 | |
579 | -@item tcp:[host]:port[,server][,nowait] | |
579 | +@item tcp:[host]:port[,server][,nowait][,nodelay] | |
580 | 580 | The TCP Net Console has two modes of operation. It can send the serial |
581 | 581 | I/O to a location or wait for a connection from a location. By default |
582 | 582 | the TCP Net Console is sent to @var{host} at the @var{port}. If you use |
583 | 583 | the @var{server} option QEMU will wait for a client socket application |
584 | 584 | to connect to the port before continuing, unless the @code{nowait} |
585 | -option was specified. If @var{host} is omitted, 0.0.0.0 is assumed. Only | |
585 | +option was specified. The @code{nodelay} option disables the Nagle buffering | |
586 | +algoritm. If @var{host} is omitted, 0.0.0.0 is assumed. Only | |
586 | 587 | one TCP connection at a time is accepted. You can use @code{telnet} to |
587 | 588 | connect to the corresponding character device. |
588 | 589 | @table @code |
... | ... | @@ -594,7 +595,7 @@ connect to the corresponding character device. |
594 | 595 | -serial tcp:192.168.0.100:4444,server,nowait |
595 | 596 | @end table |
596 | 597 | |
597 | -@item telnet:host:port[,server][,nowait] | |
598 | +@item telnet:host:port[,server][,nowait][,nodelay] | |
598 | 599 | The telnet protocol is used instead of raw tcp sockets. The options |
599 | 600 | work the same as if you had specified @code{-serial tcp}. The |
600 | 601 | difference is that the port acts like a telnet server or client using | ... | ... |
vl.c
... | ... | @@ -2497,6 +2497,12 @@ static void tcp_chr_telnet_init(int fd) |
2497 | 2497 | send(fd, (char *)buf, 3, 0); |
2498 | 2498 | } |
2499 | 2499 | |
2500 | +static void socket_set_nodelay(int fd) | |
2501 | +{ | |
2502 | + int val = 1; | |
2503 | + setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val)); | |
2504 | +} | |
2505 | + | |
2500 | 2506 | static void tcp_chr_accept(void *opaque) |
2501 | 2507 | { |
2502 | 2508 | CharDriverState *chr = opaque; |
... | ... | @@ -2530,6 +2536,8 @@ static void tcp_chr_accept(void *opaque) |
2530 | 2536 | } |
2531 | 2537 | } |
2532 | 2538 | socket_set_nonblock(fd); |
2539 | + if (s->do_nodelay) | |
2540 | + socket_set_nodelay(fd); | |
2533 | 2541 | s->fd = fd; |
2534 | 2542 | qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL); |
2535 | 2543 | tcp_chr_connect(chr); |
... | ... | @@ -2554,6 +2562,7 @@ static CharDriverState *qemu_chr_open_tcp(const char *host_str, |
2554 | 2562 | int fd = -1, ret, err, val; |
2555 | 2563 | int is_listen = 0; |
2556 | 2564 | int is_waitconnect = 1; |
2565 | + int do_nodelay = 0; | |
2557 | 2566 | const char *ptr; |
2558 | 2567 | struct sockaddr_in saddr; |
2559 | 2568 | #ifndef _WIN32 |
... | ... | @@ -2584,6 +2593,8 @@ static CharDriverState *qemu_chr_open_tcp(const char *host_str, |
2584 | 2593 | is_listen = 1; |
2585 | 2594 | } else if (!strncmp(ptr,"nowait",6)) { |
2586 | 2595 | is_waitconnect = 0; |
2596 | + } else if (!strncmp(ptr,"nodelay",6)) { | |
2597 | + do_nodelay = 1; | |
2587 | 2598 | } else { |
2588 | 2599 | printf("Unknown option: %s\n", ptr); |
2589 | 2600 | goto fail; |
... | ... | @@ -2616,6 +2627,7 @@ static CharDriverState *qemu_chr_open_tcp(const char *host_str, |
2616 | 2627 | s->fd = -1; |
2617 | 2628 | s->listen_fd = -1; |
2618 | 2629 | s->is_unix = is_unix; |
2630 | + s->do_nodelay = do_nodelay && !is_unix; | |
2619 | 2631 | |
2620 | 2632 | chr->opaque = s; |
2621 | 2633 | chr->chr_write = tcp_chr_write; |
... | ... | @@ -2665,6 +2677,7 @@ static CharDriverState *qemu_chr_open_tcp(const char *host_str, |
2665 | 2677 | } |
2666 | 2678 | } |
2667 | 2679 | s->fd = fd; |
2680 | + socket_set_nodelay(fd); | |
2668 | 2681 | if (s->connected) |
2669 | 2682 | tcp_chr_connect(chr); |
2670 | 2683 | else | ... | ... |