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
This commit is contained in:
aliguori 2009-04-21 19:56:44 +00:00
parent 764a4d1deb
commit d4ebe1934a
5 changed files with 28 additions and 17 deletions

View File

@ -1735,6 +1735,10 @@ static const mon_cmd_t mon_cmds[] = {
"tap|user|socket|vde|dump [options]", "add host VLAN client" }, "tap|user|socket|vde|dump [options]", "add host VLAN client" },
{ "host_net_remove", "is", net_host_device_remove, { "host_net_remove", "is", net_host_device_remove,
"vlan_id name", "remove host VLAN client" }, "vlan_id name", "remove host VLAN client" },
#ifdef CONFIG_SLIRP
{ "host_net_redir", "s", net_slirp_redir,
"[tcp|udp]:host-port:[guest-host]:guest-port", "redirect TCP or UDP connections from host to guest (requires -net user)" },
#endif
{ "balloon", "i", do_balloon, { "balloon", "i", do_balloon,
"target", "request VM to change it's memory allocation (in MB)" }, "target", "request VM to change it's memory allocation (in MB)" },
{ "set_link", "ss", do_set_link, { "set_link", "ss", do_set_link,

35
net.c
View File

@ -556,11 +556,11 @@ static int net_slirp_init(VLANState *vlan, const char *model, const char *name)
return 0; return 0;
} }
void net_slirp_redir(const char *redir_str) void net_slirp_redir(Monitor *mon, const char *redir_str)
{ {
int is_udp; int is_udp;
char buf[256], *r; char buf[256], *r;
const char *p; const char *p, *errmsg;
struct in_addr guest_addr; struct in_addr guest_addr;
int host_port, guest_port; int host_port, guest_port;
@ -571,41 +571,48 @@ void net_slirp_redir(const char *redir_str)
p = redir_str; p = redir_str;
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
goto fail; goto fail_syntax;
if (!strcmp(buf, "tcp")) { if (!strcmp(buf, "tcp") || buf[0] == '\0') {
is_udp = 0; is_udp = 0;
} else if (!strcmp(buf, "udp")) { } else if (!strcmp(buf, "udp")) {
is_udp = 1; is_udp = 1;
} else { } else {
goto fail; goto fail_syntax;
} }
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
goto fail; goto fail_syntax;
host_port = strtol(buf, &r, 0); host_port = strtol(buf, &r, 0);
if (r == buf) if (r == buf)
goto fail; goto fail_syntax;
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
goto fail; goto fail_syntax;
if (buf[0] == '\0') { if (buf[0] == '\0') {
pstrcpy(buf, sizeof(buf), "10.0.2.15"); pstrcpy(buf, sizeof(buf), "10.0.2.15");
} }
if (!inet_aton(buf, &guest_addr)) if (!inet_aton(buf, &guest_addr))
goto fail; goto fail_syntax;
guest_port = strtol(p, &r, 0); guest_port = strtol(p, &r, 0);
if (r == p) if (r == p)
goto fail; goto fail_syntax;
if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) { if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
fprintf(stderr, "qemu: could not set up redirection\n"); errmsg = "could not set up redirection\n";
exit(1); goto fail;
} }
return; return;
fail_syntax:
errmsg = "invalid redirection format\n";
fail: fail:
fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n"); if (mon) {
exit(1); monitor_printf(mon, errmsg);
} else {
fprintf(stderr, "qemu: %s", errmsg);
exit(1);
}
} }
#ifndef _WIN32 #ifndef _WIN32

2
net.h
View File

@ -112,7 +112,7 @@ int net_client_init(const char *device, const char *p);
void net_client_uninit(NICInfo *nd); void net_client_uninit(NICInfo *nd);
int net_client_parse(const char *str); int net_client_parse(const char *str);
void net_slirp_smb(const char *exported_dir); void net_slirp_smb(const char *exported_dir);
void net_slirp_redir(const char *redir_str); void net_slirp_redir(Monitor *mon, const char *redir_str);
void net_cleanup(void); void net_cleanup(void);
int slirp_is_inited(void); int slirp_is_inited(void);
void net_client_check(void); void net_client_check(void);

View File

@ -943,7 +943,7 @@ When using the user mode network stack, redirect incoming TCP or UDP
connections to the host port @var{host-port} to the guest connections to the host port @var{host-port} to the guest
@var{guest-host} on guest port @var{guest-port}. If @var{guest-host} @var{guest-host} on guest port @var{guest-port}. If @var{guest-host}
is not specified, its value is 10.0.2.15 (default address given by the is not specified, its value is 10.0.2.15 (default address given by the
built-in DHCP server). built-in DHCP server). If no connection type is specified, TCP is used.
For example, to redirect host X11 connection from screen 1 to guest For example, to redirect host X11 connection from screen 1 to guest
screen 0, use the following: screen 0, use the following:

2
vl.c
View File

@ -4589,7 +4589,7 @@ int main(int argc, char **argv, char **envp)
break; break;
#endif #endif
case QEMU_OPTION_redir: case QEMU_OPTION_redir:
net_slirp_redir(optarg); net_slirp_redir(NULL, optarg);
break; break;
#endif #endif
case QEMU_OPTION_bt: case QEMU_OPTION_bt: