]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: move BSM clear into BSM code
authorDavid Lamparter <equinox@opensourcerouting.org>
Sun, 25 Jul 2021 13:48:03 +0000 (15:48 +0200)
committerDavid Lamparter <equinox@opensourcerouting.org>
Wed, 17 Nov 2021 10:17:44 +0000 (11:17 +0100)
... where it actually belongs.  And make a bunch of stuff static, since
it's no longer used across files now.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
pimd/pim_bsm.c
pimd/pim_bsm.h
pimd/pim_cmd.c

index b7207aa212033e015225f13feab6154f4422a413..2078a859e571510ca2ff65ddb0cb367b85a9328c 100644 (file)
@@ -70,7 +70,7 @@ static void pim_bsm_rpinfo_free(struct bsm_rpinfo *bsrp_info)
        XFREE(MTYPE_PIM_BSRP_INFO, bsrp_info);
 }
 
-void pim_bsm_rpinfos_free(struct bsm_rpinfos_head *head)
+static void pim_bsm_rpinfos_free(struct bsm_rpinfos_head *head)
 {
        struct bsm_rpinfo *bsrp_info;
 
@@ -78,14 +78,14 @@ void pim_bsm_rpinfos_free(struct bsm_rpinfos_head *head)
                pim_bsm_rpinfo_free(bsrp_info);
 }
 
-void pim_free_bsgrp_data(struct bsgrp_node *bsgrp_node)
+static void pim_free_bsgrp_data(struct bsgrp_node *bsgrp_node)
 {
        pim_bsm_rpinfos_free(bsgrp_node->bsrp_list);
        pim_bsm_rpinfos_free(bsgrp_node->partial_bsrp_list);
        XFREE(MTYPE_PIM_BSGRP_NODE, bsgrp_node);
 }
 
-void pim_free_bsgrp_node(struct route_table *rt, struct prefix *grp)
+static void pim_free_bsgrp_node(struct route_table *rt, struct prefix *grp)
 {
        struct route_node *rn;
 
@@ -102,7 +102,7 @@ static void pim_bsm_frag_free(struct bsm_frag *bsfrag)
        XFREE(MTYPE_PIM_BSM_FRAG, bsfrag);
 }
 
-void pim_bsm_frags_free(struct bsm_scope *scope)
+static void pim_bsm_frags_free(struct bsm_scope *scope)
 {
        struct bsm_frag *bsfrag;
 
@@ -202,7 +202,7 @@ static int pim_on_bs_timer(struct thread *t)
        return 0;
 }
 
-void pim_bs_timer_stop(struct bsm_scope *scope)
+static void pim_bs_timer_stop(struct bsm_scope *scope)
 {
        if (PIM_DEBUG_BSM)
                zlog_debug("%s : BS timer being stopped of sz: %d", __func__,
@@ -569,6 +569,122 @@ static void pim_bsm_update(struct pim_instance *pim, struct in_addr bsr,
        pim->global_scope.current_bsr_last_ts = pim_time_monotonic_sec();
 }
 
+void pim_bsm_clear(struct pim_instance *pim)
+{
+       struct route_node *rn;
+       struct route_node *rpnode;
+       struct bsgrp_node *bsgrp;
+       struct prefix nht_p;
+       struct prefix g_all;
+       struct rp_info *rp_all;
+       struct pim_upstream *up;
+       struct rp_info *rp_info;
+
+       if (pim->global_scope.current_bsr.s_addr)
+               pim_nht_bsr_del(pim, pim->global_scope.current_bsr);
+
+       /* Reset scope zone data */
+       pim->global_scope.accept_nofwd_bsm = false;
+       pim->global_scope.state = ACCEPT_ANY;
+       pim->global_scope.current_bsr.s_addr = INADDR_ANY;
+       pim->global_scope.current_bsr_prio = 0;
+       pim->global_scope.current_bsr_first_ts = 0;
+       pim->global_scope.current_bsr_last_ts = 0;
+       pim->global_scope.bsm_frag_tag = 0;
+       pim_bsm_frags_free(&pim->global_scope);
+
+       pim_bs_timer_stop(&pim->global_scope);
+
+       for (rn = route_top(pim->global_scope.bsrp_table); rn;
+            rn = route_next(rn)) {
+               bsgrp = rn->info;
+               if (!bsgrp)
+                       continue;
+
+               rpnode = route_node_lookup(pim->rp_table, &bsgrp->group);
+
+               if (!rpnode) {
+                       pim_free_bsgrp_node(bsgrp->scope->bsrp_table,
+                                           &bsgrp->group);
+                       pim_free_bsgrp_data(bsgrp);
+                       continue;
+               }
+
+               rp_info = (struct rp_info *)rpnode->info;
+
+               if ((!rp_info) || (rp_info->rp_src != RP_SRC_BSR)) {
+                       pim_free_bsgrp_node(bsgrp->scope->bsrp_table,
+                                           &bsgrp->group);
+                       pim_free_bsgrp_data(bsgrp);
+                       continue;
+               }
+
+               /* Deregister addr with Zebra NHT */
+               nht_p.family = AF_INET;
+               nht_p.prefixlen = IPV4_MAX_BITLEN;
+               nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4;
+
+               if (PIM_DEBUG_PIM_NHT_RP) {
+                       zlog_debug("%s: Deregister RP addr %pFX with Zebra ",
+                                  __func__, &nht_p);
+               }
+
+               pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info);
+
+               if (!str2prefix("224.0.0.0/4", &g_all))
+                       return;
+
+               rp_all = pim_rp_find_match_group(pim, &g_all);
+
+               if (rp_all == rp_info) {
+                       rp_all->rp.rpf_addr.family = AF_INET;
+                       rp_all->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
+                       rp_all->i_am_rp = 0;
+               } else {
+                       /* Delete the rp_info from rp-list */
+                       listnode_delete(pim->rp_list, rp_info);
+
+                       /* Delete the rp node from rp_table */
+                       rpnode->info = NULL;
+                       route_unlock_node(rpnode);
+                       route_unlock_node(rpnode);
+                       XFREE(MTYPE_PIM_RP, rp_info);
+               }
+
+               pim_free_bsgrp_node(bsgrp->scope->bsrp_table, &bsgrp->group);
+               pim_free_bsgrp_data(bsgrp);
+       }
+       pim_rp_refresh_group_to_rp_mapping(pim);
+
+
+       frr_each (rb_pim_upstream, &pim->upstream_head, up) {
+               /* Find the upstream (*, G) whose upstream address is same as
+                * the RP
+                */
+               if (up->sg.src.s_addr != INADDR_ANY)
+                       continue;
+
+               struct prefix grp;
+               struct rp_info *trp_info;
+
+               grp.family = AF_INET;
+               grp.prefixlen = IPV4_MAX_BITLEN;
+               grp.u.prefix4 = up->sg.grp;
+
+               trp_info = pim_rp_find_match_group(pim, &grp);
+
+               /* RP not found for the group grp */
+               if (pim_rpf_addr_is_inaddr_none(&trp_info->rp)) {
+                       pim_upstream_rpf_clear(pim, up);
+                       pim_rp_set_upstream_addr(pim, &up->upstream_addr,
+                                                up->sg.src, up->sg.grp);
+               } else {
+                       /* RP found for the group grp */
+                       pim_upstream_update(pim, up);
+               }
+       }
+}
+
 static bool pim_bsm_send_intf(uint8_t *buf, int len, struct interface *ifp,
                              struct in_addr dst_addr)
 {
index dbfeeceec883c1c09407a6b046290c3446c3c7bd..a536b506881b2b383a33be368e7bfd5749dab4eb 100644 (file)
@@ -205,6 +205,7 @@ struct bsmmsg_rpinfo {
 /* API */
 void pim_bsm_proc_init(struct pim_instance *pim);
 void pim_bsm_proc_free(struct pim_instance *pim);
+void pim_bsm_clear(struct pim_instance *pim);
 void pim_bsm_write_config(struct vty *vty, struct interface *ifp);
 int  pim_bsm_process(struct interface *ifp,
                     struct ip *ip_hdr,
@@ -214,9 +215,4 @@ int  pim_bsm_process(struct interface *ifp,
 bool pim_bsm_new_nbr_fwd(struct pim_neighbor *neigh, struct interface *ifp);
 struct bsgrp_node *pim_bsm_get_bsgrp_node(struct bsm_scope *scope,
                                          struct prefix *grp);
-void pim_bs_timer_stop(struct bsm_scope *scope);
-void pim_bsm_frags_free(struct bsm_scope *scope);
-void pim_bsm_rpinfos_free(struct bsm_rpinfos_head *head);
-void pim_free_bsgrp_data(struct bsgrp_node *bsgrp_node);
-void pim_free_bsgrp_node(struct route_table *rt, struct prefix *grp);
 #endif
index 518fcb00e1d180922f216092bf7ed5e90a9bd6b0..82627e5e8476c34e6b08acb90e8a1c77ade516db 100644 (file)
@@ -4051,123 +4051,6 @@ DEFUN (clear_ip_pim_oil,
        return CMD_SUCCESS;
 }
 
-static void clear_pim_bsr_db(struct pim_instance *pim)
-{
-       struct route_node *rn;
-       struct route_node *rpnode;
-       struct bsgrp_node *bsgrp;
-       struct prefix nht_p;
-       struct prefix g_all;
-       struct rp_info *rp_all;
-       struct pim_upstream *up;
-       struct rp_info *rp_info;
-
-       if (pim->global_scope.current_bsr.s_addr)
-               pim_nht_bsr_del(pim, pim->global_scope.current_bsr);
-
-       /* Reset scope zone data */
-       pim->global_scope.accept_nofwd_bsm = false;
-       pim->global_scope.state = ACCEPT_ANY;
-       pim->global_scope.current_bsr.s_addr = INADDR_ANY;
-       pim->global_scope.current_bsr_prio = 0;
-       pim->global_scope.current_bsr_first_ts = 0;
-       pim->global_scope.current_bsr_last_ts = 0;
-       pim->global_scope.bsm_frag_tag = 0;
-       pim_bsm_frags_free(&pim->global_scope);
-
-       pim_bs_timer_stop(&pim->global_scope);
-
-       for (rn = route_top(pim->global_scope.bsrp_table); rn;
-            rn = route_next(rn)) {
-               bsgrp = rn->info;
-               if (!bsgrp)
-                       continue;
-
-               rpnode = route_node_lookup(pim->rp_table, &bsgrp->group);
-
-               if (!rpnode) {
-                       pim_free_bsgrp_node(bsgrp->scope->bsrp_table,
-                                           &bsgrp->group);
-                       pim_free_bsgrp_data(bsgrp);
-                       continue;
-               }
-
-               rp_info = (struct rp_info *)rpnode->info;
-
-               if ((!rp_info) || (rp_info->rp_src != RP_SRC_BSR)) {
-                       pim_free_bsgrp_node(bsgrp->scope->bsrp_table,
-                                           &bsgrp->group);
-                       pim_free_bsgrp_data(bsgrp);
-                       continue;
-               }
-
-               /* Deregister addr with Zebra NHT */
-               nht_p.family = AF_INET;
-               nht_p.prefixlen = IPV4_MAX_BITLEN;
-               nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4;
-
-               if (PIM_DEBUG_PIM_NHT_RP) {
-                       zlog_debug("%s: Deregister RP addr %pFX with Zebra ",
-                                  __func__, &nht_p);
-               }
-
-               pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info);
-
-               if (!str2prefix("224.0.0.0/4", &g_all))
-                       return;
-
-               rp_all = pim_rp_find_match_group(pim, &g_all);
-
-               if (rp_all == rp_info) {
-                       rp_all->rp.rpf_addr.family = AF_INET;
-                       rp_all->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
-                       rp_all->i_am_rp = 0;
-               } else {
-                       /* Delete the rp_info from rp-list */
-                       listnode_delete(pim->rp_list, rp_info);
-
-                       /* Delete the rp node from rp_table */
-                       rpnode->info = NULL;
-                       route_unlock_node(rpnode);
-                       route_unlock_node(rpnode);
-                       XFREE(MTYPE_PIM_RP, rp_info);
-               }
-
-               pim_free_bsgrp_node(bsgrp->scope->bsrp_table, &bsgrp->group);
-               pim_free_bsgrp_data(bsgrp);
-       }
-       pim_rp_refresh_group_to_rp_mapping(pim);
-
-
-       frr_each (rb_pim_upstream, &pim->upstream_head, up) {
-               /* Find the upstream (*, G) whose upstream address is same as
-                * the RP
-                */
-               if (up->sg.src.s_addr != INADDR_ANY)
-                       continue;
-
-               struct prefix grp;
-               struct rp_info *trp_info;
-
-               grp.family = AF_INET;
-               grp.prefixlen = IPV4_MAX_BITLEN;
-               grp.u.prefix4 = up->sg.grp;
-
-               trp_info = pim_rp_find_match_group(pim, &grp);
-
-               /* RP not found for the group grp */
-               if (pim_rpf_addr_is_inaddr_none(&trp_info->rp)) {
-                       pim_upstream_rpf_clear(pim, up);
-                       pim_rp_set_upstream_addr(pim, &up->upstream_addr,
-                                                up->sg.src, up->sg.grp);
-               } else {
-                       /* RP found for the group grp */
-                       pim_upstream_update(pim, up);
-               }
-       }
-}
-
-
 DEFUN (clear_ip_pim_bsr_db,
        clear_ip_pim_bsr_db_cmd,
        "clear ip pim [vrf NAME] bsr-data",
@@ -4183,7 +4066,7 @@ DEFUN (clear_ip_pim_bsr_db,
        if (!vrf)
                return CMD_WARNING;
 
-       clear_pim_bsr_db(vrf->info);
+       pim_bsm_clear(vrf->info);
 
        return CMD_SUCCESS;
 }