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, "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,

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",
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;

View File

@ -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);

View File

@ -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;
}
/*