From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1FaiTw-0000UH-9Q for qemu-devel@nongnu.org; Mon, 01 May 2006 20:11:12 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1FaiTv-0000T7-LC for qemu-devel@nongnu.org; Mon, 01 May 2006 20:11:11 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FaiTv-0000T3-BR for qemu-devel@nongnu.org; Mon, 01 May 2006 20:11:11 -0400 Received: from [64.233.162.200] (helo=nz-out-0102.google.com) by monty-python.gnu.org with esmtp (Exim 4.52) id 1FaiTx-0000ln-Jm for qemu-devel@nongnu.org; Mon, 01 May 2006 20:11:13 -0400 Received: by nz-out-0102.google.com with SMTP id 14so2861085nzn for ; Mon, 01 May 2006 17:11:10 -0700 (PDT) Message-ID: Date: Mon, 1 May 2006 17:11:10 -0700 From: "Ed Swierk" Sender: eswierk@gmail.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_1412_17939032.1146528670744" Subject: [Qemu-devel] [PATCH] Separate alias_addr (10.0.2.2) from our_addr in slirp Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org ------=_Part_1412_17939032.1146528670744 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 Content-Disposition: inline T24gNS8xLzA2LCBGYWJyaWNlIEJlbGxhcmQgPGZhYnJpY2VAYmVsbGFyZC5vcmc+IHdyb3RlOgo+ IEkgYW0gbm90IHN1cmUgdGhpcyBwYXRjaCBpcyBzdWZmaWNpZW50OiBzb21ldGltZXMgb3VyX2Fk ZHIgaXMgdXNlZCB0bwo+IG9wZW4gc29ja2V0IG9uIHRoZSBob3N0IHNpZGUgYW5kIDEwLjAuMi4y IGhhcyBhIG1lYW5uaW5nIG9ubHkgb24gdGhlIFZNCj4gc2lkZS4KCkluZGVlZCwgb3VyX2FkZHIg c2VlbXMgdG8gYmUgdXNlZCBmb3IgdHdvIGRpc3RpbmN0IHB1cnBvc2VzOgoKLSBhcHBsaWNhdGlv biBwcm90b2NvbCBlbXVsYXRpb24gY29kZSAobGlrZSB1ZHBfZW11KCkgaW4gdWRwLmMpIHVzZXMK dGhlICJob3N0IiBhZGRyZXNzIGZvciBvcGVuaW5nIHNvY2tldHMgb24gdGhlIGhvc3Q7IEknbSBu b3QgZmFtaWxpYXIKd2l0aCB0aGUgZGV0YWlscyBvZiB0aGVzZSBwcm90b2NvbHMsIGJ1dCBpbiBh bnkgZXZlbnQgaXQgbXVzdCBiZSBzb21lCmFkZHJlc3MgdGhhdCBpcyBtZWFuaW5nZnVsIHRvIGFw cGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZSBob3N0IHNpZGU7CgotIGVsc2V3aGVyZSBpbiBzbGly cCwgdGhlICJhbGlhcyIgYWRkcmVzcyAoMTAuMC4yLjIpIGlzIHVzZWQgdG8KcmV3cml0ZSB0aGUg c291cmNlIGFkZHJlc3Mgb2YgcGFja2V0cyBvcmlnaW5hdGluZyBmcm9tIHRoZSBob3N0IHRvIHRo ZQpWTTsgdGhpcyBhZGRyZXNzIG1ha2VzIHNlbnNlIG9ubHkgd2l0aGluIHRoZSBWTS4KClRoZSBh dHRhY2hlZCBwYXRjaCBhZGRzIGEgbmV3IGdsb2JhbCwgYWxpYXNfYWRkciwgdGhhdCBpcyBzZXQg dG8KMTAuMC4yLjIgYW5kIHJlcGxhY2VzIG91cl9hZGRyIGluIHRoZSBsYXR0ZXIgY2FzZXMuIFRo ZSBwYXRjaCBhbHNvCmNoYW5nZXMgZ2V0b3VyYWRkcigpIHNvIHRoYXQgaXQgYWx3YXlzIHJldHVy bnMgZWl0aGVyIGEgInJlYWwiIGFkZHJlc3MKKGFzIGRldGVybWluZWQgYnkgZ2V0aG9zdGJ5bmFt ZShnZXRob3N0bmFtZSgpKSBvciAxMjcuMC4wLjEsIGJ1dCBuZXZlcgoxMC4wLjIuMi4KCi0tRWQK ------=_Part_1412_17939032.1146528670744 Content-Type: text/x-patch; name=qemu-alias-addr.patch; charset=us-ascii Content-Transfer-Encoding: 7bit X-Attachment-Id: f_emphg9ym Content-Disposition: attachment; filename="qemu-alias-addr.patch" diff -BurN qemu.orig/slirp/ip_icmp.c qemu/slirp/ip_icmp.c --- qemu.orig/slirp/ip_icmp.c 2004-04-22 00:10:47.000000000 +0000 +++ qemu/slirp/ip_icmp.c 2006-05-01 22:05:05.000000000 +0000 @@ -114,8 +114,7 @@ case ICMP_ECHO: icp->icmp_type = ICMP_ECHOREPLY; ip->ip_len += hlen; /* since ip_input subtracts this */ - if (ip->ip_dst.s_addr == our_addr.s_addr || - (ip->ip_dst.s_addr == (special_addr.s_addr|htonl(CTL_ALIAS))) ) { + if (ip->ip_dst.s_addr == alias_addr.s_addr) { icmp_reflect(m); } else { struct socket *so; @@ -161,7 +160,7 @@ icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno)); udp_detach(so); } - } /* if ip->ip_dst.s_addr == our_addr.s_addr */ + } /* if ip->ip_dst.s_addr == alias_addr.s_addr */ break; case ICMP_UNREACH: /* XXX? report error? close socket? */ @@ -311,7 +310,7 @@ ip->ip_ttl = MAXTTL; ip->ip_p = IPPROTO_ICMP; 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); diff -BurN qemu.orig/slirp/main.h qemu/slirp/main.h --- qemu.orig/slirp/main.h 2004-07-12 22:33:04.000000000 +0000 +++ qemu/slirp/main.h 2006-05-01 22:05:05.000000000 +0000 @@ -34,6 +34,7 @@ extern fd_set *global_readfds, *global_writefds, *global_xfds; extern struct in_addr ctl_addr; extern struct in_addr special_addr; +extern struct in_addr alias_addr; extern struct in_addr our_addr; extern struct in_addr loopback_addr; extern struct in_addr dns_addr; diff -BurN qemu.orig/slirp/misc.c qemu/slirp/misc.c --- qemu.orig/slirp/misc.c 2006-04-23 19:41:17.000000000 +0000 +++ qemu/slirp/misc.c 2006-05-01 22:06:08.000000000 +0000 @@ -94,10 +94,8 @@ he = gethostbyname(buff); if (he) our_addr = *(struct in_addr *)he->h_addr; - /* If the host doesn't have a useful IP address then use the - guest side address. */ - 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 (our_addr.s_addr == 0) + our_addr.s_addr == loopback_addr.s_addr; } #if SIZEOF_CHAR_P == 8 diff -BurN qemu.orig/slirp/slirp.c qemu/slirp/slirp.c --- qemu.orig/slirp/slirp.c 2006-05-01 16:05:27.000000000 +0000 +++ qemu/slirp/slirp.c 2006-05-01 22:05:05.000000000 +0000 @@ -9,6 +9,8 @@ /* address for slirp virtual addresses */ struct in_addr special_addr; +/* virtual address alias for host */ +struct in_addr alias_addr; const uint8_t special_ethaddr[6] = { 0x52, 0x54, 0x00, 0x12, 0x35, 0x00 @@ -154,6 +156,7 @@ } inet_aton(CTL_SPECIAL, &special_addr); + alias_addr.s_addr = special_addr.s_addr | htonl(CTL_ALIAS); getouraddr(); } diff -BurN qemu.orig/slirp/socket.c qemu/slirp/socket.c --- qemu.orig/slirp/socket.c 2006-04-25 22:36:06.000000000 +0000 +++ qemu/slirp/socket.c 2006-05-01 22:05:05.000000000 +0000 @@ -596,7 +596,7 @@ getsockname(s,(struct sockaddr *)&addr,&addrlen); so->so_fport = addr.sin_port; 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 so->so_faddr = addr.sin_addr; diff -BurN qemu.orig/slirp/tcp_subr.c qemu/slirp/tcp_subr.c --- qemu.orig/slirp/tcp_subr.c 2004-09-18 19:33:56.000000000 +0000 +++ qemu/slirp/tcp_subr.c 2006-05-01 22:05:05.000000000 +0000 @@ -504,7 +504,7 @@ so->so_faddr = addr.sin_addr; /* Translate connections from localhost to the real hostname */ 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 */ if (inso->so_state & SS_FACCEPTONCE) { @@ -840,7 +840,7 @@ if (ns->so_faddr.s_addr == 0 || 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); tp = sototcpcb(ns); diff -BurN qemu.orig/slirp/udp.c qemu/slirp/udp.c --- qemu.orig/slirp/udp.c 2005-07-03 17:08:43.000000000 +0000 +++ qemu/slirp/udp.c 2006-05-01 22:05:05.000000000 +0000 @@ -657,7 +657,7 @@ getsockname(so->s,(struct sockaddr *)&addr,&addrlen); so->so_fport = addr.sin_port; 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 so->so_faddr = addr.sin_addr; ------=_Part_1412_17939032.1146528670744--