From: Donald Sharp Date: Tue, 23 Aug 2016 17:39:48 +0000 (+0000) Subject: pimd: Fix bad state no FHR after quagga restart X-Git-Tag: frr-3.0-branchpoint~64^2~10^2~270 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=bb6e291f3bab84ae623d6c4c05de2bc7eba837c9;p=matthieu%2Ffrr.git pimd: Fix bad state no FHR after quagga restart If on the FHR we have an established stream between interested parties and we stop the stream and restart quagga we were not coming back up into the correct state. For the multicast stream. Ticket: CM-12462 Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index e69fec0793..03ca3b6edc 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -186,12 +186,6 @@ pim_upstream_send_join (struct pim_upstream *up) } } - /* - * In the case of a FHR we will not have anyone to send this to. - */ - if (up->fhr) - return; - /* send Join(S,G) to the current upstream neighbor */ pim_joinprune_send(up->rpf.source_nexthop.interface, up->rpf.rpf_addr, @@ -207,9 +201,16 @@ static int on_join_timer(struct thread *t) up = THREAD_ARG(t); zassert(up); + up->t_join_timer = NULL; + + /* + * In the case of a HFR we will not ahve anyone to send this to. + */ + if (up->fhr) + return 0; + pim_upstream_send_join (up); - up->t_join_timer = NULL; join_timer_start(up); return 0; @@ -373,6 +374,18 @@ static void forward_off(struct pim_upstream *up) } /* scan iflist */ } +static int +pim_upstream_could_register (struct pim_upstream *up) +{ + struct pim_interface *pim_ifp = up->rpf.source_nexthop.interface->info; + + if (PIM_I_am_DR (pim_ifp) && + pim_if_connected_to_source (up->rpf.source_nexthop.interface, up->sg.src)) + return 1; + + return 0; +} + void pim_upstream_switch(struct pim_upstream *up, enum pim_upstream_state new_state) @@ -414,9 +427,22 @@ pim_upstream_switch(struct pim_upstream *up, if (new_state == PIM_UPSTREAM_JOINED) { if (old_state != PIM_UPSTREAM_JOINED) { + int old_fhr = up->fhr; forward_on(up); - pim_upstream_send_join (up); - join_timer_start(up); + up->fhr = pim_upstream_could_register (up); + if (up->fhr) + { + if (!old_fhr) + { + pim_upstream_keep_alive_timer_start (up, qpim_keep_alive_time); + pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM); + } + } + else + { + pim_upstream_send_join (up); + join_timer_start (up); + } } else {