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: Mon, 27 Jun 2016 15:12:52 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1


Le 27/06/2016 à 15:09, Peter Maydell a écrit :
> On 26 June 2016 at 23:18, Laurent Vivier <address@hidden> wrote:
>> 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>
> 
> Do we need the new include? We already use struct sockaddr_ll
> without it.

we already use target_sockaddr_ll, not sockaddr_ll.

> 
>>  #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);
> 
> Otherwise
> Reviewed-by: Peter Maydell <address@hidden>

Thanks,
Laurent



reply via email to

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