From e0e127b00953ba68da8f51c927ca251cea4a3773 Mon Sep 17 00:00:00 2001 From: anuradhak Date: Wed, 8 Mar 2017 09:29:40 -0800 Subject: [PATCH 1/4] pimd: Separate the register and upstream join states on the FHR On the FHR upstream-join-state is not particularly relevant as we don't need to send upstream JPs for the SG. So that field was being overloaded with the register-state. However some of the events that triggered changes to the JoinDesired macro were accidentally overwriting the state with join info (instead of treating it as register info) confusing the register state machine. To make the PIM RFC macros' implemention simple I have separated out the register-state. And upstream->state now solely describes the upstream-join-state independent of the role of the PIM router. Signed-off-by: Anuradha Karuppiah Reviewed-by: Donald Sharp Ticket: CM-14700 Testing Done: verified pim-register state-machine with separate and combined FHR/RP routers. Also ran pim-smoke. --- pimd/pim_cmd.c | 12 ++++++++++-- pimd/pim_jp_agg.c | 4 ++++ pimd/pim_mroute.c | 4 ++-- pimd/pim_register.c | 6 +++--- pimd/pim_upstream.c | 39 ++++++++++++++++++++++++++++++++------- pimd/pim_upstream.h | 3 +++ 6 files changed, 54 insertions(+), 14 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 016ba3e451..4183175f86 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -1667,6 +1667,7 @@ static void pim_show_upstream(struct vty *vty, u_char uj) char rs_timer[10]; char ka_timer[10]; char msdp_reg_timer[10]; + char state_str[PIM_REG_STATE_STR_LEN]; pim_inet4_dump("", up->sg.src, src_str, sizeof(src_str)); pim_inet4_dump("", up->sg.grp, grp_str, sizeof(grp_str)); @@ -1690,6 +1691,11 @@ static void pim_show_upstream(struct vty *vty, u_char uj) 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); @@ -1703,7 +1709,9 @@ static void pim_show_upstream(struct vty *vty, u_char uj) 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); @@ -1717,7 +1725,7 @@ static void pim_show_upstream(struct vty *vty, u_char uj) up->rpf.source_nexthop.interface->name, src_str, grp_str, - pim_upstream_state2str (up->join_state), + state_str, uptime, join_timer, rs_timer, diff --git a/pimd/pim_jp_agg.c b/pimd/pim_jp_agg.c index 67ddf05d06..8d4510324c 100644 --- a/pimd/pim_jp_agg.c +++ b/pimd/pim_jp_agg.c @@ -249,6 +249,10 @@ pim_jp_agg_single_upstream_send (struct pim_rpf *rpf, 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(); diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c index 334e0ce06e..3f483a25ad 100644 --- a/pimd/pim_mroute.c +++ b/pimd/pim_mroute.c @@ -189,7 +189,7 @@ pim_mroute_msg_nocache (int fd, struct interface *ifp, const struct igmpmsg *msg 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; } @@ -453,7 +453,7 @@ pim_mroute_msg_wrvifwhole (int fd, struct interface *ifp, const char *buf) 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 diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 29b4e8a63b..2d4d296598 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -122,19 +122,19 @@ pim_register_stop_recv (uint8_t *buf, int buf_size) 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; diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 4187635b19..68652f67fd 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -509,6 +509,7 @@ pim_upstream_switch(struct pim_upstream *up, 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); } @@ -602,6 +603,7 @@ pim_upstream_new (struct prefix_sg *sg, 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; @@ -958,7 +960,7 @@ static void pim_upstream_fhr_kat_expiry(struct pim_upstream *up) /* 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); } @@ -972,9 +974,9 @@ static void pim_upstream_fhr_kat_start(struct pim_upstream *up) 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; } } } @@ -1211,6 +1213,29 @@ pim_upstream_state2str (enum pim_upstream_state join_state) 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) { @@ -1226,13 +1251,13 @@ 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: @@ -1246,7 +1271,7 @@ pim_upstream_register_stop_timer (struct thread *t) __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) && diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h index 7cdf73759d..3f0abc16c2 100644 --- a/pimd/pim_upstream.h +++ b/pimd/pim_upstream.h @@ -88,6 +88,7 @@ struct pim_upstream { struct list *sources; enum pim_upstream_state join_state; + enum pim_upstream_state reg_state; enum pim_upstream_sptbit sptbit; int ref_count; @@ -163,6 +164,8 @@ void pim_upstream_send_join (struct pim_upstream *up); 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); From 0c2ebf00a628772c09ec97f970ae34b8076e9976 Mon Sep 17 00:00:00 2001 From: anuradhak Date: Thu, 9 Mar 2017 09:52:59 -0800 Subject: [PATCH 2/4] pimd: add new/distinct enumeration for pim register state With the separation of register-state and upstream-join-state we no longer need an enumeration that covers both states. This commit includes the following - 1. Defined new enumeration for reg state (this 1:1 with RFC4601). 2. Dropped JOIN_PENDING enum value from upstream join state. RFC4601 only define two values NOT_JOINED and JOINED for this state. Signed-off-by: Anuradha Karuppiah Reviewed-by: Donald Sharp Ticket: CM-14700 Testing Done: Verified register setup manually and ran pim-smoke --- pimd/pim_cmd.c | 2 +- pimd/pim_mroute.c | 4 ++-- pimd/pim_register.c | 12 +++++------ pimd/pim_upstream.c | 52 +++++++++++++++++++++------------------------ pimd/pim_upstream.h | 12 ++++++++--- 5 files changed, 42 insertions(+), 40 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 4183175f86..0895ce21cf 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -1692,7 +1692,7 @@ static void pim_show_upstream(struct vty *vty, u_char uj) 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)); + pim_reg_state2str (up->reg_state, state_str); else strcpy (state_str, pim_upstream_state2str (up->join_state)); diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c index 3f483a25ad..9401475813 100644 --- a/pimd/pim_mroute.c +++ b/pimd/pim_mroute.c @@ -189,7 +189,7 @@ pim_mroute_msg_nocache (int fd, struct interface *ifp, const struct igmpmsg *msg 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->reg_state = PIM_UPSTREAM_JOINED; + up->reg_state = PIM_REG_JOIN; return 0; } @@ -453,7 +453,7 @@ pim_mroute_msg_wrvifwhole (int fd, struct interface *ifp, const char *buf) up->channel_oil = oil; up->channel_oil->cc.pktcnt++; pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM); - up->reg_state = PIM_UPSTREAM_JOINED; + up->reg_state = PIM_REG_JOIN; pim_upstream_inherited_olist (up); // Send the packet to the RP diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 2d4d296598..99ddd45d7f 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -124,17 +124,17 @@ pim_register_stop_recv (uint8_t *buf, int buf_size) switch (upstream->reg_state) { - case PIM_UPSTREAM_NOTJOINED: - case PIM_UPSTREAM_PRUNE: + case PIM_REG_NOINFO: + case PIM_REG_PRUNE: return 0; break; - case PIM_UPSTREAM_JOINED: - upstream->reg_state = PIM_UPSTREAM_PRUNE; + case PIM_REG_JOIN: + upstream->reg_state = PIM_REG_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->reg_state = PIM_UPSTREAM_PRUNE; + case PIM_REG_JOIN_PENDING: + upstream->reg_state = PIM_REG_PRUNE; pim_upstream_start_register_stop_timer (upstream, 0); return 0; break; diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 68652f67fd..5324d555ec 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -485,8 +485,6 @@ pim_upstream_switch(struct pim_upstream *up, up->state_transition = pim_time_monotonic_sec (); } break; - case PIM_UPSTREAM_JOIN_PENDING: - break; case PIM_UPSTREAM_NOTJOINED: case PIM_UPSTREAM_JOINED: up->join_state = new_state; @@ -509,7 +507,7 @@ pim_upstream_switch(struct pim_upstream *up, PIM_UPSTREAM_FLAG_SET_FHR(up->flags); if (!old_fhr && PIM_UPSTREAM_FLAG_TEST_SRC_STREAM(up->flags)) { - up->reg_state = PIM_UPSTREAM_JOINED; + up->reg_state = PIM_REG_JOIN; 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); } @@ -603,7 +601,7 @@ pim_upstream_new (struct prefix_sg *sg, up->t_rs_timer = NULL; up->t_msdp_reg_timer = NULL; up->join_state = 0; - up->reg_state = 0; + up->reg_state = PIM_REG_NOINFO; up->state_transition = pim_time_monotonic_sec(); up->channel_oil = NULL; up->sptbit = PIM_UPSTREAM_SPTBIT_FALSE; @@ -959,8 +957,8 @@ static void pim_upstream_fhr_kat_expiry(struct pim_upstream *up) THREAD_OFF(up->t_rs_timer); /* 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->reg_state = PIM_UPSTREAM_NOTJOINED; + /* clear the register state */ + up->reg_state = PIM_REG_NOINFO; PIM_UPSTREAM_FLAG_UNSET_FHR(up->flags); } @@ -974,9 +972,9 @@ static void pim_upstream_fhr_kat_start(struct pim_upstream *up) zlog_debug ("kat started on %s; set fhr reg state to joined", up->sg_str); PIM_UPSTREAM_FLAG_SET_FHR(up->flags); - if (up->reg_state == PIM_UPSTREAM_NOTJOINED) { + if (up->reg_state == PIM_REG_NOINFO) { pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM); - up->reg_state = PIM_UPSTREAM_JOINED; + up->reg_state = PIM_REG_JOIN; } } } @@ -1203,9 +1201,6 @@ pim_upstream_state2str (enum pim_upstream_state join_state) case PIM_UPSTREAM_JOINED: return "Joined"; break; - case PIM_UPSTREAM_JOIN_PENDING: - return "JoinPending"; - break; case PIM_UPSTREAM_PRUNE: return "Prune"; break; @@ -1214,24 +1209,24 @@ pim_upstream_state2str (enum pim_upstream_state join_state) } const char * -pim_reg_state2str (enum pim_upstream_state join_state, char *state_str) +pim_reg_state2str (enum pim_reg_state reg_state, char *state_str) { - switch (join_state) + switch (reg_state) { - case PIM_UPSTREAM_NOTJOINED: - strcpy (state_str, "NoInfo"); + case PIM_REG_NOINFO: + strcpy (state_str, "RegNoInfo"); break; - case PIM_UPSTREAM_JOINED: - strcpy (state_str, "Joined"); + case PIM_REG_JOIN: + strcpy (state_str, "RegJoined"); break; - case PIM_UPSTREAM_JOIN_PENDING: - strcpy (state_str, "JoinPending"); + case PIM_REG_JOIN_PENDING: + strcpy (state_str, "RegJoinPend"); break; - case PIM_UPSTREAM_PRUNE: - strcpy (state_str, "Prune"); + case PIM_REG_PRUNE: + strcpy (state_str, "RegPrune"); break; default: - strcpy (state_str, "Unknown"); + strcpy (state_str, "RegUnknown"); } return state_str; } @@ -1249,20 +1244,21 @@ pim_upstream_register_stop_timer (struct thread *t) if (PIM_DEBUG_TRACE) { + char state_str[PIM_REG_STATE_STR_LEN]; zlog_debug ("%s: (S,G)=%s upstream register stop timer %s", __PRETTY_FUNCTION__, up->sg_str, - pim_upstream_state2str(up->reg_state)); + pim_reg_state2str(up->reg_state, state_str)); } switch (up->reg_state) { - case PIM_UPSTREAM_JOIN_PENDING: - up->reg_state = PIM_UPSTREAM_JOINED; + case PIM_REG_JOIN_PENDING: + up->reg_state = PIM_REG_JOIN; pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM); break; - case PIM_UPSTREAM_JOINED: + case PIM_REG_JOIN: break; - case PIM_UPSTREAM_PRUNE: + case PIM_REG_PRUNE: pim_ifp = up->rpf.source_nexthop.interface->info; if (!pim_ifp) { @@ -1271,7 +1267,7 @@ pim_upstream_register_stop_timer (struct thread *t) __PRETTY_FUNCTION__, up->rpf.source_nexthop.interface->name); return 0; } - up->reg_state = PIM_UPSTREAM_JOIN_PENDING; + up->reg_state = PIM_REG_JOIN_PENDING; pim_upstream_start_register_stop_timer (up, 1); if (((up->channel_oil->cc.lastused/100) > PIM_KEEPALIVE_PERIOD) && diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h index 3f0abc16c2..cd7c16be75 100644 --- a/pimd/pim_upstream.h +++ b/pimd/pim_upstream.h @@ -61,10 +61,16 @@ enum pim_upstream_state { PIM_UPSTREAM_NOTJOINED, PIM_UPSTREAM_JOINED, - PIM_UPSTREAM_JOIN_PENDING, PIM_UPSTREAM_PRUNE, }; +enum pim_reg_state { + PIM_REG_NOINFO, + PIM_REG_JOIN, + PIM_REG_JOIN_PENDING, + PIM_REG_PRUNE, +}; + enum pim_upstream_sptbit { PIM_UPSTREAM_SPTBIT_FALSE, PIM_UPSTREAM_SPTBIT_TRUE @@ -88,7 +94,7 @@ struct pim_upstream { struct list *sources; enum pim_upstream_state join_state; - enum pim_upstream_state reg_state; + enum pim_reg_state reg_state; enum pim_upstream_sptbit sptbit; int ref_count; @@ -165,7 +171,7 @@ void pim_upstream_switch (struct pim_upstream *up, enum pim_upstream_state new_s 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); +const char *pim_reg_state2str (enum pim_reg_state state, char *state_str); int pim_upstream_inherited_olist_decide (struct pim_upstream *up); int pim_upstream_inherited_olist (struct pim_upstream *up); From b4786acd7ea88ec0a3da8edfc4e0ce71f67b5f12 Mon Sep 17 00:00:00 2001 From: anuradhak Date: Thu, 9 Mar 2017 10:47:50 -0800 Subject: [PATCH 3/4] pimd: simplify pim upstream state transitions This is another follow-up change to the reg-state and up-join-state separation. The upstream join state machine can now respond to JoinDesired macro changes independent of router role. I have also dropped the PRUNE state from the upstream-join-state enumeration. RFC4601 only defines JOINED and NOTJOINED states. And PRUNE can really be replace by NOTJOINED. Signed-off-by: Anuradha Karuppiah Reviewed-by: Donald Sharp Ticket: CM-14700 Testing Done: Register state machine in FHR only, combined FHR-RP and FHR-RP-LHR/all-in-one setups. Also ran pim-smoke. --- pimd/pim_register.c | 2 +- pimd/pim_upstream.c | 28 ++++------------------------ pimd/pim_upstream.h | 1 - 3 files changed, 5 insertions(+), 26 deletions(-) diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 99ddd45d7f..46d8e3ec2e 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -358,7 +358,7 @@ pim_register_recv (struct interface *ifp, upstream->sg.src = sg.src; upstream->rpf.rpf_addr = upstream->rpf.source_nexthop.mrib_nexthop_addr; - upstream->join_state = PIM_UPSTREAM_PRUNE; + upstream->join_state = PIM_UPSTREAM_NOTJOINED; } diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 5324d555ec..19f7d3336c 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -473,26 +473,9 @@ pim_upstream_switch(struct pim_upstream *up, pim_upstream_state2str (new_state)); } - /* - * This code still needs work. - */ - switch (up->join_state) - { - case PIM_UPSTREAM_PRUNE: - if (!PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)) - { - up->join_state = new_state; - up->state_transition = pim_time_monotonic_sec (); - } - break; - case PIM_UPSTREAM_NOTJOINED: - case PIM_UPSTREAM_JOINED: - up->join_state = new_state; - if (old_state != new_state) - up->state_transition = pim_time_monotonic_sec(); - - break; - } + up->join_state = new_state; + if (old_state != new_state) + up->state_transition = pim_time_monotonic_sec(); pim_upstream_update_assert_tracking_desired(up); @@ -600,7 +583,7 @@ pim_upstream_new (struct prefix_sg *sg, up->t_ka_timer = NULL; up->t_rs_timer = NULL; up->t_msdp_reg_timer = NULL; - up->join_state = 0; + up->join_state = PIM_UPSTREAM_NOTJOINED; up->reg_state = PIM_REG_NOINFO; up->state_transition = pim_time_monotonic_sec(); up->channel_oil = NULL; @@ -1201,9 +1184,6 @@ pim_upstream_state2str (enum pim_upstream_state join_state) case PIM_UPSTREAM_JOINED: return "Joined"; break; - case PIM_UPSTREAM_PRUNE: - return "Prune"; - break; } return "Unknown"; } diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h index cd7c16be75..b191fe9404 100644 --- a/pimd/pim_upstream.h +++ b/pimd/pim_upstream.h @@ -61,7 +61,6 @@ enum pim_upstream_state { PIM_UPSTREAM_NOTJOINED, PIM_UPSTREAM_JOINED, - PIM_UPSTREAM_PRUNE, }; enum pim_reg_state { From 755210ab1dea88aa7b41d83b65e2bc75dbabd99e Mon Sep 17 00:00:00 2001 From: anuradhak Date: Thu, 9 Mar 2017 11:42:55 -0800 Subject: [PATCH 4/4] pimd: display reg-state and join-state info in the pim_upstream output Changed the state field in the "sh ip pim upstream" output to include register and join state info as a comma separated value. Register info is supressed if reg-state=NoInfo. Sample output: ============= root@fhr:/home/cumulus# net show pim upstream Iif Source Group State Uptime JoinTimer RSTimer KATimer RefCnt swp1 33.1.1.1 239.1.1.2 J,RegP 00:00:18 --:--:-- 00:00:44 00:03:24 2 root@fhr:/home/cumulus# root@rp:/home/cumulus# net show pim upstream Iif Source Group State Uptime JoinTimer RSTimer KATimer RefCnt lo * 239.1.1.2 J 00:02:08 00:00:52 --:--:-- --:--:-- 1 swp1 33.1.1.1 239.1.1.2 J 00:00:16 00:00:11 --:--:-- 00:03:26 1 root@rp:/home/cumulus# Signed-off-by: Anuradha Karuppiah Reviewed-by: Donald Sharp Ticket: CM-14700 Testing Done: pim-smoke --- pimd/pim_cmd.c | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 0895ce21cf..465c368f43 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -1643,6 +1643,44 @@ json_object_pim_upstream_add (json_object *json, struct pim_upstream *up) json_object_boolean_true_add(json, "sourceMsdp"); } +static const char * +pim_upstream_state2brief_str (enum pim_upstream_state join_state, char *state_str) +{ + switch (join_state) + { + case PIM_UPSTREAM_NOTJOINED: + strcpy (state_str, "NotJ"); + break; + case PIM_UPSTREAM_JOINED: + strcpy (state_str, "J"); + break; + default: + strcpy (state_str, "Unk"); + } + return state_str; +} + +static const char * +pim_reg_state2brief_str (enum pim_reg_state reg_state, char *state_str) +{ + switch (reg_state) + { + case PIM_REG_NOINFO: + strcpy (state_str, "RegNI"); + break; + case PIM_REG_JOIN: + strcpy (state_str, "RegJ"); + break; + case PIM_REG_JOIN_PENDING: + case PIM_REG_PRUNE: + strcpy (state_str, "RegP"); + break; + default: + strcpy (state_str, "Unk"); + } + return state_str; +} + static void pim_show_upstream(struct vty *vty, u_char uj) { struct listnode *upnode; @@ -1691,10 +1729,13 @@ static void pim_show_upstream(struct vty *vty, u_char uj) 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)) - pim_reg_state2str (up->reg_state, state_str); - else - strcpy (state_str, pim_upstream_state2str (up->join_state)); + pim_upstream_state2brief_str (up->join_state, state_str); + if (up->reg_state != PIM_REG_NOINFO) { + char tmp_str[PIM_REG_STATE_STR_LEN]; + + sprintf (state_str + strlen (state_str), ",%s", + pim_reg_state2brief_str (up->reg_state, tmp_str)); + } if (uj) { json_object_object_get_ex(json, grp_str, &json_group);