The branch stable/15 has been updated by madpilot:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=76cd2807fc3a686abf4f6e87705896a69315e943

commit 76cd2807fc3a686abf4f6e87705896a69315e943
Author:     Guido Falsi <[email protected]>
AuthorDate: 2025-09-22 07:57:39 +0000
Commit:     Guido Falsi <[email protected]>
CommitDate: 2026-02-16 17:27:04 +0000

    sys/netinet6: Fix ABI breakage introduced with RFC 7217 support
    
    commit 31ec8b6407fdd5a87d70265762457c67ce618283 added a `dad_failures`
    variable to `struct nd_ifinfo`, which broke the netowrking ABI.
    
    This commit fixes it by moving such variable to `struct in6_ifextra`
    which is not a public interface, while `struct nd_ifinfo` is back
    in its original state.
    
    Thanks to kib, markj and glebious for their help and suggestions
    in solving this problem.
    
    Reported by:    "Herbert J. Skuhra" <[email protected]>
    Tested by:      "Herbert J. Skuhra" <[email protected]>
    Approved by:    glebius
    Fixes:          31ec8b6407fdd5a87d70265762457c67ce618283
    
    (cherry picked from commit 0ec13430c583830cc4d29640787e2d154b140e31)
    
    Reviewed by:            glebius, kp, pouria, zlei
    Approved by:            glebius, pouria
    Relnotes:               yes
    Differential Revision:  https://reviews.freebsd.org/D54382
---
 sys/netinet6/in6.c          | 3 +++
 sys/netinet6/in6_ifattach.c | 2 +-
 sys/netinet6/in6_var.h      | 2 ++
 sys/netinet6/nd6.c          | 4 ----
 sys/netinet6/nd6.h          | 1 -
 sys/netinet6/nd6_nbr.c      | 6 +++---
 sys/netinet6/nd6_rtr.c      | 2 +-
 7 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index bdee1eefaa3f..abb880e5c2c1 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -2629,6 +2629,8 @@ in6_domifattach(struct ifnet *ifp)
        COUNTER_ARRAY_ALLOC(ext->icmp6_ifstat,
            sizeof(struct icmp6_ifstat) / sizeof(uint64_t), M_WAITOK);
 
+       ext->dad_failures = counter_u64_alloc(M_WAITOK);
+
        ext->nd_ifinfo = nd6_ifattach(ifp);
        ext->scope6_id = scope6_ifattach(ifp);
        ext->lltable = in6_lltattach(ifp);
@@ -2664,6 +2666,7 @@ in6_domifdetach(struct ifnet *ifp, void *aux)
        COUNTER_ARRAY_FREE(ext->icmp6_ifstat,
            sizeof(struct icmp6_ifstat) / sizeof(uint64_t));
        free(ext->icmp6_ifstat, M_IFADDR);
+       counter_u64_free(ext->dad_failures);
        free(ext, M_IFADDR);
 }
 
diff --git a/sys/netinet6/in6_ifattach.c b/sys/netinet6/in6_ifattach.c
index 3152291cbe6a..538f34a267b4 100644
--- a/sys/netinet6/in6_ifattach.c
+++ b/sys/netinet6/in6_ifattach.c
@@ -378,7 +378,7 @@ in6_get_stableifid(struct ifnet *ifp, struct in6_addr *in6, 
int prefixlen)
        }
        hostuuid_len = strlen(hostuuid);
 
-       dad_failures = counter_u64_fetch(ND_IFINFO(ifp)->dad_failures);
+       dad_failures = counter_u64_fetch(DAD_FAILURES(ifp));
 
        /*
         * RFC 7217 section 7
diff --git a/sys/netinet6/in6_var.h b/sys/netinet6/in6_var.h
index e5ab83e6a2a1..e511ead24f08 100644
--- a/sys/netinet6/in6_var.h
+++ b/sys/netinet6/in6_var.h
@@ -106,9 +106,11 @@ struct in6_ifextra {
        struct scope6_id *scope6_id;
        struct lltable *lltable;
        struct mld_ifsoftc *mld_ifinfo;
+       counter_u64_t dad_failures;     /* DAD failures when using RFC 7217 
stable addresses */
 };
 
 #define        LLTABLE6(ifp)   (((struct in6_ifextra 
*)(ifp)->if_afdata[AF_INET6])->lltable)
+#define        DAD_FAILURES(ifp)       (((struct in6_ifextra 
*)(ifp)->if_afdata[AF_INET6])->dad_failures)
 
 #ifdef _KERNEL
 
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
index 938d411711f0..00df5efcef92 100644
--- a/sys/netinet6/nd6.c
+++ b/sys/netinet6/nd6.c
@@ -329,8 +329,6 @@ nd6_ifattach(struct ifnet *ifp)
                nd->flags |= ND6_IFF_STABLEADDR;
        }
 
-       nd->dad_failures = counter_u64_alloc(M_WAITOK);
-
        return nd;
 }
 
@@ -350,8 +348,6 @@ nd6_ifdetach(struct ifnet *ifp, struct nd_ifinfo *nd)
        }
        NET_EPOCH_EXIT(et);
 
-       counter_u64_free(nd->dad_failures);
-
        free(nd, M_IP6NDP);
 }
 
diff --git a/sys/netinet6/nd6.h b/sys/netinet6/nd6.h
index 4322066b0912..e484c709e29a 100644
--- a/sys/netinet6/nd6.h
+++ b/sys/netinet6/nd6.h
@@ -76,7 +76,6 @@ struct nd_ifinfo {
        u_int8_t randomseed0[8]; /* upper 64 bits of MD5 digest */
        u_int8_t randomseed1[8]; /* lower 64 bits (usually the EUI64 IFID) */
        u_int8_t randomid[8];   /* current random ID */
-       counter_u64_t dad_failures;     /* DAD failures when using RFC 7217 
stable addresses */
 };
 
 #define ND6_IFF_PERFORMNUD     0x1
diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c
index 74f63ed6dfdc..e2db192bca15 100644
--- a/sys/netinet6/nd6_nbr.c
+++ b/sys/netinet6/nd6_nbr.c
@@ -1460,7 +1460,7 @@ nd6_dad_timer(void *arg)
                        if ((ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) == 0) {
                                ia->ia6_flags &= ~IN6_IFF_TENTATIVE;
                                if ((ND_IFINFO(ifp)->flags & 
ND6_IFF_STABLEADDR) && !(ia->ia6_flags & IN6_IFF_TEMPORARY))
-                                       
counter_u64_zero(ND_IFINFO(ifp)->dad_failures);
+                                       counter_u64_zero(DAD_FAILURES(ifp));
                        }
 
                        nd6log((LOG_DEBUG,
@@ -1509,10 +1509,10 @@ nd6_dad_duplicated(struct ifaddr *ifa, struct dadq *dp)
         * More addresses will be generated as long as retries are not 
exhausted.
         */
        if ((ND_IFINFO(ifp)->flags & ND6_IFF_STABLEADDR) && !(ia->ia6_flags & 
IN6_IFF_TEMPORARY)) {
-               uint64_t dad_failures = 
counter_u64_fetch(ND_IFINFO(ifp)->dad_failures);
+               uint64_t dad_failures = counter_u64_fetch(DAD_FAILURES(ifp));
 
                if (dad_failures <= V_ip6_stableaddr_maxretries) {
-                       counter_u64_add(ND_IFINFO(ifp)->dad_failures, 1);
+                       counter_u64_add(DAD_FAILURES(ifp), 1);
                        /* if retries exhausted, output an informative error 
message */
                        if (dad_failures == V_ip6_stableaddr_maxretries)
                                log(LOG_ERR, "%s: manual intervention required, 
consider disabling \"stableaddr\" on the interface"
diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c
index 85046c0dd9fe..2ac883729c12 100644
--- a/sys/netinet6/nd6_rtr.c
+++ b/sys/netinet6/nd6_rtr.c
@@ -1709,7 +1709,7 @@ prelist_update(struct nd_prefixctl *new, struct 
nd_defrouter *dr,
                 * to fail and no further retries should happen.
                 */
                if (ND_IFINFO(ifp)->flags & ND6_IFF_STABLEADDR &&
-                   counter_u64_fetch(ND_IFINFO(ifp)->dad_failures) <= 
V_ip6_stableaddr_maxretries &&
+                   counter_u64_fetch(DAD_FAILURES(ifp)) <= 
V_ip6_stableaddr_maxretries &&
                    ifa6->ia6_flags & (IN6_IFF_DUPLICATED | IN6_IFF_TEMPORARY))
                        continue;
 

Reply via email to