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 <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2017-03-17 13:46:47 -04:00
parent 6233f08738
commit d1e77284c1
4 changed files with 35 additions and 18 deletions

View File

@ -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, "upTime", uptime);
json_object_string_add(json_row, "expire", expire); json_object_string_add(json_row, "expire", expire);
json_object_string_add(json_row, "prune", prune); 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)) if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags))
json_object_int_add(json_row, "SGRpt", 1); 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), inet_ntoa(ifaddr),
ch_src_str, ch_src_str,
ch_grp_str, ch_grp_str,
pim_ifchannel_ifjoin_name(ch->ifjoin_state), pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags),
uptime, uptime,
expire, expire,
prune, prune,

View File

@ -239,15 +239,15 @@ void pim_ifchannel_ifjoin_switch(const char *caller,
zlog_debug ("PIM_IFCHANNEL(%s): %s is switching from %s to %s", zlog_debug ("PIM_IFCHANNEL(%s): %s is switching from %s to %s",
ch->interface->name, ch->interface->name,
ch->sg_str, ch->sg_str,
pim_ifchannel_ifjoin_name (ch->ifjoin_state), pim_ifchannel_ifjoin_name (ch->ifjoin_state, ch->flags),
pim_ifchannel_ifjoin_name (new_state)); pim_ifchannel_ifjoin_name (new_state, 0));
if (old_state == new_state) { if (old_state == new_state) {
if (PIM_DEBUG_PIM_EVENTS) { if (PIM_DEBUG_PIM_EVENTS) {
zlog_debug("%s calledby %s: non-transition on state %d (%s)", zlog_debug("%s calledby %s: non-transition on state %d (%s)",
__PRETTY_FUNCTION__, caller, new_state, __PRETTY_FUNCTION__, caller, new_state,
pim_ifchannel_ifjoin_name(new_state)); pim_ifchannel_ifjoin_name(new_state, 0));
} }
return; 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) { switch (ifjoin_state) {
case PIM_IFJOIN_NOINFO: return "NOINFO"; case PIM_IFJOIN_NOINFO:
case PIM_IFJOIN_JOIN: return "JOIN"; if (PIM_IF_FLAG_TEST_S_G_RPT(flags))
case PIM_IFJOIN_PRUNE: return "PRUNE"; return "SGRpt";
case PIM_IFJOIN_PRUNE_PENDING: return "PRUNEP"; else
case PIM_IFJOIN_PRUNE_TMP: return "PRUNET"; return "NOINFO";
case PIM_IFJOIN_PRUNE_PENDING_TMP: return "PRUNEPT"; 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"; 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", zlog_warn("%s: IFCHANNEL%s Prune Pending Timer Popped while in %s state",
__PRETTY_FUNCTION__, pim_str_sg_dump (&ch->sg), __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; return 0;
@ -1198,7 +1214,7 @@ pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom)
if (PIM_DEBUG_PIM_TRACE) if (PIM_DEBUG_PIM_TRACE)
zlog_debug ("%s: %s %s eom: %d", __PRETTY_FUNCTION__, 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); ch->sg_str, eom);
if (!ch->sources) if (!ch->sources)
return; return;

View File

@ -139,7 +139,7 @@ void pim_ifchannel_local_membership_del(struct interface *ifp,
void pim_ifchannel_ifjoin_switch(const char *caller, void pim_ifchannel_ifjoin_switch(const char *caller,
struct pim_ifchannel *ch, struct pim_ifchannel *ch,
enum pim_ifjoin_state new_state); 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); const char *pim_ifchannel_ifassert_name(enum pim_ifassert_state ifassert_state);
int pim_ifchannel_isin_oiflist(struct pim_ifchannel *ch); int pim_ifchannel_isin_oiflist(struct pim_ifchannel *ch);

View File

@ -744,11 +744,11 @@ pim_upstream_evaluate_join_desired_interface (struct pim_upstream *up,
if (ch->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)) if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags))
return 0; return 0;
if (!pim_macro_ch_lost_assert(ch) && pim_macro_chisin_joins_or_include(ch))
return 1;
} }
/* /*