* [PATCH v2 1/6] linux-user: netlink: Add missing IFA_PROTO to host_to_target_data_addr_rtattr()
2024-12-27 20:54 [PATCH v2 0/6] linux-user: Add support for various missing netlink sockopt entries deller
@ 2024-12-27 20:54 ` deller
2025-01-10 13:10 ` Laurent Vivier
2024-12-27 20:54 ` [PATCH v2 2/6] linux-user: Use unique error messages for cmsg parsing deller
` (4 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: deller @ 2024-12-27 20:54 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel, Laurent Vivier,
Richard Henderson
Cc: deller
From: Helge Deller <deller@gmx.de>
Fixes this warning:
Unknown host IFA type: 11
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/fd-trans.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/linux-user/fd-trans.c b/linux-user/fd-trans.c
index c04a97c73a..a86ed2f4b4 100644
--- a/linux-user/fd-trans.c
+++ b/linux-user/fd-trans.c
@@ -1140,6 +1140,7 @@ static abi_long host_to_target_data_addr_rtattr(struct rtattr *rtattr)
/* binary: depends on family type */
case IFA_ADDRESS:
case IFA_LOCAL:
+ case IFA_PROTO:
break;
/* string */
case IFA_LABEL:
--
2.47.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/6] linux-user: netlink: Add missing IFA_PROTO to host_to_target_data_addr_rtattr()
2024-12-27 20:54 ` [PATCH v2 1/6] linux-user: netlink: Add missing IFA_PROTO to host_to_target_data_addr_rtattr() deller
@ 2025-01-10 13:10 ` Laurent Vivier
0 siblings, 0 replies; 12+ messages in thread
From: Laurent Vivier @ 2025-01-10 13:10 UTC (permalink / raw)
To: deller, Philippe Mathieu-Daudé, qemu-devel,
Richard Henderson; +Cc: deller
Le 27/12/2024 à 21:54, deller@kernel.org a écrit :
> From: Helge Deller <deller@gmx.de>
>
> Fixes this warning:
> Unknown host IFA type: 11
>
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
> linux-user/fd-trans.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/linux-user/fd-trans.c b/linux-user/fd-trans.c
> index c04a97c73a..a86ed2f4b4 100644
> --- a/linux-user/fd-trans.c
> +++ b/linux-user/fd-trans.c
> @@ -1140,6 +1140,7 @@ static abi_long host_to_target_data_addr_rtattr(struct rtattr *rtattr)
> /* binary: depends on family type */
> case IFA_ADDRESS:
> case IFA_LOCAL:
> + case IFA_PROTO:
> break;
> /* string */
> case IFA_LABEL:
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 2/6] linux-user: Use unique error messages for cmsg parsing
2024-12-27 20:54 [PATCH v2 0/6] linux-user: Add support for various missing netlink sockopt entries deller
2024-12-27 20:54 ` [PATCH v2 1/6] linux-user: netlink: Add missing IFA_PROTO to host_to_target_data_addr_rtattr() deller
@ 2024-12-27 20:54 ` deller
2024-12-27 20:54 ` [PATCH v2 3/6] linux-user: netlink: Add IP_PKTINFO " deller
` (3 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: deller @ 2024-12-27 20:54 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel, Laurent Vivier,
Richard Henderson
Cc: deller
From: Helge Deller <deller@gmx.de>
Avoid using the same error message for two different code paths
as it complicates determining the one which actually triggered.
Signed-off-by: Helge Deller <deller@gmx.de>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
linux-user/syscall.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 1ce4c79784..494323efba 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1825,7 +1825,7 @@ static inline abi_long target_to_host_cmsg(struct msghdr *msgh,
*dst = tswap32(*dst);
}
} else {
- qemu_log_mask(LOG_UNIMP, "Unsupported ancillary data: %d/%d\n",
+ qemu_log_mask(LOG_UNIMP, "Unsupported target ancillary data: %d/%d\n",
cmsg->cmsg_level, cmsg->cmsg_type);
memcpy(data, target_data, len);
}
@@ -2047,7 +2047,7 @@ static inline abi_long host_to_target_cmsg(struct target_msghdr *target_msgh,
default:
unimplemented:
- qemu_log_mask(LOG_UNIMP, "Unsupported ancillary data: %d/%d\n",
+ qemu_log_mask(LOG_UNIMP, "Unsupported host ancillary data: %d/%d\n",
cmsg->cmsg_level, cmsg->cmsg_type);
memcpy(target_data, data, MIN(len, tgt_len));
if (tgt_len > len) {
--
2.47.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH v2 3/6] linux-user: netlink: Add IP_PKTINFO cmsg parsing
2024-12-27 20:54 [PATCH v2 0/6] linux-user: Add support for various missing netlink sockopt entries deller
2024-12-27 20:54 ` [PATCH v2 1/6] linux-user: netlink: Add missing IFA_PROTO to host_to_target_data_addr_rtattr() deller
2024-12-27 20:54 ` [PATCH v2 2/6] linux-user: Use unique error messages for cmsg parsing deller
@ 2024-12-27 20:54 ` deller
2025-01-10 13:27 ` Laurent Vivier
2024-12-27 20:54 ` [PATCH v2 4/6] linux-user: netlink: Add emulation of IP_MULTICAST_IF deller
` (2 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: deller @ 2024-12-27 20:54 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel, Laurent Vivier,
Richard Henderson
Cc: deller
From: Helge Deller <deller@gmx.de>
Fixes those warnings:
Unsupported host ancillary data: 0/8
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/syscall.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 494323efba..bbe2560927 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1996,6 +1996,18 @@ static inline abi_long host_to_target_cmsg(struct target_msghdr *target_msgh,
(void *) &errh->offender, sizeof(errh->offender));
break;
}
+ case IP_PKTINFO:
+ {
+ struct in_pktinfo *pkti = data;
+ struct in_pktinfo *target_pkti = target_data;
+
+ __put_user(pkti->ipi_ifindex, &target_pkti->ipi_ifindex);
+ host_to_target_sockaddr((unsigned long) &target_pkti->ipi_spec_dst,
+ (void *) &pkti->ipi_spec_dst, sizeof(pkti->ipi_spec_dst));
+ host_to_target_sockaddr((unsigned long) &target_pkti->ipi_addr,
+ (void *) &pkti->ipi_addr, sizeof(pkti->ipi_addr));
+ break;
+ }
default:
goto unimplemented;
}
--
2.47.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v2 3/6] linux-user: netlink: Add IP_PKTINFO cmsg parsing
2024-12-27 20:54 ` [PATCH v2 3/6] linux-user: netlink: Add IP_PKTINFO " deller
@ 2025-01-10 13:27 ` Laurent Vivier
0 siblings, 0 replies; 12+ messages in thread
From: Laurent Vivier @ 2025-01-10 13:27 UTC (permalink / raw)
To: deller, Philippe Mathieu-Daudé, qemu-devel,
Richard Henderson; +Cc: deller
Le 27/12/2024 à 21:54, deller@kernel.org a écrit :
> From: Helge Deller <deller@gmx.de>
>
> Fixes those warnings:
> Unsupported host ancillary data: 0/8
>
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
> linux-user/syscall.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 494323efba..bbe2560927 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -1996,6 +1996,18 @@ static inline abi_long host_to_target_cmsg(struct target_msghdr *target_msgh,
> (void *) &errh->offender, sizeof(errh->offender));
> break;
> }
> + case IP_PKTINFO:
> + {
> + struct in_pktinfo *pkti = data;
> + struct in_pktinfo *target_pkti = target_data;
I think we need to define a target_in_pktinfo structure.
> +
> + __put_user(pkti->ipi_ifindex, &target_pkti->ipi_ifindex);
> + host_to_target_sockaddr((unsigned long) &target_pkti->ipi_spec_dst,
> + (void *) &pkti->ipi_spec_dst, sizeof(pkti->ipi_spec_dst));
> + host_to_target_sockaddr((unsigned long) &target_pkti->ipi_addr,
> + (void *) &pkti->ipi_addr, sizeof(pkti->ipi_addr));
Why do you use host_to_target_sockaddr()? The type of ipi_spec_dst and ipi_addr is in_addr.
And in_addr is a __be32 so it doesn't need be translated from host endianness to target endianness.
> + break;
> + }
> default:
> goto unimplemented;
> }
Thanks,
Laurent
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 4/6] linux-user: netlink: Add emulation of IP_MULTICAST_IF
2024-12-27 20:54 [PATCH v2 0/6] linux-user: Add support for various missing netlink sockopt entries deller
` (2 preceding siblings ...)
2024-12-27 20:54 ` [PATCH v2 3/6] linux-user: netlink: Add IP_PKTINFO " deller
@ 2024-12-27 20:54 ` deller
2025-01-10 13:53 ` Laurent Vivier
2024-12-27 20:54 ` [PATCH v2 5/6] linux-user: netlink: add netlink neighbour emulation deller
2024-12-27 20:54 ` [PATCH v2 6/6] linux-user: netlink: Add missing QEMU_IFLA entries deller
5 siblings, 1 reply; 12+ messages in thread
From: deller @ 2024-12-27 20:54 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel, Laurent Vivier,
Richard Henderson
Cc: deller
From: Helge Deller <deller@gmx.de>
Share code with IP_ADD_MEMBERSHIP/IP_DROP_MEMBERSHIP.
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/syscall.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index bbe2560927..4360543e20 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -2130,16 +2130,23 @@ static abi_long do_setsockopt(int sockfd, int level, int optname,
}
ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
break;
+ case IP_MULTICAST_IF:
case IP_ADD_MEMBERSHIP:
case IP_DROP_MEMBERSHIP:
{
struct ip_mreqn ip_mreq;
struct target_ip_mreqn *target_smreqn;
+ int min_size;
QEMU_BUILD_BUG_ON(sizeof(struct ip_mreq) !=
sizeof(struct target_ip_mreq));
- if (optlen < sizeof (struct target_ip_mreq) ||
+ if (optname == IP_MULTICAST_IF) {
+ min_size = sizeof(struct in_addr);
+ } else {
+ min_size = sizeof(struct target_ip_mreq);
+ }
+ if (optlen < min_size ||
optlen > sizeof (struct target_ip_mreqn)) {
return -TARGET_EINVAL;
}
@@ -2149,7 +2156,9 @@ static abi_long do_setsockopt(int sockfd, int level, int optname,
return -TARGET_EFAULT;
}
ip_mreq.imr_multiaddr.s_addr = target_smreqn->imr_multiaddr.s_addr;
- ip_mreq.imr_address.s_addr = target_smreqn->imr_address.s_addr;
+ if (optlen >= sizeof(struct target_ip_mreq)) {
+ ip_mreq.imr_address.s_addr = target_smreqn->imr_address.s_addr;
+ }
if (optlen == sizeof(struct target_ip_mreqn)) {
ip_mreq.imr_ifindex = tswapal(target_smreqn->imr_ifindex);
optlen = sizeof(struct ip_mreqn);
--
2.47.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v2 4/6] linux-user: netlink: Add emulation of IP_MULTICAST_IF
2024-12-27 20:54 ` [PATCH v2 4/6] linux-user: netlink: Add emulation of IP_MULTICAST_IF deller
@ 2025-01-10 13:53 ` Laurent Vivier
0 siblings, 0 replies; 12+ messages in thread
From: Laurent Vivier @ 2025-01-10 13:53 UTC (permalink / raw)
To: deller, Philippe Mathieu-Daudé, qemu-devel,
Richard Henderson; +Cc: deller
Le 27/12/2024 à 21:54, deller@kernel.org a écrit :
> From: Helge Deller <deller@gmx.de>
>
> Share code with IP_ADD_MEMBERSHIP/IP_DROP_MEMBERSHIP.
>
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
> linux-user/syscall.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index bbe2560927..4360543e20 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -2130,16 +2130,23 @@ static abi_long do_setsockopt(int sockfd, int level, int optname,
> }
> ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
> break;
> + case IP_MULTICAST_IF:
> case IP_ADD_MEMBERSHIP:
> case IP_DROP_MEMBERSHIP:
Could you put in the commit message the information from ip(7):
IP_MULTICAST_IF (since Linux 1.2)
Set the local device for a multicast socket. The argument
for setsockopt(2) is an ip_mreqn or (since Linux 3.5)
ip_mreq structure similar to IP_ADD_MEMBERSHIP, or an
in_addr structure. (The kernel determines which structure
is being passed based on the size passed in optlen.) For
getsockopt(2), the argument is an in_addr structure.
It would help to understand why we merge IP_MULTICAST_IF and IP_ADD_MEMBERSHIP code.
> {
> struct ip_mreqn ip_mreq;
> struct target_ip_mreqn *target_smreqn;
> + int min_size;
>
> QEMU_BUILD_BUG_ON(sizeof(struct ip_mreq) !=
> sizeof(struct target_ip_mreq));
>
> - if (optlen < sizeof (struct target_ip_mreq) ||
> + if (optname == IP_MULTICAST_IF) {
> + min_size = sizeof(struct in_addr);
> + } else {
> + min_size = sizeof(struct target_ip_mreq);
> + }
> + if (optlen < min_size ||
> optlen > sizeof (struct target_ip_mreqn)) {
> return -TARGET_EINVAL;
> }
> @@ -2149,7 +2156,9 @@ static abi_long do_setsockopt(int sockfd, int level, int optname,
> return -TARGET_EFAULT;
> }
> ip_mreq.imr_multiaddr.s_addr = target_smreqn->imr_multiaddr.s_addr;
> - ip_mreq.imr_address.s_addr = target_smreqn->imr_address.s_addr;
> + if (optlen >= sizeof(struct target_ip_mreq)) {
> + ip_mreq.imr_address.s_addr = target_smreqn->imr_address.s_addr;
> + }
I think you should have 3 parts here (like in the kernel):
if (optlen >= sizeof(struct target_ip_mreqn)) {
...
} else {
if (optlen >= sizeof(struct target_ip_mreq)) {
...
} else if (optlen >= sizeof(struct in_addr)) {
...
}
}
> if (optlen == sizeof(struct target_ip_mreqn)) {
> ip_mreq.imr_ifindex = tswapal(target_smreqn->imr_ifindex);
> optlen = sizeof(struct ip_mreqn);
Thanks.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 5/6] linux-user: netlink: add netlink neighbour emulation
2024-12-27 20:54 [PATCH v2 0/6] linux-user: Add support for various missing netlink sockopt entries deller
` (3 preceding siblings ...)
2024-12-27 20:54 ` [PATCH v2 4/6] linux-user: netlink: Add emulation of IP_MULTICAST_IF deller
@ 2024-12-27 20:54 ` deller
2025-01-10 16:28 ` Laurent Vivier
2024-12-27 20:54 ` [PATCH v2 6/6] linux-user: netlink: Add missing QEMU_IFLA entries deller
5 siblings, 1 reply; 12+ messages in thread
From: deller @ 2024-12-27 20:54 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel, Laurent Vivier,
Richard Henderson
Cc: deller
From: Helge Deller <deller@gmx.de>
Fixes various warnings in the testsuite while building gupnp:
gssdp-net-DEBUG: Failed to send netlink message: Operation not supported
gupnp-context-DEBUG: Mismatch between host header and host IP (example.com, expected: 127.0.0.1)
gupnp-context-DEBUG: Mismatch between host header and host port (80, expected 4711)
gupnp-context-DEBUG: Mismatch between host header and host IP (192.168.1.2, expected: 127.0.0.1)
gupnp-context-DEBUG: Mismatch between host header and host IP (fe80::01, expected: 127.0.0.1)
gupnp-context-DEBUG: Mismatch between host header and host port (80, expected 4711)
gupnp-context-DEBUG: Failed to parse HOST header from request: Invalid IPv6 address ?[fe80::01%1]? in URI
gupnp-context-DEBUG: Failed to parse HOST header from request: Invalid IPv6 address ?[fe80::01%eth0]? in URI
gupnp-context-DEBUG: Failed to parse HOST header from request: Could not parse port ?:1? in URI
gupnp-context-DEBUG: Mismatch between host header and host IP (example.com, expected: ::1)
gupnp-context-DEBUG: Mismatch between host header and host port (80, expected 4711)
gupnp-context-DEBUG: Mismatch between host header and host IP (example.com, expected: ::1)
gupnp-context-DEBUG: Mismatch between host header and host port (80, expected 4711)
gupnp-context-DEBUG: Mismatch between host header and host IP (example.com, expected: ::1)
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/fd-trans.c | 100 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 100 insertions(+)
diff --git a/linux-user/fd-trans.c b/linux-user/fd-trans.c
index a86ed2f4b4..a5e6c6b6f2 100644
--- a/linux-user/fd-trans.c
+++ b/linux-user/fd-trans.c
@@ -25,12 +25,16 @@
#ifdef CONFIG_RTNETLINK
#include <linux/rtnetlink.h>
#include <linux/if_bridge.h>
+#include <linux/neighbour.h>
#endif
#include "qemu.h"
#include "user-internals.h"
#include "fd-trans.h"
#include "signal-common.h"
+#define NDM_RTA(r) ((struct rtattr*)(((char*)(r)) + \
+ NLMSG_ALIGN(sizeof(struct ndmsg))))
+
enum {
QEMU_IFLA_BR_UNSPEC,
QEMU_IFLA_BR_FORWARD_DELAY,
@@ -1210,6 +1214,35 @@ static abi_long host_to_target_data_route_rtattr(struct rtattr *rtattr)
return 0;
}
+static abi_long host_to_target_data_neigh_rtattr(struct rtattr *rtattr)
+{
+ struct nda_cacheinfo *ndac;
+ uint32_t *u32;
+
+ switch (rtattr->rta_type) {
+ case NDA_UNSPEC:
+ case NDA_DST:
+ case NDA_LLADDR:
+ break;
+ case NDA_PROBES:
+ u32 = RTA_DATA(rtattr);
+ *u32 = tswap32(*u32);
+ break;
+ case NDA_CACHEINFO:
+ ndac = RTA_DATA(rtattr);
+ ndac->ndm_confirmed = tswap32(ndac->ndm_confirmed);
+ ndac->ndm_used = tswap32(ndac->ndm_used);
+ ndac->ndm_updated = tswap32(ndac->ndm_updated);
+ ndac->ndm_refcnt = tswap32(ndac->ndm_refcnt);
+ break;
+ default:
+ qemu_log_mask(LOG_UNIMP, "Unknown host to target NEIGH type: %d\n",
+ rtattr->rta_type);
+ break;
+ }
+ return 0;
+}
+
static abi_long host_to_target_link_rtattr(struct rtattr *rtattr,
uint32_t rtattr_len)
{
@@ -1231,12 +1264,20 @@ static abi_long host_to_target_route_rtattr(struct rtattr *rtattr,
host_to_target_data_route_rtattr);
}
+static abi_long host_to_target_neigh_rtattr(struct rtattr *rtattr,
+ uint32_t rtattr_len)
+{
+ return host_to_target_for_each_rtattr(rtattr, rtattr_len,
+ host_to_target_data_neigh_rtattr);
+}
+
static abi_long host_to_target_data_route(struct nlmsghdr *nlh)
{
uint32_t nlmsg_len;
struct ifinfomsg *ifi;
struct ifaddrmsg *ifa;
struct rtmsg *rtm;
+ struct ndmsg *ndm;
nlmsg_len = nlh->nlmsg_len;
switch (nlh->nlmsg_type) {
@@ -1263,6 +1304,17 @@ static abi_long host_to_target_data_route(struct nlmsghdr *nlh)
nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)));
}
break;
+ case RTM_NEWNEIGH:
+ case RTM_DELNEIGH:
+ case RTM_GETNEIGH:
+ if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ndm))) {
+ ndm = NLMSG_DATA(nlh);
+ ndm->ndm_ifindex = tswap32(ndm->ndm_ifindex);
+ ndm->ndm_state = tswap16(ndm->ndm_state);
+ host_to_target_neigh_rtattr(NDM_RTA(ndm),
+ nlmsg_len - NLMSG_LENGTH(sizeof(*ndm)));
+ }
+ break;
case RTM_NEWROUTE:
case RTM_DELROUTE:
case RTM_GETROUTE:
@@ -1410,6 +1462,35 @@ static abi_long target_to_host_data_addr_rtattr(struct rtattr *rtattr)
return 0;
}
+static abi_long target_to_host_data_neigh_rtattr(struct rtattr *rtattr)
+{
+ struct nda_cacheinfo *ndac;
+ uint32_t *u32;
+
+ switch (rtattr->rta_type) {
+ case NDA_UNSPEC:
+ case NDA_DST:
+ case NDA_LLADDR:
+ break;
+ case NDA_PROBES:
+ u32 = RTA_DATA(rtattr);
+ *u32 = tswap32(*u32);
+ break;
+ case NDA_CACHEINFO:
+ ndac = RTA_DATA(rtattr);
+ ndac->ndm_confirmed = tswap32(ndac->ndm_confirmed);
+ ndac->ndm_used = tswap32(ndac->ndm_used);
+ ndac->ndm_updated = tswap32(ndac->ndm_updated);
+ ndac->ndm_refcnt = tswap32(ndac->ndm_refcnt);
+ break;
+ default:
+ qemu_log_mask(LOG_UNIMP, "Unknown target NEIGH type: %d\n",
+ rtattr->rta_type);
+ break;
+ }
+ return 0;
+}
+
static abi_long target_to_host_data_route_rtattr(struct rtattr *rtattr)
{
uint32_t *u32;
@@ -1448,6 +1529,13 @@ static void target_to_host_addr_rtattr(struct rtattr *rtattr,
target_to_host_data_addr_rtattr);
}
+static void target_to_host_neigh_rtattr(struct rtattr *rtattr,
+ uint32_t rtattr_len)
+{
+ target_to_host_for_each_rtattr(rtattr, rtattr_len,
+ target_to_host_data_neigh_rtattr);
+}
+
static void target_to_host_route_rtattr(struct rtattr *rtattr,
uint32_t rtattr_len)
{
@@ -1460,6 +1548,7 @@ static abi_long target_to_host_data_route(struct nlmsghdr *nlh)
struct ifinfomsg *ifi;
struct ifaddrmsg *ifa;
struct rtmsg *rtm;
+ struct ndmsg *ndm;
switch (nlh->nlmsg_type) {
case RTM_NEWLINK:
@@ -1486,6 +1575,17 @@ static abi_long target_to_host_data_route(struct nlmsghdr *nlh)
NLMSG_LENGTH(sizeof(*ifa)));
}
break;
+ case RTM_NEWNEIGH:
+ case RTM_DELNEIGH:
+ case RTM_GETNEIGH:
+ if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ndm))) {
+ ndm = NLMSG_DATA(nlh);
+ ndm->ndm_ifindex = tswap32(ndm->ndm_ifindex);
+ ndm->ndm_state = tswap16(ndm->ndm_state);
+ target_to_host_neigh_rtattr(NDM_RTA(ndm), nlh->nlmsg_len -
+ NLMSG_LENGTH(sizeof(*ndm)));
+ }
+ break;
case RTM_NEWROUTE:
case RTM_DELROUTE:
case RTM_GETROUTE:
--
2.47.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v2 5/6] linux-user: netlink: add netlink neighbour emulation
2024-12-27 20:54 ` [PATCH v2 5/6] linux-user: netlink: add netlink neighbour emulation deller
@ 2025-01-10 16:28 ` Laurent Vivier
0 siblings, 0 replies; 12+ messages in thread
From: Laurent Vivier @ 2025-01-10 16:28 UTC (permalink / raw)
To: deller, Philippe Mathieu-Daudé, qemu-devel,
Richard Henderson; +Cc: deller
Le 27/12/2024 à 21:54, deller@kernel.org a écrit :
> From: Helge Deller <deller@gmx.de>
>
> Fixes various warnings in the testsuite while building gupnp:
> gssdp-net-DEBUG: Failed to send netlink message: Operation not supported
> gupnp-context-DEBUG: Mismatch between host header and host IP (example.com, expected: 127.0.0.1)
> gupnp-context-DEBUG: Mismatch between host header and host port (80, expected 4711)
> gupnp-context-DEBUG: Mismatch between host header and host IP (192.168.1.2, expected: 127.0.0.1)
> gupnp-context-DEBUG: Mismatch between host header and host IP (fe80::01, expected: 127.0.0.1)
> gupnp-context-DEBUG: Mismatch between host header and host port (80, expected 4711)
> gupnp-context-DEBUG: Failed to parse HOST header from request: Invalid IPv6 address ?[fe80::01%1]? in URI
> gupnp-context-DEBUG: Failed to parse HOST header from request: Invalid IPv6 address ?[fe80::01%eth0]? in URI
> gupnp-context-DEBUG: Failed to parse HOST header from request: Could not parse port ?:1? in URI
> gupnp-context-DEBUG: Mismatch between host header and host IP (example.com, expected: ::1)
> gupnp-context-DEBUG: Mismatch between host header and host port (80, expected 4711)
> gupnp-context-DEBUG: Mismatch between host header and host IP (example.com, expected: ::1)
> gupnp-context-DEBUG: Mismatch between host header and host port (80, expected 4711)
> gupnp-context-DEBUG: Mismatch between host header and host IP (example.com, expected: ::1)
>
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
> linux-user/fd-trans.c | 100 ++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 100 insertions(+)
>
> diff --git a/linux-user/fd-trans.c b/linux-user/fd-trans.c
> index a86ed2f4b4..a5e6c6b6f2 100644
> --- a/linux-user/fd-trans.c
> +++ b/linux-user/fd-trans.c
> @@ -25,12 +25,16 @@
> #ifdef CONFIG_RTNETLINK
> #include <linux/rtnetlink.h>
> #include <linux/if_bridge.h>
> +#include <linux/neighbour.h>
> #endif
> #include "qemu.h"
> #include "user-internals.h"
> #include "fd-trans.h"
> #include "signal-common.h"
>
> +#define NDM_RTA(r) ((struct rtattr*)(((char*)(r)) + \
> + NLMSG_ALIGN(sizeof(struct ndmsg))))
> +
> enum {
> QEMU_IFLA_BR_UNSPEC,
> QEMU_IFLA_BR_FORWARD_DELAY,
> @@ -1210,6 +1214,35 @@ static abi_long host_to_target_data_route_rtattr(struct rtattr *rtattr)
> return 0;
> }
>
> +static abi_long host_to_target_data_neigh_rtattr(struct rtattr *rtattr)
> +{
> + struct nda_cacheinfo *ndac;
> + uint32_t *u32;
> +
> + switch (rtattr->rta_type) {
> + case NDA_UNSPEC:
> + case NDA_DST:
> + case NDA_LLADDR:
> + break;
> + case NDA_PROBES:
> + u32 = RTA_DATA(rtattr);
> + *u32 = tswap32(*u32);
> + break;
> + case NDA_CACHEINFO:
> + ndac = RTA_DATA(rtattr);
> + ndac->ndm_confirmed = tswap32(ndac->ndm_confirmed);
> + ndac->ndm_used = tswap32(ndac->ndm_used);
> + ndac->ndm_updated = tswap32(ndac->ndm_updated);
> + ndac->ndm_refcnt = tswap32(ndac->ndm_refcnt);
> + break;
> + default:
> + qemu_log_mask(LOG_UNIMP, "Unknown host to target NEIGH type: %d\n",
> + rtattr->rta_type);
> + break;
> + }
> + return 0;
> +}
> +
> static abi_long host_to_target_link_rtattr(struct rtattr *rtattr,
> uint32_t rtattr_len)
> {
> @@ -1231,12 +1264,20 @@ static abi_long host_to_target_route_rtattr(struct rtattr *rtattr,
> host_to_target_data_route_rtattr);
> }
>
> +static abi_long host_to_target_neigh_rtattr(struct rtattr *rtattr,
> + uint32_t rtattr_len)
> +{
> + return host_to_target_for_each_rtattr(rtattr, rtattr_len,
> + host_to_target_data_neigh_rtattr);
> +}
> +
> static abi_long host_to_target_data_route(struct nlmsghdr *nlh)
> {
> uint32_t nlmsg_len;
> struct ifinfomsg *ifi;
> struct ifaddrmsg *ifa;
> struct rtmsg *rtm;
> + struct ndmsg *ndm;
>
> nlmsg_len = nlh->nlmsg_len;
> switch (nlh->nlmsg_type) {
> @@ -1263,6 +1304,17 @@ static abi_long host_to_target_data_route(struct nlmsghdr *nlh)
> nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)));
> }
> break;
> + case RTM_NEWNEIGH:
> + case RTM_DELNEIGH:
> + case RTM_GETNEIGH:
> + if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ndm))) {
> + ndm = NLMSG_DATA(nlh);
> + ndm->ndm_ifindex = tswap32(ndm->ndm_ifindex);
> + ndm->ndm_state = tswap16(ndm->ndm_state);
> + host_to_target_neigh_rtattr(NDM_RTA(ndm),
> + nlmsg_len - NLMSG_LENGTH(sizeof(*ndm)));
> + }
> + break;
> case RTM_NEWROUTE:
> case RTM_DELROUTE:
> case RTM_GETROUTE:
> @@ -1410,6 +1462,35 @@ static abi_long target_to_host_data_addr_rtattr(struct rtattr *rtattr)
> return 0;
> }
>
> +static abi_long target_to_host_data_neigh_rtattr(struct rtattr *rtattr)
> +{
> + struct nda_cacheinfo *ndac;
> + uint32_t *u32;
> +
> + switch (rtattr->rta_type) {
> + case NDA_UNSPEC:
> + case NDA_DST:
> + case NDA_LLADDR:
> + break;
> + case NDA_PROBES:
> + u32 = RTA_DATA(rtattr);
> + *u32 = tswap32(*u32);
> + break;
> + case NDA_CACHEINFO:
> + ndac = RTA_DATA(rtattr);
> + ndac->ndm_confirmed = tswap32(ndac->ndm_confirmed);
> + ndac->ndm_used = tswap32(ndac->ndm_used);
> + ndac->ndm_updated = tswap32(ndac->ndm_updated);
> + ndac->ndm_refcnt = tswap32(ndac->ndm_refcnt);
> + break;
> + default:
> + qemu_log_mask(LOG_UNIMP, "Unknown target NEIGH type: %d\n",
> + rtattr->rta_type);
> + break;
> + }
> + return 0;
> +}
> +
> static abi_long target_to_host_data_route_rtattr(struct rtattr *rtattr)
> {
> uint32_t *u32;
> @@ -1448,6 +1529,13 @@ static void target_to_host_addr_rtattr(struct rtattr *rtattr,
> target_to_host_data_addr_rtattr);
> }
>
> +static void target_to_host_neigh_rtattr(struct rtattr *rtattr,
> + uint32_t rtattr_len)
> +{
> + target_to_host_for_each_rtattr(rtattr, rtattr_len,
> + target_to_host_data_neigh_rtattr);
> +}
> +
> static void target_to_host_route_rtattr(struct rtattr *rtattr,
> uint32_t rtattr_len)
> {
> @@ -1460,6 +1548,7 @@ static abi_long target_to_host_data_route(struct nlmsghdr *nlh)
> struct ifinfomsg *ifi;
> struct ifaddrmsg *ifa;
> struct rtmsg *rtm;
> + struct ndmsg *ndm;
>
> switch (nlh->nlmsg_type) {
> case RTM_NEWLINK:
> @@ -1486,6 +1575,17 @@ static abi_long target_to_host_data_route(struct nlmsghdr *nlh)
> NLMSG_LENGTH(sizeof(*ifa)));
> }
> break;
> + case RTM_NEWNEIGH:
> + case RTM_DELNEIGH:
> + case RTM_GETNEIGH:
> + if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ndm))) {
> + ndm = NLMSG_DATA(nlh);
> + ndm->ndm_ifindex = tswap32(ndm->ndm_ifindex);
> + ndm->ndm_state = tswap16(ndm->ndm_state);
> + target_to_host_neigh_rtattr(NDM_RTA(ndm), nlh->nlmsg_len -
> + NLMSG_LENGTH(sizeof(*ndm)));
> + }
> + break;
> case RTM_NEWROUTE:
> case RTM_DELROUTE:
> case RTM_GETROUTE:
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 6/6] linux-user: netlink: Add missing QEMU_IFLA entries
2024-12-27 20:54 [PATCH v2 0/6] linux-user: Add support for various missing netlink sockopt entries deller
` (4 preceding siblings ...)
2024-12-27 20:54 ` [PATCH v2 5/6] linux-user: netlink: add netlink neighbour emulation deller
@ 2024-12-27 20:54 ` deller
2025-01-10 15:40 ` Laurent Vivier
5 siblings, 1 reply; 12+ messages in thread
From: deller @ 2024-12-27 20:54 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel, Laurent Vivier,
Richard Henderson
Cc: deller
From: Helge Deller <deller@gmx.de>
This fixes the following qemu warnings when building debian gupnp package:
Unknown host QEMU_IFLA type: 61
Unknown host QEMU_IFLA type: 58
Unknown host QEMU_IFLA type: 59
Unknown host QEMU_IFLA type: 60
Unknown host QEMU_IFLA type: 32820
QEMU_IFLA type 32820 is actually NLA_NESTED | QEMU_IFLA_PROP_LIST (a nested
entry), which is why rta_type needs to be masked with NLA_TYPE_MASK.
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/fd-trans.c | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/linux-user/fd-trans.c b/linux-user/fd-trans.c
index a5e6c6b6f2..6a8775bb55 100644
--- a/linux-user/fd-trans.c
+++ b/linux-user/fd-trans.c
@@ -145,6 +145,14 @@ enum {
QEMU_IFLA_PROTO_DOWN_REASON,
QEMU_IFLA_PARENT_DEV_NAME,
QEMU_IFLA_PARENT_DEV_BUS_NAME,
+ QEMU_IFLA_GRO_MAX_SIZE,
+ QEMU_IFLA_TSO_MAX_SIZE,
+ QEMU_IFLA_TSO_MAX_SEGS,
+ QEMU_IFLA_ALLMULTI,
+ QEMU_IFLA_DEVLINK_PORT,
+ QEMU_IFLA_GSO_IPV4_MAX_SIZE,
+ QEMU_IFLA_GRO_IPV4_MAX_SIZE,
+ QEMU_IFLA_DPLL_PIN,
QEMU___IFLA_MAX
};
@@ -986,6 +994,22 @@ static abi_long host_to_target_data_vfinfo_nlattr(struct nlattr *nlattr,
return 0;
}
+static abi_long host_to_target_data_prop_nlattr(struct nlattr *nlattr,
+ void *context)
+{
+ switch (nlattr->nla_type) {
+ /* string */
+ case QEMU_IFLA_ALT_IFNAME:
+ break;
+ default:
+ qemu_log_mask(LOG_UNIMP, "Unknown host PROP type: %d\n",
+ nlattr->nla_type);
+ break;
+ }
+ return 0;
+}
+
+
static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
{
uint32_t *u32;
@@ -994,7 +1018,7 @@ static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
struct rtnl_link_ifmap *map;
struct linkinfo_context li_context;
- switch (rtattr->rta_type) {
+ switch (rtattr->rta_type & NLA_TYPE_MASK) {
/* binary stream */
case QEMU_IFLA_ADDRESS:
case QEMU_IFLA_BROADCAST:
@@ -1032,6 +1056,12 @@ static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
case QEMU_IFLA_CARRIER_DOWN_COUNT:
case QEMU_IFLA_MIN_MTU:
case QEMU_IFLA_MAX_MTU:
+ case QEMU_IFLA_GRO_MAX_SIZE:
+ case QEMU_IFLA_TSO_MAX_SIZE:
+ case QEMU_IFLA_TSO_MAX_SEGS:
+ case QEMU_IFLA_ALLMULTI:
+ case QEMU_IFLA_GSO_IPV4_MAX_SIZE:
+ case QEMU_IFLA_GRO_IPV4_MAX_SIZE:
u32 = RTA_DATA(rtattr);
*u32 = tswap32(*u32);
break;
@@ -1127,6 +1157,10 @@ static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len,
NULL,
host_to_target_data_vfinfo_nlattr);
+ case QEMU_IFLA_PROP_LIST:
+ return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len,
+ NULL,
+ host_to_target_data_prop_nlattr);
default:
qemu_log_mask(LOG_UNIMP, "Unknown host QEMU_IFLA type: %d\n",
rtattr->rta_type);
--
2.47.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v2 6/6] linux-user: netlink: Add missing QEMU_IFLA entries
2024-12-27 20:54 ` [PATCH v2 6/6] linux-user: netlink: Add missing QEMU_IFLA entries deller
@ 2025-01-10 15:40 ` Laurent Vivier
0 siblings, 0 replies; 12+ messages in thread
From: Laurent Vivier @ 2025-01-10 15:40 UTC (permalink / raw)
To: deller, Philippe Mathieu-Daudé, qemu-devel,
Richard Henderson; +Cc: deller
Le 27/12/2024 à 21:54, deller@kernel.org a écrit :
> From: Helge Deller <deller@gmx.de>
>
> This fixes the following qemu warnings when building debian gupnp package:
> Unknown host QEMU_IFLA type: 61
> Unknown host QEMU_IFLA type: 58
> Unknown host QEMU_IFLA type: 59
> Unknown host QEMU_IFLA type: 60
> Unknown host QEMU_IFLA type: 32820
>
> QEMU_IFLA type 32820 is actually NLA_NESTED | QEMU_IFLA_PROP_LIST (a nested
> entry), which is why rta_type needs to be masked with NLA_TYPE_MASK.
>
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
> linux-user/fd-trans.c | 36 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/linux-user/fd-trans.c b/linux-user/fd-trans.c
> index a5e6c6b6f2..6a8775bb55 100644
> --- a/linux-user/fd-trans.c
> +++ b/linux-user/fd-trans.c
> @@ -145,6 +145,14 @@ enum {
> QEMU_IFLA_PROTO_DOWN_REASON,
> QEMU_IFLA_PARENT_DEV_NAME,
> QEMU_IFLA_PARENT_DEV_BUS_NAME,
> + QEMU_IFLA_GRO_MAX_SIZE,
> + QEMU_IFLA_TSO_MAX_SIZE,
> + QEMU_IFLA_TSO_MAX_SEGS,
> + QEMU_IFLA_ALLMULTI,
> + QEMU_IFLA_DEVLINK_PORT,
> + QEMU_IFLA_GSO_IPV4_MAX_SIZE,
> + QEMU_IFLA_GRO_IPV4_MAX_SIZE,
> + QEMU_IFLA_DPLL_PIN,
> QEMU___IFLA_MAX
> };
>
> @@ -986,6 +994,22 @@ static abi_long host_to_target_data_vfinfo_nlattr(struct nlattr *nlattr,
> return 0;
> }
>
> +static abi_long host_to_target_data_prop_nlattr(struct nlattr *nlattr,
> + void *context)
> +{
> + switch (nlattr->nla_type) {
> + /* string */
> + case QEMU_IFLA_ALT_IFNAME:
> + break;
> + default:
> + qemu_log_mask(LOG_UNIMP, "Unknown host PROP type: %d\n",
> + nlattr->nla_type);
> + break;
> + }
> + return 0;
> +}
> +
> +
> static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
> {
> uint32_t *u32;
> @@ -994,7 +1018,7 @@ static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
> struct rtnl_link_ifmap *map;
> struct linkinfo_context li_context;
>
> - switch (rtattr->rta_type) {
> + switch (rtattr->rta_type & NLA_TYPE_MASK) {
> /* binary stream */
> case QEMU_IFLA_ADDRESS:
> case QEMU_IFLA_BROADCAST:
> @@ -1032,6 +1056,12 @@ static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
> case QEMU_IFLA_CARRIER_DOWN_COUNT:
> case QEMU_IFLA_MIN_MTU:
> case QEMU_IFLA_MAX_MTU:
> + case QEMU_IFLA_GRO_MAX_SIZE:
> + case QEMU_IFLA_TSO_MAX_SIZE:
> + case QEMU_IFLA_TSO_MAX_SEGS:
> + case QEMU_IFLA_ALLMULTI:
> + case QEMU_IFLA_GSO_IPV4_MAX_SIZE:
> + case QEMU_IFLA_GRO_IPV4_MAX_SIZE:
> u32 = RTA_DATA(rtattr);
> *u32 = tswap32(*u32);
> break;
> @@ -1127,6 +1157,10 @@ static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
> return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len,
> NULL,
> host_to_target_data_vfinfo_nlattr);
> + case QEMU_IFLA_PROP_LIST:
> + return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len,
> + NULL,
> + host_to_target_data_prop_nlattr);
> default:
> qemu_log_mask(LOG_UNIMP, "Unknown host QEMU_IFLA type: %d\n",
> rtattr->rta_type);
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
^ permalink raw reply [flat|nested] 12+ messages in thread