summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2023-07-20 08:23:28 -0400
committerGitHub <noreply@github.com>2023-07-20 08:23:28 -0400
commit46b47720a23d3615bebda73d92867d4075fa1be4 (patch)
tree0ccc6539b8aac012ceaf5a3a96fdddbc83eacdfc
parent59742b4550aa54941cf86f5c03f82305bbc7c718 (diff)
parente9484001ee2a1030228de39c997e19f90e32516b (diff)
Merge pull request #14006 from AbhishekNR/mld_core
pim6d: Fixing core while running MLD conformance test.
-rw-r--r--pimd/pim6_mld.c2
-rw-r--r--pimd/pim6_mld.h15
2 files changed, 17 insertions, 0 deletions
diff --git a/pimd/pim6_mld.c b/pimd/pim6_mld.c
index 52496325c4..ed9967e7a8 100644
--- a/pimd/pim6_mld.c
+++ b/pimd/pim6_mld.c
@@ -1243,6 +1243,7 @@ static void gm_handle_q_groupsrc(struct gm_if *gm_ifp,
for (i = 0; i < n_src; i++) {
sg = gm_sg_find(gm_ifp, grp, srcs[i]);
+ GM_UPDATE_SG_STATE(sg);
gm_sg_timer_start(gm_ifp, sg, timers->expire_wait);
}
}
@@ -1317,6 +1318,7 @@ static void gm_handle_q_group(struct gm_if *gm_ifp,
if (PIM_DEBUG_GM_TRACE)
zlog_debug(log_ifp("*,%pPAs expiry timer starting"),
&grp);
+ GM_UPDATE_SG_STATE(sg);
gm_sg_timer_start(gm_ifp, sg, timers->expire_wait);
sg = gm_sgs_next(gm_ifp->sgs, sg);
diff --git a/pimd/pim6_mld.h b/pimd/pim6_mld.h
index 7634fb2ec4..183ab2fc50 100644
--- a/pimd/pim6_mld.h
+++ b/pimd/pim6_mld.h
@@ -36,6 +36,21 @@ enum gm_sg_state {
GM_SG_NOPRUNE_EXPIRING,
};
+/* If the timer gm_t_sg_expire is started without a leave message being received,
+ * the sg->state should be moved to expiring states.
+ * When the timer expires, we do not expect the state to be in join state.
+ * If a JOIN message is received while the timer is running,
+ * the state will be moved to JOIN and this timer will be switched off.
+ * Hence the below state transition is done.
+ */
+#define GM_UPDATE_SG_STATE(sg) \
+ do { \
+ if (sg->state == GM_SG_JOIN) \
+ sg->state = GM_SG_JOIN_EXPIRING; \
+ else if (sg->state == GM_SG_NOPRUNE) \
+ sg->state = GM_SG_NOPRUNE_EXPIRING; \
+ } while (0)
+
static inline bool gm_sg_state_want_join(enum gm_sg_state state)
{
return state != GM_SG_NOINFO && state != GM_SG_PRUNE;