From: Christian Franke <[email protected]>

It is quite useful to be able to assert whether specific interfaces have
flapped or also to verify that specific interfaces have not flapped.

By having counters for those events and storing the last time of their
occurrence, this is made possible.

Signed-off-by: Christian Franke <[email protected]>
---
 zebra/interface.c | 15 +++++++++++++++
 zebra/interface.h |  6 ++++++
 2 files changed, 21 insertions(+)

diff --git a/zebra/interface.c b/zebra/interface.c
index 8a9225a..ab0dfb5 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -536,6 +536,11 @@ if_up (struct interface *ifp)
   struct listnode *next;
   struct connected *ifc;
   struct prefix *p;
+  struct zebra_if *zif;
+
+  zif = ifp->info;
+  zif->up_count++;
+  quagga_timestamp(2, zif->up_last, sizeof(zif->up_last));
 
   /* Notify the protocol daemons. */
   zebra_interface_up_update (ifp);
@@ -569,6 +574,11 @@ if_down (struct interface *ifp)
   struct listnode *next;
   struct connected *ifc;
   struct prefix *p;
+  struct zebra_if *zif;
+
+  zif = ifp->info;
+  zif->down_count++;
+  quagga_timestamp(2, zif->down_last, sizeof(zif->down_last));
 
   /* Notify to the protocol daemons. */
   zebra_interface_down_update (ifp);
@@ -728,6 +738,11 @@ if_dump_vty (struct vty *vty, struct interface *ifp)
     vty_out (vty, "down%s", VTY_NEWLINE);
   }
 
+  vty_out (vty, "  Link ups:   %5u    last: %s%s", zebra_if->up_count,
+           zebra_if->up_last[0] ? zebra_if->up_last : "(never)", VTY_NEWLINE);
+  vty_out (vty, "  Link downs: %5u    last: %s%s", zebra_if->down_count,
+           zebra_if->down_last[0] ? zebra_if->down_last : "(never)", 
VTY_NEWLINE);
+
   vty_out (vty, "  vrf: %u%s", ifp->vrf_id, VTY_NEWLINE);
 
   if (ifp->desc)
diff --git a/zebra/interface.h b/zebra/interface.h
index dbb33c5..a7522bc 100644
--- a/zebra/interface.h
+++ b/zebra/interface.h
@@ -188,6 +188,12 @@ struct zebra_if
   /* Installed addresses chains tree. */
   struct route_table *ipv4_subnets;
 
+  /* Information about up/down changes */
+  unsigned int up_count;
+  char up_last[QUAGGA_TIMESTAMP_LEN];
+  unsigned int down_count;
+  char down_last[QUAGGA_TIMESTAMP_LEN];
+
 #if defined(HAVE_RTADV)
   struct rtadvconf rtadv;
 #endif /* RTADV */
-- 
2.7.4


_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to