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 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  
... ...