diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c index 0f3c0a147e..9640d05f05 100644 --- a/zebra/zebra_nhg.c +++ b/zebra/zebra_nhg.c @@ -845,6 +845,8 @@ static bool zebra_nhe_find(struct nhg_hash_entry **nhe, /* return value */ SET_FLAG(backup_nhe->flags, NEXTHOP_GROUP_RECURSIVE); done: + /* Reset time since last update */ + (*nhe)->uptime = monotime(NULL); return created; } diff --git a/zebra/zebra_nhg.h b/zebra/zebra_nhg.h index 0489f059be..afbf1f6793 100644 --- a/zebra/zebra_nhg.h +++ b/zebra/zebra_nhg.h @@ -51,6 +51,9 @@ struct nhg_hash_entry { afi_t afi; vrf_id_t vrf_id; + /* Time since last update */ + time_t uptime; + /* Source protocol - zebra or another daemon */ int type; diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 283a3e52d6..8061f34d2b 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -445,6 +445,16 @@ static void zebra_show_ip_route_opaque(struct vty *vty, struct route_entry *re, } } +static void uptime2str(time_t uptime, char *buf, size_t bufsize) +{ + time_t cur; + + cur = monotime(NULL); + cur -= uptime; + + frrtime_to_interval(cur, buf, bufsize); +} + /* New RIB. Detailed information for IPv4 route. */ static void vty_show_ip_route_detail(struct vty *vty, struct route_node *rn, int mcast, bool use_fib, bool show_ng) @@ -499,12 +509,7 @@ static void vty_show_ip_route_detail(struct vty *vty, struct route_node *rn, vty_out(vty, ", best"); vty_out(vty, "\n"); - time_t uptime; - - uptime = monotime(NULL); - uptime -= re->uptime; - - frrtime_to_interval(uptime, buf, sizeof(buf)); + uptime2str(re->uptime, buf, sizeof(buf)); vty_out(vty, " Last update %s ago\n", buf); @@ -839,17 +844,13 @@ static void vty_show_ip_route(struct vty *vty, struct route_node *rn, json_object *json_nexthops = NULL; json_object *json_nexthop = NULL; json_object *json_route = NULL; - time_t uptime; const rib_dest_t *dest = rib_dest_from_rnode(rn); const struct nexthop_group *nhg; char up_str[MONOTIME_STRLEN]; bool first_p = true; bool nhg_from_backup = false; - uptime = monotime(NULL); - uptime -= re->uptime; - - frrtime_to_interval(uptime, up_str, sizeof(up_str)); + uptime2str(re->uptime, up_str, sizeof(up_str)); /* If showing fib information, use the fib view of the * nexthops. @@ -1339,9 +1340,13 @@ static void show_nexthop_group_out(struct vty *vty, struct nhg_hash_entry *nhe) struct nexthop *nexthop = NULL; struct nhg_connected *rb_node_dep = NULL; struct nexthop_group *backup_nhg; + char up_str[MONOTIME_STRLEN]; + + uptime2str(nhe->uptime, up_str, sizeof(up_str)); vty_out(vty, "ID: %u (%s)\n", nhe->id, zebra_route_string(nhe->type)); - vty_out(vty, " RefCnt: %d\n", nhe->refcnt); + vty_out(vty, " RefCnt: %u\n", nhe->refcnt); + vty_out(vty, " Uptime: %s\n", up_str); vty_out(vty, " VRF: %s\n", vrf_id_to_name(nhe->vrf_id)); if (CHECK_FLAG(nhe->flags, NEXTHOP_GROUP_VALID)) {