mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 20:55:25 +00:00
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 <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
4e85d20983
commit
bb6e291f3b
@ -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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user