From 68ea980e22e0b3178dfdf1cdeab3d71e3e71c1b9 Mon Sep 17 00:00:00 2001 From: melifaro Date: Sun, 29 Nov 2020 13:52:06 +0000 Subject: [PATCH] Add nhop_ref_any() to unify referencing nhop or nexthop group. It allows code within routing subsystem to transparently reference nexthops and nexthop groups, similar to nhop_free_any(), abstracting ROUTE_MPATH details. Differential Revision: https://reviews.freebsd.org/D27410 --- sys/net/route/nhgrp_ctl.c | 11 +++++++++++ sys/net/route/nhop_ctl.c | 13 +++++++++++++ sys/net/route/route_var.h | 2 ++ 3 files changed, 26 insertions(+) diff --git a/sys/net/route/nhgrp_ctl.c b/sys/net/route/nhgrp_ctl.c index 2774f196625d..c4f86500ca8d 100644 --- a/sys/net/route/nhgrp_ctl.c +++ b/sys/net/route/nhgrp_ctl.c @@ -293,6 +293,17 @@ alloc_nhgrp(struct weightened_nhop *wn, int num_nhops) return (nhg_priv); } +void +nhgrp_ref_object(struct nhgrp_object *nhg) +{ + struct nhgrp_priv *nhg_priv; + u_int old; + + nhg_priv = NHGRP_PRIV(nhg); + old = refcount_acquire(&nhg_priv->nhg_refcount); + KASSERT(old > 0, ("%s: nhgrp object %p has 0 refs", __func__, nhg)); +} + void nhgrp_free(struct nhgrp_object *nhg) { diff --git a/sys/net/route/nhop_ctl.c b/sys/net/route/nhop_ctl.c index 2b5bd740711b..2b676663a782 100644 --- a/sys/net/route/nhop_ctl.c +++ b/sys/net/route/nhop_ctl.c @@ -690,6 +690,19 @@ nhop_free(struct nhop_object *nh) &nh_priv->nh_epoch_ctx); } +void +nhop_ref_any(struct nhop_object *nh) +{ +#ifdef ROUTE_MPATH + if (!NH_IS_NHGRP(nh)) + nhop_ref_object(nh); + else + nhgrp_ref_object((struct nhgrp_object *)nh); +#else + nhop_ref_object(nh); +#endif +} + void nhop_free_any(struct nhop_object *nh) { diff --git a/sys/net/route/route_var.h b/sys/net/route/route_var.h index 58575531f87e..a24720cf2e71 100644 --- a/sys/net/route/route_var.h +++ b/sys/net/route/route_var.h @@ -242,6 +242,7 @@ int nhops_init_rib(struct rib_head *rh); void nhops_destroy_rib(struct rib_head *rh); void nhop_ref_object(struct nhop_object *nh); int nhop_try_ref_object(struct nhop_object *nh); +void nhop_ref_any(struct nhop_object *nh); void nhop_free_any(struct nhop_object *nh); void nhop_set_type(struct nhop_object *nh, enum nhop_type nh_type); @@ -306,6 +307,7 @@ int nhgrp_get_addition_group(struct rib_head *rnh, struct route_nhop_data *rnd_orig, struct route_nhop_data *rnd_add, struct route_nhop_data *rnd_new); +void nhgrp_ref_object(struct nhgrp_object *nhg); uint32_t nhgrp_get_idx(const struct nhgrp_object *nhg); void nhgrp_free(struct nhgrp_object *nhg);