summaryrefslogtreecommitdiff
path: root/pimd/pim_register.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2020-06-01 07:58:32 -0400
committerGitHub <noreply@github.com>2020-06-01 07:58:32 -0400
commit88b5958e31e2458b710ef1aac9d352235019b546 (patch)
tree5bf065c3baf88058b0d1490a9c6b98a369b89332 /pimd/pim_register.c
parentb12b5d209713ed06b1a58a680360c8fce4c8b624 (diff)
parent46a9ea8bfa753472e786268ed97444b41ce94fa8 (diff)
Merge pull request #6054 from sarav511/dr2ndr
pimd: When DR becomes non DR, Still sends register packets to RP
Diffstat (limited to 'pimd/pim_register.c')
-rw-r--r--pimd/pim_register.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/pimd/pim_register.c b/pimd/pim_register.c
index cb6aae7fae..19e15f3ede 100644
--- a/pimd/pim_register.c
+++ b/pimd/pim_register.c
@@ -520,3 +520,32 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
return 0;
}
+
+/*
+ * This routine scan all upstream and update register state and remove pimreg
+ * when couldreg becomes false.
+ */
+void pim_reg_del_on_couldreg_fail(struct interface *ifp)
+{
+ struct pim_interface *pim_ifp = ifp->info;
+ struct pim_instance *pim;
+ struct pim_upstream *up;
+
+ if (!pim_ifp)
+ return;
+
+ pim = pim_ifp->pim;
+
+ frr_each (rb_pim_upstream, &pim->upstream_head, up) {
+ if (ifp != up->rpf.source_nexthop.interface)
+ continue;
+
+ if (!pim_upstream_could_register(up)
+ && (up->reg_state != PIM_REG_NOINFO)) {
+ pim_channel_del_oif(up->channel_oil, pim->regiface,
+ PIM_OIF_FLAG_PROTO_PIM, __func__);
+ THREAD_OFF(up->t_rs_timer);
+ up->reg_state = PIM_REG_NOINFO;
+ }
+ }
+}