]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: fix BSR RPs timing out
authorJafar Al-Gharaibeh <jafar@atcorp.com>
Sat, 11 Jan 2025 20:36:45 +0000 (14:36 -0600)
committerJafar Al-Gharaibeh <jafar@atcorp.com>
Mon, 13 Jan 2025 16:18:24 +0000 (10:18 -0600)
On the BSR node itself, RPs shouldn't timeout, becase we know
the node is the BSR, and it is active!

fixes:#17587

Signed-off-by: Jafar Al-Gharaibeh <jafar@atcorp.com>
pimd/pim_bsm.c

index 6c4d649235c5d6ce7f8e7301f2a384408417f464..672cdffaae288f2d8d7297be1b011fc17c54cb42 100644 (file)
@@ -354,24 +354,29 @@ static void pim_on_g2rp_timer(struct event *t)
        bsrp = EVENT_ARG(t);
        EVENT_OFF(bsrp->g2rp_timer);
        bsgrp_node = bsrp->bsgrp_node;
-
-       /* elapse time is the hold time of expired node */
-       elapse = bsrp->rp_holdtime;
+       pim = bsgrp_node->scope->pim;
        bsrp_addr = bsrp->rp_address;
 
-       /* update elapse for all bsrp nodes */
-       frr_each_safe (bsm_rpinfos, bsgrp_node->bsrp_list, bsrp_node) {
-               bsrp_node->elapse_time += elapse;
-
-               if (is_hold_time_elapsed(bsrp_node)) {
-                       bsm_rpinfos_del(bsgrp_node->bsrp_list, bsrp_node);
-                       pim_bsm_rpinfo_free(bsrp_node);
+       /*
+        * Update elapse for all bsrp nodes except on the BSR itself.
+        * The timer is meant to remove any bsr RPs learned from the BSR that
+        * we don't hear from anymore. on the BSR itself, no need to do this.
+        */
+       if (pim->global_scope.state != BSR_ELECTED) {
+               /* elapse time is the hold time of expired node */
+               elapse = bsrp->rp_holdtime;
+               frr_each_safe (bsm_rpinfos, bsgrp_node->bsrp_list, bsrp_node) {
+                       bsrp_node->elapse_time += elapse;
+
+                       if (is_hold_time_elapsed(bsrp_node)) {
+                               bsm_rpinfos_del(bsgrp_node->bsrp_list, bsrp_node);
+                               pim_bsm_rpinfo_free(bsrp_node);
+                       }
                }
        }
 
        /* Get the next elected rp node */
        bsrp = bsm_rpinfos_first(bsgrp_node->bsrp_list);
-       pim = bsgrp_node->scope->pim;
        rn = route_node_lookup(pim->rp_table, &bsgrp_node->group);
 
        if (!rn) {