diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2020-06-01 07:58:32 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-06-01 07:58:32 -0400 |
| commit | 88b5958e31e2458b710ef1aac9d352235019b546 (patch) | |
| tree | 5bf065c3baf88058b0d1490a9c6b98a369b89332 /pimd/pim_register.c | |
| parent | b12b5d209713ed06b1a58a680360c8fce4c8b624 (diff) | |
| parent | 46a9ea8bfa753472e786268ed97444b41ce94fa8 (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.c | 29 |
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; + } + } +} |
