]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: fix null register before aging out reg-stop
authorDavid Lamparter <equinox@opensourcerouting.org>
Mon, 17 Apr 2023 09:47:08 +0000 (11:47 +0200)
committerJafar Al-Gharaibeh <jafar@atcorp.com>
Fri, 10 May 2024 21:06:28 +0000 (16:06 -0500)
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

pimd/pim_register.c
pimd/pim_upstream.c
pimd/pim_upstream.h

index 9ccdae13bc9bf2cbfef69668abdb7b7b3c8b6d12..d4eb88e75b140c18a270bde7f7564c58ecbff581 100644 (file)
@@ -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;
        }
 }
index be575ee1ec66cd40d28c195fe2f1949b27d98d8d..749790fb97b94f190976ff660c6d15723ed1ba4e 100644 (file)
@@ -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)
 {
index 15c4fcfe7ef3ced63da5844bb73f8a46a89203b4..a7611b04892d41b63c0bd45cf9f9c358dc2b443d 100644 (file)
@@ -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);