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 | 114 | case ICMP_ECHO: |
115 | 115 | icp->icmp_type = ICMP_ECHOREPLY; |
116 | 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 | 118 | icmp_reflect(m); |
120 | 119 | } else { |
121 | 120 | struct socket *so; |
... | ... | @@ -161,7 +160,7 @@ icmp_input(m, hlen) |
161 | 160 | icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno)); |
162 | 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 | 164 | break; |
166 | 165 | case ICMP_UNREACH: |
167 | 166 | /* XXX? report error? close socket? */ |
... | ... | @@ -311,7 +310,7 @@ icmp_error(msrc, type, code, minsize, message) |
311 | 310 | ip->ip_ttl = MAXTTL; |
312 | 311 | ip->ip_p = IPPROTO_ICMP; |
313 | 312 | ip->ip_dst = ip->ip_src; /* ip adresses */ |
314 | - ip->ip_src = our_addr; | |
313 | + ip->ip_src = alias_addr; | |
315 | 314 | |
316 | 315 | (void ) ip_output((struct socket *)NULL, m); |
317 | 316 | ... | ... |
slirp/main.h
... | ... | @@ -34,6 +34,7 @@ extern u_int curtime; |
34 | 34 | extern fd_set *global_readfds, *global_writefds, *global_xfds; |
35 | 35 | extern struct in_addr ctl_addr; |
36 | 36 | extern struct in_addr special_addr; |
37 | +extern struct in_addr alias_addr; | |
37 | 38 | extern struct in_addr our_addr; |
38 | 39 | extern struct in_addr loopback_addr; |
39 | 40 | extern struct in_addr dns_addr; | ... | ... |
slirp/misc.c
... | ... | @@ -94,10 +94,8 @@ getouraddr() |
94 | 94 | he = gethostbyname(buff); |
95 | 95 | if (he) |
96 | 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 | 101 | #if SIZEOF_CHAR_P == 8 | ... | ... |
slirp/slirp.c
... | ... | @@ -9,6 +9,8 @@ struct in_addr loopback_addr; |
9 | 9 | |
10 | 10 | /* address for slirp virtual addresses */ |
11 | 11 | struct in_addr special_addr; |
12 | +/* virtual address alias for host */ | |
13 | +struct in_addr alias_addr; | |
12 | 14 | |
13 | 15 | const uint8_t special_ethaddr[6] = { |
14 | 16 | 0x52, 0x54, 0x00, 0x12, 0x35, 0x00 |
... | ... | @@ -154,6 +156,7 @@ void slirp_init(void) |
154 | 156 | } |
155 | 157 | |
156 | 158 | inet_aton(CTL_SPECIAL, &special_addr); |
159 | + alias_addr.s_addr = special_addr.s_addr | htonl(CTL_ALIAS); | |
157 | 160 | getouraddr(); |
158 | 161 | } |
159 | 162 | ... | ... |
slirp/socket.c
... | ... | @@ -596,7 +596,7 @@ solisten(port, laddr, lport, flags) |
596 | 596 | getsockname(s,(struct sockaddr *)&addr,&addrlen); |
597 | 597 | so->so_fport = addr.sin_port; |
598 | 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 | 600 | else |
601 | 601 | so->so_faddr = addr.sin_addr; |
602 | 602 | ... | ... |
slirp/tcp_subr.c
... | ... | @@ -504,7 +504,7 @@ tcp_connect(inso) |
504 | 504 | so->so_faddr = addr.sin_addr; |
505 | 505 | /* Translate connections from localhost to the real hostname */ |
506 | 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 | 509 | /* Close the accept() socket, set right state */ |
510 | 510 | if (inso->so_state & SS_FACCEPTONCE) { |
... | ... | @@ -840,7 +840,7 @@ tcp_emu(so, m) |
840 | 840 | |
841 | 841 | if (ns->so_faddr.s_addr == 0 || |
842 | 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 | 845 | ns->so_iptos = tcp_tos(ns); |
846 | 846 | tp = sototcpcb(ns); | ... | ... |
slirp/udp.c
... | ... | @@ -657,7 +657,7 @@ udp_listen(port, laddr, lport, flags) |
657 | 657 | getsockname(so->s,(struct sockaddr *)&addr,&addrlen); |
658 | 658 | so->so_fport = addr.sin_port; |
659 | 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 | 661 | else |
662 | 662 | so->so_faddr = addr.sin_addr; |
663 | 663 | ... | ... |