Hello, While the patches fixed the pseudo ICMP between the guest (10.0.2.x) and the DHCP gateway (10.0.2.2), I have still never been able to get TCP/UDP working. I even tried compiling glib for MinGW32 without -mms-bitfields to force Qemu to build without taking this compiler flag from pkg-config, but I got the same results so I don't believe it's a packing issue this time. What is different about the way packets are constructed for ICMP versus actual TCP/UDP packets that leave the guest?
Here is a log I collected from the latest Git build as of 2012-02-01. The sequence was as follows: I ping 10.0.2.2 from 10.0.2.5, then I attempt a DNS lookup from nameserver 209.18.47.61: arp_table_add... ip = 0x502000a hw addr = 52:54:00:12:34:56 arp_table_add... ip = 0x502000a hw addr = 52:54:00:12:34:56 m_get... m = 5bd4f0b8 ip_input... m = 5bd4f0b8 m_len = 84 icmp_input... m = 5bd4f0b8 m_len = 84 icmp_type = 8 ip_output... so = 0 m0 = 5bd4f0b8 if_output... so = 0 ifm = 5bd4f0b8 if_start... arp_table_search... ip = 0x502000a found hw addr = 52:54:00:12:34:56 m_free... m = 5bd4f0b8 m_get... m = 5bd4f0b8 ip_input... m = 5bd4f0b8 m_len = 84 icmp_input... m = 5bd4f0b8 m_len = 84 icmp_type = 8 ip_output... so = 0 m0 = 5bd4f0b8 if_output... so = 0 ifm = 5bd4f0b8 if_start... arp_table_search... ip = 0x502000a found hw addr = 52:54:00:12:34:56 m_free... m = 5bd4f0b8 arp_table_add... ip = 0x502000a hw addr = 52:54:00:12:34:56 m_get... m = 5bd4f0b8 ip_input... m = 5bd4f0b8 m_len = 55 udp_input... m = 5bd4f0b8 iphlen = 20 sosendto... so = 5bd104a0 m = 5bd4f0b8 sendto()ing, addr.sin_port=53, addr.sin_addr.s_addr=209.18.47.61 m_free... m = 0 ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... m_get... m = 5bd4f728 ip_input... m = 5bd4f728 m_len = 55 udp_input... m = 5bd4f728 iphlen = 20 sosendto... so = 5bd104a0 m = 5bd4f728 sendto()ing, addr.sin_port=53, addr.sin_addr.s_addr=209.18.47.61 m_free... m = 5bd4f0b8 ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... m_get... m = 5bd4f0b8 ip_input... m = 5bd4f0b8 m_len = 55 udp_input... m = 5bd4f0b8 iphlen = 20 sosendto... so = 5bd104a0 m = 5bd4f0b8 sendto()ing, addr.sin_port=53, addr.sin_addr.s_addr=209.18.47.61 m_free... m = 5bd4f728 ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... ip_slowtimo... tcp_slowtimo... [repeated] Another strange problem I've been having with newer builds from Git lately is I can only execute qemu-system-*.exe correctly from within gdb (i.e. "/usr/bin/gdb.exe ./i386-softmmu/qemu-system-i386.exe; gdb>run -L ./pc-bios"). If I run qemu-system-*.exe outside of gdb it will otherwise die complaining about exception code 0xc0000005 at address 0x000000007c91b21a in ntdll.dll... "--help" works though... Any suggestions are appreciated. Thanks. Ken --- On Sat, 8/6/11, Blue Swirl <blauwir...@gmail.com> wrote: > From: Blue Swirl <blauwir...@gmail.com> > Subject: Re: [Qemu-devel] 0.15.0-rc2 (any version past 0.14.1) having issues > with SLIRP on Windows XP host > To: "Anthony Liguori" <anth...@codemonkey.ws>, "Jan Kiszka" > <jan.kis...@siemens.com> > Cc: "TeLeMan" <gele...@gmail.com>, "Kenneth Salerno" > <kennethsale...@yahoo.com>, qemu-devel@nongnu.org > Date: Saturday, August 6, 2011, 10:35 AM > On Sat, Aug 6, 2011 at 1:33 PM, > Anthony Liguori <anth...@codemonkey.ws> > wrote: > > On 08/05/2011 10:25 PM, TeLeMan wrote: > >> > >> On Sat, Aug 6, 2011 at 04:46, Blue Swirl<blauwir...@gmail.com> > wrote: > >>> > >>> On Fri, Aug 5, 2011 at 8:09 PM, Kenneth > Salerno > >>> <kennethsale...@yahoo.com> > wrote: > >>>> > >>>> Hi, > >>>> > >>>> I'm not sure if any defaults (build or > runtime) have changed since > >>>> 0.14.1, but I can no longer get the > following to work anymore for QEMU > >>>> versions 0.15.0-rc2 or recent development > builds: > >>>> > >>>> -device e1000,netdev=mynet0 -netdev > type=user,id=mynet0 ... > >>>> > >>>> Works great in 0.14.1 however. > >>>> > >>>> From the QEMU console, "info networking" > shows the NIC e1000 and the > >>>> VLAN correctly setup, the guest (RHEL 6.1 > x86_64) has its NIC recognized and > >>>> networking setup, just can't seem to > communicate with the gateway > >>>> (10.0.2.2). The only difference I see in > the console is cosmetic > >>>> (restricted=off rather than restricted=n). > >>>> > >>>> Host OS: Windows XP > >>>> Build env: i686-pc-mingw32-gcc 4.5.2, > binutils 2.21.53.20110731 i386pe > >>>> Runtime env: Cygwin 1.7.9 2011-03-29, SDL > 1.2.14, mingw32-glib 2.28.1-1, > >>>> mingw32-gettext 0.18.1-2 > >>>> Guest OS: RHEL 6.1 > >>>> > >>>> Is it just me? > >>> > >>> No, this is fallout from glib use: > >>> http://lists.nongnu.org/archive/html/qemu-devel/2011-08/msg00134.html > >>> > >>> The fix is to rewrite structures without using > GCC bit fields. > >> > >> -mms-bitfields affects all byte-alignments in a > structure. For example, > >> struct s > >> { > >> uint8_t a; > >> uint32_t b; > >> } __attribute__((packed)); > >> > >> sizeof(s) is 5 without -mms-bitfields but sizeof(s) > is 8 with > >> -mms-bitfields. > > > > If you can identify the offending structs, you can do: > > > > #pragma pack(push,1) > > > > struct s > > { > > uint8_t a; > > uint32_t b; > > } __attribute__((packed)); > > > > #pragma pack(pop) > > I grepped the tree for ((packed)). The only two places where > bit > fields are used with packed structs are in SLIRP: > > struct ip { > #ifdef HOST_WORDS_BIGENDIAN > u_int ip_v:4, > /* version */ > > ip_hl:4; /* header > length */ > #else > u_int ip_hl:4, > /* header length */ > > ip_v:4; > /* version */ > #endif > uint8_t > ip_tos; > /* type of service */ > uint16_t > ip_len; > /* total length */ > uint16_t > ip_id; > /* identification */ > uint16_t > ip_off; > /* fragment offset field */ > #define IP_DF 0x4000 > /* don't fragment flag > */ > #define IP_MF 0x2000 > /* more fragments flag > */ > #define IP_OFFMASK > 0x1fff /* mask for > fragmenting bits */ > uint8_t ip_ttl; > /* time to live */ > uint8_t ip_p; > /* protocol */ > uint16_t > ip_sum; > /* checksum */ > struct in_addr > ip_src,ip_dst; /* source and dest address > */ > } __attribute__((packed)); > > struct ip_timestamp { > uint8_t > ipt_code; /* IPOPT_TS > */ > uint8_t > ipt_len; /* size of > structure (variable) */ > uint8_t > ipt_ptr; /* index of > current entry */ > #ifdef HOST_WORDS_BIGENDIAN > u_int > ipt_oflw:4, /* overflow > counter */ > > ipt_flg:4; /* flags, > see below */ > #else > u_int > ipt_flg:4, /* flags, > see below */ > > ipt_oflw:4; /* overflow > counter */ > #endif > union ipt_timestamp { > > n_long ipt_time[1]; > > struct ipt_ta { > > struct in_addr ipt_addr; > > n_long ipt_time; > } ipt_ta[1]; > } ipt_timestamp; > } __attribute__((packed)); > > I'd avoid the bit fields altogether in both cases, then also > the > #ifdeffery could be removed. >