|
From: | Mathis MARION |
Subject: | Re: [PATCH v1 3/4] linux-user: add target to host netlink conversions |
Date: | Mon, 20 Feb 2023 09:24:12 +0100 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.2 |
On 20/02/2023 08:22, Philippe Mathieu-Daudé wrote:
On 17/2/23 17:35, Mathis Marion wrote:From: Mathis Marion <mathis.marion@silabs.com> Added conversions for: - IFLA_MTU - IFLA_TXQLEN - IFLA_AF_SPEC AF_INET6 IFLA_INET6_ADDR_GEN_MODE These relate to the libnl functions rtnl_link_set_mtu, rtnl_link_set_txqlen, and rtnl_link_inet6_set_addr_gen_mode. Signed-off-by: Mathis Marion <mathis.marion@silabs.com> --- linux-user/fd-trans.c | 64 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/linux-user/fd-trans.c b/linux-user/fd-trans.c index 146aaaafaa..aa398098ec 100644 --- a/linux-user/fd-trans.c +++ b/linux-user/fd-trans.c@@ -1284,6 +1284,49 @@ static inline abi_long host_to_target_nlmsg_route(struct nlmsghdr *nlh, return host_to_target_for_each_nlmsg(nlh, len, host_to_target_data_route);} +static abi_long target_to_host_for_each_nlattr(struct nlattr *nlattr,+ size_t len, void *context,You always pass a NULL context... Do we really need it?
This is a leftover, I had the context in every functions as copied from the host_to_target* variants but removed it. I just forgot about this function.
+ abi_long (*target_to_host_nlattr) + (struct nlattr *))+{ + unsigned short aligned_nla_len; + abi_long ret; + + while (len > sizeof(struct nlattr)) { + if (tswap16(nlattr->nla_len) < sizeof(struct rtattr) || + tswap16(nlattr->nla_len) > len) { + break; + } + nlattr->nla_len = tswap16(nlattr->nla_len); + nlattr->nla_type = tswap16(nlattr->nla_type); + ret = target_to_host_nlattr(nlattr); + if (ret < 0) {If this fail, guest's nlattr is now inconsistent. Is this OK?
The same check is done in target_to_host_for_each_rtattr(), and in all host_to_target_for_each* functions so I think this is OK.
+ return ret; + } + + aligned_nla_len = NLA_ALIGN(nlattr->nla_len); + if (aligned_nla_len >= len) { + break; + } + len -= aligned_nla_len; + nlattr = (struct nlattr *)(((char *)nlattr) + aligned_nla_len); + } + return 0; +} + +static abi_long target_to_host_data_inet6_nlattr(struct nlattr *nlattr) +{ + switch (nlattr->nla_type) { + /* uint8_t */ + case QEMU_IFLA_INET6_ADDR_GEN_MODE: + break; + default: + qemu_log_mask(LOG_UNIMP, "Unknown target AF_INET6 type: %d\n", + nlattr->nla_type); + } + return 0; +} + static abi_long target_to_host_for_each_rtattr(struct rtattr *rtattr, size_t len,abi_long (*target_to_host_rtattr) @@ -1314,16 +1357,37 @@ static abi_long target_to_host_for_each_rtattr(struct rtattr *rtattr,return 0; } +static abi_long target_to_host_data_spec_nlattr(struct nlattr *nlattr) +{ + switch (nlattr->nla_type) { + case AF_INET6:+ return target_to_host_for_each_nlattr(NLA_DATA(nlattr), nlattr->nla_len,+ NULL,+ target_to_host_data_inet6_nlattr);+ default: + qemu_log_mask(LOG_UNIMP, "Unknown target AF_SPEC type: %d\n", + nlattr->nla_type); + break; + } + return 0; +} + static abi_long target_to_host_data_link_rtattr(struct rtattr *rtattr) { uint32_t *u32; switch (rtattr->rta_type) { /* uint32_t */ + case QEMU_IFLA_MTU: + case QEMU_IFLA_TXQLEN: case QEMU_IFLA_EXT_MASK: u32 = RTA_DATA(rtattr); *u32 = tswap32(*u32); break; + case QEMU_IFLA_AF_SPEC:+ return target_to_host_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len,+ NULL,+ target_to_host_data_spec_nlattr);default: qemu_log_mask(LOG_UNIMP, "Unknown target QEMU_IFLA type: %d\n", rtattr->rta_type);
[Prev in Thread] | Current Thread | [Next in Thread] |