[ospfd] Remove nsm_reset_nbr and a bunch of useless NSM event/action functions

2006-07-10 Paul Jakma <paul.jakma@sun.com>

	* ospf_nsm.c: (nsm_change_state) call nsm_clear_adj for all
	  adjacency losses, hence removing need for nsm_reset_nbr.
	  (nsm_reset_nbr) kill it, clear_adj in previous does fine.
	  (nsm_kill_nbr,nsm_start) remove nsm_reset_nbr call.
	  (ospf_nsm_event) Allow NSM function to be NULL, this along with
	  removal of nsm_reset_nbr, allows a bunch of now useless functiosn
	  to be removed.
	  Remove some useless variables.
	  (nsm_ignore) now useless, remove.
	  (nsm_bad_ls_req) ditto
	  (nsm_seq_number_mismatch)   "
	  (nsm_oneway_received)       "
	  (nsm_inactivity_timer)      "
	  (nsm_ll_down)               "
	  (NSM) replace removed action functions with NULL.
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index 1bc3232..e84a470 100644
--- a/ospfd/ChangeLog
+++ b/ospfd/ChangeLog
@@ -1,3 +1,21 @@
+2006-07-10 Paul Jakma <paul.jakma@sun.com>
+
+	* ospf_nsm.c: (nsm_change_state) call nsm_clear_adj for all
+	  adjacency losses, hence removing need for nsm_reset_nbr.
+	  (nsm_reset_nbr) kill it, clear_adj in previous does fine.
+	  (nsm_kill_nbr,nsm_start) remove nsm_reset_nbr call.
+	  (ospf_nsm_event) Allow NSM function to be NULL, this along with
+	  removal of nsm_reset_nbr, allows a bunch of now useless functiosn
+	  to be removed.
+	  Remove some useless variables.
+	  (nsm_ignore) now useless, remove.
+	  (nsm_bad_ls_req) ditto
+	  (nsm_seq_number_mismatch)   "
+	  (nsm_oneway_received)       "
+	  (nsm_inactivity_timer)      "
+	  (nsm_ll_down)               "
+	  (NSM) replace removed action functions with NULL.
+
 2006-07-10 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
 	* ospf_packet.c: (ospf_hello) Improve NetworkMask mismatch warning
diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c
index 56f8186..a71cb74 100644
--- a/ospfd/ospf_nsm.c
+++ b/ospfd/ospf_nsm.c
@@ -49,7 +49,6 @@
 #include "ospfd/ospf_abr.h"
 #include "ospfd/ospf_snmp.h"
 
-static void nsm_reset_nbr (struct ospf_neighbor *);
 static void nsm_clear_adj (struct ospf_neighbor *);
 
 /* OSPF NSM Timer functions. */
@@ -163,16 +162,6 @@
 
 /* OSPF NSM functions. */
 static int
-nsm_ignore (struct ospf_neighbor *nbr)
-{
-  if (IS_DEBUG_OSPF (nsm, NSM_EVENTS))
-    zlog (NULL, LOG_DEBUG, "NSM[%s:%s]: nsm_ignore called",
-	  IF_NAME (nbr->oi), inet_ntoa (nbr->router_id));
-
-  return 0;
-}
-
-static int
 nsm_hello_received (struct ospf_neighbor *nbr)
 {
   /* Start or Restart Inactivity Timer. */
@@ -190,9 +179,6 @@
 static int
 nsm_start (struct ospf_neighbor *nbr)
 {
-
-  nsm_reset_nbr (nbr);
-
   if (nbr->nbr_nbma)
       OSPF_POLL_TIMER_OFF (nbr->nbr_nbma->t_poll);
 
@@ -345,15 +331,6 @@
 }
 
 static int
-nsm_bad_ls_req (struct ospf_neighbor *nbr)
-{
-  /* Clear neighbor. */
-  nsm_reset_nbr (nbr);
-
-  return 0;
-}
-
-static int
 nsm_adj_ok (struct ospf_neighbor *nbr)
 {
   int next_state = nbr->state;
@@ -367,24 +344,6 @@
   return next_state;
 }
 
-static int
-nsm_seq_number_mismatch (struct ospf_neighbor *nbr)
-{
-  /* Clear neighbor. */
-  nsm_reset_nbr (nbr);
-
-  return 0;
-}
-
-static int
-nsm_oneway_received (struct ospf_neighbor *nbr)
-{
-  /* Clear neighbor. */
-  nsm_reset_nbr (nbr);
-
-  return 0;
-}
-
 /* Clear adjacency related state for a neighbour, intended where nbr
  * transitions from > ExStart (i.e. a Full or forming adjacency)
  * to <= ExStart.
@@ -403,18 +362,6 @@
   /* Clear Link State Retransmission list. */
   if (!ospf_ls_retransmit_isempty (nbr))
     ospf_ls_retransmit_clear (nbr);
-}
-
-static void
-nsm_reset_nbr (struct ospf_neighbor *nbr)
-{
-  nsm_clear_adj (nbr);
-
-  /* Cancel thread. */
-  OSPF_NSM_TIMER_OFF (nbr->t_db_desc);
-  OSPF_NSM_TIMER_OFF (nbr->t_ls_req);
-  OSPF_NSM_TIMER_OFF (nbr->t_ls_upd);
-  OSPF_NSM_TIMER_OFF (nbr->t_hello_reply);
 
 #ifdef HAVE_OPAQUE_LSA
   if (CHECK_FLAG (nbr->options, OSPF_OPTION_O))
@@ -432,9 +379,6 @@
       return 0;
     }
   
-  /* Reset neighbor. */
-  nsm_reset_nbr (nbr);
-
   if (nbr->oi->type == OSPF_IFTYPE_NBMA && nbr->nbr_nbma != NULL)
     {
       struct ospf_nbr_nbma *nbr_nbma = nbr->nbr_nbma;
@@ -455,24 +399,6 @@
   return 0;
 }
 
-static int
-nsm_inactivity_timer (struct ospf_neighbor *nbr)
-{
-  /* Kill neighbor. */
-  nsm_kill_nbr (nbr);
-
-  return 0;
-}
-
-static int
-nsm_ll_down (struct ospf_neighbor *nbr)
-{
-  /* Kill neighbor. */
-  nsm_kill_nbr (nbr);
-
-  return 0;
-}
-
 /* Neighbor State Machine */
 struct {
   int (*func) (struct ospf_neighbor *);
@@ -481,172 +407,172 @@
 {
   {
     /* DependUpon: dummy state. */
-    { nsm_ignore,              NSM_DependUpon }, /* NoEvent           */
-    { nsm_ignore,              NSM_DependUpon }, /* HelloReceived     */
-    { nsm_ignore,              NSM_DependUpon }, /* Start             */
-    { nsm_ignore,              NSM_DependUpon }, /* 2-WayReceived     */
-    { nsm_ignore,              NSM_DependUpon }, /* NegotiationDone   */
-    { nsm_ignore,              NSM_DependUpon }, /* ExchangeDone      */
-    { nsm_ignore,              NSM_DependUpon }, /* BadLSReq          */
-    { nsm_ignore,              NSM_DependUpon }, /* LoadingDone       */
-    { nsm_ignore,              NSM_DependUpon }, /* AdjOK?            */
-    { nsm_ignore,              NSM_DependUpon }, /* SeqNumberMismatch */
-    { nsm_ignore,              NSM_DependUpon }, /* 1-WayReceived     */
-    { nsm_ignore,              NSM_DependUpon }, /* KillNbr           */
-    { nsm_ignore,              NSM_DependUpon }, /* InactivityTimer   */
-    { nsm_ignore,              NSM_DependUpon }, /* LLDown            */
+    { NULL,                    NSM_DependUpon }, /* NoEvent           */
+    { NULL,                    NSM_DependUpon }, /* HelloReceived     */
+    { NULL,                    NSM_DependUpon }, /* Start             */
+    { NULL,                    NSM_DependUpon }, /* 2-WayReceived     */
+    { NULL,                    NSM_DependUpon }, /* NegotiationDone   */
+    { NULL,                    NSM_DependUpon }, /* ExchangeDone      */
+    { NULL,                    NSM_DependUpon }, /* BadLSReq          */
+    { NULL,                    NSM_DependUpon }, /* LoadingDone       */
+    { NULL,                    NSM_DependUpon }, /* AdjOK?            */
+    { NULL,                    NSM_DependUpon }, /* SeqNumberMismatch */
+    { NULL,                    NSM_DependUpon }, /* 1-WayReceived     */
+    { NULL,                    NSM_DependUpon }, /* KillNbr           */
+    { NULL,                    NSM_DependUpon }, /* InactivityTimer   */
+    { NULL,                    NSM_DependUpon }, /* LLDown            */
   },
   {
     /* Deleted: dummy state. */
-    { nsm_ignore,              NSM_Deleted    }, /* NoEvent           */
-    { nsm_ignore,              NSM_Deleted    }, /* HelloReceived     */
-    { nsm_ignore,              NSM_Deleted    }, /* Start             */
-    { nsm_ignore,              NSM_Deleted    }, /* 2-WayReceived     */
-    { nsm_ignore,              NSM_Deleted    }, /* NegotiationDone   */
-    { nsm_ignore,              NSM_Deleted    }, /* ExchangeDone      */
-    { nsm_ignore,              NSM_Deleted    }, /* BadLSReq          */
-    { nsm_ignore,              NSM_Deleted    }, /* LoadingDone       */
-    { nsm_ignore,              NSM_Deleted    }, /* AdjOK?            */
-    { nsm_ignore,              NSM_Deleted    }, /* SeqNumberMismatch */
-    { nsm_ignore,              NSM_Deleted    }, /* 1-WayReceived     */
-    { nsm_ignore,              NSM_Deleted    }, /* KillNbr           */
-    { nsm_ignore,              NSM_Deleted    }, /* InactivityTimer   */
-    { nsm_ignore,              NSM_Deleted    }, /* LLDown            */
+    { NULL,                    NSM_Deleted    }, /* NoEvent           */
+    { NULL,                    NSM_Deleted    }, /* HelloReceived     */
+    { NULL,                    NSM_Deleted    }, /* Start             */
+    { NULL,                    NSM_Deleted    }, /* 2-WayReceived     */
+    { NULL,                    NSM_Deleted    }, /* NegotiationDone   */
+    { NULL,                    NSM_Deleted    }, /* ExchangeDone      */
+    { NULL,                    NSM_Deleted    }, /* BadLSReq          */
+    { NULL,                    NSM_Deleted    }, /* LoadingDone       */
+    { NULL,                    NSM_Deleted    }, /* AdjOK?            */
+    { NULL,                    NSM_Deleted    }, /* SeqNumberMismatch */
+    { NULL,                    NSM_Deleted    }, /* 1-WayReceived     */
+    { NULL,                    NSM_Deleted    }, /* KillNbr           */
+    { NULL,                    NSM_Deleted    }, /* InactivityTimer   */
+    { NULL,                    NSM_Deleted    }, /* LLDown            */
   },
   {
     /* Down: */
-    { nsm_ignore,              NSM_DependUpon }, /* NoEvent           */
+    { NULL,                    NSM_DependUpon }, /* NoEvent           */
     { nsm_hello_received,      NSM_Init       }, /* HelloReceived     */
     { nsm_start,               NSM_Attempt    }, /* Start             */
-    { nsm_ignore,              NSM_Down       }, /* 2-WayReceived     */
-    { nsm_ignore,              NSM_Down       }, /* NegotiationDone   */
-    { nsm_ignore,              NSM_Down       }, /* ExchangeDone      */
-    { nsm_ignore,              NSM_Down       }, /* BadLSReq          */
-    { nsm_ignore,              NSM_Down       }, /* LoadingDone       */
-    { nsm_ignore,              NSM_Down       }, /* AdjOK?            */
-    { nsm_ignore,              NSM_Down       }, /* SeqNumberMismatch */
-    { nsm_ignore,              NSM_Down       }, /* 1-WayReceived     */
+    { NULL,                    NSM_Down       }, /* 2-WayReceived     */
+    { NULL,                    NSM_Down       }, /* NegotiationDone   */
+    { NULL,                    NSM_Down       }, /* ExchangeDone      */
+    { NULL,                    NSM_Down       }, /* BadLSReq          */
+    { NULL,                    NSM_Down       }, /* LoadingDone       */
+    { NULL,                    NSM_Down       }, /* AdjOK?            */
+    { NULL,                    NSM_Down       }, /* SeqNumberMismatch */
+    { NULL,                    NSM_Down       }, /* 1-WayReceived     */
     { nsm_kill_nbr,            NSM_Deleted    }, /* KillNbr           */
-    { nsm_inactivity_timer,    NSM_Deleted    }, /* InactivityTimer   */
-    { nsm_ll_down,             NSM_Deleted    }, /* LLDown            */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* InactivityTimer   */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* LLDown            */
   },
   {
     /* Attempt: */
-    { nsm_ignore,              NSM_DependUpon }, /* NoEvent           */
+    { NULL,                    NSM_DependUpon }, /* NoEvent           */
     { nsm_hello_received,      NSM_Init       }, /* HelloReceived     */
-    { nsm_ignore,              NSM_Attempt    }, /* Start             */
-    { nsm_ignore,              NSM_Attempt    }, /* 2-WayReceived     */
-    { nsm_ignore,              NSM_Attempt    }, /* NegotiationDone   */
-    { nsm_ignore,              NSM_Attempt    }, /* ExchangeDone      */
-    { nsm_ignore,              NSM_Attempt    }, /* BadLSReq          */
-    { nsm_ignore,              NSM_Attempt    }, /* LoadingDone       */
-    { nsm_ignore,              NSM_Attempt    }, /* AdjOK?            */
-    { nsm_ignore,              NSM_Attempt    }, /* SeqNumberMismatch */
-    { nsm_ignore,              NSM_Attempt    }, /* 1-WayReceived     */
+    { NULL,                    NSM_Attempt    }, /* Start             */
+    { NULL,                    NSM_Attempt    }, /* 2-WayReceived     */
+    { NULL,                    NSM_Attempt    }, /* NegotiationDone   */
+    { NULL,                    NSM_Attempt    }, /* ExchangeDone      */
+    { NULL,                    NSM_Attempt    }, /* BadLSReq          */
+    { NULL,                    NSM_Attempt    }, /* LoadingDone       */
+    { NULL,                    NSM_Attempt    }, /* AdjOK?            */
+    { NULL,                    NSM_Attempt    }, /* SeqNumberMismatch */
+    { NULL,                    NSM_Attempt    }, /* 1-WayReceived     */
     { nsm_kill_nbr,            NSM_Deleted    }, /* KillNbr           */
-    { nsm_inactivity_timer,    NSM_Deleted    }, /* InactivityTimer   */
-    { nsm_ll_down,             NSM_Deleted    }, /* LLDown            */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* InactivityTimer   */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* LLDown            */
   },
   {
     /* Init: */
-    { nsm_ignore,              NSM_DependUpon }, /* NoEvent           */
+    { NULL,                    NSM_DependUpon }, /* NoEvent           */
     { nsm_hello_received,      NSM_Init       }, /* HelloReceived     */
-    { nsm_ignore,              NSM_Init       }, /* Start             */
+    { NULL,                    NSM_Init       }, /* Start             */
     { nsm_twoway_received,     NSM_DependUpon }, /* 2-WayReceived     */
-    { nsm_ignore,              NSM_Init       }, /* NegotiationDone   */
-    { nsm_ignore,              NSM_Init       }, /* ExchangeDone      */
-    { nsm_ignore,              NSM_Init       }, /* BadLSReq          */
-    { nsm_ignore,              NSM_Init       }, /* LoadingDone       */
-    { nsm_ignore,              NSM_Init       }, /* AdjOK?            */
-    { nsm_ignore,              NSM_Init       }, /* SeqNumberMismatch */
-    { nsm_ignore,              NSM_Init       }, /* 1-WayReceived     */
+    { NULL,                    NSM_Init       }, /* NegotiationDone   */
+    { NULL,                    NSM_Init       }, /* ExchangeDone      */
+    { NULL,                    NSM_Init       }, /* BadLSReq          */
+    { NULL,                    NSM_Init       }, /* LoadingDone       */
+    { NULL,                    NSM_Init       }, /* AdjOK?            */
+    { NULL,                    NSM_Init       }, /* SeqNumberMismatch */
+    { NULL,                    NSM_Init       }, /* 1-WayReceived     */
     { nsm_kill_nbr,            NSM_Deleted    }, /* KillNbr           */
-    { nsm_inactivity_timer,    NSM_Deleted    }, /* InactivityTimer   */
-    { nsm_ll_down,             NSM_Deleted    }, /* LLDown            */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* InactivityTimer   */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* LLDown            */
   },
   {
     /* 2-Way: */
-    { nsm_ignore,              NSM_DependUpon }, /* NoEvent           */
+    { NULL,                    NSM_DependUpon }, /* NoEvent           */
     { nsm_hello_received,      NSM_TwoWay     }, /* HelloReceived     */
-    { nsm_ignore,              NSM_TwoWay     }, /* Start             */
-    { nsm_ignore,              NSM_TwoWay     }, /* 2-WayReceived     */
-    { nsm_ignore,              NSM_TwoWay     }, /* NegotiationDone   */
-    { nsm_ignore,              NSM_TwoWay     }, /* ExchangeDone      */
-    { nsm_ignore,              NSM_TwoWay     }, /* BadLSReq          */
-    { nsm_ignore,              NSM_TwoWay     }, /* LoadingDone       */
+    { NULL,                    NSM_TwoWay     }, /* Start             */
+    { NULL,                    NSM_TwoWay     }, /* 2-WayReceived     */
+    { NULL,                    NSM_TwoWay     }, /* NegotiationDone   */
+    { NULL,                    NSM_TwoWay     }, /* ExchangeDone      */
+    { NULL,                    NSM_TwoWay     }, /* BadLSReq          */
+    { NULL,                    NSM_TwoWay     }, /* LoadingDone       */
     { nsm_adj_ok,              NSM_DependUpon }, /* AdjOK?            */
-    { nsm_ignore,              NSM_TwoWay     }, /* SeqNumberMismatch */
-    { nsm_oneway_received,     NSM_Init       }, /* 1-WayReceived     */
+    { NULL,                    NSM_TwoWay     }, /* SeqNumberMismatch */
+    { NULL,                    NSM_Init       }, /* 1-WayReceived     */
     { nsm_kill_nbr,            NSM_Deleted    }, /* KillNbr           */
-    { nsm_inactivity_timer,    NSM_Deleted    }, /* InactivityTimer   */
-    { nsm_ll_down,             NSM_Deleted    }, /* LLDown            */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* InactivityTimer   */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* LLDown            */
   },
   {
     /* ExStart: */
-    { nsm_ignore,              NSM_DependUpon }, /* NoEvent           */
+    { NULL,                    NSM_DependUpon }, /* NoEvent           */
     { nsm_hello_received,      NSM_ExStart    }, /* HelloReceived     */
-    { nsm_ignore,              NSM_ExStart    }, /* Start             */
-    { nsm_ignore,              NSM_ExStart    }, /* 2-WayReceived     */
+    { NULL,                    NSM_ExStart    }, /* Start             */
+    { NULL,                    NSM_ExStart    }, /* 2-WayReceived     */
     { nsm_negotiation_done,    NSM_Exchange   }, /* NegotiationDone   */
-    { nsm_ignore,              NSM_ExStart    }, /* ExchangeDone      */
-    { nsm_ignore,              NSM_ExStart    }, /* BadLSReq          */
-    { nsm_ignore,              NSM_ExStart    }, /* LoadingDone       */
+    { NULL,                    NSM_ExStart    }, /* ExchangeDone      */
+    { NULL,                    NSM_ExStart    }, /* BadLSReq          */
+    { NULL,                    NSM_ExStart    }, /* LoadingDone       */
     { nsm_adj_ok,              NSM_DependUpon }, /* AdjOK?            */
-    { nsm_ignore,              NSM_ExStart    }, /* SeqNumberMismatch */
-    { nsm_oneway_received,     NSM_Init       }, /* 1-WayReceived     */
+    { NULL,                    NSM_ExStart    }, /* SeqNumberMismatch */
+    { NULL,                    NSM_Init       }, /* 1-WayReceived     */
     { nsm_kill_nbr,            NSM_Deleted    }, /* KillNbr           */
-    { nsm_inactivity_timer,    NSM_Deleted    }, /* InactivityTimer   */
-    { nsm_ll_down,             NSM_Deleted    }, /* LLDown            */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* InactivityTimer   */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* LLDown            */
   },
   {
     /* Exchange: */
-    { nsm_ignore,              NSM_DependUpon }, /* NoEvent           */
+    { NULL,                    NSM_DependUpon }, /* NoEvent           */
     { nsm_hello_received,      NSM_Exchange   }, /* HelloReceived     */
-    { nsm_ignore,              NSM_Exchange   }, /* Start             */
-    { nsm_ignore,              NSM_Exchange   }, /* 2-WayReceived     */
-    { nsm_ignore,              NSM_Exchange   }, /* NegotiationDone   */
+    { NULL,                    NSM_Exchange   }, /* Start             */
+    { NULL,                    NSM_Exchange   }, /* 2-WayReceived     */
+    { NULL,                    NSM_Exchange   }, /* NegotiationDone   */
     { nsm_exchange_done,       NSM_DependUpon }, /* ExchangeDone      */
-    { nsm_bad_ls_req,          NSM_ExStart    }, /* BadLSReq          */
-    { nsm_ignore,              NSM_Exchange   }, /* LoadingDone       */
+    { NULL,                    NSM_ExStart    }, /* BadLSReq          */
+    { NULL,                    NSM_Exchange   }, /* LoadingDone       */
     { nsm_adj_ok,              NSM_DependUpon }, /* AdjOK?            */
-    { nsm_seq_number_mismatch, NSM_ExStart    }, /* SeqNumberMismatch */
-    { nsm_oneway_received,     NSM_Init       }, /* 1-WayReceived     */
+    { NULL,                    NSM_ExStart    }, /* SeqNumberMismatch */
+    { NULL,                    NSM_Init       }, /* 1-WayReceived     */
     { nsm_kill_nbr,            NSM_Deleted    }, /* KillNbr           */
-    { nsm_inactivity_timer,    NSM_Deleted    }, /* InactivityTimer   */
-    { nsm_ll_down,             NSM_Deleted    }, /* LLDown            */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* InactivityTimer   */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* LLDown            */
   },
   {
     /* Loading: */
-    { nsm_ignore,              NSM_DependUpon }, /* NoEvent           */
+    { NULL,                    NSM_DependUpon }, /* NoEvent           */
     { nsm_hello_received,      NSM_Loading    }, /* HelloReceived     */
-    { nsm_ignore,              NSM_Loading    }, /* Start             */
-    { nsm_ignore,              NSM_Loading    }, /* 2-WayReceived     */
-    { nsm_ignore,              NSM_Loading    }, /* NegotiationDone   */
-    { nsm_ignore,              NSM_Loading    }, /* ExchangeDone      */
-    { nsm_bad_ls_req,          NSM_ExStart    }, /* BadLSReq          */
-    { nsm_ignore,              NSM_Full       }, /* LoadingDone       */
+    { NULL,                    NSM_Loading    }, /* Start             */
+    { NULL,                    NSM_Loading    }, /* 2-WayReceived     */
+    { NULL,                    NSM_Loading    }, /* NegotiationDone   */
+    { NULL,                    NSM_Loading    }, /* ExchangeDone      */
+    { NULL,                    NSM_ExStart    }, /* BadLSReq          */
+    { NULL,                    NSM_Full       }, /* LoadingDone       */
     { nsm_adj_ok,              NSM_DependUpon }, /* AdjOK?            */
-    { nsm_seq_number_mismatch, NSM_ExStart    }, /* SeqNumberMismatch */
-    { nsm_oneway_received,     NSM_Init       }, /* 1-WayReceived     */
+    { NULL,                    NSM_ExStart    }, /* SeqNumberMismatch */
+    { NULL,                    NSM_Init       }, /* 1-WayReceived     */
     { nsm_kill_nbr,            NSM_Deleted    }, /* KillNbr           */
-    { nsm_inactivity_timer,    NSM_Deleted    }, /* InactivityTimer   */
-    { nsm_ll_down,             NSM_Deleted    }, /* LLDown            */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* InactivityTimer   */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* LLDown            */
   },
   { /* Full: */
-    { nsm_ignore,              NSM_DependUpon }, /* NoEvent           */
+    { NULL,                    NSM_DependUpon }, /* NoEvent           */
     { nsm_hello_received,      NSM_Full       }, /* HelloReceived     */
-    { nsm_ignore,              NSM_Full       }, /* Start             */
-    { nsm_ignore,              NSM_Full       }, /* 2-WayReceived     */
-    { nsm_ignore,              NSM_Full       }, /* NegotiationDone   */
-    { nsm_ignore,              NSM_Full       }, /* ExchangeDone      */
-    { nsm_bad_ls_req,          NSM_ExStart    }, /* BadLSReq          */
-    { nsm_ignore,              NSM_Full       }, /* LoadingDone       */
+    { NULL,                    NSM_Full       }, /* Start             */
+    { NULL,                    NSM_Full       }, /* 2-WayReceived     */
+    { NULL,                    NSM_Full       }, /* NegotiationDone   */
+    { NULL,                    NSM_Full       }, /* ExchangeDone      */
+    { NULL,                    NSM_ExStart    }, /* BadLSReq          */
+    { NULL,                    NSM_Full       }, /* LoadingDone       */
     { nsm_adj_ok,              NSM_DependUpon }, /* AdjOK?            */
-    { nsm_seq_number_mismatch, NSM_ExStart    }, /* SeqNumberMismatch */
-    { nsm_oneway_received,     NSM_Init       }, /* 1-WayReceived     */
+    { NULL,                    NSM_ExStart    }, /* SeqNumberMismatch */
+    { NULL,                    NSM_Init       }, /* 1-WayReceived     */
     { nsm_kill_nbr,            NSM_Deleted    }, /* KillNbr           */
-    { nsm_inactivity_timer,    NSM_Deleted    }, /* InactivityTimer   */
-    { nsm_ll_down,             NSM_Deleted    }, /* LLDown            */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* InactivityTimer   */
+    { nsm_kill_nbr,            NSM_Deleted    }, /* LLDown            */
   },
 };
 
@@ -797,13 +723,8 @@
   /* State changes from > ExStart to <= ExStart should clear any Exchange
    * or Full/LSA Update related lists and state.
    * Potential causal events: BadLSReq, SeqNumberMismatch, AdjOK?
-   *
-   * Note that transitions from > ExStart to < 2-Way (e.g. due to
-   * KillNbr or 1-Way) must and will do the same, but via
-   * nsm_reset_nbr.
    */
-  if (old_state > NSM_ExStart 
-      && (state == NSM_ExStart || state == NSM_TwoWay))
+  if ((old_state > NSM_ExStart) && (state <= NSM_ExStart))
     nsm_clear_adj (nbr);
 
   /* Start DD exchange protocol */
@@ -855,40 +776,40 @@
   int next_state;
   struct ospf_neighbor *nbr;
   struct in_addr router_id;
-  int old_state;
-  struct ospf_interface *oi;
 
   nbr = THREAD_ARG (thread);
   event = THREAD_VAL (thread);
   router_id = nbr->router_id;
 
-  old_state = nbr->state;
-  oi = nbr->oi ;
-  
-  /* Call function. */
-  next_state = (*(NSM [nbr->state][event].func))(nbr);
+  next_state = NSM [nbr->state][event].next_state;
 
-  if (! next_state)
-    next_state = NSM [nbr->state][event].next_state;
-  else if (NSM [nbr->state][event].next_state != NSM_DependUpon)
+  /* Call function. */
+  if (NSM [nbr->state][event].func != NULL)
     {
-      /* There's a mismatch between the FSM tables and what an FSM
-       * action/state-change function returned. State changes which
-       * do not have conditional/DependUpon next-states should not
-       * try set next_state.
-       */
-      zlog_warn ("NSM[%s:%s]: %s (%s): "
-                 "Warning: action tried to change next_state to %s",
-                 IF_NAME (oi), inet_ntoa (nbr->router_id),
-                 LOOKUP (ospf_nsm_state_msg, nbr->state),
-                 ospf_nsm_event_str [event],
-                 LOOKUP (ospf_nsm_state_msg, next_state));
+      int func_state = (*(NSM [nbr->state][event].func))(nbr);
       
-      next_state = NSM [nbr->state][event].next_state;
+      if (NSM [nbr->state][event].next_state == NSM_DependUpon)
+        next_state = func_state;
+      else if (func_state)
+        {
+          /* There's a mismatch between the FSM tables and what an FSM
+           * action/state-change function returned. State changes which
+           * do not have conditional/DependUpon next-states should not
+           * try set next_state.
+           */
+          zlog_warn ("NSM[%s:%s]: %s (%s): "
+                     "Warning: action tried to change next_state to %s",
+                     IF_NAME (nbr->oi), inet_ntoa (nbr->router_id),
+                     LOOKUP (ospf_nsm_state_msg, nbr->state),
+                     ospf_nsm_event_str [event],
+                     LOOKUP (ospf_nsm_state_msg, func_state));
+        }
     }
 
+  assert (next_state != NSM_DependUpon);
+  
   if (IS_DEBUG_OSPF (nsm, NSM_EVENTS))
-    zlog_debug ("NSM[%s:%s]: %s (%s)", IF_NAME (oi),
+    zlog_debug ("NSM[%s:%s]: %s (%s)", IF_NAME (nbr->oi),
 	       inet_ntoa (nbr->router_id),
 	       LOOKUP (ospf_nsm_state_msg, nbr->state),
 	       ospf_nsm_event_str [event]);