From ae616d60b5d6469fd9eca61e85dff17b05f67694 Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Thu, 7 Apr 2016 16:43:43 -0300 Subject: [PATCH 1/2] lib: use constant to replace magic value for length of quagga_timestamp Signed-off-by: Christian Franke Acked-by: Jafar Al-Gharaibeh --- lib/log.h | 3 ++- lib/vty.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/log.h b/lib/log.h index 1466e3becf..e09d747ee2 100644 --- a/lib/log.h +++ b/lib/log.h @@ -171,6 +171,7 @@ extern void zlog_backtrace_sigsafe(int priority, void *program_counter); It caches the most recent localtime result and can therefore avoid multiple calls within the same second. If buflen is too small, *buf will be set to '\0', and 0 will be returned. */ +#define QUAGGA_TIMESTAMP_LEN 40 extern size_t quagga_timestamp(int timestamp_precision /* # subsecond digits */, char *buf, size_t buflen); @@ -181,7 +182,7 @@ struct timestamp_control { size_t len; /* length of rendered timestamp */ int precision; /* configuration parameter */ int already_rendered; /* should be initialized to 0 */ - char buf[40]; /* will contain the rendered timestamp */ + char buf[QUAGGA_TIMESTAMP_LEN]; /* will contain the rendered timestamp */ }; /* Defines for use in command construction: */ diff --git a/lib/vty.c b/lib/vty.c index ae3e595364..13b8b3019f 100644 --- a/lib/vty.c +++ b/lib/vty.c @@ -208,7 +208,7 @@ vty_log_out (struct vty *vty, const char *level, const char *proto_str, void vty_time_print (struct vty *vty, int cr) { - char buf [25]; + char buf[QUAGGA_TIMESTAMP_LEN]; if (quagga_timestamp(0, buf, sizeof(buf)) == 0) { From 55ce4d3addcc1ba24c0c1fe2491a7aeb17a37137 Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Thu, 7 Apr 2016 16:43:44 -0300 Subject: [PATCH 2/2] zebra: count iface up/down events and keep last time of their occurrence 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 Acked-by: Jafar Al-Gharaibeh --- zebra/interface.c | 17 +++++++++++++++++ zebra/interface.h | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/zebra/interface.c b/zebra/interface.c index 38fe6988eb..9b6c04c294 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -835,6 +835,12 @@ if_down_del_nbr_connected (struct interface *ifp) void if_up (struct interface *ifp) { + struct zebra_if *zif; + + zif = ifp->info; + zif->up_count++; + quagga_timestamp (2, zif->up_last, sizeof (zif->up_last)); + /* Notify the protocol daemons. */ if (ifp->ptm_enable && (ifp->ptm_status == ZEBRA_PTM_STATUS_DOWN)) { zlog_warn("%s: interface %s hasn't passed ptm check\n", __func__, @@ -859,6 +865,12 @@ if_up (struct interface *ifp) void if_down (struct interface *ifp) { + 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); @@ -1035,6 +1047,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); + zebra_ptm_show_status(vty, ifp); vrf = vrf_lookup(ifp->vrf_id); diff --git a/zebra/interface.h b/zebra/interface.h index ed51507763..8e8387eaf4 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -189,6 +189,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 /* HAVE_RTADV */