Commit 8dbca8dd8a81d7f1afd6ef23b418c8f9d292b65d
1 parent
68cae3d8
separate alias_addr (10.0.2.2) from our_addr (Ed Swierk)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1895 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
7 changed files
with
13 additions
and
12 deletions
slirp/ip_icmp.c
| @@ -114,8 +114,7 @@ icmp_input(m, hlen) | @@ -114,8 +114,7 @@ icmp_input(m, hlen) | ||
| 114 | case ICMP_ECHO: | 114 | case ICMP_ECHO: |
| 115 | icp->icmp_type = ICMP_ECHOREPLY; | 115 | icp->icmp_type = ICMP_ECHOREPLY; |
| 116 | ip->ip_len += hlen; /* since ip_input subtracts this */ | 116 | ip->ip_len += hlen; /* since ip_input subtracts this */ |
| 117 | - if (ip->ip_dst.s_addr == our_addr.s_addr || | ||
| 118 | - (ip->ip_dst.s_addr == (special_addr.s_addr|htonl(CTL_ALIAS))) ) { | 117 | + if (ip->ip_dst.s_addr == alias_addr.s_addr) { |
| 119 | icmp_reflect(m); | 118 | icmp_reflect(m); |
| 120 | } else { | 119 | } else { |
| 121 | struct socket *so; | 120 | struct socket *so; |
| @@ -161,7 +160,7 @@ icmp_input(m, hlen) | @@ -161,7 +160,7 @@ icmp_input(m, hlen) | ||
| 161 | icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno)); | 160 | icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno)); |
| 162 | udp_detach(so); | 161 | udp_detach(so); |
| 163 | } | 162 | } |
| 164 | - } /* if ip->ip_dst.s_addr == our_addr.s_addr */ | 163 | + } /* if ip->ip_dst.s_addr == alias_addr.s_addr */ |
| 165 | break; | 164 | break; |
| 166 | case ICMP_UNREACH: | 165 | case ICMP_UNREACH: |
| 167 | /* XXX? report error? close socket? */ | 166 | /* XXX? report error? close socket? */ |
| @@ -311,7 +310,7 @@ icmp_error(msrc, type, code, minsize, message) | @@ -311,7 +310,7 @@ icmp_error(msrc, type, code, minsize, message) | ||
| 311 | ip->ip_ttl = MAXTTL; | 310 | ip->ip_ttl = MAXTTL; |
| 312 | ip->ip_p = IPPROTO_ICMP; | 311 | ip->ip_p = IPPROTO_ICMP; |
| 313 | ip->ip_dst = ip->ip_src; /* ip adresses */ | 312 | ip->ip_dst = ip->ip_src; /* ip adresses */ |
| 314 | - ip->ip_src = our_addr; | 313 | + ip->ip_src = alias_addr; |
| 315 | 314 | ||
| 316 | (void ) ip_output((struct socket *)NULL, m); | 315 | (void ) ip_output((struct socket *)NULL, m); |
| 317 | 316 |
slirp/main.h
| @@ -34,6 +34,7 @@ extern u_int curtime; | @@ -34,6 +34,7 @@ extern u_int curtime; | ||
| 34 | extern fd_set *global_readfds, *global_writefds, *global_xfds; | 34 | extern fd_set *global_readfds, *global_writefds, *global_xfds; |
| 35 | extern struct in_addr ctl_addr; | 35 | extern struct in_addr ctl_addr; |
| 36 | extern struct in_addr special_addr; | 36 | extern struct in_addr special_addr; |
| 37 | +extern struct in_addr alias_addr; | ||
| 37 | extern struct in_addr our_addr; | 38 | extern struct in_addr our_addr; |
| 38 | extern struct in_addr loopback_addr; | 39 | extern struct in_addr loopback_addr; |
| 39 | extern struct in_addr dns_addr; | 40 | extern struct in_addr dns_addr; |
slirp/misc.c
| @@ -94,10 +94,8 @@ getouraddr() | @@ -94,10 +94,8 @@ getouraddr() | ||
| 94 | he = gethostbyname(buff); | 94 | he = gethostbyname(buff); |
| 95 | if (he) | 95 | if (he) |
| 96 | our_addr = *(struct in_addr *)he->h_addr; | 96 | our_addr = *(struct in_addr *)he->h_addr; |
| 97 | - /* If the host doesn't have a useful IP address then use the | ||
| 98 | - guest side address. */ | ||
| 99 | - if (our_addr.s_addr == 0 || our_addr.s_addr == loopback_addr.s_addr) | ||
| 100 | - our_addr.s_addr = special_addr.s_addr | htonl(CTL_ALIAS); | 97 | + if (our_addr.s_addr == 0) |
| 98 | + our_addr.s_addr = loopback_addr.s_addr; | ||
| 101 | } | 99 | } |
| 102 | 100 | ||
| 103 | #if SIZEOF_CHAR_P == 8 | 101 | #if SIZEOF_CHAR_P == 8 |
slirp/slirp.c
| @@ -9,6 +9,8 @@ struct in_addr loopback_addr; | @@ -9,6 +9,8 @@ struct in_addr loopback_addr; | ||
| 9 | 9 | ||
| 10 | /* address for slirp virtual addresses */ | 10 | /* address for slirp virtual addresses */ |
| 11 | struct in_addr special_addr; | 11 | struct in_addr special_addr; |
| 12 | +/* virtual address alias for host */ | ||
| 13 | +struct in_addr alias_addr; | ||
| 12 | 14 | ||
| 13 | const uint8_t special_ethaddr[6] = { | 15 | const uint8_t special_ethaddr[6] = { |
| 14 | 0x52, 0x54, 0x00, 0x12, 0x35, 0x00 | 16 | 0x52, 0x54, 0x00, 0x12, 0x35, 0x00 |
| @@ -154,6 +156,7 @@ void slirp_init(void) | @@ -154,6 +156,7 @@ void slirp_init(void) | ||
| 154 | } | 156 | } |
| 155 | 157 | ||
| 156 | inet_aton(CTL_SPECIAL, &special_addr); | 158 | inet_aton(CTL_SPECIAL, &special_addr); |
| 159 | + alias_addr.s_addr = special_addr.s_addr | htonl(CTL_ALIAS); | ||
| 157 | getouraddr(); | 160 | getouraddr(); |
| 158 | } | 161 | } |
| 159 | 162 |
slirp/socket.c
| @@ -596,7 +596,7 @@ solisten(port, laddr, lport, flags) | @@ -596,7 +596,7 @@ solisten(port, laddr, lport, flags) | ||
| 596 | getsockname(s,(struct sockaddr *)&addr,&addrlen); | 596 | getsockname(s,(struct sockaddr *)&addr,&addrlen); |
| 597 | so->so_fport = addr.sin_port; | 597 | so->so_fport = addr.sin_port; |
| 598 | if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr) | 598 | if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr) |
| 599 | - so->so_faddr = our_addr; | 599 | + so->so_faddr = alias_addr; |
| 600 | else | 600 | else |
| 601 | so->so_faddr = addr.sin_addr; | 601 | so->so_faddr = addr.sin_addr; |
| 602 | 602 |
slirp/tcp_subr.c
| @@ -504,7 +504,7 @@ tcp_connect(inso) | @@ -504,7 +504,7 @@ tcp_connect(inso) | ||
| 504 | so->so_faddr = addr.sin_addr; | 504 | so->so_faddr = addr.sin_addr; |
| 505 | /* Translate connections from localhost to the real hostname */ | 505 | /* Translate connections from localhost to the real hostname */ |
| 506 | if (so->so_faddr.s_addr == 0 || so->so_faddr.s_addr == loopback_addr.s_addr) | 506 | if (so->so_faddr.s_addr == 0 || so->so_faddr.s_addr == loopback_addr.s_addr) |
| 507 | - so->so_faddr = our_addr; | 507 | + so->so_faddr = alias_addr; |
| 508 | 508 | ||
| 509 | /* Close the accept() socket, set right state */ | 509 | /* Close the accept() socket, set right state */ |
| 510 | if (inso->so_state & SS_FACCEPTONCE) { | 510 | if (inso->so_state & SS_FACCEPTONCE) { |
| @@ -840,7 +840,7 @@ tcp_emu(so, m) | @@ -840,7 +840,7 @@ tcp_emu(so, m) | ||
| 840 | 840 | ||
| 841 | if (ns->so_faddr.s_addr == 0 || | 841 | if (ns->so_faddr.s_addr == 0 || |
| 842 | ns->so_faddr.s_addr == loopback_addr.s_addr) | 842 | ns->so_faddr.s_addr == loopback_addr.s_addr) |
| 843 | - ns->so_faddr = our_addr; | 843 | + ns->so_faddr = alias_addr; |
| 844 | 844 | ||
| 845 | ns->so_iptos = tcp_tos(ns); | 845 | ns->so_iptos = tcp_tos(ns); |
| 846 | tp = sototcpcb(ns); | 846 | tp = sototcpcb(ns); |
slirp/udp.c
| @@ -657,7 +657,7 @@ udp_listen(port, laddr, lport, flags) | @@ -657,7 +657,7 @@ udp_listen(port, laddr, lport, flags) | ||
| 657 | getsockname(so->s,(struct sockaddr *)&addr,&addrlen); | 657 | getsockname(so->s,(struct sockaddr *)&addr,&addrlen); |
| 658 | so->so_fport = addr.sin_port; | 658 | so->so_fport = addr.sin_port; |
| 659 | if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr) | 659 | if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr) |
| 660 | - so->so_faddr = our_addr; | 660 | + so->so_faddr = alias_addr; |
| 661 | else | 661 | else |
| 662 | so->so_faddr = addr.sin_addr; | 662 | so->so_faddr = addr.sin_addr; |
| 663 | 663 |