]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: fix order of operations for evaluating join
authorDavid Lamparter <equinox@opensourcerouting.org>
Mon, 12 Dec 2022 16:50:59 +0000 (17:50 +0100)
committerJafar Al-Gharaibeh <jafar@atcorp.com>
Fri, 10 May 2024 21:06:28 +0000 (16:06 -0500)
join_desired looks at whether up->channel_oil is empty.  up->channel_oil
is updated from pim_forward_stop(), calling pim_channel_del_oif().  But
that was being called *after* updating join_desired, so join_desired saw
a non-empty OIL.  Pull up the pim_forward_stop() call to before updating
join_desired.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
(cherry picked from commit fdb1a6fed5a8e42447b5b9633ad9df0f3042d0a9)

pimd/pim_ifchannel.c

index 3310009c024e11adca3d52f999781538351934df..c26f318f98bcda4730d552e34ca4530dba3a6388 100644 (file)
@@ -355,6 +355,13 @@ void pim_ifchannel_ifjoin_switch(const char *caller, struct pim_ifchannel *ch,
                                   ch->sg_str, ch->interface->name);
                }
 
+               /* pim_upstream_update_join_desired looks at up->channel_oil,
+                * but that's updated from pim_forward_stop().  Need this here
+                * so we correctly determine join_desired right below.
+                */
+               if (new_state == PIM_IFJOIN_NOINFO)
+                       pim_forward_stop(ch);
+
                /*
                  Record uptime of state transition to/from NOINFO
                */
@@ -632,7 +639,6 @@ struct pim_ifchannel *pim_ifchannel_add(struct interface *ifp, pim_sgaddr *sg,
 static void ifjoin_to_noinfo(struct pim_ifchannel *ch)
 {
        pim_ifchannel_ifjoin_switch(__func__, ch, PIM_IFJOIN_NOINFO);
-       pim_forward_stop(ch);
 
        PIM_UPSTREAM_FLAG_UNSET_SRC_PIM(ch->upstream->flags);