bgpd: improve "monotonic" uptime correction
Older versions of Quagga/Zebra would output a value in MRT table
dump files for "uptime" aka "ORIGINATED" that was a WALL clock
value. Given that uptime is now internally a bgp_clock MONOTONIC
value, the output in the MRT files is showing up as monotonic.
Note: time of MRT dump is still recorded correctly as a
time() based value, so we haven't lost that value.
Proposal is to correct the uptime output on the vty and in the
MRT files to again display something more akin to WALL time.
* bgp_dump.c: (bgp_dump_routes_func) add conditional correction
* bgp_route.c: (route_vty_out_detail) make correction conditional, move
variable declaration to beginning of the function
diff --git a/bgpd/bgp_dump.c b/bgpd/bgp_dump.c
index 8087a40..edb725a 100644
--- a/bgpd/bgp_dump.c
+++ b/bgpd/bgp_dump.c
@@ -356,7 +356,11 @@
stream_putw(obuf, info->peer->table_dump_index);
/* Originated */
+#ifdef HAVE_CLOCK_MONOTONIC
+ stream_putl (obuf, time(NULL) - (bgp_clock() - info->uptime));
+#else
stream_putl (obuf, info->uptime);
+#endif /* HAVE_CLOCK_MONOTONIC */
/* Dump attribute. */
/* Skip prefix & AFI/SAFI for MP_NLRI */
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index cf8e211..b771633 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -5799,6 +5799,9 @@
char buf1[BUFSIZ];
struct attr *attr;
int sockunion_vty_out (struct vty *, union sockunion *);
+#ifdef HAVE_CLOCK_MONOTONIC
+ time_t tbuf;
+#endif
attr = binfo->attr;
@@ -5954,8 +5957,12 @@
bgp_damp_info_vty (vty, binfo);
/* Line 7 display Uptime */
- time_t tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
+#ifdef HAVE_CLOCK_MONOTONIC
+ tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
vty_out (vty, " Last update: %s", ctime(&tbuf));
+#else
+ vty_out (vty, " Last update: %s", ctime(&binfo->uptime));
+#endif /* HAVE_CLOCK_MONOTONIC */
}
vty_out (vty, "%s", VTY_NEWLINE);
}