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
This commit is contained in:
parent
68cae3d8c1
commit
8dbca8dd8a
|
@ -114,8 +114,7 @@ icmp_input(m, hlen)
|
||||||
case ICMP_ECHO:
|
case ICMP_ECHO:
|
||||||
icp->icmp_type = ICMP_ECHOREPLY;
|
icp->icmp_type = ICMP_ECHOREPLY;
|
||||||
ip->ip_len += hlen; /* since ip_input subtracts this */
|
ip->ip_len += hlen; /* since ip_input subtracts this */
|
||||||
if (ip->ip_dst.s_addr == our_addr.s_addr ||
|
if (ip->ip_dst.s_addr == alias_addr.s_addr) {
|
||||||
(ip->ip_dst.s_addr == (special_addr.s_addr|htonl(CTL_ALIAS))) ) {
|
|
||||||
icmp_reflect(m);
|
icmp_reflect(m);
|
||||||
} else {
|
} else {
|
||||||
struct socket *so;
|
struct socket *so;
|
||||||
|
@ -161,7 +160,7 @@ icmp_input(m, hlen)
|
||||||
icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno));
|
icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno));
|
||||||
udp_detach(so);
|
udp_detach(so);
|
||||||
}
|
}
|
||||||
} /* if ip->ip_dst.s_addr == our_addr.s_addr */
|
} /* if ip->ip_dst.s_addr == alias_addr.s_addr */
|
||||||
break;
|
break;
|
||||||
case ICMP_UNREACH:
|
case ICMP_UNREACH:
|
||||||
/* XXX? report error? close socket? */
|
/* XXX? report error? close socket? */
|
||||||
|
@ -311,7 +310,7 @@ icmp_error(msrc, type, code, minsize, message)
|
||||||
ip->ip_ttl = MAXTTL;
|
ip->ip_ttl = MAXTTL;
|
||||||
ip->ip_p = IPPROTO_ICMP;
|
ip->ip_p = IPPROTO_ICMP;
|
||||||
ip->ip_dst = ip->ip_src; /* ip adresses */
|
ip->ip_dst = ip->ip_src; /* ip adresses */
|
||||||
ip->ip_src = our_addr;
|
ip->ip_src = alias_addr;
|
||||||
|
|
||||||
(void ) ip_output((struct socket *)NULL, m);
|
(void ) ip_output((struct socket *)NULL, m);
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ extern u_int curtime;
|
||||||
extern fd_set *global_readfds, *global_writefds, *global_xfds;
|
extern fd_set *global_readfds, *global_writefds, *global_xfds;
|
||||||
extern struct in_addr ctl_addr;
|
extern struct in_addr ctl_addr;
|
||||||
extern struct in_addr special_addr;
|
extern struct in_addr special_addr;
|
||||||
|
extern struct in_addr alias_addr;
|
||||||
extern struct in_addr our_addr;
|
extern struct in_addr our_addr;
|
||||||
extern struct in_addr loopback_addr;
|
extern struct in_addr loopback_addr;
|
||||||
extern struct in_addr dns_addr;
|
extern struct in_addr dns_addr;
|
||||||
|
|
|
@ -94,10 +94,8 @@ getouraddr()
|
||||||
he = gethostbyname(buff);
|
he = gethostbyname(buff);
|
||||||
if (he)
|
if (he)
|
||||||
our_addr = *(struct in_addr *)he->h_addr;
|
our_addr = *(struct in_addr *)he->h_addr;
|
||||||
/* If the host doesn't have a useful IP address then use the
|
if (our_addr.s_addr == 0)
|
||||||
guest side address. */
|
our_addr.s_addr = loopback_addr.s_addr;
|
||||||
if (our_addr.s_addr == 0 || our_addr.s_addr == loopback_addr.s_addr)
|
|
||||||
our_addr.s_addr = special_addr.s_addr | htonl(CTL_ALIAS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SIZEOF_CHAR_P == 8
|
#if SIZEOF_CHAR_P == 8
|
||||||
|
|
|
@ -9,6 +9,8 @@ struct in_addr loopback_addr;
|
||||||
|
|
||||||
/* address for slirp virtual addresses */
|
/* address for slirp virtual addresses */
|
||||||
struct in_addr special_addr;
|
struct in_addr special_addr;
|
||||||
|
/* virtual address alias for host */
|
||||||
|
struct in_addr alias_addr;
|
||||||
|
|
||||||
const uint8_t special_ethaddr[6] = {
|
const uint8_t special_ethaddr[6] = {
|
||||||
0x52, 0x54, 0x00, 0x12, 0x35, 0x00
|
0x52, 0x54, 0x00, 0x12, 0x35, 0x00
|
||||||
|
@ -154,6 +156,7 @@ void slirp_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
inet_aton(CTL_SPECIAL, &special_addr);
|
inet_aton(CTL_SPECIAL, &special_addr);
|
||||||
|
alias_addr.s_addr = special_addr.s_addr | htonl(CTL_ALIAS);
|
||||||
getouraddr();
|
getouraddr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -596,7 +596,7 @@ solisten(port, laddr, lport, flags)
|
||||||
getsockname(s,(struct sockaddr *)&addr,&addrlen);
|
getsockname(s,(struct sockaddr *)&addr,&addrlen);
|
||||||
so->so_fport = addr.sin_port;
|
so->so_fport = addr.sin_port;
|
||||||
if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr)
|
if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr)
|
||||||
so->so_faddr = our_addr;
|
so->so_faddr = alias_addr;
|
||||||
else
|
else
|
||||||
so->so_faddr = addr.sin_addr;
|
so->so_faddr = addr.sin_addr;
|
||||||
|
|
||||||
|
|
|
@ -504,7 +504,7 @@ tcp_connect(inso)
|
||||||
so->so_faddr = addr.sin_addr;
|
so->so_faddr = addr.sin_addr;
|
||||||
/* Translate connections from localhost to the real hostname */
|
/* 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_addr.s_addr)
|
||||||
so->so_faddr = our_addr;
|
so->so_faddr = alias_addr;
|
||||||
|
|
||||||
/* Close the accept() socket, set right state */
|
/* Close the accept() socket, set right state */
|
||||||
if (inso->so_state & SS_FACCEPTONCE) {
|
if (inso->so_state & SS_FACCEPTONCE) {
|
||||||
|
@ -840,7 +840,7 @@ tcp_emu(so, m)
|
||||||
|
|
||||||
if (ns->so_faddr.s_addr == 0 ||
|
if (ns->so_faddr.s_addr == 0 ||
|
||||||
ns->so_faddr.s_addr == loopback_addr.s_addr)
|
ns->so_faddr.s_addr == loopback_addr.s_addr)
|
||||||
ns->so_faddr = our_addr;
|
ns->so_faddr = alias_addr;
|
||||||
|
|
||||||
ns->so_iptos = tcp_tos(ns);
|
ns->so_iptos = tcp_tos(ns);
|
||||||
tp = sototcpcb(ns);
|
tp = sototcpcb(ns);
|
||||||
|
|
|
@ -657,7 +657,7 @@ udp_listen(port, laddr, lport, flags)
|
||||||
getsockname(so->s,(struct sockaddr *)&addr,&addrlen);
|
getsockname(so->s,(struct sockaddr *)&addr,&addrlen);
|
||||||
so->so_fport = addr.sin_port;
|
so->so_fport = addr.sin_port;
|
||||||
if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr)
|
if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr)
|
||||||
so->so_faddr = our_addr;
|
so->so_faddr = alias_addr;
|
||||||
else
|
else
|
||||||
so->so_faddr = addr.sin_addr;
|
so->so_faddr = addr.sin_addr;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue