From bae0f7dbb111e2c8fbb8a94b59de6e241020ad66 Mon Sep 17 00:00:00 2001
From: Ondrej Filip <feela@network.cz>
Date: Tue, 1 Jun 1999 17:29:56 +0000
Subject: [PATCH] Neigbor deleting done. (I have some problems with timers, so
 it does not send hello.)

---
 proto/ospf/ospf.c | 40 +++++++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c
index de60f4e2..8e201fef 100644
--- a/proto/ospf/ospf.c
+++ b/proto/ospf/ospf.c
@@ -35,6 +35,11 @@ neighbor_timer_hook(timer *timer)
   p=(struct proto *)(ifa->proto);
   debug("%s: Inactivity timer fired on interface %s for neighbor %d.\n",
     p->name, ifa->iface->name, n->rid);
+  tm_stop(n->inactim);
+  rfree(n->inactim);
+  rem_node(NODE n);
+  mb_free(n);
+  debug("%s: Deleting neigbor.\n", p->name);
 }
 
 void
@@ -101,17 +106,16 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
     n->inactim->data=n;
     n->inactim->randomize=0;
     n->inactim->hook=neighbor_timer_hook;
-    n->inactim->recurrent=ifa->deadc*ifa->helloint;
-    n->inactim->expires=0;
-    tm_start(ifa->hello_timer,ifa->deadc*ifa->helloint);
+    n->inactim->recurrent=0;
     DBG("%s: Installing inactivity timer.\n", p->name);
     n->state=NEIGHBOR_INIT;
-    n->rid=nrid;
-    n->dr=ntohl(ps->dr);
-    n->bdr=ntohl(ps->bdr);
-    n->priority=ps->priority;
-    n->options=ps->options;
   }
+  n->rid=nrid;
+  n->dr=ntohl(ps->dr);
+  n->bdr=ntohl(ps->bdr);
+  n->priority=ps->priority;
+  n->options=ps->options;
+  tm_start(ifa->hello_timer,ifa->deadc*ifa->helloint);
 
   /* XXXX */
 
@@ -467,7 +471,6 @@ ospf_add_timers(struct ospf_iface *ifa, pool *pool, int wait)
   if(ifa->helloint==0) ifa->helloint=HELLOINT_D;
   ifa->hello_timer->hook=hello_timer_hook;
   ifa->hello_timer->recurrent=ifa->helloint;
-  ifa->hello_timer->expires=0;
   tm_start(ifa->hello_timer,ifa->helloint);
   DBG("%s: Installing hello timer.\n", p->name);
   if((ifa->type!=OSPF_IT_PTP))
@@ -475,10 +478,9 @@ ospf_add_timers(struct ospf_iface *ifa, pool *pool, int wait)
     /* Install wait timer on NOT-PtP interfaces */
     ifa->wait_timer=tm_new(pool);
     ifa->wait_timer->data=ifa;
-    ifa->wait_timer->randomize=1;
+    ifa->wait_timer->randomize=0;
     ifa->wait_timer->hook=wait_timer_hook;
     ifa->wait_timer->recurrent=0;
-    ifa->wait_timer->expires=0;
     ifa->state=OSPF_IS_WAITING;
     tm_start(ifa->wait_timer,(wait!=0 ? wait : WAIT_DMH*ifa->helloint));
     DBG(p->name);
@@ -540,21 +542,29 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
     ifa=mb_alloc(p->pool, sizeof(struct ospf_iface));
     ifa->proto=(struct proto_ospf *)p;
     ifa->iface=iface;
-    add_tail(&((struct proto_ospf *)p)->iface_list, NODE ifa);
     ospf_iface_default(ifa);
-    /* FIXME: This should read config */
-    ospf_add_timers(ifa,p->pool,0);
     if(ifa->type!=OSPF_IT_NBMA)
     {
       if((mcsk=ospf_open_socket(p, ifa))!=NULL)
       {
 	ifa->hello_sk=mcsk;
       }
-      else log("Huh? could not open socket?");
+      else
+      {
+        log("%s: Huh? could not open socket on interface %s?", p->name,
+          iface->name);
+	mb_free(ifa);
+	log("%s: Ignoring this interface\n", p->name);
+	return;
+      }
       /* FIXME: In fail case??? */
       init_list(&(ifa->neigh_list));
     }
     /* FIXME: NBMA? */
+    /* FIXME: This should read config */
+    ifa->helloint=0;
+    ospf_add_timers(ifa,p->pool,0);
+    add_tail(&((struct proto_ospf *)p)->iface_list, NODE ifa);
   }
 
   if(flags & IF_CHANGE_DOWN)