[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: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [PATCH] linux-user: convert sockaddr_ll from host to target |
Date: |
Mon, 27 Jun 2016 14:09:03 +0100 |
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.
> #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
-- PMM