Commit 8dbca8dd8a81d7f1afd6ef23b418c8f9d292b65d

Authored by bellard
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
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