[ospfd] Bug #234. Fix nbr_self reinitialisation after down/up.

2006-01-10 Len Sorensen <lennartsorensen@ruggedcom.com>

	* (general) Bug #234, see also [quagga-dev 3902].
	  Fix problem with nbr_self not being properly reinitialised
	  when an interface comes up, after having been down.
	  Some re-arrangement done by Paul Jakma, any bugs introduced
	  on top of Len's suggested changes are his.
	* ospf_neighbor.c: (ospf_nbr_add_self) centralise
	  initialisation of nbr_self parameters here.
	* ospf_interface.c: (ospf_if_new) deleting initialisation of
	  parameters of nbr_self, just rely on call to
	  ospf_nbr_add_self.
	  (ospf_if_cleanup) ditto.
	* ospfd.c: (ospf_network_run) ditto.
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index 23a109a..bc7b5e2 100644
--- a/ospfd/ChangeLog
+++ b/ospfd/ChangeLog
@@ -3,6 +3,8 @@
 	* (general) Bug #234, see also [quagga-dev 3902].
 	  Fix problem with nbr_self not being properly reinitialised
 	  when an interface comes up, after having been down.
+	  Some re-arrangement done by Paul Jakma, any bugs introduced
+	  on top of Len's suggested changes are his.
 	* ospf_neighbor.c: (ospf_nbr_add_self) centralise
 	  initialisation of nbr_self parameters here.
 	* ospf_interface.c: (ospf_if_new) deleting initialisation of
diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c
index d21dea3..82c4bae 100644
--- a/ospfd/ospf_interface.c
+++ b/ospfd/ospf_interface.c
@@ -237,9 +237,6 @@
 
   /* Add pseudo neighbor. */
   oi->nbr_self = ospf_nbr_new (oi);
-  oi->nbr_self->state = NSM_TwoWay;
-  oi->nbr_self->priority = OSPF_IF_PARAM (oi, priority);
-  oi->nbr_self->options = OSPF_OPTION_E;
 
   oi->ls_upd_queue = route_table_init ();
   oi->t_ls_upd_event = NULL;
@@ -267,7 +264,7 @@
   struct ospf_nbr_nbma *nbr_nbma;
   struct ospf_lsa *lsa;
 
-  /* oi->nbrs and oi->nbr_nbma should be deletete on InterafceDown event */
+  /* oi->nbrs and oi->nbr_nbma should be deleted on InterfaceDown event */
   /* delete all static neighbors attached to this interface */
   for (ALL_LIST_ELEMENTS (oi->nbr_nbma, node, nnode, nbr_nbma))
     {
@@ -300,26 +297,11 @@
   /* Empty link state update queue */
   ospf_ls_upd_queue_empty (oi);
   
- /* Handle pseudo neighbor. */
+  /* Reset pseudo neighbor. */
   ospf_nbr_delete (oi->nbr_self);
   oi->nbr_self = ospf_nbr_new (oi);
-  oi->nbr_self->state = NSM_TwoWay;
-  oi->nbr_self->priority = OSPF_IF_PARAM (oi, priority);
-
-  switch (oi->area->external_routing)
-    {
-    case OSPF_AREA_DEFAULT:
-      SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
-      break;
-    case OSPF_AREA_STUB:
-      UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
-      break;
-    case OSPF_AREA_NSSA:
-      UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
-      SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
-      break;
-    }
-
+  ospf_nbr_add_self (oi);
+  
   ospf_lsa_unlock (oi->network_lsa_self);
   oi->network_lsa_self = NULL;
   OSPF_TIMER_OFF (oi->t_network_lsa_self);
diff --git a/ospfd/ospf_neighbor.c b/ospfd/ospf_neighbor.c
index 5c1a762..5875236 100644
--- a/ospfd/ospf_neighbor.c
+++ b/ospfd/ospf_neighbor.c
@@ -202,6 +202,27 @@
     }
   else
     rn->info = oi->nbr_self;
+  
+  /* Initial state */
+  oi->nbr_self->address = *oi->address;
+  oi->nbr_self->priority = OSPF_IF_PARAM (oi, priority);
+  oi->nbr_self->router_id = oi->ospf->router_id;
+  oi->nbr_self->src = oi->address->u.prefix4;
+  oi->nbr_self->state = NSM_TwoWay;
+  
+  switch (oi->area->external_routing)
+    {
+      case OSPF_AREA_DEFAULT:
+        SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
+        break;
+      case OSPF_AREA_STUB:
+        UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
+        break;
+      case OSPF_AREA_NSSA:
+        UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
+        SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
+        break;
+    }
 }
 
 /* Get neighbor count by status.
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index 7c99365..680a500 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -859,24 +859,14 @@
 		oi = ospf_if_new (ospf, ifp, co->address);
 		oi->connected = co;
 		
-		oi->nbr_self->address = *oi->address;
-
 		oi->area = area;
 
 		oi->params = ospf_lookup_if_params (ifp, oi->address->u.prefix4);
 		oi->output_cost = ospf_if_get_output_cost (oi);
 		
-		if (area->external_routing != OSPF_AREA_DEFAULT)
-		  UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
-		oi->nbr_self->priority = OSPF_IF_PARAM (oi, priority);
-		
 		/* Add pseudo neighbor. */
 		ospf_nbr_add_self (oi);
 
-		/* Make sure pseudo neighbor's router_id. */
-		oi->nbr_self->router_id = ospf->router_id;
-		oi->nbr_self->src = oi->address->u.prefix4;
-		
 		/* Relate ospf interface to ospf instance. */
 		oi->ospf = ospf;
 
@@ -885,21 +875,6 @@
 		   skip network type setting. */
 		oi->type = IF_DEF_PARAMS (ifp)->type;
 		
-		/* Set area flag. */
-		switch (area->external_routing)
-		  {
-		  case OSPF_AREA_DEFAULT:
-		    SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
-		    break;
-		  case OSPF_AREA_STUB:
-		    UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
-		    break;
-		  case OSPF_AREA_NSSA:
-		    UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
-		    SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
-		    break;
-		  }
-
 		ospf_area_add_if (oi->area, oi);
 		
 		/* if router_id is not configured, dont bring up