On Tue, 3 Mar 2026 14:16:41 -0500
Jon Maloy
nl_addr_get() was not setting the prefix_len output parameter for IPv6 addresses, only for IPv4. This meant callers always got 0 for IPv6, forcing them to use a hardcoded default (64).
Fix by assigning *prefix_len even in the IPv6 case.
Signed-off-by: Jon Maloy
Reviewed-by: David Gibson --- netlink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netlink.c b/netlink.c index 82a2f0c..769cb23 100644 --- a/netlink.c +++ b/netlink.c @@ -752,7 +752,7 @@ int nl_addr_set_ll_nodad(int s, unsigned int ifi) * @ifi: Interface index in outer network namespace * @af: Address family * @addr: Global address to fill - * @prefix_len: Mask or prefix length, to fill (for IPv4) + * @prefix_len: Mask or prefix length, to fill * @addr_l: Link-scoped address to fill (for IPv6) * * Return: 0 on success, negative error code on failure @@ -797,7 +797,7 @@ int nl_addr_get(int s, unsigned int ifi, sa_family_t af, ifa->ifa_prefixlen > prefix_max) { memcpy(addr, RTA_DATA(rta), RTA_PAYLOAD(rta));
- prefix_max = ifa->ifa_prefixlen; + prefix_max = *prefix_len = ifa->ifa_prefixlen;
Sorry, I spotted this just now and not in the original series, because I hadn't really looked at the context there. The main reason why there are two separate blocks for IPv4 and IPv6, here, is the *prefix_len assignment. Now that this becomes the same for IPv6, that doesn't hold anymore, so, instead of: if (af == AF_INET && ifa->ifa_prefixlen > prefix_max) { memcpy(addr, RTA_DATA(rta), RTA_PAYLOAD(rta)); prefix_max = *prefix_len = ifa->ifa_prefixlen; } else if (af == AF_INET6 && addr && ifa->ifa_scope < RT_SCOPE_LINK && ifa->ifa_prefixlen > prefix_max) { memcpy(addr, RTA_DATA(rta), RTA_PAYLOAD(rta)); prefix_max = *prefix_len = ifa->ifa_prefixlen; } you could simplify all that to: if (ifa->ifa_prefixlen > prefix_max && (af == AF_INET || ifa->ifa_scope < RT_SCOPE_LINK)) { memcpy(addr, RTA_DATA(rta), RTA_PAYLOAD(rta)); prefix_max = *prefix_len = ifa->ifa_prefixlen; } and save 5 lines out of 11. I haven't checked the possible meanings of ifa_scope for IPv4 by the way, maybe that part of the condition could go away as well. -- Stefano