]> git.proxmox.com Git - mirror_frr.git/commitdiff
vrrpd: add 'show vrrp summary' command
authorQuentin Young <qlyoung@cumulusnetworks.com>
Thu, 2 May 2019 15:53:58 +0000 (15:53 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Fri, 17 May 2019 00:27:08 +0000 (00:27 +0000)
Shows a brief summary table of all VRRP routers

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
vrrpd/vrrp_vty.c

index 9cd1be245e3931b8c99ac1feaddf8628252c273f..b14efc33e7380cc5ace10b41b72702717e0de4e3 100644 (file)
@@ -572,6 +572,23 @@ static void vrrp_show(struct vty *vty, struct vrrp_vrouter *vr)
        ttable_del(tt);
 }
 
+/*
+ * Sort comparator, used when sorting VRRP instances for display purposes.
+ *
+ * Sorts by interface name first, then by VRID ascending.
+ */
+static int vrrp_instance_display_sort_cmp(const void **d1, const void **d2)
+{
+       const struct vrrp_vrouter *vr1 = *d1;
+       const struct vrrp_vrouter *vr2 = *d2;
+       int result;
+
+       result = strcmp(vr1->ifp->name, vr2->ifp->name);
+       result += !result * (vr1->vrid - vr2->vrid);
+
+       return result;
+}
+
 /* clang-format off */
 
 DEFPY(vrrp_vrid_show,
@@ -589,6 +606,8 @@ DEFPY(vrrp_vrid_show,
        struct list *ll = hash_to_list(vrrp_vrouters_hash);
        struct json_object *j = json_object_new_array();
 
+       list_sort(ll, vrrp_instance_display_sort_cmp);
+
        for (ALL_LIST_ELEMENTS_RO(ll, ln, vr)) {
                if (ifn && !strmatch(ifn, vr->ifp->name))
                        continue;
@@ -613,6 +632,55 @@ DEFPY(vrrp_vrid_show,
        return CMD_SUCCESS;
 }
 
+DEFPY(vrrp_vrid_show_summary,
+      vrrp_vrid_show_summary_cmd,
+      "show vrrp [interface INTERFACE$ifn] [(1-255)$vrid] summary",
+      SHOW_STR
+      VRRP_STR
+      INTERFACE_STR
+      "Only show VRRP instances on this interface\n"
+      VRRP_VRID_STR
+      "Summarize all VRRP instances\n")
+{
+       struct vrrp_vrouter *vr;
+       struct listnode *ln;
+       struct list *ll = hash_to_list(vrrp_vrouters_hash);
+
+       list_sort(ll, vrrp_instance_display_sort_cmp);
+
+       struct ttable *tt = ttable_new(&ttable_styles[TTSTYLE_BLANK]);
+
+       ttable_add_row(
+               tt, "Interface|VRID|Priority|IPv4|IPv6|State (v4)|State (v6)");
+       ttable_rowseps(tt, 0, BOTTOM, true, '-');
+
+       for (ALL_LIST_ELEMENTS_RO(ll, ln, vr)) {
+               if (ifn && !strmatch(ifn, vr->ifp->name))
+                       continue;
+               if (vrid && ((uint8_t)vrid) != vr->vrid)
+                       continue;
+
+               ttable_add_row(
+                       tt, "%s|%" PRIu8 "|%" PRIu8 "|%d|%d|%s|%s",
+                       vr->ifp->name, vr->vrid, vr->priority,
+                       vr->v4->addrs->count, vr->v6->addrs->count,
+                       vr->v4->fsm.state == VRRP_STATE_MASTER ? "Master"
+                                                              : "Backup",
+                       vr->v6->fsm.state == VRRP_STATE_MASTER ? "Master"
+                                                              : "Backup");
+       }
+
+       char *table = ttable_dump(tt, "\n");
+
+       vty_out(vty, "\n%s\n", table);
+       XFREE(MTYPE_TMP, table);
+       ttable_del(tt);
+
+       list_delete(&ll);
+
+       return CMD_SUCCESS;
+}
+
 
 DEFPY(debug_vrrp,
       debug_vrrp_cmd,
@@ -667,6 +735,7 @@ void vrrp_vty_init(void)
        if_cmd_init();
 
        install_element(VIEW_NODE, &vrrp_vrid_show_cmd);
+       install_element(VIEW_NODE, &vrrp_vrid_show_summary_cmd);
        install_element(VIEW_NODE, &show_debugging_vrrp_cmd);
        install_element(VIEW_NODE, &debug_vrrp_cmd);
        install_element(CONFIG_NODE, &debug_vrrp_cmd);