From: Mathis Marion <mathis.marion@silabs.com>
Newer kernel versions require this flag to be present contrary to older
ones. Depending on the libnl version it is added or not.
Typically when using rtnl_link_inet6_set_addr_gen_mode, the netlink
packet generated may contain the following attribute:
with libnl 3.4
{nla_len=16, nla_type=IFLA_AF_SPEC},
[
{nla_len=12, nla_type=AF_INET6},
[{nla_len=5, nla_type=IFLA_INET6_ADDR_GEN_MODE}, IN6_ADDR_GEN_MODE_NONE]
]
with libnl 3.7
{nla_len=16, nla_type=NLA_F_NESTED|IFLA_AF_SPEC},
[
{nla_len=12, nla_type=NLA_F_NESTED|AF_INET6},
[{nla_len=5, nla_type=IFLA_INET6_ADDR_GEN_MODE}, IN6_ADDR_GEN_MODE_NONE]]
]
Masking the type is likely needed in other places. Only the above cases
are implemented in this patch.
Signed-off-by: Mathis Marion <mathis.marion@silabs.com>
---
linux-user/fd-trans.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/linux-user/fd-trans.c b/linux-user/fd-trans.c
index 4852a75d9d..c04a97c73a 100644
--- a/linux-user/fd-trans.c
+++ b/linux-user/fd-trans.c
@@ -1359,7 +1359,7 @@ static abi_long target_to_host_for_each_rtattr(struct rtattr *rtattr,
static abi_long target_to_host_data_spec_nlattr(struct nlattr *nlattr)
{
- switch (nlattr->nla_type) {
+ switch (nlattr->nla_type & NLA_TYPE_MASK) {
case AF_INET6:
return target_to_host_for_each_nlattr(NLA_DATA(nlattr), nlattr->nla_len,
target_to_host_data_inet6_nlattr);
@@ -1375,7 +1375,7 @@ static abi_long target_to_host_data_link_rtattr(struct rtattr *rtattr)
{
uint32_t *u32;
- switch (rtattr->rta_type) {
+ switch (rtattr->rta_type & NLA_TYPE_MASK) {
/* uint32_t */
case QEMU_IFLA_MTU:
case QEMU_IFLA_TXQLEN:
--
2.39.2
Le 07/03/2023 à 16:42, Mathis Marion a écrit : > From: Mathis Marion <mathis.marion@silabs.com> > > Newer kernel versions require this flag to be present contrary to older > ones. Depending on the libnl version it is added or not. > > Typically when using rtnl_link_inet6_set_addr_gen_mode, the netlink > packet generated may contain the following attribute: > > with libnl 3.4 > > {nla_len=16, nla_type=IFLA_AF_SPEC}, > [ > {nla_len=12, nla_type=AF_INET6}, > [{nla_len=5, nla_type=IFLA_INET6_ADDR_GEN_MODE}, IN6_ADDR_GEN_MODE_NONE] > ] > > with libnl 3.7 > > {nla_len=16, nla_type=NLA_F_NESTED|IFLA_AF_SPEC}, > [ > {nla_len=12, nla_type=NLA_F_NESTED|AF_INET6}, > [{nla_len=5, nla_type=IFLA_INET6_ADDR_GEN_MODE}, IN6_ADDR_GEN_MODE_NONE]] > ] > > Masking the type is likely needed in other places. Only the above cases > are implemented in this patch. > > Signed-off-by: Mathis Marion <mathis.marion@silabs.com> > --- > linux-user/fd-trans.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/linux-user/fd-trans.c b/linux-user/fd-trans.c > index 4852a75d9d..c04a97c73a 100644 > --- a/linux-user/fd-trans.c > +++ b/linux-user/fd-trans.c > @@ -1359,7 +1359,7 @@ static abi_long target_to_host_for_each_rtattr(struct rtattr *rtattr, > > static abi_long target_to_host_data_spec_nlattr(struct nlattr *nlattr) > { > - switch (nlattr->nla_type) { > + switch (nlattr->nla_type & NLA_TYPE_MASK) { > case AF_INET6: > return target_to_host_for_each_nlattr(NLA_DATA(nlattr), nlattr->nla_len, > target_to_host_data_inet6_nlattr); > @@ -1375,7 +1375,7 @@ static abi_long target_to_host_data_link_rtattr(struct rtattr *rtattr) > { > uint32_t *u32; > > - switch (rtattr->rta_type) { > + switch (rtattr->rta_type & NLA_TYPE_MASK) { > /* uint32_t */ > case QEMU_IFLA_MTU: > case QEMU_IFLA_TXQLEN: Applied to my linux-user-for-8.0 branch. Thanks, Laurent
Le 07/03/2023 à 16:42, Mathis Marion a écrit : > From: Mathis Marion <mathis.marion@silabs.com> > > Newer kernel versions require this flag to be present contrary to older > ones. Depending on the libnl version it is added or not. > > Typically when using rtnl_link_inet6_set_addr_gen_mode, the netlink > packet generated may contain the following attribute: > > with libnl 3.4 > > {nla_len=16, nla_type=IFLA_AF_SPEC}, > [ > {nla_len=12, nla_type=AF_INET6}, > [{nla_len=5, nla_type=IFLA_INET6_ADDR_GEN_MODE}, IN6_ADDR_GEN_MODE_NONE] > ] > > with libnl 3.7 > > {nla_len=16, nla_type=NLA_F_NESTED|IFLA_AF_SPEC}, > [ > {nla_len=12, nla_type=NLA_F_NESTED|AF_INET6}, > [{nla_len=5, nla_type=IFLA_INET6_ADDR_GEN_MODE}, IN6_ADDR_GEN_MODE_NONE]] > ] > > Masking the type is likely needed in other places. Only the above cases > are implemented in this patch. > > Signed-off-by: Mathis Marion <mathis.marion@silabs.com> > --- > linux-user/fd-trans.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/linux-user/fd-trans.c b/linux-user/fd-trans.c > index 4852a75d9d..c04a97c73a 100644 > --- a/linux-user/fd-trans.c > +++ b/linux-user/fd-trans.c > @@ -1359,7 +1359,7 @@ static abi_long target_to_host_for_each_rtattr(struct rtattr *rtattr, > > static abi_long target_to_host_data_spec_nlattr(struct nlattr *nlattr) > { > - switch (nlattr->nla_type) { > + switch (nlattr->nla_type & NLA_TYPE_MASK) { > case AF_INET6: > return target_to_host_for_each_nlattr(NLA_DATA(nlattr), nlattr->nla_len, > target_to_host_data_inet6_nlattr); > @@ -1375,7 +1375,7 @@ static abi_long target_to_host_data_link_rtattr(struct rtattr *rtattr) > { > uint32_t *u32; > > - switch (rtattr->rta_type) { > + switch (rtattr->rta_type & NLA_TYPE_MASK) { > /* uint32_t */ > case QEMU_IFLA_MTU: > case QEMU_IFLA_TXQLEN: Reviewed-by: Laurent Vivier <laurent@vivier.eu>
© 2016 - 2025 Red Hat, Inc.