[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