Commit d4ebe1934a89b1ab699a9485c85c42f1ec9ae2ad
1 parent
764a4d1d
slirp: Enhance host-guest redirection setup (Jan Kiszka)
Allow to establish a TCP/UDP connection redirection also via a monitor command 'host_net_redir'. Moreover, assume TCP as connection type if that parameter is omitted. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7204 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
28 additions
and
17 deletions
monitor.c
... | ... | @@ -1735,6 +1735,10 @@ static const mon_cmd_t mon_cmds[] = { |
1735 | 1735 | "tap|user|socket|vde|dump [options]", "add host VLAN client" }, |
1736 | 1736 | { "host_net_remove", "is", net_host_device_remove, |
1737 | 1737 | "vlan_id name", "remove host VLAN client" }, |
1738 | +#ifdef CONFIG_SLIRP | |
1739 | + { "host_net_redir", "s", net_slirp_redir, | |
1740 | + "[tcp|udp]:host-port:[guest-host]:guest-port", "redirect TCP or UDP connections from host to guest (requires -net user)" }, | |
1741 | +#endif | |
1738 | 1742 | { "balloon", "i", do_balloon, |
1739 | 1743 | "target", "request VM to change it's memory allocation (in MB)" }, |
1740 | 1744 | { "set_link", "ss", do_set_link, | ... | ... |
net.c
... | ... | @@ -556,11 +556,11 @@ static int net_slirp_init(VLANState *vlan, const char *model, const char *name) |
556 | 556 | return 0; |
557 | 557 | } |
558 | 558 | |
559 | -void net_slirp_redir(const char *redir_str) | |
559 | +void net_slirp_redir(Monitor *mon, const char *redir_str) | |
560 | 560 | { |
561 | 561 | int is_udp; |
562 | 562 | char buf[256], *r; |
563 | - const char *p; | |
563 | + const char *p, *errmsg; | |
564 | 564 | struct in_addr guest_addr; |
565 | 565 | int host_port, guest_port; |
566 | 566 | |
... | ... | @@ -571,41 +571,48 @@ void net_slirp_redir(const char *redir_str) |
571 | 571 | |
572 | 572 | p = redir_str; |
573 | 573 | if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) |
574 | - goto fail; | |
575 | - if (!strcmp(buf, "tcp")) { | |
574 | + goto fail_syntax; | |
575 | + if (!strcmp(buf, "tcp") || buf[0] == '\0') { | |
576 | 576 | is_udp = 0; |
577 | 577 | } else if (!strcmp(buf, "udp")) { |
578 | 578 | is_udp = 1; |
579 | 579 | } else { |
580 | - goto fail; | |
580 | + goto fail_syntax; | |
581 | 581 | } |
582 | 582 | |
583 | 583 | if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) |
584 | - goto fail; | |
584 | + goto fail_syntax; | |
585 | 585 | host_port = strtol(buf, &r, 0); |
586 | 586 | if (r == buf) |
587 | - goto fail; | |
587 | + goto fail_syntax; | |
588 | 588 | |
589 | 589 | if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) |
590 | - goto fail; | |
590 | + goto fail_syntax; | |
591 | 591 | if (buf[0] == '\0') { |
592 | 592 | pstrcpy(buf, sizeof(buf), "10.0.2.15"); |
593 | 593 | } |
594 | 594 | if (!inet_aton(buf, &guest_addr)) |
595 | - goto fail; | |
595 | + goto fail_syntax; | |
596 | 596 | |
597 | 597 | guest_port = strtol(p, &r, 0); |
598 | 598 | if (r == p) |
599 | - goto fail; | |
599 | + goto fail_syntax; | |
600 | 600 | |
601 | 601 | if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) { |
602 | - fprintf(stderr, "qemu: could not set up redirection\n"); | |
603 | - exit(1); | |
602 | + errmsg = "could not set up redirection\n"; | |
603 | + goto fail; | |
604 | 604 | } |
605 | 605 | return; |
606 | + | |
607 | + fail_syntax: | |
608 | + errmsg = "invalid redirection format\n"; | |
606 | 609 | fail: |
607 | - fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n"); | |
608 | - exit(1); | |
610 | + if (mon) { | |
611 | + monitor_printf(mon, errmsg); | |
612 | + } else { | |
613 | + fprintf(stderr, "qemu: %s", errmsg); | |
614 | + exit(1); | |
615 | + } | |
609 | 616 | } |
610 | 617 | |
611 | 618 | #ifndef _WIN32 | ... | ... |
net.h
... | ... | @@ -112,7 +112,7 @@ int net_client_init(const char *device, const char *p); |
112 | 112 | void net_client_uninit(NICInfo *nd); |
113 | 113 | int net_client_parse(const char *str); |
114 | 114 | void net_slirp_smb(const char *exported_dir); |
115 | -void net_slirp_redir(const char *redir_str); | |
115 | +void net_slirp_redir(Monitor *mon, const char *redir_str); | |
116 | 116 | void net_cleanup(void); |
117 | 117 | int slirp_is_inited(void); |
118 | 118 | void net_client_check(void); | ... | ... |
qemu-options.hx
... | ... | @@ -943,7 +943,7 @@ When using the user mode network stack, redirect incoming TCP or UDP |
943 | 943 | connections to the host port @var{host-port} to the guest |
944 | 944 | @var{guest-host} on guest port @var{guest-port}. If @var{guest-host} |
945 | 945 | is not specified, its value is 10.0.2.15 (default address given by the |
946 | -built-in DHCP server). | |
946 | +built-in DHCP server). If no connection type is specified, TCP is used. | |
947 | 947 | |
948 | 948 | For example, to redirect host X11 connection from screen 1 to guest |
949 | 949 | screen 0, use the following: | ... | ... |
vl.c