summaryrefslogtreecommitdiff
path: root/zebra/interface.c
diff options
context:
space:
mode:
authorStephen Worley <sworley@cumulusnetworks.com>2019-10-23 16:49:07 -0400
committerStephen Worley <sworley@cumulusnetworks.com>2019-10-25 11:13:44 -0400
commit80286aa564601dda7430ea8c96b2f9fd9867ee0b (patch)
tree9c1d52399d778a0da056658a1706a2be22ea48b7 /zebra/interface.c
parente1292378e242735f25a4073119ca2da897100fc8 (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.c45
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)
{