Index: sys/sysctl.h =================================================================== RCS file: /cvs/src/sys/sys/sysctl.h,v diff -u -p -r1.243 sysctl.h --- sys/sysctl.h 5 Jul 2025 09:24:37 -0000 1.243 +++ sys/sysctl.h 12 Jul 2025 00:41:42 -0000 @@ -1054,7 +1054,7 @@ struct mbuf_queue; int sysctl_mq(int *, u_int, void *, size_t *, void *, size_t, struct mbuf_queue *); struct rtentry; -int sysctl_dumpentry(struct rtentry *, void *, unsigned int); +int sysctl_dumpentry(const struct rtentry *, void *, unsigned int); int sysctl_rtable(int *, u_int, void *, size_t *, void *, size_t); int sysctl_clockrate(char *, size_t *, void *); #if defined(GPROF) || defined(DDBPROF) Index: net/route.c =================================================================== RCS file: /cvs/src/sys/net/route.c,v diff -u -p -r1.446 route.c --- net/route.c 7 Jul 2025 02:28:50 -0000 1.446 +++ net/route.c 12 Jul 2025 00:41:43 -0000 @@ -2003,7 +2003,7 @@ rt_plentosa(sa_family_t af, int plen, st } struct sockaddr * -rt_plen2mask(struct rtentry *rt, struct sockaddr_in6 *sa_mask) +rt_plen2mask(const struct rtentry *rt, struct sockaddr_in6 *sa_mask) { return (rt_plentosa(rt_key(rt)->sa_family, rt_plen(rt), sa_mask)); } Index: net/route.h =================================================================== RCS file: /cvs/src/sys/net/route.h,v diff -u -p -r1.217 route.h --- net/route.h 10 Jul 2025 05:28:13 -0000 1.217 +++ net/route.h 12 Jul 2025 00:41:43 -0000 @@ -476,7 +476,7 @@ void rtm_bfd(struct bfd_config *); void rtm_80211info(struct ifnet *, struct if_ieee80211_data *); void rt_maskedcopy(struct sockaddr *, struct sockaddr *, struct sockaddr *); -struct sockaddr *rt_plen2mask(struct rtentry *, struct sockaddr_in6 *); +struct sockaddr *rt_plen2mask(const struct rtentry *, struct sockaddr_in6 *); void rtm_send(struct rtentry *, int, int, unsigned int); void rtm_addr(int, struct ifaddr *); void rtm_miss(int, struct rt_addrinfo *, int, uint8_t, u_int, int, u_int); Index: net/rtable.c =================================================================== RCS file: /cvs/src/sys/net/rtable.c,v diff -u -p -r1.92 rtable.c --- net/rtable.c 10 Jul 2025 05:28:13 -0000 1.92 +++ net/rtable.c 12 Jul 2025 00:41:43 -0000 @@ -783,6 +783,37 @@ rtable_walk(unsigned int rtableid, sa_fa return (error); } +int +rtable_read(unsigned int rtableid, sa_family_t af, + int (*func)(const struct rtentry *, void *, unsigned int), void *arg) +{ + struct rtable *tbl; + struct art_iter ai; + struct art_node *an; + int error; + + tbl = rtable_get(rtableid, af); + if (tbl == NULL) + return (EAFNOSUPPORT); + + rw_enter_write(&tbl->r_lock); + ART_FOREACH(an, tbl->r_art, &ai) { + struct rtentry *rt; + for (rt = SMR_PTR_GET_LOCKED(&an->an_value); rt != NULL; + rt = SMR_PTR_GET_LOCKED(&rt->rt_next)) { + error = func(rt, arg, rtableid); + if (error != 0) { + art_iter_close(&ai); + goto leave; + } + } + } +leave: + rw_exit_write(&tbl->r_lock); + + return (error); +} + struct rtentry * rtable_iterate(struct rtentry *rt0) { Index: net/rtable.h =================================================================== RCS file: /cvs/src/sys/net/rtable.h,v diff -u -p -r1.34 rtable.h --- net/rtable.h 10 Jul 2025 05:28:13 -0000 1.34 +++ net/rtable.h 12 Jul 2025 00:41:43 -0000 @@ -69,6 +69,9 @@ int rtable_delete(unsigned int, const const struct sockaddr *, struct rtentry *); int rtable_walk(unsigned int, sa_family_t, struct rtentry **, int (*)(struct rtentry *, void *, unsigned int), void *); +int rtable_read(unsigned int, sa_family_t, + int (*)(const struct rtentry *, void *, unsigned int), + void *); int rtable_mpath_capable(unsigned int, sa_family_t); int rtable_mpath_reprio(unsigned int, struct sockaddr *, int, Index: net/rtsock.c =================================================================== RCS file: /cvs/src/sys/net/rtsock.c,v diff -u -p -r1.385 rtsock.c --- net/rtsock.c 7 Jul 2025 02:28:50 -0000 1.385 +++ net/rtsock.c 12 Jul 2025 00:41:44 -0000 @@ -1955,7 +1955,7 @@ rtm_proposal(struct ifnet *ifp, struct r * This is used in dumping the kernel table via sysctl(). */ int -sysctl_dumpentry(struct rtentry *rt, void *v, unsigned int id) +sysctl_dumpentry(const struct rtentry *rt, void *v, unsigned int id) { struct walkarg *w = v; int error = 0, size; @@ -2029,7 +2029,8 @@ sysctl_dumpentry(struct rtentry *rt, voi rtm->rtm_priority = rt->rt_priority & RTP_MASK; rtm_getmetrics(rt, &rtm->rtm_rmx); /* Do not account the routing table's reference. */ - rtm->rtm_rmx.rmx_refcnt = refcnt_read(&rt->rt_refcnt) - 1; + rtm->rtm_rmx.rmx_refcnt = + refcnt_read((struct refcnt *)&rt->rt_refcnt) - 1; rtm->rtm_index = rt->rt_ifidx; rtm->rtm_addrs = info.rti_addrs; rtm->rtm_tableid = id; @@ -2231,8 +2232,7 @@ sysctl_rtable(int *name, u_int namelen, if (af != 0 && af != i) continue; - error = rtable_walk(tableid, i, NULL, sysctl_dumpentry, - &w); + error = rtable_read(tableid, i, sysctl_dumpentry, &w); if (error == EAFNOSUPPORT) error = 0; if (error)