]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: fix register suppress timer code
authorChristian Hopps <chopps@labn.net>
Thu, 19 Aug 2021 01:48:28 +0000 (21:48 -0400)
committerChristian Hopps <chopps@labn.net>
Thu, 19 Aug 2021 04:28:35 +0000 (00:28 -0400)
Signed-off-by: Christian Hopps <chopps@labn.net>
pimd/pim_instance.h
pimd/pim_nb_config.c
pimd/pim_upstream.c

index 72c726690c915f2fbd51e6b60ce7b4545ea299ae..52ded08ae390e4c02823779456b0d18535605ff1 100644 (file)
@@ -96,9 +96,9 @@ struct pim_router {
        int t_periodic;
        struct pim_assert_metric infinite_assert_metric;
        long rpf_cache_refresh_delay_msec;
-       int32_t register_suppress_time;
+       uint32_t register_suppress_time;
        int packet_process;
-       int32_t register_probe_time;
+       uint32_t register_probe_time;
 
        /*
         * What is the default vrf that we work in
index 5940c94570e57c12cd01ad474c7d713917482cf1..22a98f94dd884896408740d17a1ba3179c996e66 100644 (file)
@@ -556,8 +556,27 @@ int pim_join_prune_interval_modify(struct nb_cb_modify_args *args)
  */
 int pim_register_suppress_time_modify(struct nb_cb_modify_args *args)
 {
+       uint16_t value;
        switch (args->event) {
        case NB_EV_VALIDATE:
+               value = yang_dnode_get_uint16(args->dnode, NULL);
+               /*
+                * As soon as this is non-constant it needs to be replaced with
+                * a yang_dnode_get to lookup the candidate value, *not* the
+                * operational value. Since the code has a field assigned and
+                * used for this value it should have YANG/CLI to set it too,
+                * otherwise just use the #define!
+                */
+               /* RFC7761: 4.11.  Timer Values */
+               if (value <= router->register_probe_time * 2) {
+                       snprintf(
+                               args->errmsg, args->errmsg_len,
+                               "Register suppress time (%u) must be more than "
+                               "twice the register probe time (%u).",
+                               value, router->register_probe_time);
+                       return NB_ERR_VALIDATION;
+               }
+               break;
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
                break;
index 2b674b4234d7548d8181c9d6d1adf1a2d0145ff5..d21c7b4008a55fe0246e58aef1689f71dc44c57b 100644 (file)
@@ -1800,12 +1800,16 @@ void pim_upstream_start_register_stop_timer(struct pim_upstream *up,
        THREAD_OFF(up->t_rs_timer);
 
        if (!null_register) {
-               uint32_t lower = (0.5 * PIM_REGISTER_SUPPRESSION_PERIOD);
-               uint32_t upper = (1.5 * PIM_REGISTER_SUPPRESSION_PERIOD);
-               time = lower + (frr_weak_random() % (upper - lower + 1))
-                      - PIM_REGISTER_PROBE_PERIOD;
+               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 = PIM_REGISTER_PROBE_PERIOD;
+               time = router->register_probe_time;
 
        if (PIM_DEBUG_PIM_TRACE) {
                zlog_debug(