]> git.proxmox.com Git - mirror_frr.git/commitdiff
pimd: Add ability to select join S,G for 'show ip pim join`
authorDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 18 Apr 2019 20:23:02 +0000 (16:23 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 18 Apr 2019 20:36:10 +0000 (16:36 -0400)
Add a bit of code to allow us to look at specified S,G for
the upstream available to us.

If one item is listed we assume Group, if both we assume Source
then Group.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_cmd.c

index b3ae2e7d868a0a8e7f30d632aa00314465b59ef4..110408001f24b20136267461bcbbfab03c91acb9 100644 (file)
@@ -1696,7 +1696,8 @@ static void pim_show_join_helper(struct vty *vty, struct pim_interface *pim_ifp,
        }
 }
 
-static void pim_show_join(struct pim_instance *pim, struct vty *vty, bool uj)
+static void pim_show_join(struct pim_instance *pim, struct vty *vty,
+                         struct prefix_sg *sg, bool uj)
 {
        struct pim_interface *pim_ifp;
        struct pim_ifchannel *ch;
@@ -1718,6 +1719,12 @@ static void pim_show_join(struct pim_instance *pim, struct vty *vty, bool uj)
                        continue;
 
                RB_FOREACH (ch, pim_ifchannel_rb, &pim_ifp->ifchannel_rb) {
+                       if (sg->grp.s_addr != 0
+                           && sg->grp.s_addr != ch->sg.grp.s_addr)
+                               continue;
+                       if (sg->src.s_addr != 0
+                           && sg->src.s_addr != ch->sg.src.s_addr)
+                       continue;
                        pim_show_join_helper(vty, pim_ifp, ch, json, now, uj);
                } /* scan interface channels */
        }
@@ -3782,24 +3789,45 @@ DEFUN (show_ip_pim_interface_vrf_all,
        return CMD_SUCCESS;
 }
 
-DEFUN (show_ip_pim_join,
+DEFPY (show_ip_pim_join,
        show_ip_pim_join_cmd,
-       "show ip pim [vrf NAME] join [json]",
+       "show ip pim [vrf NAME] join [A.B.C.D$s_or_g [A.B.C.D$g]] [json$json]",
        SHOW_STR
        IP_STR
        PIM_STR
        VRF_CMD_HELP_STR
        "PIM interface join information\n"
+       "The Source or Group\n"
+       "The Group\n"
        JSON_STR)
 {
-       int idx = 2;
-       struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
-       bool uj = use_json(argc, argv);
+       struct prefix_sg sg = {0};
+       struct vrf *v;
+       bool uj = !!json;
+       struct pim_instance *pim;
 
-       if (!vrf)
+       v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+       if (!v) {
+               vty_out(vty, "%% Vrf specified: %s does not exist\n", vrf);
                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;
+       }
+
+       if (s_or_g.s_addr != 0) {
+               if (g.s_addr != 0) {
+                       sg.src = s_or_g;
+                       sg.grp = g;
+               } else
+                       sg.grp = s_or_g;
+       }
 
-       pim_show_join(vrf->info, vty, uj);
+       pim_show_join(pim, vty, &sg, uj);
 
        return CMD_SUCCESS;
 }
@@ -3814,6 +3842,7 @@ DEFUN (show_ip_pim_join_vrf_all,
        "PIM interface join information\n"
        JSON_STR)
 {
+       struct prefix_sg sg = {0};
        bool uj = use_json(argc, argv);
        struct vrf *vrf;
        bool first = true;
@@ -3828,7 +3857,7 @@ DEFUN (show_ip_pim_join_vrf_all,
                        first = false;
                } else
                        vty_out(vty, "VRF: %s\n", vrf->name);
-               pim_show_join(vrf->info, vty, uj);
+               pim_show_join(vrf->info, vty, &sg, uj);
        }
        if (uj)
                vty_out(vty, "}\n");