Le mardi 01 janvier 2013 à 15:03 +0000, Peter Maydell a écrit : > On 31 December 2012 22:19, Laurent Vivier <laur...@vivier.eu> wrote: > > Le lundi 31 décembre 2012 à 21:32 +0000, Peter Maydell a écrit : > >> Also it seems rather involved since we swap things three times and > >> have an entirely new abi_* function. Either I'm completely confused > >> or it should be enough to just have > >> > >> if (type == SOCK_PACKET) { > >> protocol = tswap16(protocol); > >> } > > Looking more carefully at packet(7) this is actually the wrong > guard anyway. You need to check for > (domain == AF_PACKET) || (type == SOCK_PACKET)
I agree. > since SOCK_PACKET is the obsolete Linux 2.0 way of doing packet sockets. But dhclient is always using this... > > works... sometime. In fact, work if target endianess is network endianess. > > > > Correct me if I'm wrong. > > > > target host > > little endian / big endian > > > > memory 00 00 00 03 > > Syscall arguments aren't generally passed in memory, they're > in registers (and if they were pased in memory for some architecture > then that arch would do a load-and-swap-from-memory in main.c). > So the value you see in do_socket() is always "the integer passed > as a syscall parameter, as a host-order integer". Yes, I missed that. > So in this case, with a simple guest program: > #include <sys/socket.h> > #include <netpacket/packet.h> > #include <net/ethernet.h> > #include <arpa/inet.h> > > int main(void) { > return socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); > } > > you will find that do_socket() in QEMU is passed either 0x3 [if the > guest is bigendian and the guest htons() is a no-op] or 0x0300 > [if the guest is littleendian]. Since what we want to pass to the > host socket() call is 0x3 if the host is bigendian and 0x0300 if > the host is little endian, this amounts to needing to do a 16 bit > byteswap if the host and guest are different endianness, which > is exactly what tswap16() does. I checked with i386-to-i386 > that do_socket() gets passed 0x300 and we correctly send it > through to the host socket(). Yes, I agree. I correct the patch. Thank you, Laurent -- "Just play. Have fun. Enjoy the game." - Michael Jordan