char rs_timer[10];
char ka_timer[10];
char msdp_reg_timer[10];
+ char state_str[PIM_REG_STATE_STR_LEN];
pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str));
pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str));
pim_time_timer_to_hhmmss (ka_timer, sizeof (ka_timer), up->t_ka_timer);
pim_time_timer_to_hhmmss (msdp_reg_timer, sizeof (msdp_reg_timer), up->t_msdp_reg_timer);
+ if (pim_if_connected_to_source (up->rpf.source_nexthop.interface, up->sg.src))
+ strcpy (state_str, pim_upstream_state2str (up->reg_state));
+ else
+ strcpy (state_str, pim_upstream_state2str (up->join_state));
+
if (uj) {
json_object_object_get_ex(json, grp_str, &json_group);
json_object_string_add(json_row, "inboundInterface", up->rpf.source_nexthop.interface->name);
json_object_string_add(json_row, "source", src_str);
json_object_string_add(json_row, "group", grp_str);
- json_object_string_add(json_row, "state", pim_upstream_state2str (up->join_state));
+ json_object_string_add(json_row, "state", state_str);
+ json_object_string_add(json_row, "joinState", pim_upstream_state2str (up->join_state));
+ json_object_string_add(json_row, "regState", pim_reg_state2str (up->reg_state, state_str));
json_object_string_add(json_row, "upTime", uptime);
json_object_string_add(json_row, "joinTimer", join_timer);
json_object_string_add(json_row, "resetTimer", rs_timer);
up->rpf.source_nexthop.interface->name,
src_str,
grp_str,
- pim_upstream_state2str (up->join_state),
+ state_str,
uptime,
join_timer,
rs_timer,
static bool first = true;
+ /* skip JP upstream messages if source is directly connected */
+ if (pim_if_connected_to_source (rpf->source_nexthop.interface, up->sg.src))
+ return;
+
if (first)
{
groups = list_new();
up->channel_oil->cc.pktcnt++;
PIM_UPSTREAM_FLAG_SET_FHR(up->flags);
pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
- up->join_state = PIM_UPSTREAM_JOINED;
+ up->reg_state = PIM_UPSTREAM_JOINED;
return 0;
}
up->channel_oil = oil;
up->channel_oil->cc.pktcnt++;
pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
- up->join_state = PIM_UPSTREAM_JOINED;
+ up->reg_state = PIM_UPSTREAM_JOINED;
pim_upstream_inherited_olist (up);
// Send the packet to the RP
zlog_debug ("Received Register stop for %s",
upstream->sg_str);
- switch (upstream->join_state)
+ switch (upstream->reg_state)
{
case PIM_UPSTREAM_NOTJOINED:
case PIM_UPSTREAM_PRUNE:
return 0;
break;
case PIM_UPSTREAM_JOINED:
- upstream->join_state = PIM_UPSTREAM_PRUNE;
+ upstream->reg_state = PIM_UPSTREAM_PRUNE;
pim_channel_del_oif (upstream->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
pim_upstream_start_register_stop_timer (upstream, 0);
break;
case PIM_UPSTREAM_JOIN_PENDING:
- upstream->join_state = PIM_UPSTREAM_PRUNE;
+ upstream->reg_state = PIM_UPSTREAM_PRUNE;
pim_upstream_start_register_stop_timer (upstream, 0);
return 0;
break;
PIM_UPSTREAM_FLAG_SET_FHR(up->flags);
if (!old_fhr && PIM_UPSTREAM_FLAG_TEST_SRC_STREAM(up->flags))
{
+ up->reg_state = PIM_UPSTREAM_JOINED;
pim_upstream_keep_alive_timer_start (up, qpim_keep_alive_time);
pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
}
up->t_rs_timer = NULL;
up->t_msdp_reg_timer = NULL;
up->join_state = 0;
+ up->reg_state = 0;
up->state_transition = pim_time_monotonic_sec();
up->channel_oil = NULL;
up->sptbit = PIM_UPSTREAM_SPTBIT_FALSE;
/* remove regiface from the OIL if it is there*/
pim_channel_del_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
/* move to "not-joined" */
- up->join_state = PIM_UPSTREAM_NOTJOINED;
+ up->reg_state = PIM_UPSTREAM_NOTJOINED;
PIM_UPSTREAM_FLAG_UNSET_FHR(up->flags);
}
zlog_debug ("kat started on %s; set fhr reg state to joined", up->sg_str);
PIM_UPSTREAM_FLAG_SET_FHR(up->flags);
- if (up->join_state == PIM_UPSTREAM_NOTJOINED) {
+ if (up->reg_state == PIM_UPSTREAM_NOTJOINED) {
pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
- up->join_state = PIM_UPSTREAM_JOINED;
+ up->reg_state = PIM_UPSTREAM_JOINED;
}
}
}
return "Unknown";
}
+const char *
+pim_reg_state2str (enum pim_upstream_state join_state, char *state_str)
+{
+ switch (join_state)
+ {
+ case PIM_UPSTREAM_NOTJOINED:
+ strcpy (state_str, "NoInfo");
+ break;
+ case PIM_UPSTREAM_JOINED:
+ strcpy (state_str, "Joined");
+ break;
+ case PIM_UPSTREAM_JOIN_PENDING:
+ strcpy (state_str, "JoinPending");
+ break;
+ case PIM_UPSTREAM_PRUNE:
+ strcpy (state_str, "Prune");
+ break;
+ default:
+ strcpy (state_str, "Unknown");
+ }
+ return state_str;
+}
+
static int
pim_upstream_register_stop_timer (struct thread *t)
{
{
zlog_debug ("%s: (S,G)=%s upstream register stop timer %s",
__PRETTY_FUNCTION__, up->sg_str,
- pim_upstream_state2str(up->join_state));
+ pim_upstream_state2str(up->reg_state));
}
- switch (up->join_state)
+ switch (up->reg_state)
{
case PIM_UPSTREAM_JOIN_PENDING:
- up->join_state = PIM_UPSTREAM_JOINED;
+ up->reg_state = PIM_UPSTREAM_JOINED;
pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
break;
case PIM_UPSTREAM_JOINED:
__PRETTY_FUNCTION__, up->rpf.source_nexthop.interface->name);
return 0;
}
- up->join_state = PIM_UPSTREAM_JOIN_PENDING;
+ up->reg_state = PIM_UPSTREAM_JOIN_PENDING;
pim_upstream_start_register_stop_timer (up, 1);
if (((up->channel_oil->cc.lastused/100) > PIM_KEEPALIVE_PERIOD) &&
struct list *sources;
enum pim_upstream_state join_state;
+ enum pim_upstream_state reg_state;
enum pim_upstream_sptbit sptbit;
int ref_count;
void pim_upstream_switch (struct pim_upstream *up, enum pim_upstream_state new_state);
const char *pim_upstream_state2str (enum pim_upstream_state join_state);
+#define PIM_REG_STATE_STR_LEN 12
+const char *pim_reg_state2str (enum pim_upstream_state state, char *state_str);
int pim_upstream_inherited_olist_decide (struct pim_upstream *up);
int pim_upstream_inherited_olist (struct pim_upstream *up);