From owner-freebsd-emulation@FreeBSD.ORG Fri Jan 12 04:10:17 2007 Return-Path: X-Original-To: freebsd-emulation@freebsd.org Delivered-To: freebsd-emulation@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 6FB9616A415 for ; Fri, 12 Jan 2007 04:10:17 +0000 (UTC) (envelope-from jason.wessel@windriver.com) Received: from mail.wrs.com (mail.windriver.com [147.11.1.11]) by mx1.freebsd.org (Postfix) with ESMTP id 460B913C461 for ; Fri, 12 Jan 2007 04:10:17 +0000 (UTC) (envelope-from jason.wessel@windriver.com) Received: from ALA-MAIL03.corp.ad.wrs.com (ala-mail03 [147.11.57.144]) by mail.wrs.com (8.13.6/8.13.6) with ESMTP id l0C3bxRs018584; Thu, 11 Jan 2007 19:37:59 -0800 (PST) Received: from ala-mail06.corp.ad.wrs.com ([147.11.57.147]) by ALA-MAIL03.corp.ad.wrs.com with Microsoft SMTPSVC(6.0.3790.1830); Thu, 11 Jan 2007 19:37:59 -0800 Received: from [128.224.62.66] ([128.224.62.66]) by ala-mail06.corp.ad.wrs.com with Microsoft SMTPSVC(6.0.3790.1830); Thu, 11 Jan 2007 19:37:59 -0800 Message-ID: <45A70296.9010705@windriver.com> Date: Thu, 11 Jan 2007 21:37:58 -0600 From: Jason Wessel User-Agent: Thunderbird 1.5.0.8 (Windows/20061025) MIME-Version: 1.0 To: qemu-devel@nongnu.org, freebsd-emulation@freebsd.org References: <20070109204740.GA98620@saturn.kn-bremen.de> <20070109230403.GA4552@saturn.kn-bremen.de> <20070112014143.GA50646@saturn.kn-bremen.de> In-Reply-To: <20070112014143.GA50646@saturn.kn-bremen.de> Content-Type: multipart/mixed; boundary="------------030905060207030201020006" X-OriginalArrivalTime: 12 Jan 2007 03:37:59.0359 (UTC) FILETIME=[0E230CF0:01C735FB] Cc: Subject: Re: [Qemu-devel] Re: weird slirp problems (dns lookups stopped working, and maybe more) [PATCH] X-BeenThere: freebsd-emulation@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Development of Emulators of other operating systems List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 12 Jan 2007 04:10:17 -0000 This is a multi-part message in MIME format. --------------030905060207030201020006 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit I posted a similar patch last year, but it was not accepted for some reason. Making this change allows UDP nfs to work to a remote file server as well. I would recommend, making one further change as included in this patch. It allows KGDBOE to operate on the local host or from a remote host because it allow the special 10.0.2.2 address to be translated. I have included the patch in the e-mail once again. signed-off-by: jason.wessel@windriver.com Jason. Juergen Lock wrote: > On Wed, Jan 10, 2007 at 12:04:03AM +0100, Juergen Lock wrote: > >> ... >> Ok, garrison on irc just helped solve this mystery: This (the same) >> one actually goes out first, before the 10.0.2.3 one (I didn't notice >> at first), and since slirp reuses the socket because the source ip and >> port hasnt changed (slirp/udp.c lines 172 and up, it doesn't check the >> dest ip), the second packet with the 10.0.2.3 dest ip (which gets >> replaced with the hosts's dns) goes out wrong. And the reason this >> worked previously with the same guest is multicast started working >> only recently... >> > > And here's the fix I just added to the FreeBSD qemu port: (thanx garrison!) > > Index: qemu/slirp/udp.c > @@ -205,8 +208,6 @@ > /* udp_last_so = so; */ > so->so_laddr = ip->ip_src; > so->so_lport = uh->uh_sport; > - so->so_faddr = ip->ip_dst; /* XXX */ > - so->so_fport = uh->uh_dport; /* XXX */ > > if ((so->so_iptos = udp_tos(so)) == 0) > so->so_iptos = ip->ip_tos; > @@ -216,6 +217,15 @@ > * and if it is, do the fork_exec() etc. > */ > } > + > + /* > + * Assign destination unconditionally > + * > + * This fixes the case where packets are sent from the same > + * source ip/port to different destination ips/ports > + */ > + so->so_faddr = ip->ip_dst; /* XXX */ > + so->so_fport = uh->uh_dport; /* XXX */ > > iphlen += sizeof(struct udphdr); > m->m_len -= iphlen; > > > _______________________________________________ > Qemu-devel mailing list > Qemu-devel@nongnu.org > http://lists.nongnu.org/mailman/listinfo/qemu-devel > --------------030905060207030201020006 Content-Type: text/plain; name="always_set_udp_faddr.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="always_set_udp_faddr.patch" Index: qemu/slirp/udp.c =================================================================== --- qemu.orig/slirp/udp.c +++ qemu/slirp/udp.c @@ -205,8 +205,6 @@ udp_input(m, iphlen) /* udp_last_so = so; */ so->so_laddr = ip->ip_src; so->so_lport = uh->uh_sport; - so->so_faddr = ip->ip_dst; /* XXX */ - so->so_fport = uh->uh_dport; /* XXX */ if ((so->so_iptos = udp_tos(so)) == 0) so->so_iptos = ip->ip_tos; @@ -216,6 +214,13 @@ udp_input(m, iphlen) * and if it is, do the fork_exec() etc. */ } + /* Always reset the from address as it can change, + * as with NFS for example where it will talk to + * the same destination port with multiple source + * addresses. Or different gdb session to kgdboe. + */ + so->so_faddr = ip->ip_dst; /* XXX */ + so->so_fport = uh->uh_dport; /* XXX */ iphlen += sizeof(struct udphdr); m->m_len -= iphlen; @@ -312,7 +317,8 @@ int udp_output(struct socket *so, struct struct sockaddr_in saddr, daddr; saddr = *addr; - if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr) { + if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr && + addr->sin_addr.s_addr == htonl(0x7f000001)) { saddr.sin_addr.s_addr = so->so_faddr.s_addr; if ((so->so_faddr.s_addr & htonl(0x000000ff)) == htonl(0xff)) saddr.sin_addr.s_addr = alias_addr.s_addr; --------------030905060207030201020006--