diff options
Diffstat (limited to 'pimd/pim_cmd_common.c')
| -rw-r--r-- | pimd/pim_cmd_common.c | 167 |
1 files changed, 111 insertions, 56 deletions
diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index 03689bea8d..f2974edae2 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -898,13 +898,9 @@ void pim_show_rpf(struct pim_instance *pim, struct vty *vty, json_object *json) } frr_each (rb_pim_upstream, &pim->upstream_head, up) { - char rpf_addr_str[PREFIX_STRLEN]; const char *rpf_ifname; struct pim_rpf *rpf = &up->rpf; - pim_addr_dump("<rpf?>", &rpf->rpf_addr, rpf_addr_str, - sizeof(rpf_addr_str)); - rpf_ifname = rpf->source_nexthop.interface ? rpf->source_nexthop .interface->name @@ -932,8 +928,8 @@ void pim_show_rpf(struct pim_instance *pim, struct vty *vty, json_object *json) json_object_string_add(json_row, "group", grp_str); json_object_string_add(json_row, "rpfInterface", rpf_ifname); - json_object_string_add(json_row, "rpfAddress", - rpf_addr_str); + json_object_string_addf(json_row, "rpfAddress", "%pPA", + &rpf->rpf_addr); json_object_string_addf( json_row, "ribNexthop", "%pPAs", &rpf->source_nexthop.mrib_nexthop_addr); @@ -947,9 +943,9 @@ void pim_show_rpf(struct pim_instance *pim, struct vty *vty, json_object *json) } else { vty_out(vty, - "%-15pPAs %-15pPAs %-16s %-15s %-15pPAs %6d %4d\n", + "%-15pPAs %-15pPAs %-16s %-15pPA %-15pPAs %6d %4d\n", &up->sg.src, &up->sg.grp, rpf_ifname, - rpf_addr_str, + &rpf->rpf_addr, &rpf->source_nexthop.mrib_nexthop_addr, rpf->source_nexthop.mrib_route_metric, rpf->source_nexthop.mrib_metric_preference); @@ -1352,9 +1348,9 @@ void pim_show_upstream(struct pim_instance *pim, struct vty *vty, if (!up->t_join_timer && up->rpf.source_nexthop.interface) { struct pim_neighbor *nbr; - nbr = pim_neighbor_find_prefix( + nbr = pim_neighbor_find( up->rpf.source_nexthop.interface, - &up->rpf.rpf_addr); + up->rpf.rpf_addr); if (nbr) pim_time_timer_to_hhmmss(join_timer, sizeof(join_timer), @@ -1418,7 +1414,7 @@ void pim_show_upstream(struct pim_instance *pim, struct vty *vty, rpg = RP(pim, up->sg.grp); json_object_string_addf(json_row, "rpfAddress", - "%pFX", &rpg->rpf_addr); + "%pPA", &rpg->rpf_addr); } else { json_object_string_add(json_row, "rpfAddress", src_str); @@ -1534,15 +1530,11 @@ void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, bool uj) "Source Group RpfIface RibNextHop RpfAddress \n"); frr_each (rb_pim_upstream, &pim->upstream_head, up) { - char rpf_addr_str[PREFIX_STRLEN]; struct pim_rpf *rpf; const char *rpf_ifname; rpf = &up->rpf; - pim_addr_dump("<rpf?>", &rpf->rpf_addr, rpf_addr_str, - sizeof(rpf_addr_str)); - rpf_ifname = rpf->source_nexthop.interface ? rpf->source_nexthop .interface->name @@ -1573,14 +1565,15 @@ void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, bool uj) json_object_string_addf( json_row, "ribNexthop", "%pPAs", &rpf->source_nexthop.mrib_nexthop_addr); - json_object_string_add(json_row, "rpfAddress", - rpf_addr_str); + json_object_string_addf(json_row, "rpfAddress", "%pPA", + &rpf->rpf_addr); json_object_object_add(json_group, src_str, json_row); } else { - vty_out(vty, "%-15pPAs %-15pPAs %-16s %-15pPA %-15s\n", + vty_out(vty, + "%-15pPAs %-15pPAs %-16s %-15pPA %-15pPA\n", &up->sg.src, &up->sg.grp, rpf_ifname, &rpf->source_nexthop.mrib_nexthop_addr, - rpf_addr_str); + &rpf->rpf_addr); } } @@ -1679,7 +1672,7 @@ int pim_show_join_cmd_helper(const char *vrf, struct vty *vty, pim_addr s_or_g, vty_out(vty, "%% Vrf specified: %s does not exist\n", vrf); return CMD_WARNING; } - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -1780,7 +1773,7 @@ int pim_show_jp_agg_list_cmd_helper(const char *vrf, struct vty *vty) vty_out(vty, "%% Vrf specified: %s does not exist\n", vrf); return CMD_WARNING; } - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -2635,40 +2628,90 @@ void ip_pim_ssm_show_group_range(struct pim_instance *pim, struct vty *vty, vty_out(vty, "SSM group range : %s\n", range_str); } -struct pnc_cache_walk_data { +struct vty_pnc_cache_walk_data { struct vty *vty; struct pim_instance *pim; }; -static int pim_print_pnc_cache_walkcb(struct hash_bucket *bucket, void *arg) +struct json_pnc_cache_walk_data { + json_object *json_obj; + struct pim_instance *pim; +}; + +static int pim_print_vty_pnc_cache_walkcb(struct hash_bucket *bucket, void *arg) { struct pim_nexthop_cache *pnc = bucket->data; - struct pnc_cache_walk_data *cwd = arg; + struct vty_pnc_cache_walk_data *cwd = arg; struct vty *vty = cwd->vty; struct pim_instance *pim = cwd->pim; struct nexthop *nh_node = NULL; ifindex_t first_ifindex; struct interface *ifp = NULL; - char buf[PREFIX_STRLEN]; for (nh_node = pnc->nexthop; nh_node; nh_node = nh_node->next) { first_ifindex = nh_node->ifindex; + ifp = if_lookup_by_index(first_ifindex, pim->vrf->vrf_id); - vty_out(vty, "%-15s ", - inet_ntop(AF_INET, &pnc->rpf.rpf_addr.u.prefix4, buf, - sizeof(buf))); + vty_out(vty, "%-15pPA ", &pnc->rpf.rpf_addr); vty_out(vty, "%-16s ", ifp ? ifp->name : "NULL"); +#if PIM_IPV == 4 vty_out(vty, "%pI4 ", &nh_node->gate.ipv4); +#else + vty_out(vty, "%pI6 ", &nh_node->gate.ipv6); +#endif vty_out(vty, "\n"); } return CMD_SUCCESS; } +static int pim_print_json_pnc_cache_walkcb(struct hash_bucket *backet, + void *arg) +{ + struct pim_nexthop_cache *pnc = backet->data; + struct json_pnc_cache_walk_data *cwd = arg; + struct pim_instance *pim = cwd->pim; + struct nexthop *nh_node = NULL; + ifindex_t first_ifindex; + struct interface *ifp = NULL; + char addr_str[PIM_ADDRSTRLEN]; + json_object *json_row = NULL; + json_object *json_ifp = NULL; + json_object *json_arr = NULL; + + for (nh_node = pnc->nexthop; nh_node; nh_node = nh_node->next) { + first_ifindex = nh_node->ifindex; + ifp = if_lookup_by_index(first_ifindex, pim->vrf->vrf_id); + snprintfrr(addr_str, sizeof(addr_str), "%pPA", + &pnc->rpf.rpf_addr); + json_object_object_get_ex(cwd->json_obj, addr_str, &json_row); + if (!json_row) { + json_row = json_object_new_object(); + json_object_string_addf(json_row, "address", "%pPA", + &pnc->rpf.rpf_addr); + json_object_object_addf(cwd->json_obj, json_row, "%pPA", + &pnc->rpf.rpf_addr); + json_arr = json_object_new_array(); + json_object_object_add(json_row, "nexthops", json_arr); + } + json_ifp = json_object_new_object(); + json_object_string_add(json_ifp, "interface", + ifp ? ifp->name : "NULL"); +#if PIM_IPV == 4 + json_object_string_addf(json_ifp, "nexthop", "%pI4", + &nh_node->gate.ipv4); +#else + json_object_string_addf(json_ifp, "nexthop", "%pI6", + &nh_node->gate.ipv6); +#endif + json_object_array_add(json_arr, json_ifp); + } + return CMD_SUCCESS; +} + int pim_show_nexthop_lookup_cmd_helper(const char *vrf, struct vty *vty, pim_addr source, pim_addr group) { - struct prefix nht_p; int result = 0; pim_addr vif_source; struct prefix grp; @@ -2698,11 +2741,11 @@ int pim_show_nexthop_lookup_cmd_helper(const char *vrf, struct vty *vty, if (!pim_rp_set_upstream_addr(v->info, &vif_source, source, group)) return CMD_SUCCESS; - pim_addr_to_prefix(&nht_p, vif_source); pim_addr_to_prefix(&grp, group); memset(&nexthop, 0, sizeof(nexthop)); - result = pim_ecmp_nexthop_lookup(v->info, &nexthop, &nht_p, &grp, 0); + result = + pim_ecmp_nexthop_lookup(v->info, &nexthop, vif_source, &grp, 0); if (!result) { vty_out(vty, @@ -2718,7 +2761,7 @@ int pim_show_nexthop_lookup_cmd_helper(const char *vrf, struct vty *vty, return CMD_SUCCESS; } -int pim_show_nexthop_cmd_helper(const char *vrf, struct vty *vty) +int pim_show_nexthop_cmd_helper(const char *vrf, struct vty *vty, bool uj) { struct vrf *v; @@ -2727,23 +2770,35 @@ int pim_show_nexthop_cmd_helper(const char *vrf, struct vty *vty) if (!v) return CMD_WARNING; - pim_show_nexthop(v->info, vty); + pim_show_nexthop(v->info, vty, uj); return CMD_SUCCESS; } -void pim_show_nexthop(struct pim_instance *pim, struct vty *vty) +void pim_show_nexthop(struct pim_instance *pim, struct vty *vty, bool uj) { - struct pnc_cache_walk_data cwd; + struct vty_pnc_cache_walk_data cwd; + struct json_pnc_cache_walk_data jcwd; cwd.vty = vty; cwd.pim = pim; - vty_out(vty, "Number of registered addresses: %lu\n", - pim->rpf_hash->count); - vty_out(vty, "Address Interface Nexthop\n"); - vty_out(vty, "---------------------------------------------\n"); + jcwd.pim = pim; + + if (uj) { + jcwd.json_obj = json_object_new_object(); + } else { + vty_out(vty, "Number of registered addresses: %lu\n", + pim->rpf_hash->count); + vty_out(vty, "Address Interface Nexthop\n"); + vty_out(vty, "---------------------------------------------\n"); + } - hash_walk(pim->rpf_hash, pim_print_pnc_cache_walkcb, &cwd); + if (uj) { + hash_walk(pim->rpf_hash, pim_print_json_pnc_cache_walkcb, + &jcwd); + vty_json(vty, jcwd.json_obj); + } else + hash_walk(pim->rpf_hash, pim_print_vty_pnc_cache_walkcb, &cwd); } int pim_show_neighbors_cmd_helper(const char *vrf, struct vty *vty, @@ -4043,7 +4098,7 @@ int pim_show_rpf_helper(const char *vrf, struct vty *vty, bool json) if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4099,7 +4154,7 @@ int pim_show_rp_helper(const char *vrf, struct vty *vty, const char *group_str, if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4170,7 +4225,7 @@ int pim_show_secondary_helper(const char *vrf, struct vty *vty) if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4193,7 +4248,7 @@ int pim_show_statistics_helper(const char *vrf, struct vty *vty, if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4222,7 +4277,7 @@ int pim_show_upstream_helper(const char *vrf, struct vty *vty, pim_addr s_or_g, vty_out(vty, "%% Vrf specified: %s does not exist\n", vrf); return CMD_WARNING; } - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4286,7 +4341,7 @@ int pim_show_upstream_join_desired_helper(const char *vrf, struct vty *vty, if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4308,7 +4363,7 @@ int pim_show_upstream_rpf_helper(const char *vrf, struct vty *vty, bool uj) if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4332,7 +4387,7 @@ int pim_show_state_helper(const char *vrf, struct vty *vty, if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4386,7 +4441,7 @@ int pim_show_multicast_helper(const char *vrf, struct vty *vty) if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4421,7 +4476,7 @@ int pim_show_multicast_count_helper(const char *vrf, struct vty *vty, bool json) if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4478,7 +4533,7 @@ int pim_show_mroute_helper(const char *vrf, struct vty *vty, pim_addr s_or_g, if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4541,7 +4596,7 @@ int pim_show_mroute_count_helper(const char *vrf, struct vty *vty, bool json) if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4597,7 +4652,7 @@ int pim_show_mroute_summary_helper(const char *vrf, struct vty *vty, bool json) if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); @@ -4683,10 +4738,10 @@ void pim_show_interface_traffic(struct pim_instance *pim, struct vty *vty, pim_ifp->pim_ifstat_join_recv); json_object_int_add(json_row, "joinTx", pim_ifp->pim_ifstat_join_send); - json_object_int_add(json_row, "pruneTx", - pim_ifp->pim_ifstat_prune_send); json_object_int_add(json_row, "pruneRx", pim_ifp->pim_ifstat_prune_recv); + json_object_int_add(json_row, "pruneTx", + pim_ifp->pim_ifstat_prune_send); json_object_int_add(json_row, "registerRx", pim_ifp->pim_ifstat_reg_recv); json_object_int_add(json_row, "registerTx", @@ -4833,7 +4888,7 @@ int pim_show_interface_traffic_helper(const char *vrf, const char *if_name, if (!v) return CMD_WARNING; - pim = pim_get_pim_instance(v->vrf_id); + pim = v->info; if (!pim) { vty_out(vty, "%% Unable to find pim instance\n"); |
