From b1a419baef33492752823f35fe8bdb0e68df151d Mon Sep 17 00:00:00 2001 From: Abhishek N R Date: Mon, 14 Feb 2022 23:42:40 -0800 Subject: [PATCH] pim6d: Implementing "show ipv6 pim upstream-rpf" CLI. Adding new show CLI to display pim RPF for upstreams. Signed-off-by: Abhishek N R --- pimd/pim6_cmd.c | 32 +++++++++++ pimd/pim_cmd.c | 23 +++++--- pimd/pim_cmd_common.c | 129 ++++++++++++++++++++++-------------------- 3 files changed, 115 insertions(+), 69 deletions(-) diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c index 631eb95e30..dbe9296073 100644 --- a/pimd/pim6_cmd.c +++ b/pimd/pim6_cmd.c @@ -963,6 +963,37 @@ DEFPY (show_ipv6_pim_upstream_join_desired, return CMD_SUCCESS; } +DEFPY (show_ipv6_pim_upstream_rpf, + show_ipv6_pim_upstream_rpf_cmd, + "show ipv6 pim [vrf NAME] upstream-rpf [json$json]", + SHOW_STR + IPV6_STR + PIM_STR + VRF_CMD_HELP_STR + "PIM upstream source rpf\n" + JSON_STR) +{ + struct pim_instance *pim; + struct vrf *v; + bool uj = !!json; + + v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME); + + if (!v) + return CMD_WARNING; + + pim = pim_get_pim_instance(v->vrf_id); + + if (!pim) { + vty_out(vty, "%% Unable to find pim instance\n"); + return CMD_WARNING; + } + + pim_show_upstream_rpf(pim, vty, uj); + + return CMD_SUCCESS; +} + void pim_cmd_init(void) { if_cmd_init(pim_interface_config_write); @@ -1024,4 +1055,5 @@ void pim_cmd_init(void) install_element(VIEW_NODE, &show_ipv6_pim_upstream_cmd); install_element(VIEW_NODE, &show_ipv6_pim_upstream_vrf_all_cmd); install_element(VIEW_NODE, &show_ipv6_pim_upstream_join_desired_cmd); + install_element(VIEW_NODE, &show_ipv6_pim_upstream_rpf_cmd); } diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 3f77b0cd65..cc113a4520 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -4540,9 +4540,9 @@ DEFPY (show_ip_pim_upstream_join_desired, return CMD_SUCCESS; } -DEFUN (show_ip_pim_upstream_rpf, +DEFPY (show_ip_pim_upstream_rpf, show_ip_pim_upstream_rpf_cmd, - "show ip pim [vrf NAME] upstream-rpf [json]", + "show ip pim [vrf NAME] upstream-rpf [json$json]", SHOW_STR IP_STR PIM_STR @@ -4550,14 +4550,23 @@ DEFUN (show_ip_pim_upstream_rpf, "PIM upstream source rpf\n" JSON_STR) { - int idx = 2; - struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx); - bool uj = use_json(argc, argv); + struct pim_instance *pim; + struct vrf *v; + bool uj = !!json; - if (!vrf) + v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME); + + if (!v) + return CMD_WARNING; + + pim = pim_get_pim_instance(v->vrf_id); + + if (!pim) { + vty_out(vty, "%% Unable to find pim instance\n"); return CMD_WARNING; + } - pim_show_upstream_rpf(vrf->info, vty, uj); + pim_show_upstream_rpf(pim, vty, uj); return CMD_SUCCESS; } diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index 06f590ad92..ad2f474789 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -674,62 +674,64 @@ bool pim_sgaddr_match(pim_sgaddr item, pim_sgaddr match) void json_object_pim_upstream_add(json_object *json, struct pim_upstream *up) { - if (up->flags & PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) - json_object_boolean_true_add(json, "drJoinDesired"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) - json_object_boolean_true_add(json, "drJoinDesiredUpdated"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_FHR) - json_object_boolean_true_add(json, "firstHopRouter"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) - json_object_boolean_true_add(json, "sourceIgmp"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_PIM) - json_object_boolean_true_add(json, "sourcePim"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) - json_object_boolean_true_add(json, "sourceStream"); - + json_object_boolean_add( + json, "drJoinDesired", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED)); + json_object_boolean_add( + json, "drJoinDesiredUpdated", + CHECK_FLAG(up->flags, + PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED)); + json_object_boolean_add( + json, "firstHopRouter", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_FHR)); + json_object_boolean_add( + json, "sourceIgmp", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_SRC_IGMP)); + json_object_boolean_add( + json, "sourcePim", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_SRC_PIM)); + json_object_boolean_add( + json, "sourceStream", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_SRC_STREAM)); /* XXX: need to print ths flag in the plain text display as well */ - if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_MSDP) - json_object_boolean_true_add(json, "sourceMsdp"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE) - json_object_boolean_true_add(json, "sendSGRptPrune"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_LHR) - json_object_boolean_true_add(json, "lastHopRouter"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY) - json_object_boolean_true_add(json, "disableKATExpiry"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_STATIC_IIF) - json_object_boolean_true_add(json, "staticIncomingInterface"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL) - json_object_boolean_true_add(json, - "allowIncomingInterfaceinOil"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA) - json_object_boolean_true_add(json, "noPimRegistrationData"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_FORCE_PIMREG) - json_object_boolean_true_add(json, "forcePimRegistration"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG) - json_object_boolean_true_add(json, "sourceVxlanOrigination"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM) - json_object_boolean_true_add(json, "sourceVxlanTermination"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN) - json_object_boolean_true_add(json, "mlagVxlan"); - - if (up->flags & PIM_UPSTREAM_FLAG_MASK_MLAG_NON_DF) - json_object_boolean_true_add(json, - "mlagNonDesignatedForwarder"); + json_object_boolean_add( + json, "sourceMsdp", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_SRC_MSDP)); + json_object_boolean_add( + json, "sendSGRptPrune", + CHECK_FLAG(up->flags, + PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE)); + json_object_boolean_add( + json, "lastHopRouter", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_SRC_LHR)); + json_object_boolean_add( + json, "disableKATExpiry", + CHECK_FLAG(up->flags, + PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY)); + json_object_boolean_add( + json, "staticIncomingInterface", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_STATIC_IIF)); + json_object_boolean_add( + json, "allowIncomingInterfaceinOil", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL)); + json_object_boolean_add( + json, "noPimRegistrationData", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA)); + json_object_boolean_add( + json, "forcePimRegistration", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_FORCE_PIMREG)); + json_object_boolean_add( + json, "sourceVxlanOrigination", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG)); + json_object_boolean_add( + json, "sourceVxlanTermination", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM)); + json_object_boolean_add( + json, "mlagVxlan", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN)); + json_object_boolean_add( + json, "mlagNonDesignatedForwarder", + CHECK_FLAG(up->flags, PIM_UPSTREAM_FLAG_MASK_MLAG_NON_DF)); } static const char * @@ -1473,8 +1475,6 @@ 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 src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; char rpf_nexthop_str[PREFIX_STRLEN]; char rpf_addr_str[PREFIX_STRLEN]; struct pim_rpf *rpf; @@ -1482,8 +1482,6 @@ void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, bool uj) rpf = &up->rpf; - pim_inet4_dump("", up->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("", up->sg.grp, grp_str, sizeof(grp_str)); pim_addr_dump("", &rpf->source_nexthop.mrib_nexthop_addr, rpf_nexthop_str, sizeof(rpf_nexthop_str)); @@ -1496,6 +1494,13 @@ void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, bool uj) : ""; if (uj) { + char grp_str[PIM_ADDRSTRLEN]; + char src_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", + &up->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", + &up->sg.src); json_object_object_get_ex(json, grp_str, &json_group); if (!json_group) { @@ -1516,9 +1521,9 @@ void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, bool uj) rpf_addr_str); json_object_object_add(json_group, src_str, json_row); } else { - vty_out(vty, "%-15s %-15s %-16s %-15s %-15s\n", src_str, - grp_str, rpf_ifname, rpf_nexthop_str, - rpf_addr_str); + vty_out(vty, "%-15pPAs %-15pPAs %-16s %-15s %-15s\n", + &up->sg.src, &up->sg.grp, rpf_ifname, + rpf_nexthop_str, rpf_addr_str); } } -- 2.39.5