isisd: guard against adj timer display overflow

An adjacency should be removed when the holdtimer expires, but if the
system is overloaded we may end up doing it late. In the meanwhile vtysh
will display an incorrect value in the show isis neighbor output, due to
an overflow of the unsigned variable used to display the Holdtime, e.g.:

pe1# show isis neighbor
Area test:
 System Id     Interface   L   state   Holdtime  SNPA
 Spirent-1     2.201       1   Down    26        2020.2020.2020
 Spirent-1     2.203       1   Up      21        2020.2020.2020
 Spirent-1     2.204       1   Up      18446744073709551615  2020.2020.2020
 Spirent-1     2.207       1   Up      18446744073709551615  2020.2020.2020
 Spirent-1     2.208       1   Up      18446744073709551615  2020.2020.2020
 Spirent-1     2.209       1   Up      0         2020.2020.2020
 Spirent-1     2.210       1   Up      18446744073709551615  2020.2020.2020
 pe2           12.200      1   Up      30        2020.2020.2020

Guard against that by printing an "Expiring" message instead.

Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
This commit is contained in:
Emanuele Di Pascale 2020-09-23 16:46:44 +02:00
parent e4229afd5f
commit 3cbe31c798

View File

@ -465,11 +465,15 @@ void isis_adj_print_vty(struct isis_adjacency *adj, struct vty *vty,
vty_out(vty, "%-3u", adj->level); /* level */ vty_out(vty, "%-3u", adj->level); /* level */
vty_out(vty, "%-13s", adj_state2string(adj->adj_state)); vty_out(vty, "%-13s", adj_state2string(adj->adj_state));
now = time(NULL); now = time(NULL);
if (adj->last_upd) if (adj->last_upd) {
vty_out(vty, "%-9llu", if (adj->last_upd + adj->hold_time
< (unsigned long long)now)
vty_out(vty, " Expiring");
else
vty_out(vty, " %-9llu",
(unsigned long long)adj->last_upd (unsigned long long)adj->last_upd
+ adj->hold_time - now); + adj->hold_time - now);
else } else
vty_out(vty, "- "); vty_out(vty, "- ");
vty_out(vty, "%-10s", snpa_print(adj->snpa)); vty_out(vty, "%-10s", snpa_print(adj->snpa));
vty_out(vty, "\n"); vty_out(vty, "\n");
@ -489,11 +493,15 @@ void isis_adj_print_vty(struct isis_adjacency *adj, struct vty *vty,
vty_out(vty, ", Level: %u", adj->level); /* level */ vty_out(vty, ", Level: %u", adj->level); /* level */
vty_out(vty, ", State: %s", adj_state2string(adj->adj_state)); vty_out(vty, ", State: %s", adj_state2string(adj->adj_state));
now = time(NULL); now = time(NULL);
if (adj->last_upd) if (adj->last_upd) {
vty_out(vty, ", Expires in %s", if (adj->last_upd + adj->hold_time
time2string(adj->last_upd + adj->hold_time < (unsigned long long)now)
- now)); vty_out(vty, " Expiring");
else else
vty_out(vty, ", Expires in %s",
time2string(adj->last_upd
+ adj->hold_time - now));
} else
vty_out(vty, ", Expires in %s", vty_out(vty, ", Expires in %s",
time2string(adj->hold_time)); time2string(adj->hold_time));
vty_out(vty, "\n"); vty_out(vty, "\n");