qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Jason Wessel <jason.wessel@windriver.com>
To: qemu-devel@nongnu.org, freebsd-emulation@freebsd.org
Subject: Re: [Qemu-devel] Re: weird slirp problems (dns lookups stopped working, and maybe more) [PATCH]
Date: Thu, 11 Jan 2007 21:37:58 -0600	[thread overview]
Message-ID: <45A70296.9010705@windriver.com> (raw)
In-Reply-To: <20070112014143.GA50646@saturn.kn-bremen.de>

[-- Attachment #1: Type: text/plain, Size: 2089 bytes --]

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
>   


[-- Attachment #2: always_set_udp_faddr.patch --]
[-- Type: text/plain, Size: 1400 bytes --]

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;

  reply	other threads:[~2007-01-12  3:38 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-09 20:47 [Qemu-devel] weird slirp problems (dns lookups stopped working, and maybe more) Juergen Lock
2007-01-09 23:04 ` [Qemu-devel] " Juergen Lock
2007-01-12  1:41   ` Juergen Lock
2007-01-12  3:37     ` Jason Wessel [this message]
2007-01-15 21:34       ` [Qemu-devel] Re: weird slirp problems (dns lookups stopped working, and maybe more) [PATCH] Igor Kovalenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=45A70296.9010705@windriver.com \
    --to=jason.wessel@windriver.com \
    --cc=freebsd-emulation@freebsd.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).