]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pim6d: Implementing "show ipv6 pim upstream-rpf" CLI.
authorAbhishek N R <abnr@vmware.com>
Tue, 15 Feb 2022 07:42:40 +0000 (23:42 -0800)
committerAbhishek N R <abnr@vmware.com>
Tue, 29 Mar 2022 06:53:24 +0000 (23:53 -0700)
Adding new show CLI to display pim RPF for upstreams.

Signed-off-by: Abhishek N R <abnr@vmware.com>
pimd/pim6_cmd.c
pimd/pim_cmd.c
pimd/pim_cmd_common.c

index 631eb95e30bdef475dd813bdf390196d49248484..dbe9296073453d5628d901cbb3bc3edce36bec0d 100644 (file)
@@ -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);
 }
index 3f77b0cd653f439ebf84e1b77257cfa1eaeb26a5..cc113a452063096b731171d2b091138b00fa537e 100644 (file)
@@ -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;
 }
index 06f590ad9213566cf9403ef3f626dbd59ad94da5..ad2f474789953a5ec7142dc139a3f3e450ea6d46 100644 (file)
@@ -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("<src?>", up->sg.src, src_str, sizeof(src_str));
-               pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str));
                pim_addr_dump("<nexthop?>",
                              &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)
                                                      : "<ifname?>";
 
                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);
                }
        }