diff options
| author | Stephen Worley <sworley@cumulusnetworks.com> | 2019-10-23 16:49:07 -0400 |
|---|---|---|
| committer | Stephen Worley <sworley@cumulusnetworks.com> | 2019-10-25 11:13:44 -0400 |
| commit | 80286aa564601dda7430ea8c96b2f9fd9867ee0b (patch) | |
| tree | 9c1d52399d778a0da056658a1706a2be22ea48b7 /zebra/interface.c | |
| parent | e1292378e242735f25a4073119ca2da897100fc8 (diff) | |
zebra: Re-work zebra_nhg_*_valid APIs
Re-work the validity setting and checking APIs
for nhg_hash_entry's to make them clearer.
Further, they were originally only beings set
on ifdown and install. Extended their use into
releasing entries and to account for setting
the validity of a recursive dependent.
Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
Diffstat (limited to 'zebra/interface.c')
| -rw-r--r-- | zebra/interface.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/zebra/interface.c b/zebra/interface.c index 76d5d2a246..daa93e36d1 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -189,17 +189,31 @@ static int if_zebra_new_hook(struct interface *ifp) return 0; } -static void if_nhg_dependents_release(struct interface *ifp) +static void if_nhg_dependents_check_valid(struct nhg_hash_entry *nhe) { - if (!if_nhg_dependents_is_empty(ifp)) { - struct nhg_connected *rb_node_dep = NULL; - struct zebra_if *zif = (struct zebra_if *)ifp->info; + zebra_nhg_check_valid(nhe); + if (!CHECK_FLAG(nhe->flags, NEXTHOP_GROUP_VALID)) + /* Assuming uninstalled as well here */ + UNSET_FLAG(nhe->flags, NEXTHOP_GROUP_INSTALLED); +} - frr_each(nhg_connected_tree, &zif->nhg_dependents, - rb_node_dep) { - rb_node_dep->nhe->ifp = NULL; - zebra_nhg_set_invalid(rb_node_dep->nhe); - } +static void if_down_nhg_dependents(const struct interface *ifp) +{ + struct nhg_connected *rb_node_dep = NULL; + struct zebra_if *zif = (struct zebra_if *)ifp->info; + + frr_each(nhg_connected_tree, &zif->nhg_dependents, rb_node_dep) + if_nhg_dependents_check_valid(rb_node_dep->nhe); +} + +static void if_nhg_dependents_release(const struct interface *ifp) +{ + struct nhg_connected *rb_node_dep = NULL; + struct zebra_if *zif = (struct zebra_if *)ifp->info; + + frr_each(nhg_connected_tree, &zif->nhg_dependents, rb_node_dep) { + rb_node_dep->nhe->ifp = NULL; /* Null it out */ + if_nhg_dependents_check_valid(rb_node_dep->nhe); } } @@ -998,19 +1012,6 @@ bool if_nhg_dependents_is_empty(const struct interface *ifp) return false; } -static void if_down_nhg_dependents(const struct interface *ifp) -{ - if (!if_nhg_dependents_is_empty(ifp)) { - struct nhg_connected *rb_node_dep = NULL; - struct zebra_if *zif = (struct zebra_if *)ifp->info; - - frr_each(nhg_connected_tree, &zif->nhg_dependents, - rb_node_dep) { - zebra_nhg_set_invalid(rb_node_dep->nhe); - } - } -} - /* Interface is up. */ void if_up(struct interface *ifp) { |
