From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42788) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bPUXX-0006y7-W3 for qemu-devel@nongnu.org; Tue, 19 Jul 2016 08:54:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bPUXX-0003LB-4F for qemu-devel@nongnu.org; Tue, 19 Jul 2016 08:54:23 -0400 Received: from mail-lf0-x230.google.com ([2a00:1450:4010:c07::230]:36377) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bPUXW-0003L4-SZ for qemu-devel@nongnu.org; Tue, 19 Jul 2016 08:54:23 -0400 Received: by mail-lf0-x230.google.com with SMTP id g62so13364749lfe.3 for ; Tue, 19 Jul 2016 05:54:22 -0700 (PDT) From: riku.voipio@linaro.org Date: Tue, 19 Jul 2016 15:54:02 +0300 Message-Id: In-Reply-To: References: Subject: [Qemu-devel] [PULL 04/16] linux-user: convert sockaddr_ll from host to target List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Laurent Vivier From: Laurent Vivier As we convert sockaddr for AF_PACKET family for sendto() (target to host) we need also to convert this for getsockname() (host to target). arping uses getsockname() to get the the interface address and uses this address with sendto(). Tested with: /sbin/arping -D -q -c2 -I eno1 192.168.122.88 ... getsockname(3, {sa_family=AF_PACKET, proto=0x806, if2, pkttype=PACKET_HOST, addr(6)={1, 10c37b6b9a76}, [18]) = 0 ... sendto(3, "..." 28, 0, {sa_family=AF_PACKET, proto=0x806, if2, pkttype=PACKET_HOST, addr(6)={1, ffffffffffff}, 20) = 28 ... Signed-off-by: Laurent Vivier Signed-off-by: Riku Voipio --- linux-user/syscall.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index f9ce9d8..919b589 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -100,6 +100,7 @@ int __clone2(int (*fn)(void *), void *child_stack_base, #include #include #include +#include #include #ifdef CONFIG_RTNETLINK #include @@ -1383,6 +1384,10 @@ static inline abi_long host_to_target_sockaddr(abi_ulong target_addr, struct sockaddr_nl *target_nl = (struct sockaddr_nl *)target_saddr; target_nl->nl_pid = tswap32(target_nl->nl_pid); target_nl->nl_groups = tswap32(target_nl->nl_groups); + } else if (addr->sa_family == AF_PACKET) { + struct sockaddr_ll *target_ll = (struct sockaddr_ll *)target_saddr; + target_ll->sll_ifindex = tswap32(target_ll->sll_ifindex); + target_ll->sll_hatype = tswap16(target_ll->sll_hatype); } unlock_user(target_saddr, target_addr, len); -- 2.1.4