From: Jon Maloy <jmaloy@redhat.com>
To: sbrivio@redhat.com, dgibson@redhat.com,
david@gibson.dropbear.id.au, jmaloy@redhat.com,
passt-dev@passt.top
Subject: [PATCH v2] netlink: Return prefix length for IPv6 addresses in nl_addr_get()
Date: Fri, 6 Mar 2026 15:09:52 -0500 [thread overview]
Message-ID: <20260306200952.1440552-1-jmaloy@redhat.com> (raw)
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.
We also add another functional change. We now check for if an AF_INET
address is link local, in which case we have to skip it. Although it
is conventional to set the scope of such addresses to RT_SCOPE_HOST,
this is not stated in any RFC, and we cannot trust it to have been set
correctly by the user, just as we cannot trust it to have been set
correctly for any other AF_INET address. We therefore add this check
explicitly on the address itself.
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
---
v2: - Simplified according to feedback from S. Brivio
- Added test fo AF_INET link local property
---
netlink.c | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/netlink.c b/netlink.c
index 82a2f0c..f0e8fa7 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
@@ -777,6 +777,7 @@ int nl_addr_get(int s, unsigned int ifi, sa_family_t af,
nl_foreach_oftype(nh, status, s, buf, seq, RTM_NEWADDR) {
struct ifaddrmsg *ifa = (struct ifaddrmsg *)NLMSG_DATA(nh);
struct rtattr *rta;
+ bool link_local;
size_t na;
if (ifa->ifa_index != ifi || ifa->ifa_flags & IFA_F_DEPRECATED)
@@ -788,18 +789,14 @@ int nl_addr_get(int s, unsigned int ifi, sa_family_t af,
(af == AF_INET6 && rta->rta_type != IFA_ADDRESS))
continue;
- if (af == AF_INET && ifa->ifa_prefixlen > prefix_max) {
- memcpy(addr, RTA_DATA(rta), RTA_PAYLOAD(rta));
+ link_local = (af == AF_INET6) ?
+ ifa->ifa_scope >= RT_SCOPE_LINK :
+ IN4_IS_ADDR_LINKLOCAL(RTA_DATA(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) {
+ if (ifa->ifa_prefixlen > prefix_max && !link_local) {
memcpy(addr, RTA_DATA(rta), RTA_PAYLOAD(rta));
-
- prefix_max = ifa->ifa_prefixlen;
+ prefix_max = *prefix_len = ifa->ifa_prefixlen;
}
-
if (addr_l &&
af == AF_INET6 && ifa->ifa_scope == RT_SCOPE_LINK &&
ifa->ifa_prefixlen > prefix_max_ll) {
--
2.52.0
reply other threads:[~2026-03-06 20:09 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260306200952.1440552-1-jmaloy@redhat.com \
--to=jmaloy@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=dgibson@redhat.com \
--cc=passt-dev@passt.top \
--cc=sbrivio@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).