]> git.puffer.fish Git - mirror/frr.git/commitdiff
[ospfd] Clear adjacency state for NSM changes down to TwoWay/ExStart
authorPaul Jakma <paul.jakma@sun.com>
Tue, 4 Jul 2006 13:50:44 +0000 (13:50 +0000)
committerPaul Jakma <paul.jakma@sun.com>
Tue, 4 Jul 2006 13:50:44 +0000 (13:50 +0000)
2006-07-02 Paul Jakma <paul.jakma@sun.com>

* ospf_nsm.c: (nsm_clear_adj) clear adjacency related state for a
  neighbour, needed for some state changes from > ExStart down
  to ExStart or less, which need not go through nsm_reset_nbr.
  (nsm_reset_nbr) move code to former. Should be static.
  (ospf_nsm_event) Remove long dead code.
  Use nsm_clear_adj for state changes that take down
  adjacencies to TwoWay/ExStart.
  (nsm_kill_nbr) Oops, action function shouldn't try return
  1 for error.

ospfd/ChangeLog
ospfd/ospf_nsm.c

index e6d04f32d1f3573adf5c545b00b0f0f8f4b9a328..e22b7a42c035d5251f3a102fcd60ebf50859c10f 100644 (file)
@@ -3,14 +3,23 @@
        * ospf_nsm.c: (nsm_should_adj) New function, just consolidate the
          10.4 adjacency check from nsm_twoway_received/nsm_adj_ok.
          (nsm_twoway_received/nsm_adj_ok) Use former.
+         (nsm_clear_adj) clear adjacency related state for a
+         neighbour, needed for some state changes from > ExStart down
+         to ExStart or less, which need not go through nsm_reset_nbr.
+         (nsm_reset_nbr) move code to former. Should be static.
          (ospf_nsm_event) Don't allow action functions to change
          next_state if the NSM tables do not indicate next_state is
          conditional, log warning if one tries - existing code
          appears fine though.
+         Remove long dead code.
+         Use nsm_clear_adj for state changes that take down
+         adjacencies to TwoWay/ExStart.
          (nsm_timer_set) ls_req timer should be OFF in early states.
          Compact several identical sections.
          Set inactivity timer to OFF for Down, for documentary
          purposes.
+         (nsm_kill_nbr) Oops, action function shouldn't try return
+         1 for error.
 
 2006-06-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
index 8c7c11a8b3431c2c101b861db55142880a1fe216..149ff7cbd5cce3eef052cd5a6f37758aeb930c83 100644 (file)
@@ -49,8 +49,8 @@
 #include "ospfd/ospf_abr.h"
 #include "ospfd/ospf_snmp.h"
 
-void nsm_reset_nbr (struct ospf_neighbor *);
-
+static void nsm_reset_nbr (struct ospf_neighbor *);
+static void nsm_clear_adj (struct ospf_neighbor *);
 \f
 /* OSPF NSM Timer functions. */
 static int
@@ -397,8 +397,12 @@ nsm_oneway_received (struct ospf_neighbor *nbr)
   return 0;
 }
 
-void
-nsm_reset_nbr (struct ospf_neighbor *nbr)
+/* Clear adjacency related state for a neighbour, intended where nbr
+ * transitions from > ExStart (i.e. a Full or forming adjacency)
+ * to <= ExStart.
+ */
+static void
+nsm_clear_adj (struct ospf_neighbor *nbr)
 {
   /* Clear Database Summary list. */
   if (!ospf_db_summary_isempty (nbr))
@@ -411,6 +415,12 @@ nsm_reset_nbr (struct ospf_neighbor *nbr)
   /* 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);
@@ -433,7 +443,7 @@ nsm_kill_nbr (struct ospf_neighbor *nbr)
   /* killing nbr_self is invalid */
   assert (nbr != nbr->oi->nbr_self);
   if (nbr == nbr->oi->nbr_self)
-    return 1;
+    return 0;
   
   /* Reset neighbor. */
   nsm_reset_nbr (nbr);
@@ -748,10 +758,6 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
            if (vl_area->full_vls > 0)
              if (--vl_area->full_vls == 0)
                ospf_schedule_abr_task (oi->ospf);
-          /* clear neighbor retransmit list */
-          if (!ospf_ls_retransmit_isempty (nbr))
-            ospf_ls_retransmit_clear (nbr);
        }
 
       zlog_info ("nsm_change_state(%s, %s -> %s): "
@@ -790,6 +796,18 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
   ospf_opaque_nsm_change (nbr, old_state);
 #endif /* HAVE_OPAQUE_LSA */
 
+  /* 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))
+    nsm_clear_adj (nbr);
+
   /* Start DD exchange protocol */
   if (state == NSM_ExStart)
     {
@@ -807,11 +825,6 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
     nbr->crypt_seqnum = 0;
   
   /* Generete NeighborChange ISM event. */
-#ifdef BUGGY_ISM_TRANSITION
-  if ((old_state < NSM_TwoWay && state >= NSM_TwoWay) ||
-      (old_state >= NSM_TwoWay && state < NSM_TwoWay))
-    OSPF_ISM_EVENT_EXECUTE (oi, ISM_NeighborChange);
-#else /* BUGGY_ISM_TRANSITION */
   switch (oi->state) {
   case ISM_DROther:
   case ISM_Backup:
@@ -824,7 +837,6 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
     /* ISM_PointToPoint -> ISM_Down, ISM_Loopback -> ISM_Down, etc. */
     break;
   }
-#endif /* BUGGY_ISM_TRANSITION */
 
   /* Performance hack. Send hello immideately when some neighbor enter
      Init state.  This whay we decrease neighbor discovery time. Gleb.*/