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 14 Jul 2025 08:49:37 -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/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 14 Jul 2025 08:49:37 -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 14 Jul 2025 08:49:37 -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 14 Jul 2025 08:49:37 -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; @@ -2231,8 +2231,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)