zebra: Add code to track kernel interactions

Allow zebra to track kernel interactions.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2017-05-18 13:13:32 -04:00
parent eefe02daa1
commit 57282a31cf
5 changed files with 49 additions and 3 deletions

View File

@ -774,6 +774,7 @@ if_nbr_ipv6ll_to_ipv4ll_neigh_update (struct interface *ifp,
struct in6_addr *address, struct in6_addr *address,
int add) int add)
{ {
struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
char buf[16] = "169.254.0.1"; char buf[16] = "169.254.0.1";
struct in_addr ipv4_ll; struct in_addr ipv4_ll;
char mac[6]; 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); ipv6_ll_address_to_mac(address, (u_char *)mac);
kernel_neigh_update (add, ifp->ifindex, ipv4_ll.s_addr, mac, 6); kernel_neigh_update (add, ifp->ifindex, ipv4_ll.s_addr, mac, 6);
zvrf->neigh_updates++;
} }
static void static void

View File

@ -927,6 +927,7 @@ lsp_process (struct work_queue *wq, void *data)
zebra_lsp_t *lsp; zebra_lsp_t *lsp;
zebra_nhlfe_t *oldbest, *newbest; zebra_nhlfe_t *oldbest, *newbest;
char buf[BUFSIZ], buf2[BUFSIZ]; char buf[BUFSIZ], buf2[BUFSIZ];
struct zebra_vrf *zvrf = vrf_info_lookup (VRF_DEFAULT);
lsp = (zebra_lsp_t *)data; lsp = (zebra_lsp_t *)data;
if (!lsp) // unexpected if (!lsp) // unexpected
@ -955,15 +956,24 @@ lsp_process (struct work_queue *wq, void *data)
{ {
/* Not already installed */ /* Not already installed */
if (newbest) if (newbest)
kernel_add_lsp (lsp); {
kernel_add_lsp (lsp);
zvrf->lsp_installs++;
}
} }
else else
{ {
/* Installed, may need an update and/or delete. */ /* Installed, may need an update and/or delete. */
if (!newbest) if (!newbest)
kernel_del_lsp (lsp); {
kernel_del_lsp (lsp);
zvrf->lsp_removals++;
}
else if (CHECK_FLAG (lsp->flags, LSP_FLAG_CHANGED)) else if (CHECK_FLAG (lsp->flags, LSP_FLAG_CHANGED))
kernel_upd_lsp (lsp); {
kernel_upd_lsp (lsp);
zvrf->lsp_installs++;
}
} }
return WQ_SUCCESS; return WQ_SUCCESS;

View 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); rib_table_info_t *info = srcdest_rnode_table_info(rn);
int recursing; int recursing;
struct prefix *p, *src_p; struct prefix *p, *src_p;
struct zebra_vrf *zvrf = vrf_info_lookup (rib->vrf_id);
srcdest_rnode_prefixes (rn, &p, &src_p); 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"); hook_call(rib_update, rn, "installing in kernel");
ret = kernel_route_rib (p, src_p, old, rib); ret = kernel_route_rib (p, src_p, old, rib);
zvrf->installs++;
/* If install succeeds, update FIB flag for nexthops. */ /* If install succeeds, update FIB flag for nexthops. */
if (!ret) 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); rib_table_info_t *info = srcdest_rnode_table_info(rn);
int recursing; int recursing;
struct prefix *p, *src_p; struct prefix *p, *src_p;
struct zebra_vrf *zvrf = vrf_info_lookup (rib->vrf_id);
srcdest_rnode_prefixes (rn, &p, &src_p); 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"); hook_call(rib_update, rn, "uninstalling from kernel");
ret = kernel_route_rib (p, src_p, rib, NULL); ret = kernel_route_rib (p, src_p, rib, NULL);
zvrf->removals++;
for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing)) for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB); UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB);

View File

@ -94,6 +94,13 @@ struct zebra_vrf
/* MPLS processing flags */ /* MPLS processing flags */
u_int16_t mpls_flags; u_int16_t mpls_flags;
#define MPLS_FLAG_SCHEDULE_LSPS (1 << 0) #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 static inline vrf_id_t

View File

@ -2817,6 +2817,28 @@ DEFUN (no_ip_forwarding,
return CMD_SUCCESS; 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. */ /* This command is for debugging purpose. */
DEFUN (show_zebra_client, DEFUN (show_zebra_client,
show_zebra_client_cmd, show_zebra_client_cmd,
@ -3005,6 +3027,7 @@ zebra_init (void)
install_element (VIEW_NODE, &show_ip_forwarding_cmd); install_element (VIEW_NODE, &show_ip_forwarding_cmd);
install_element (CONFIG_NODE, &ip_forwarding_cmd); install_element (CONFIG_NODE, &ip_forwarding_cmd);
install_element (CONFIG_NODE, &no_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_cmd);
install_element (ENABLE_NODE, &show_zebra_client_summary_cmd); install_element (ENABLE_NODE, &show_zebra_client_summary_cmd);