diff --git a/regress/sys/net/rtable/delete/main.c b/regress/sys/net/rtable/delete/main.c index b377d0eb612..76de5b66d2f 100644 --- a/regress/sys/net/rtable/delete/main.c +++ b/regress/sys/net/rtable/delete/main.c @@ -30,7 +30,7 @@ #include "util.h" -extern void *rtable_get(unsigned int, sa_family_t); +extern struct rtable *rtable_get(unsigned int, sa_family_t); __dead void usage(void) @@ -58,8 +58,11 @@ main(int argc, char *argv[]) rtable_walk(0, AF_INET6, NULL, rtentry_dump, NULL); + struct rtable *tbl; + tbl = rtable_get(0, AF_INET6); + assert(tbl != NULL); struct art_root *ar; - ar = rtable_get(0, AF_INET6); + ar = tbl->r_art; assert(ar != NULL); assert(ar->ar_root.ref == NULL); diff --git a/sys/net/rtable.c b/sys/net/rtable.c index bc4f558a416..d2e554bcda9 100644 --- a/sys/net/rtable.c +++ b/sys/net/rtable.c @@ -57,7 +57,7 @@ uint8_t af2idx_max; /* Array of routing table pointers. */ struct rtmap { unsigned int limit; - void **tbl; + struct rtable **tbl; }; /* @@ -85,8 +85,8 @@ void rtmap_dtor(void *, void *); struct srp_gc rtmap_gc = SRP_GC_INITIALIZER(rtmap_dtor, NULL); void rtable_init_backend(void); -void *rtable_alloc(unsigned int, unsigned int, unsigned int); -void *rtable_get(unsigned int, sa_family_t); +struct rtable *rtable_alloc(unsigned int, unsigned int, unsigned int); +struct rtable *rtable_get(unsigned int, sa_family_t); void rtmap_init(void) @@ -193,7 +193,7 @@ int rtable_add(unsigned int id) { const struct domain *dp; - void *tbl; + struct rtable *tbl; struct rtmap *map; struct dommp *dmm; sa_family_t af; @@ -244,11 +244,11 @@ out: return (error); } -void * +struct rtable * rtable_get(unsigned int rtableid, sa_family_t af) { struct rtmap *map; - void *tbl = NULL; + struct rtable *tbl = NULL; struct srp_ref sr; if (af >= nitems(af2idx) || af2idx[af] == 0) @@ -286,7 +286,7 @@ rtable_empty(unsigned int rtableid) { const struct domain *dp; int i; - struct art_root *tbl; + struct rtable *tbl; for (i = 0; (dp = domains[i]) != NULL; i++) { if (dp->dom_rtoffset == 0) @@ -295,7 +295,7 @@ rtable_empty(unsigned int rtableid) tbl = rtable_get(rtableid, dp->dom_family); if (tbl == NULL) continue; - if (tbl->ar_root.ref != NULL) + if (tbl->r_art->ar_root.ref != NULL) return (0); } @@ -367,23 +367,36 @@ rtable_init_backend(void) art_init(); } -void * +struct rtable * rtable_alloc(unsigned int rtableid, unsigned int alen, unsigned int off) { - return (art_alloc(rtableid, alen, off)); + struct rtable *tbl; + + tbl = malloc(sizeof(*tbl), M_RTABLE, M_NOWAIT|M_ZERO); + if (tbl == NULL) + return (NULL); + + tbl->r_art = art_alloc(rtableid, alen, off); + if (tbl->r_art == NULL) { + free(tbl, M_RTABLE, sizeof(*tbl)); + return (NULL); + } + + return (tbl); } int rtable_setsource(unsigned int rtableid, int af, struct sockaddr *src) { - struct art_root *ar; + struct rtable *tbl; NET_ASSERT_LOCKED_EXCLUSIVE(); - if ((ar = rtable_get(rtableid, af)) == NULL) + tbl = rtable_get(rtableid, af); + if (tbl == NULL) return (EAFNOSUPPORT); - ar->ar_source = src; + tbl->r_art->ar_source = src; return (0); } @@ -391,15 +404,15 @@ rtable_setsource(unsigned int rtableid, int af, struct sockaddr *src) struct sockaddr * rtable_getsource(unsigned int rtableid, int af) { - struct art_root *ar; + struct rtable *tbl; NET_ASSERT_LOCKED(); - ar = rtable_get(rtableid, af); - if (ar == NULL) + tbl = rtable_get(rtableid, af); + if (tbl == NULL) return (NULL); - return (ar->ar_source); + return (tbl->r_art->ar_source); } void @@ -419,6 +432,7 @@ struct rtentry * rtable_lookup(unsigned int rtableid, const struct sockaddr *dst, const struct sockaddr *mask, const struct sockaddr *gateway, uint8_t prio) { + struct rtable *tbl; struct art_root *ar; struct art_node *an; struct rtentry *rt = NULL; @@ -426,9 +440,10 @@ rtable_lookup(unsigned int rtableid, const struct sockaddr *dst, const uint8_t *addr; int plen; - ar = rtable_get(rtableid, dst->sa_family); - if (ar == NULL) + tbl = rtable_get(rtableid, dst->sa_family); + if (tbl == NULL) return (NULL); + ar = tbl->r_art; addr = satoaddr(ar, dst); @@ -474,6 +489,7 @@ out: struct rtentry * rtable_match(unsigned int rtableid, const struct sockaddr *dst, uint32_t *src) { + struct rtable *tbl; struct art_root *ar; struct art_node *an; struct rtentry *rt = NULL; @@ -481,9 +497,10 @@ rtable_match(unsigned int rtableid, const struct sockaddr *dst, uint32_t *src) const uint8_t *addr; int hash; - ar = rtable_get(rtableid, dst->sa_family); - if (ar == NULL) + tbl = rtable_get(rtableid, dst->sa_family); + if (tbl == NULL) return (NULL); + ar = tbl->r_art; addr = satoaddr(ar, dst); @@ -549,6 +566,7 @@ rtable_insert(unsigned int rtableid, struct sockaddr *dst, const struct sockaddr *mask, const struct sockaddr *gateway, uint8_t prio, struct rtentry *rt) { + struct rtable *tbl; struct rtentry *mrt; struct srp_ref sr; struct art_root *ar; @@ -558,9 +576,10 @@ rtable_insert(unsigned int rtableid, struct sockaddr *dst, unsigned int rt_flags; int error = 0; - ar = rtable_get(rtableid, dst->sa_family); - if (ar == NULL) + tbl = rtable_get(rtableid, dst->sa_family); + if (tbl == NULL) return (EAFNOSUPPORT); + ar = tbl->r_art; addr = satoaddr(ar, dst); plen = rtable_satoplen(dst->sa_family, mask); @@ -654,6 +673,7 @@ int rtable_delete(unsigned int rtableid, const struct sockaddr *dst, const struct sockaddr *mask, struct rtentry *rt) { + struct rtable *tbl; struct art_root *ar; struct art_node *an; struct srp_ref sr; @@ -663,9 +683,10 @@ rtable_delete(unsigned int rtableid, const struct sockaddr *dst, int npaths = 0; int error = 0; - ar = rtable_get(rtableid, dst->sa_family); - if (ar == NULL) + tbl = rtable_get(rtableid, dst->sa_family); + if (tbl == NULL) return (EAFNOSUPPORT); + ar = tbl->r_art; addr = satoaddr(ar, dst); plen = rtable_satoplen(dst->sa_family, mask); @@ -752,13 +773,15 @@ int rtable_walk(unsigned int rtableid, sa_family_t af, struct rtentry **prt, int (*func)(struct rtentry *, void *, unsigned int), void *arg) { + struct rtable *tbl; struct art_root *ar; struct rtable_walk_cookie rwc; int error; - ar = rtable_get(rtableid, af); - if (ar == NULL) + tbl = rtable_get(rtableid, af); + if (tbl == NULL) return (EAFNOSUPPORT); + ar = tbl->r_art; rwc.rwc_func = func; rwc.rwc_arg = arg; @@ -794,15 +817,17 @@ int rtable_mpath_reprio(unsigned int rtableid, struct sockaddr *dst, int plen, uint8_t prio, struct rtentry *rt) { + struct rtable *tbl; struct art_root *ar; struct art_node *an; struct srp_ref sr; const uint8_t *addr; int error = 0; - ar = rtable_get(rtableid, dst->sa_family); - if (ar == NULL) + tbl = rtable_get(rtableid, dst->sa_family); + if (tbl == NULL) return (EAFNOSUPPORT); + ar = tbl->r_art; addr = satoaddr(ar, dst); diff --git a/sys/net/rtable.h b/sys/net/rtable.h index 4f31ba1aefa..00db17851a6 100644 --- a/sys/net/rtable.h +++ b/sys/net/rtable.h @@ -19,6 +19,12 @@ #ifndef _NET_RTABLE_H_ #define _NET_RTABLE_H_ +struct art_root; + +struct rtable { + struct art_root *r_art; +}; + /* * Newer routing table implementation based on ART (Allotment Routing * Table). diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c index 7cd75a28616..20c76daa4fc 100644 --- a/usr.bin/netstat/route.c +++ b/usr.bin/netstat/route.c @@ -38,6 +38,7 @@ #include #define _KERNEL #include +#include #include #undef _KERNEL #include @@ -78,14 +79,15 @@ static void p_krtentry(struct rtentry *); void routepr(u_long afmap, u_long af2idx, u_long af2idx_max, u_int tableid) { + struct rtable tbl; struct art_root ar; struct art_node *node; struct srp *afm_head, *afm; struct { unsigned int limit; - void **tbl; + struct rtable **tbl; } map; - void **tbl; + struct rtable **tblmap; int i; uint8_t af2i[AF_MAX+1]; uint8_t af2i_max; @@ -116,16 +118,18 @@ routepr(u_long afmap, u_long af2idx, u_long af2idx_max, u_int tableid) if (tableid >= map.limit) continue; - if ((tbl = calloc(map.limit, sizeof(*tbl))) == NULL) + if ((tblmap = calloc(map.limit, sizeof(*tblmap))) == NULL) err(1, NULL); - kread((u_long)map.tbl, tbl, map.limit * sizeof(*tbl)); - if (tbl[tableid] == NULL) + kread((u_long)map.tbl, tblmap, map.limit * sizeof(*tblmap)); + if (tblmap[tableid] == NULL) continue; - kread((u_long)tbl[tableid], &ar, sizeof(ar)); + kread((u_long)tblmap[tableid], &tbl, sizeof(tbl)); - free(tbl); + free(tblmap); + + kread((u_long)tbl.r_art, &ar, sizeof(ar)); if (ar.ar_root.ref == NULL) continue;