git: 34066d0008b6 - main - routing: add iterator-based nhop traversal KPI.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 25 Apr 2023 11:15:29 UTC
The branch main has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=34066d0008b6b5f0c7f9fbef8d82e468aaf3f7cf commit 34066d0008b6b5f0c7f9fbef8d82e468aaf3f7cf Author: Alexander V. Chernikov <melifaro@FreeBSD.org> AuthorDate: 2023-04-25 10:55:16 +0000 Commit: Alexander V. Chernikov <melifaro@FreeBSD.org> CommitDate: 2023-04-25 10:55:16 +0000 routing: add iterator-based nhop traversal KPI. MFC after: 2 weeks --- sys/net/route/nhop_ctl.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++ sys/net/route/route_ctl.h | 13 ++++++++++++ 2 files changed, 63 insertions(+) diff --git a/sys/net/route/nhop_ctl.c b/sys/net/route/nhop_ctl.c index d99b78351952..3b7cab0cdd35 100644 --- a/sys/net/route/nhop_ctl.c +++ b/sys/net/route/nhop_ctl.c @@ -1076,6 +1076,56 @@ nhops_update_ifmtu(struct rib_head *rh, struct ifnet *ifp, uint32_t mtu) } +struct nhop_object * +nhops_iter_start(struct nhop_iter *iter) +{ + if (iter->rh == NULL) + iter->rh = rt_tables_get_rnh_safe(iter->fibnum, iter->family); + if (iter->rh != NULL) { + struct nh_control *ctl = iter->rh->nh_control; + + NHOPS_RLOCK(ctl); + + iter->_i = 0; + iter->_next = CHT_FIRST(&ctl->nh_head, iter->_i); + + return (nhops_iter_next(iter)); + } else + return (NULL); +} + +struct nhop_object * +nhops_iter_next(struct nhop_iter *iter) +{ + struct nhop_priv *nh_priv = iter->_next; + + if (nh_priv != NULL) { + iter->_next = nh_priv->nh_next; + return (nh_priv->nh); + } + + struct nh_control *ctl = iter->rh->nh_control; + while (++iter->_i < ctl->nh_head.hash_size) { + nh_priv = CHT_FIRST(&ctl->nh_head, iter->_i); + if (nh_priv != NULL) { + iter->_next = nh_priv->nh_next; + return (nh_priv->nh); + } + } + + return (NULL); +} + +void +nhops_iter_stop(struct nhop_iter *iter) +{ + if (iter->rh != NULL) { + struct nh_control *ctl = iter->rh->nh_control; + + NHOPS_RUNLOCK(ctl); + } +} + /* * Prints nexthop @nh data in the provided @buf. * Example: nh#33/inet/em0/192.168.0.1 diff --git a/sys/net/route/route_ctl.h b/sys/net/route/route_ctl.h index d3c457cdeaae..4e4444296a9c 100644 --- a/sys/net/route/route_ctl.h +++ b/sys/net/route/route_ctl.h @@ -159,6 +159,19 @@ void ip6_writemask(struct in6_addr *addr6, uint8_t mask); /* Nexthops */ uint32_t nhops_get_count(struct rib_head *rh); +struct nhop_priv; +struct nhop_iter { + uint32_t fibnum; + uint8_t family; + struct rib_head *rh; + int _i; + struct nhop_priv *_next; +}; + +struct nhop_object *nhops_iter_start(struct nhop_iter *iter); +struct nhop_object *nhops_iter_next(struct nhop_iter *iter); +void nhops_iter_stop(struct nhop_iter *iter); + /* Multipath */ struct weightened_nhop;