]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
I allocate struct ifa before unlocking. So route exported to OSPF are correct.
authorOndrej Filip <feela@network.cz>
Mon, 4 Sep 2000 19:42:17 +0000 (19:42 +0000)
committerOndrej Filip <feela@network.cz>
Mon, 4 Sep 2000 19:42:17 +0000 (19:42 +0000)
I work also with interfaces that have some problems with socket opening.
I declare them as stub.

proto/ospf/iface.c
proto/ospf/ospf.c
proto/ospf/ospf.h

index e82d8f3a64ec06d1134213638f985d6670dd2eaf..0c398626bea32b2dace1c9f16c70db3838c79d87 100644 (file)
@@ -314,6 +314,10 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
   struct ospf_iface_patt *ip=NULL;
   struct ospf_iface *ifa;
   struct object_lock *lock;
+  struct nbma_node *nbma,*nb;
+  u8 i;
+  sock *mcsk;
+
 
   DBG("%s: If notify called\n", p->name);
   if (iface->flags & IF_IGNORE)
@@ -330,12 +334,74 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
     if(ip)
     {
       OSPF_TRACE(D_EVENTS, "Using interface %s.", iface->name);
+
+      ifa=mb_allocz(p->pool, sizeof(struct ospf_iface));
+      ifa->proto=po;
+      ifa->iface=iface;
+   
+      ifa->an=ac->areaid;
+      ifa->cost=ip->cost;
+      ifa->rxmtint=ip->rxmtint;
+      ifa->inftransdelay=ip->inftransdelay;
+      ifa->priority=ip->priority;
+      ifa->helloint=ip->helloint;
+      ifa->pollint=ip->pollint;
+      ifa->strictnbma=ip->strictnbma;
+      ifa->waitint=ip->waitint;
+      ifa->deadc=ip->deadc;
+      ifa->stub=ip->stub;
+      ifa->autype=ip->autype;
+      memcpy(ifa->aukey,ip->password,8);
+      ifa->options=2;  /* FIXME what options? */
+   
+      if(ip->type==OSPF_IT_UNDEF)
+        ifa->type=ospf_iface_clasify(ifa->iface, (struct proto *)ifa->proto);
+      else ifa->type=ip->type;
+
+      init_list(&ifa->neigh_list);
+      init_list(&ifa->nbma_list);
+      WALK_LIST(nb,ip->nbma_list)
+      {
+        nbma=mb_alloc(p->pool,sizeof(struct nbma_node));
+        nbma->ip=nb->ip;
+        nbma->eligible=nb->eligible;
+        add_tail(&ifa->nbma_list, NODE nbma);
+      }
+      
+      /* Add hello timer */
+      ifa->hello_timer=tm_new(p->pool);
+      ifa->hello_timer->data=ifa;
+      ifa->hello_timer->randomize=0;
+      ifa->hello_timer->hook=hello_timer_hook;
+      ifa->hello_timer->recurrent=ifa->helloint;
+      DBG("%s: Installing hello timer. (%u)\n", p->name, ifa->helloint);
+   
+      if(ifa->type==OSPF_IT_NBMA)
+      {
+        ifa->poll_timer=tm_new(p->pool);
+        ifa->poll_timer->data=ifa;
+        ifa->poll_timer->randomize=0;
+        ifa->poll_timer->hook=poll_timer_hook;
+        ifa->poll_timer->recurrent=ifa->pollint;
+        DBG("%s: Installing poll timer. (%u)\n", p->name, ifa->pollint);
+      }
+      else ifa->poll_timer=NULL;
+   
+      ifa->wait_timer=tm_new(p->pool);
+      ifa->wait_timer->data=ifa;
+      ifa->wait_timer->randomize=0;
+      ifa->wait_timer->hook=wait_timer_hook;
+      ifa->wait_timer->recurrent=0;
+      DBG("%s: Installing wait timer. (%u)\n", p->name, ifa->waitint);
+      add_tail(&((struct proto_ospf *)p)->iface_list, NODE ifa);
+      ifa->state=OSPF_IS_DOWN;
+
       lock = olock_new( p->pool );
       lock->addr = AllSPFRouters;
       lock->type = OBJLOCK_IP;
       lock->port = OSPF_PROTO;
       lock->iface = iface;
-      lock->data = p;
+      lock->data = ifa;
       lock->hook = ospf_ifa_add;
       olock_acquire(lock);
     }
@@ -394,50 +460,12 @@ ospf_iface_info(struct ospf_iface *ifa)
 void
 ospf_ifa_add(struct object_lock *lock)
 {
-  struct proto_ospf *po=lock->data;
+  struct ospf_iface *ifa=lock->data;
+  struct proto_ospf *po=ifa->proto;
   struct iface *iface=lock->iface;
   struct proto *p=&po->proto;
-  struct nbma_node *nbma,*nb;
-  u8 i;
-  sock *mcsk;
-  struct ospf_iface *ifa;
-  struct ospf_config *c=(struct ospf_config *)(p->cf);
-  struct ospf_area_config *ac;
-  struct ospf_iface_patt *ip=NULL;
-
-  WALK_LIST(ac, c->area_list)
-  {
-    if(ip=(struct ospf_iface_patt *)
-      iface_patt_match(&ac->patt_list, iface)) break;
-  }
 
-  if(!ip)
-  {
-    bug("After lock I cannot find pattern.");
-  }
-
-  ifa=mb_allocz(p->pool, sizeof(struct ospf_iface));
-  ifa->proto=po;
-  ifa->iface=iface;
-
-  ifa->an=ac->areaid;
-  ifa->cost=ip->cost;
-  ifa->rxmtint=ip->rxmtint;
-  ifa->inftransdelay=ip->inftransdelay;
-  ifa->priority=ip->priority;
-  ifa->helloint=ip->helloint;
-  ifa->pollint=ip->pollint;
-  ifa->strictnbma=ip->strictnbma;
-  ifa->waitint=ip->waitint;
-  ifa->deadc=ip->deadc;
-  ifa->stub=ip->stub;
-  ifa->autype=ip->autype;
-  memcpy(ifa->aukey,ip->password,8);
-  ifa->options=2;      /* FIXME what options? */
-
-  if(ip->type==OSPF_IT_UNDEF)
-    ifa->type=ospf_iface_clasify(ifa->iface, (struct proto *)ifa->proto);
-  else ifa->type=ip->type;
+  ifa->ioprob=OSPF_I_OK;
 
   if(ifa->type!=OSPF_IT_NBMA)
   {
@@ -445,10 +473,9 @@ ospf_ifa_add(struct object_lock *lock)
     {
       log("%s: Huh? could not open mc socket on interface %s?", p->name,
         iface->name);
-          mb_free(ifa);
-          log("%s: Ignoring this interface.", p->name);
-         rfree(lock);
-          return;
+      log("%s: Declaring as stub.", p->name);
+      ifa->stub=1;
+      ifa->ioprob += OSPF_I_MC;
     }
     ifa->dr_sk=NULL;
   }
@@ -457,49 +484,12 @@ ospf_ifa_add(struct object_lock *lock)
   {
     log("%s: Huh? could not open ip socket on interface %s?", p->name,
       iface->name);
-        mb_free(ifa);
-        log("%s: Ignoring this interface", p->name);
-       rfree(lock);
-        return;
+    log("%s: Declaring as stub.", p->name);
+    ifa->stub=1;
+    ifa->ioprob += OSPF_I_IP;
   }
   ifa->lock = lock;
 
-  init_list(&ifa->neigh_list);
-  init_list(&ifa->nbma_list);
-  WALK_LIST(nb,ip->nbma_list)
-  {
-    nbma=mb_alloc(p->pool,sizeof(struct nbma_node));
-    nbma->ip=nb->ip;
-    nbma->eligible=nb->eligible;
-    add_tail(&ifa->nbma_list, NODE nbma);
-  }
-  
-  /* Add hello timer */
-  ifa->hello_timer=tm_new(p->pool);
-  ifa->hello_timer->data=ifa;
-  ifa->hello_timer->randomize=0;
-  ifa->hello_timer->hook=hello_timer_hook;
-  ifa->hello_timer->recurrent=ifa->helloint;
-  DBG("%s: Installing hello timer. (%u)\n", p->name, ifa->helloint);
-
-  if(ifa->type==OSPF_IT_NBMA)
-  {
-    ifa->poll_timer=tm_new(p->pool);
-    ifa->poll_timer->data=ifa;
-    ifa->poll_timer->randomize=0;
-    ifa->poll_timer->hook=poll_timer_hook;
-    ifa->poll_timer->recurrent=ifa->pollint;
-    DBG("%s: Installing poll timer. (%u)\n", p->name, ifa->pollint);
-  }
-  else ifa->poll_timer=NULL;
-
-  ifa->wait_timer=tm_new(p->pool);
-  ifa->wait_timer->data=ifa;
-  ifa->wait_timer->randomize=0;
-  ifa->wait_timer->hook=wait_timer_hook;
-  ifa->wait_timer->recurrent=0;
-  DBG("%s: Installing wait timer. (%u)\n", p->name, ifa->waitint);
-  add_tail(&((struct proto_ospf *)p)->iface_list, NODE ifa);
   ifa->state=OSPF_IS_DOWN;
   ospf_int_sm(ifa, ISM_UP);
 }
index 64bfcdc094044f92ce9fabaa2553f8deea24b28d..83bcc5663175b4acdc6fd6298d95be00472faa45 100644 (file)
@@ -578,7 +578,10 @@ ospf_reconfigure(struct proto *p, struct proto_config *c)
            "Interface %s is now stub.",
            ifa->iface->name);
        }
-       if((ip1->stub!=0)&&(ip2->stub==0))
+       if((ip1->stub!=0)&&(ip2->stub==0)&&
+         ((ifa->ioprob & OSPF_I_IP)==0)&&
+         (((ifa->ioprob & OSPF_I_MC)==0)||
+         (ifa->type==OSPF_IT_NBMA)))
        {
          ifa->stub=ip2->stub;
          OSPF_TRACE(D_EVENTS,
index d5ff8e99c7e88cb2dcb7ee0317f7e9b9f5d9e0c6..3eb46598658813c40c3e1f0199238ea248feef7d 100644 (file)
@@ -102,13 +102,17 @@ struct ospf_iface {
   ip_addr bdrip;       /* Backup DR */
   u32 bdrid;
   u8 type;             /* OSPF view of type */
-  u8 strictnbma;       /* Can I talk with unknown neighbors? */
-  u8 stub;             /* Inactive interface */
 #define OSPF_IT_BCAST 0
 #define OSPF_IT_NBMA 1
 #define OSPF_IT_PTP 2
 #define OSPF_IT_VLINK 3
 #define OSPF_IT_UNDEF 4
+  u8 strictnbma;       /* Can I talk with unknown neighbors? */
+  u8 stub;             /* Inactive interface */
+  u8 ioprob;
+#define OSPF_I_OK 0    /* Everything OK */
+#define OSPF_I_MC 1    /* I didn't open MC socket */
+#define OSPF_I_IP 2    /* I didn't open IP socet */
   u8 state;            /* Interface state machine */
 #define OSPF_IS_DOWN 0         /* Not working */
 #define OSPF_IS_LOOP 1         /* Should never happen */