]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: Add code to track kernel interactions
authorDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 18 May 2017 17:13:32 +0000 (13:13 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 18 May 2017 17:14:18 +0000 (13:14 -0400)
Allow zebra to track kernel interactions.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
zebra/interface.c
zebra/zebra_mpls.c
zebra/zebra_rib.c
zebra/zebra_vrf.h
zebra/zserv.c

index 7b0d31338d96dea3a2830a62a931623919bdd74c..c60cb8dcbca9318437ffea96db253ba787ad93ae 100644 (file)
@@ -774,6 +774,7 @@ if_nbr_ipv6ll_to_ipv4ll_neigh_update (struct interface *ifp,
                                       struct in6_addr *address,
                                       int add)
 {
+  struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
   char buf[16] = "169.254.0.1";
   struct in_addr ipv4_ll;
   char mac[6];
@@ -782,6 +783,7 @@ if_nbr_ipv6ll_to_ipv4ll_neigh_update (struct interface *ifp,
 
   ipv6_ll_address_to_mac(address, (u_char *)mac);
   kernel_neigh_update (add, ifp->ifindex, ipv4_ll.s_addr, mac, 6);
+  zvrf->neigh_updates++;
 }
 
 static void
index d7589fda7350e5837a96f47dbdeea719ab3fb727..b547c62566dc25fc04debb8a27854e355413fcd9 100644 (file)
@@ -927,6 +927,7 @@ lsp_process (struct work_queue *wq, void *data)
   zebra_lsp_t *lsp;
   zebra_nhlfe_t *oldbest, *newbest;
   char buf[BUFSIZ], buf2[BUFSIZ];
+  struct zebra_vrf *zvrf = vrf_info_lookup (VRF_DEFAULT);
 
   lsp = (zebra_lsp_t *)data;
   if (!lsp) // unexpected
@@ -955,15 +956,24 @@ lsp_process (struct work_queue *wq, void *data)
     {
       /* Not already installed */
       if (newbest)
-        kernel_add_lsp (lsp);
+        {
+          kernel_add_lsp (lsp);
+          zvrf->lsp_installs++;
+        }
     }
   else
     {
       /* Installed, may need an update and/or delete. */
       if (!newbest)
-        kernel_del_lsp (lsp);
+        {
+          kernel_del_lsp (lsp);
+          zvrf->lsp_removals++;
+        }
       else if (CHECK_FLAG (lsp->flags, LSP_FLAG_CHANGED))
-        kernel_upd_lsp (lsp);
+        {
+          kernel_upd_lsp (lsp);
+          zvrf->lsp_installs++;
+        }
     }
 
   return WQ_SUCCESS;
index 12ee9961d58caa5c00c268cf163d4ada6afeb153..5f457a6fc5d324909b48c4712584c56d7c788471 100644 (file)
@@ -1114,6 +1114,7 @@ rib_install_kernel (struct route_node *rn, struct rib *rib, struct rib *old)
   rib_table_info_t *info = srcdest_rnode_table_info(rn);
   int recursing;
   struct prefix *p, *src_p;
+  struct zebra_vrf *zvrf = vrf_info_lookup (rib->vrf_id);
 
   srcdest_rnode_prefixes (rn, &p, &src_p);
 
@@ -1130,6 +1131,7 @@ rib_install_kernel (struct route_node *rn, struct rib *rib, struct rib *old)
    */
   hook_call(rib_update, rn, "installing in kernel");
   ret = kernel_route_rib (p, src_p, old, rib);
+  zvrf->installs++;
 
   /* If install succeeds, update FIB flag for nexthops. */
   if (!ret)
@@ -1158,6 +1160,7 @@ rib_uninstall_kernel (struct route_node *rn, struct rib *rib)
   rib_table_info_t *info = srcdest_rnode_table_info(rn);
   int recursing;
   struct prefix *p, *src_p;
+  struct zebra_vrf *zvrf = vrf_info_lookup (rib->vrf_id);
 
   srcdest_rnode_prefixes (rn, &p, &src_p);
 
@@ -1174,6 +1177,7 @@ rib_uninstall_kernel (struct route_node *rn, struct rib *rib)
    */
   hook_call(rib_update, rn, "uninstalling from kernel");
   ret = kernel_route_rib (p, src_p, rib, NULL);
+  zvrf->removals++;
 
   for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
     UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB);
index df25fad947631183a1a00bb1776a18425b2ebaa7..790e2e53d28f587241cd94b5fceddfe72d6af47c 100644 (file)
@@ -94,6 +94,13 @@ struct zebra_vrf
   /* MPLS processing flags */
   u_int16_t mpls_flags;
 #define MPLS_FLAG_SCHEDULE_LSPS    (1 << 0)
+
+  /* Route Installs */
+  uint64_t installs;
+  uint64_t removals;
+  uint64_t neigh_updates;
+  uint64_t lsp_installs;
+  uint64_t lsp_removals;
 };
 
 static inline vrf_id_t
index 76c0756adad77cc892446a91432004d093039f2f..0a33b166cd0f9614de69653a7cf53aa875a0a0d4 100644 (file)
@@ -2817,6 +2817,28 @@ DEFUN (no_ip_forwarding,
   return CMD_SUCCESS;
 }
 
+DEFUN (show_zebra,
+       show_zebra_cmd,
+       "show zebra",
+       SHOW_STR
+       "Zebra information\n")
+{
+  struct vrf *vrf;
+
+  vty_out (vty, "                            Route      Route      Neighbor   LSP        LSP%s", VTY_NEWLINE);
+  vty_out (vty, "VRF                         Installs   Removals    Updates   Installs   Removals%s", VTY_NEWLINE);
+  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
+    {
+      struct zebra_vrf *zvrf = vrf->info;
+      vty_out (vty,"%-25s %10ld %10ld %10ld %10ld %10ld%s",
+               vrf->name, zvrf->installs, zvrf->removals,
+               zvrf->neigh_updates, zvrf->lsp_installs, zvrf->lsp_removals,
+               VTY_NEWLINE);
+    }
+
+  return CMD_SUCCESS;
+}
+
 /* This command is for debugging purpose. */
 DEFUN (show_zebra_client,
        show_zebra_client_cmd,
@@ -3005,6 +3027,7 @@ zebra_init (void)
   install_element (VIEW_NODE, &show_ip_forwarding_cmd);
   install_element (CONFIG_NODE, &ip_forwarding_cmd);
   install_element (CONFIG_NODE, &no_ip_forwarding_cmd);
+  install_element (ENABLE_NODE, &show_zebra_cmd);
   install_element (ENABLE_NODE, &show_zebra_client_cmd);
   install_element (ENABLE_NODE, &show_zebra_client_summary_cmd);