summaryrefslogtreecommitdiff
path: root/pimd/pim_cmd_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_cmd_common.c')
-rw-r--r--pimd/pim_cmd_common.c167
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");