From d1e77284c1ed8b5a86aadfe0485f25fa26e48e67 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 17 Mar 2017 13:46:47 -0400 Subject: [PATCH] pimd: Add display of SGRpt state for ifchannel When we get a SGrpt Prune embedded in the *,G Join, Display the created ifchannel as being SGRpt state. Signed-off-by: Donald Sharp --- pimd/pim_cmd.c | 5 +++-- pimd/pim_ifchannel.c | 40 ++++++++++++++++++++++++++++------------ pimd/pim_ifchannel.h | 2 +- pimd/pim_upstream.c | 6 +++--- 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index a85de0aabc..b2edb94711 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -1168,7 +1168,8 @@ static void pim_show_join(struct vty *vty, u_char uj) json_object_string_add(json_row, "upTime", uptime); json_object_string_add(json_row, "expire", expire); json_object_string_add(json_row, "prune", prune); - json_object_string_add(json_row, "channelJoinName", pim_ifchannel_ifjoin_name(ch->ifjoin_state)); + json_object_string_add(json_row, "channelJoinName", + pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags)); if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags)) json_object_int_add(json_row, "SGRpt", 1); @@ -1187,7 +1188,7 @@ static void pim_show_join(struct vty *vty, u_char uj) inet_ntoa(ifaddr), ch_src_str, ch_grp_str, - pim_ifchannel_ifjoin_name(ch->ifjoin_state), + pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags), uptime, expire, prune, diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c index ee75793024..6dc1fba375 100644 --- a/pimd/pim_ifchannel.c +++ b/pimd/pim_ifchannel.c @@ -239,15 +239,15 @@ void pim_ifchannel_ifjoin_switch(const char *caller, zlog_debug ("PIM_IFCHANNEL(%s): %s is switching from %s to %s", ch->interface->name, ch->sg_str, - pim_ifchannel_ifjoin_name (ch->ifjoin_state), - pim_ifchannel_ifjoin_name (new_state)); + pim_ifchannel_ifjoin_name (ch->ifjoin_state, ch->flags), + pim_ifchannel_ifjoin_name (new_state, 0)); if (old_state == new_state) { if (PIM_DEBUG_PIM_EVENTS) { zlog_debug("%s calledby %s: non-transition on state %d (%s)", __PRETTY_FUNCTION__, caller, new_state, - pim_ifchannel_ifjoin_name(new_state)); + pim_ifchannel_ifjoin_name(new_state, 0)); } return; } @@ -331,15 +331,31 @@ void pim_ifchannel_ifjoin_switch(const char *caller, } } -const char *pim_ifchannel_ifjoin_name(enum pim_ifjoin_state ifjoin_state) +const char *pim_ifchannel_ifjoin_name(enum pim_ifjoin_state ifjoin_state, + int flags) { switch (ifjoin_state) { - case PIM_IFJOIN_NOINFO: return "NOINFO"; - case PIM_IFJOIN_JOIN: return "JOIN"; - case PIM_IFJOIN_PRUNE: return "PRUNE"; - case PIM_IFJOIN_PRUNE_PENDING: return "PRUNEP"; - case PIM_IFJOIN_PRUNE_TMP: return "PRUNET"; - case PIM_IFJOIN_PRUNE_PENDING_TMP: return "PRUNEPT"; + case PIM_IFJOIN_NOINFO: + if (PIM_IF_FLAG_TEST_S_G_RPT(flags)) + return "SGRpt"; + else + return "NOINFO"; + break; + case PIM_IFJOIN_JOIN: + return "JOIN"; + break; + case PIM_IFJOIN_PRUNE: + return "PRUNE"; + break; + case PIM_IFJOIN_PRUNE_PENDING: + return "PRUNEP"; + break; + case PIM_IFJOIN_PRUNE_TMP: + return "PRUNET"; + break; + case PIM_IFJOIN_PRUNE_PENDING_TMP: + return "PRUNEPT"; + break; } return "ifjoin_bad_state"; @@ -609,7 +625,7 @@ static int on_ifjoin_prune_pending_timer(struct thread *t) { zlog_warn("%s: IFCHANNEL%s Prune Pending Timer Popped while in %s state", __PRETTY_FUNCTION__, pim_str_sg_dump (&ch->sg), - pim_ifchannel_ifjoin_name (ch->ifjoin_state)); + pim_ifchannel_ifjoin_name (ch->ifjoin_state, ch->flags)); } return 0; @@ -1198,7 +1214,7 @@ pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom) if (PIM_DEBUG_PIM_TRACE) zlog_debug ("%s: %s %s eom: %d", __PRETTY_FUNCTION__, - pim_ifchannel_ifjoin_name(ch->ifjoin_state), + pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags), ch->sg_str, eom); if (!ch->sources) return; diff --git a/pimd/pim_ifchannel.h b/pimd/pim_ifchannel.h index c7084034a0..fe9fb9a7f1 100644 --- a/pimd/pim_ifchannel.h +++ b/pimd/pim_ifchannel.h @@ -139,7 +139,7 @@ void pim_ifchannel_local_membership_del(struct interface *ifp, void pim_ifchannel_ifjoin_switch(const char *caller, struct pim_ifchannel *ch, enum pim_ifjoin_state new_state); -const char *pim_ifchannel_ifjoin_name(enum pim_ifjoin_state ifjoin_state); +const char *pim_ifchannel_ifjoin_name(enum pim_ifjoin_state ifjoin_state, int flags); const char *pim_ifchannel_ifassert_name(enum pim_ifassert_state ifassert_state); int pim_ifchannel_isin_oiflist(struct pim_ifchannel *ch); diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 759c955412..327e4f07d7 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -744,11 +744,11 @@ pim_upstream_evaluate_join_desired_interface (struct pim_upstream *up, if (ch->upstream == up) { - if (!pim_macro_ch_lost_assert(ch) && pim_macro_chisin_joins_or_include(ch)) - return 1; - if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags)) return 0; + + if (!pim_macro_ch_lost_assert(ch) && pim_macro_chisin_joins_or_include(ch)) + return 1; } /* -- 2.39.5