qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: user-net -redir working? [problem located][PATCH]


From: Mark Jonckheere
Subject: [Qemu-devel] Re: user-net -redir working? [problem located][PATCH]
Date: Wed, 23 Nov 2005 08:33:06 +0000
User-agent: KNode/0.9.1

Richard Neill schreef:

>> Anyway, I've taken your suggestion, and run both ends with ethereal.
>> Here's what I did:
>> 
>> 
>> HOST (Linux);
>>    qemu -cdrom /dev/cdrom -boot d -user-net -redir tcp:2200::22
>> 
>> GUEST (Knoppix):
>>    Boot up, then start sshd. Verify that I can indeed do ssh
>>    address@hidden, and that PermitRootLogin is yes in sshd_config.
>> 
>>     Then, start ethereal (on the "any" interface)
>> 
>> 
>> HOST:
>>    Start ethereal (on the "any" interface")
>>    ssh -p 2200 address@hidden
>> 
>>   At this point, ssh just stalls. It's obviously waiting for something,
>>   but not known what. I get no output at all from it.
> 
> 
> Can you try "ssh -p 2200 root@<my IP address not localhost>
> 
> I've run into this several times dealing with the -redir
> function, especially since localhost resolves as 127.0.0.1.
> On my Solaris host with a linux guest, the packet arriving
> showed up as 127.0.0.1, which ended up with the same
> behavior as you're describing.
> 
> 
> ---------------
> 
> 
> Dear Ben,
> 
> Good guess! That's an ingenious bit of debugging, and it now works
> perfectly. I suppose that now means 3 things need to be done:
> 
> 1)Figure out *why* it doesn't work. It's definitely QEMU-specific, since
> if I run 2 separate netcat processes on the host, I have no problem. I'd
> be interested to know why this occurs. In particular, is it a problem
> with the user-net stuff on the host, or a problem with the guest?
> 
> 2)Fix it...   :-)
> 
> 3)Document this on the website as a known bug, so Google can find it.
> Currently, anyone using an earlier version will just think that qemu is
> broken. It hasn't worked since at least 0.6.1, although I can't tell you
> about earlier versions.

4)lookup the mailing list archive and find out that this problem
has already been detected, diagnosed, resolved and completely ignored
more than a year ago.

http://lists.gnu.org/archive/html/qemu-devel/2004-09/msg00188.html

I still patch every new download from CVS with my personal patchfile:

----8<----------------------------------------------------
diff -ur qemu/slirp/misc.c qemu-patched/slirp/misc.c
--- qemu/slirp/misc.c   Mon Sep  6 01:10:26 2004
+++ qemu-patched/slirp/misc.c   Wed Sep  8 16:12:14 2004
@@ -90,13 +90,12 @@
        char buff[256];
        struct hostent *he;

 
-       if (gethostname(buff,256) < 0)
-          return;
-
-       if ((he = gethostbyname(buff)) == NULL)
-          return;
-
-       our_addr = *(struct in_addr *)he->h_addr;
+       if (gethostname(buff,256) == 0)
+               if ((he = gethostbyname(buff)) != NULL)
+                       our_addr = *(struct in_addr *)he->h_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
diff -ur qemu/slirp/slirp.c qemu-patched/slirp/slirp.c
--- qemu/slirp/slirp.c  Mon Sep  6 01:10:26 2004
+++ qemu-patched/slirp/slirp.c  Wed Sep  8 16:13:00 2004
@@ -144,7 +144,6 @@
     m_init();

 
     /* set default addresses */
-    getouraddr();
     inet_aton("127.0.0.1", &loopback_addr);

 
     if (get_dns_addr(&dns_addr) < 0) {
@@ -153,6 +152,7 @@
     }

 
     inet_aton(CTL_SPECIAL, &special_addr);
+    getouraddr();
 }

 
 #define CONN_CANFSEND(so) (((so)->so_state & 
(SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
diff -ur qemu/slirp/udp.c qemu-patched/slirp/udp.c
--- qemu/slirp/udp.c    Tue Aug 24 23:57:12 2004
+++ qemu-patched/slirp/udp.c    Mon Sep  6 10:44:11 2004
@@ -314,6 +314,8 @@
     saddr = *addr;
     if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr)
         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 = special_addr.s_addr | htonl(CTL_ALIAS);
     daddr.sin_addr = so->so_laddr;
     daddr.sin_port = so->so_lport;
     
----8<----------------------------------------------------

The patch in misc.c and slirp.c corrects your problem, the patch in udp.c
corrects the problem that UDP replies IP-broadcasts with the IP-broadcast
address instead of its own.

greetings,
Mark.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]