qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] linux-user: convert sockaddr_ll from host to ta


From: Laurent Vivier
Subject: Re: [Qemu-devel] [PATCH] linux-user: convert sockaddr_ll from host to target
Date: Wed, 29 Jun 2016 14:23:18 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1

Le 27/06/2016 à 00:18, Laurent Vivier a écrit :
> 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 <address@hidden>
> ---
>  linux-user/syscall.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 731926d..599b946 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 <linux/route.h>
>  #include <linux/filter.h>
>  #include <linux/blkpg.h>
> +#include <netpacket/packet.h>
>  #include <linux/netlink.h>
>  #ifdef CONFIG_RTNETLINK
>  #include <linux/rtnetlink.h>
> @@ -1379,6 +1380,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);
>  
> 

It would be good to have this patch in 2.7 as this bug breaks dhclient:
dhclient uses arping to check the IP address is not already in use and
then hangs. I've seen that, at least, in a fedora21 + qemu-ppc64 container.

Thanks,
Laurent



reply via email to

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