diff options
author | Anders Waldenborg <anders@0x63.nu> | 2012-07-13 22:54:17 +0200 |
---|---|---|
committer | Jan Kiszka <jan.kiszka@siemens.com> | 2012-08-03 23:31:52 +0200 |
commit | afe63a1de4dac354e3bbadff0aa3b7a343ef4ede (patch) | |
tree | 67ba4f23505e38c2dbd6d4c15a7d54727efb2061 | |
parent | 1bf1bdd85f4e7f50015b05ad513393d2f18d1a54 (diff) | |
download | slirp-afe63a1de4dac354e3bbadff0aa3b7a343ef4ede.zip slirp-afe63a1de4dac354e3bbadff0aa3b7a343ef4ede.tar.gz slirp-afe63a1de4dac354e3bbadff0aa3b7a343ef4ede.tar.bz2 |
slirp: Handle whole 127.0.0.0/8 network as local addresses.
Changes so translation of remote address to the host's ip address in
the virtual network happens for all addresses in the 127.0.0.0/8
network, not just 127.0.0.1.
This fixes so that hostfwd bound to addresses such as 127.0.0.2 works.
Signed-off-by: Anders Waldenborg <anders@0x63.nu>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
-rw-r--r-- | main.h | 1 | ||||
-rw-r--r-- | slirp.c | 3 | ||||
-rw-r--r-- | tcp_subr.c | 5 |
3 files changed, 8 insertions, 1 deletions
@@ -31,6 +31,7 @@ extern char *exec_shell; extern u_int curtime; extern fd_set *global_readfds, *global_writefds, *global_xfds; extern struct in_addr loopback_addr; +extern in_addr_t loopback_mask; extern char *username; extern char *socket_path; extern int towrite_max; @@ -29,6 +29,8 @@ /* host loopback address */ struct in_addr loopback_addr; +/* host loopback network mask */ +in_addr_t loopback_mask; /* emulated hosts use the MAC addr 52:55:IP:IP:IP:IP */ static const uint8_t special_ethaddr[ETH_ALEN] = { 0x52, 0x55, 0x00, @@ -190,6 +192,7 @@ static void slirp_init_once(void) #endif loopback_addr.s_addr = htonl(INADDR_LOOPBACK); + loopback_mask = htonl(IN_CLASSA_NET); } static void slirp_state_save(QEMUFile *f, void *opaque); @@ -433,8 +433,11 @@ void tcp_connect(struct socket *inso) so->so_fport = addr.sin_port; so->so_faddr = addr.sin_addr; /* Translate connections from localhost to the real hostname */ - if (so->so_faddr.s_addr == 0 || so->so_faddr.s_addr == loopback_addr.s_addr) + if (so->so_faddr.s_addr == 0 || + (so->so_faddr.s_addr & loopback_mask) == + (loopback_addr.s_addr & loopback_mask)) { so->so_faddr = slirp->vhost_addr; + } /* Close the accept() socket, set right state */ if (inso->so_state & SS_FACCEPTONCE) { |