summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2023-04-17 11:47:08 +0200
committerJafar Al-Gharaibeh <jafar@atcorp.com>2024-05-10 16:06:28 -0500
commit9c3e45a75f3599de844b4ce6bbd92cb65b330310 (patch)
tree6a74d729ef7c6cecbef2df86ce34406bc67bf787
parent06b7d3dcba2ec41dd4504c715fdf1ce1dde868ad (diff)
pimd: fix null register before aging out reg-stop
It looks like the code was trying to do this with the null_register parameter on pim_upstream_start_register_stop_timer(), but that didn't quite work right. Restructure a bit to get it right. Signed-off-by: David Lamparter <equinox@opensourcerouting.org> (cherry picked from commit dce38da8061a7ac62c690dbb8a89cae7f9a758d6) # Conflicts: # pimd/pim_upstream.c
-rw-r--r--pimd/pim_register.c4
-rw-r--r--pimd/pim_upstream.c57
-rw-r--r--pimd/pim_upstream.h3
3 files changed, 46 insertions, 18 deletions
diff --git a/pimd/pim_register.c b/pimd/pim_register.c
index 9ccdae13bc..d4eb88e75b 100644
--- a/pimd/pim_register.c
+++ b/pimd/pim_register.c
@@ -123,12 +123,12 @@ static void pim_reg_stop_upstream(struct pim_instance *pim,
up->reg_state = PIM_REG_PRUNE;
pim_channel_del_oif(up->channel_oil, pim->regiface,
PIM_OIF_FLAG_PROTO_PIM, __func__);
- pim_upstream_start_register_stop_timer(up, 0);
+ pim_upstream_start_register_probe_timer(up);
pim_vxlan_update_sg_reg_state(pim, up, false);
break;
case PIM_REG_JOIN_PENDING:
up->reg_state = PIM_REG_PRUNE;
- pim_upstream_start_register_stop_timer(up, 0);
+ pim_upstream_start_register_probe_timer(up);
return;
}
}
diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c
index be575ee1ec..749790fb97 100644
--- a/pimd/pim_upstream.c
+++ b/pimd/pim_upstream.c
@@ -1692,6 +1692,8 @@ const char *pim_reg_state2str(enum pim_reg_state reg_state, char *state_str,
return state_str;
}
+static void pim_upstream_start_register_stop_timer(struct pim_upstream *up);
+
static void pim_upstream_register_stop_timer(struct thread *t)
{
struct pim_interface *pim_ifp;
@@ -1738,7 +1740,7 @@ static void pim_upstream_register_stop_timer(struct thread *t)
return;
}
up->reg_state = PIM_REG_JOIN_PENDING;
- pim_upstream_start_register_stop_timer(up, 1);
+ pim_upstream_start_register_stop_timer(up);
if (((up->channel_oil->cc.lastused / 100)
> pim->keep_alive_time)
@@ -1756,24 +1758,13 @@ static void pim_upstream_register_stop_timer(struct thread *t)
}
}
-void pim_upstream_start_register_stop_timer(struct pim_upstream *up,
- int null_register)
+static void pim_upstream_start_register_stop_timer(struct pim_upstream *up)
{
uint32_t time;
THREAD_OFF(up->t_rs_timer);
- if (!null_register) {
- uint32_t lower = (0.5 * router->register_suppress_time);
- uint32_t upper = (1.5 * router->register_suppress_time);
- time = lower + (frr_weak_random() % (upper - lower + 1));
- /* Make sure we don't wrap around */
- if (time >= router->register_probe_time)
- time -= router->register_probe_time;
- else
- time = 0;
- } else
- time = router->register_probe_time;
+ time = router->register_probe_time;
if (PIM_DEBUG_PIM_TRACE) {
zlog_debug(
@@ -1784,6 +1775,44 @@ void pim_upstream_start_register_stop_timer(struct pim_upstream *up,
time, &up->t_rs_timer);
}
+static void pim_upstream_register_probe_timer(struct thread *t)
+{
+ struct pim_upstream *up = THREAD_ARG(t);
+
+ if (!up->rpf.source_nexthop.interface ||
+ !up->rpf.source_nexthop.interface->info) {
+ if (PIM_DEBUG_PIM_REG)
+ zlog_debug("cannot send Null register for %pSG, no path to RP",
+ &up->sg);
+ } else
+ pim_null_register_send(up);
+
+ pim_upstream_start_register_stop_timer(up);
+}
+
+void pim_upstream_start_register_probe_timer(struct pim_upstream *up)
+{
+ uint32_t time;
+
+ THREAD_OFF(up->t_rs_timer);
+
+ uint32_t lower = (0.5 * router->register_suppress_time);
+ uint32_t upper = (1.5 * router->register_suppress_time);
+ time = lower + (frr_weak_random() % (upper - lower + 1));
+ /* Make sure we don't wrap around */
+ if (time >= router->register_probe_time)
+ time -= router->register_probe_time;
+ else
+ time = 0;
+
+ if (PIM_DEBUG_PIM_TRACE)
+ zlog_debug("%s: (S,G)=%s Starting upstream register stop null probe timer %d",
+ __func__, up->sg_str, time);
+
+ thread_add_timer(router->master, pim_upstream_register_probe_timer, up,
+ time, &up->t_rs_timer);
+}
+
int pim_upstream_inherited_olist_decide(struct pim_instance *pim,
struct pim_upstream *up)
{
diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h
index 15c4fcfe7e..a7611b0489 100644
--- a/pimd/pim_upstream.h
+++ b/pimd/pim_upstream.h
@@ -344,8 +344,7 @@ int pim_upstream_is_sg_rpt(struct pim_upstream *up);
void pim_upstream_set_sptbit(struct pim_upstream *up,
struct interface *incoming);
-void pim_upstream_start_register_stop_timer(struct pim_upstream *up,
- int null_register);
+void pim_upstream_start_register_probe_timer(struct pim_upstream *up);
void pim_upstream_send_join(struct pim_upstream *up);