diff options
author | Alexander Graf <agraf@suse.de> | 2009-05-26 13:03:26 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-05-27 09:46:12 -0500 |
commit | c1261d8d1617d8cf5722039a59ebb66c310f3aea (patch) | |
tree | 8aad15c7b36255d671f3911886b9c0985ee73f28 /slirp | |
parent | 8a43b1ea7fd02a8e9a5c5ef58017b1bd059663bb (diff) | |
download | qemu-c1261d8d1617d8cf5722039a59ebb66c310f3aea.zip qemu-c1261d8d1617d8cf5722039a59ebb66c310f3aea.tar.gz qemu-c1261d8d1617d8cf5722039a59ebb66c310f3aea.tar.bz2 |
User Networking: Enable removal of redirections
Using the new host_net_redir command you can easily create redirections
on the fly while your VM is running.
While that's great, it's missing the removal of redirections, in case you
want to have a port closed again at a later point in time.
This patch adds support for removal of redirections.
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'slirp')
-rw-r--r-- | slirp/libslirp.h | 1 | ||||
-rw-r--r-- | slirp/slirp.c | 23 |
2 files changed, 24 insertions, 0 deletions
diff --git a/slirp/libslirp.h b/slirp/libslirp.h index a1cd70e..6fc2c32 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -18,6 +18,7 @@ void slirp_input(const uint8_t *pkt, int pkt_len); int slirp_can_output(void); void slirp_output(const uint8_t *pkt, int pkt_len); +int slirp_redir_rm(int is_udp, int host_port); int slirp_redir(int is_udp, int host_port, struct in_addr guest_addr, int guest_port); int slirp_add_exec(int do_pty, const void *args, int addr_low_byte, diff --git a/slirp/slirp.c b/slirp/slirp.c index 04d3ded..33397c0 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -734,6 +734,29 @@ void if_encap(const uint8_t *ip_data, int ip_data_len) } } +/* Unlistens a redirection + * + * Return value: number of redirs removed */ +int slirp_redir_rm(int is_udp, int host_port) +{ + struct socket *so; + struct socket *head = (is_udp ? &udb : &tcb); + int fport = htons(host_port); + int n = 0; + + loop_again: + for (so = head->so_next; so != head; so = so->so_next) { + if (so->so_fport == fport) { + close(so->s); + sofree(so); + n++; + goto loop_again; + } + } + + return n; +} + int slirp_redir(int is_udp, int host_port, struct in_addr guest_addr, int guest_port) { |