]> 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)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Thu, 9 May 2024 13:54:42 +0000 (13:54 +0000)
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)

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

index 01da699dbd172eb51d28a5eb78a3390d6a9738ac..b149b5a2a97c236ecd45167aebf00ec60a0388b5 100644 (file)
@@ -109,12 +109,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 d7d66803c69974f762c52658021f5792442db2e4..88d27e2280b7aa4da5a9eb511d2125ccfee916cc 100644 (file)
@@ -1686,6 +1686,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 event *t)
 {
        struct pim_interface *pim_ifp;
@@ -1733,7 +1735,7 @@ static void pim_upstream_register_stop_timer(struct event *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)
@@ -1751,34 +1753,59 @@ static void pim_upstream_register_stop_timer(struct event *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;
 
        EVENT_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(
-                       "%s: (S,G)=%s Starting upstream register stop timer %d",
-                       __func__, up->sg_str, time);
-       }
+       if (PIM_DEBUG_PIM_TRACE)
+               zlog_debug("%s: (S,G)=%s Starting upstream register stop timer %d",
+                          __func__, up->sg_str, time);
        event_add_timer(router->master, pim_upstream_register_stop_timer, up,
                        time, &up->t_rs_timer);
 }
 
+static void pim_upstream_register_probe_timer(struct event *t)
+{
+       struct pim_upstream *up = EVENT_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;
+
+       EVENT_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);
+
+       event_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 62649cd949fd4a632942c026a2027e25424ff2ff..8b4a35be398cfc0c0805404addeee20599106312 100644 (file)
@@ -331,8 +331,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);