summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Jakma <paul.jakma@sun.com>2006-07-11 17:57:25 +0000
committerPaul Jakma <paul.jakma@sun.com>2006-07-11 17:57:25 +0000
commit90c33177f53ae36a8765f5f27bf34a90663806d3 (patch)
tree1439091ac03207b7cbe204c4fc57ea821144fba2
parent3d63f38064f646129ddc67410cfdbbee8538f5cc (diff)
[ospfd] record timestamp and event of last NSM state change for neighbour
2006-07-10 Paul Jakma <paul.jakma@sun.com> * ospf_nsm.c: (ospf_nsm_event) Record state change timestamp and event in nbr struct. * ospf_neighbor.h: (struct ospf_neighbor) Add fields to record timestamp of last NSM change and event. * ospf_vty.c: (show_ip_ospf_neighbor_detail_sub) Print last state change timestamp and event, if available.
-rw-r--r--ospfd/ChangeLog5
-rw-r--r--ospfd/ospf_neighbor.h2
-rw-r--r--ospfd/ospf_nsm.c3
-rw-r--r--ospfd/ospf_vty.c9
4 files changed, 18 insertions, 1 deletions
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index 79bb2bd1..1564bdbf 100644
--- a/ospfd/ChangeLog
+++ b/ospfd/ChangeLog
@@ -22,6 +22,11 @@
(ospf_nsm_event) call nsm_notice_state_changes from here.
Move the debug message to entry of function, so it gets out
even if something goes wrong.
+ Record state change timestamp and event in nbr struct.
+ * ospf_neighbor.h: (struct ospf_neighbor) Add fields to record
+ timestamp of last NSM change and event.
+ * ospf_vty.c: (show_ip_ospf_neighbor_detail_sub) Print
+ last state change timestamp and event, if available.
2006-07-10 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
diff --git a/ospfd/ospf_neighbor.h b/ospfd/ospf_neighbor.h
index cbfbc2d8..9b7ff36e 100644
--- a/ospfd/ospf_neighbor.h
+++ b/ospfd/ospf_neighbor.h
@@ -82,6 +82,8 @@ struct ospf_neighbor
/* Statistics Field */
u_int32_t state_change;
+ struct timeval ts_last_change;
+ const char *last_event_str;
struct ospf_nbr_nbma *nbr_nbma;
};
diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c
index 1b4116d9..ff0a52d0 100644
--- a/ospfd/ospf_nsm.c
+++ b/ospfd/ospf_nsm.c
@@ -615,6 +615,9 @@ nsm_notice_state_change (struct ospf_neighbor *nbr, int next_state, int event)
LOOKUP (ospf_nsm_state_msg, next_state),
ospf_nsm_event_str [event]);
+ nbr->ts_last_change = recent_time;
+ nbr->last_event_str = ospf_nsm_event_str [event];
+
#ifdef HAVE_SNMP
/* Terminal state or regression */
if ((next_state == NSM_Full)
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index ec002017..44049d8c 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -3155,7 +3155,14 @@ show_ip_ospf_neighbor_detail_sub (struct vty *vty, struct ospf_interface *oi,
nbr->priority, LOOKUP (ospf_nsm_state_msg, nbr->state));
/* Show state changes. */
vty_out (vty, " %d state changes%s", nbr->state_change, VTY_NEWLINE);
-
+ if (nbr->ts_last_change.tv_sec || nbr->ts_last_change.tv_usec)
+ {
+ struct timeval res = tv_sub (recent_time, nbr->ts_last_change);
+ vty_out (vty, " Last state change %s ago, due to %s%s",
+ ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
+ (nbr->last_event_str ? nbr->last_event_str : "??"),
+ VTY_NEWLINE);
+ }
/* Show Designated Rotuer ID. */
vty_out (vty, " DR is %s,", inet_ntoa (nbr->d_router));
/* Show Backup Designated Rotuer ID. */