]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
RT calculation strongly simplified. Now, I don't need any
authorOndrej Filip <feela@network.cz>
Sun, 30 Apr 2000 09:32:41 +0000 (09:32 +0000)
committerOndrej Filip <feela@network.cz>
Sun, 30 Apr 2000 09:32:41 +0000 (09:32 +0000)
memory allocation. :-)

proto/ospf/ospf.h
proto/ospf/rt.c
proto/ospf/rt.h
proto/ospf/topology.h

index 939bae7dbf92e7ad37495a9848face6ddace6b72..39f59bde10be8d95e92ab5ee1ce034421c1ac132 100644 (file)
@@ -336,11 +336,6 @@ struct proto_ospf {
   int areano;                  /* Number of area I belong to */
 };
 
-struct spf_n {
-  node n;
-  struct top_hash_entry *en;
-};
-
 static int ospf_start(struct proto *p);
 static void ospf_dump(struct proto *p);
 static struct proto *ospf_init(struct proto_config *c);
index cc996b851f8177eabb3df1e69a02586eca38de1f..2d923ea1cd8c8f2666bf9d5d846ecf4604e5e289 100644 (file)
@@ -8,23 +8,19 @@
 
 #include "ospf.h"
 
-/* FIXME next hop calculation
- * FIXME sync with BIRD's routing table
- */
-
 void
 ospf_rt_spfa(struct ospf_area *oa, struct proto *p)
 {
   struct top_hash_entry *en, *nx;
-  slab *sl, *sll;
-  struct spf_n *cn;
   u32 i,*rts;
   struct ospf_lsa_rt *rt;
   struct ospf_lsa_rt_link *rtl;
+  rta a0,*a;
 
   /*
    * First of all, mark all vertices as they are not in SPF
    * Maybe I can join this work with Aging of structure
+   * FIXME look at it
    */
 
   WALK_SLIST(SNODE en, oa->lsal)
@@ -36,14 +32,9 @@ ospf_rt_spfa(struct ospf_area *oa, struct proto *p)
   init_list(&oa->cand);                /* Empty list of candidates */
   oa->trcap=0;
 
-  sl=sl_new(p->pool,sizeof(struct spf_n));
-  sll=sl_new(p->pool,sizeof(list));
-
-  cn=sl_alloc(sl);
-  cn->en=oa->rt;
   oa->rt->dist=0;
   oa->rt->color=CANDIDATE;
-  add_head(&oa->cand,NODE cn);
+  add_head(&oa->cand, &en->cn);
 
   while(!EMPTY_LIST(oa->cand))
   {
@@ -52,9 +43,8 @@ ospf_rt_spfa(struct ospf_area *oa, struct proto *p)
     struct ospf_lsa_net *net;
 
     n=HEAD(oa->cand);
-    act=((struct spf_n *)n)->en;
+    act=SKIP_BACK(struct top_hash_entry, cn, n);
     rem_node(n);
-    sl_free(sl,n);             /* Good idea? */
 
     act->color=INSPF;
     switch(act->lsa.type)
@@ -82,7 +72,7 @@ ospf_rt_spfa(struct ospf_area *oa, struct proto *p)
              log("Unknown link type in router lsa.\n");
              break;
          }
-         add_cand(&oa->cand,tmp,act,act->dist+rtl->metric,sl,sll);
+         add_cand(&oa->cand,tmp,act,act->dist+rtl->metric);
        }
         break;
       case LSA_T_NET:
@@ -92,7 +82,7 @@ ospf_rt_spfa(struct ospf_area *oa, struct proto *p)
          sizeof(struct ospf_lsa_net))/sizeof(u32);i++)
        {
          tmp=ospf_hash_find(oa->gr, *rts, *rts, LSA_T_RT);
-          add_cand(&oa->cand,tmp,act,act->dist,sl,sll);
+          add_cand(&oa->cand,tmp,act,act->dist);
        }
         break;
     }
@@ -131,110 +121,57 @@ ospf_rt_spfa(struct ospf_area *oa, struct proto *p)
 
 void
 add_cand(list *l, struct top_hash_entry *en, struct top_hash_entry *par, 
-  u16 dist, slab *s, slab *sll)
+  u16 dist)
 {
-  struct spf_n *tmp;
-  node *prev;
+  node *prev,*n;
   int flag=0;
+  struct top_hash_entry *act;
 
   if(en==NULL) return;
   if(en->lsa.age==LSA_MAXAGE) return;
   /* FIXME Does it have link back? Test it! */
   if(en->color==INSPF) return;
 
-  if(dist>en->dist) return;
+  if(dist>=en->dist) return;
+  /*
+   * FIXME The line above is not a bug, but we don't support
+   * multiple next hops. I'll start as soon as nest will
+   */
   
-  if(dist==en->dist)
+  en->nh=calc_next_hop(par);
+
+  if(en->color==CANDIDATE)     /* We found shorter path */
   {
-    en->nh=multi_next_hop(par,en,s,sll);
+    rem_node(&en->cn);
   }
-  else
-  {
-    en->nh=calc_next_hop(par,s,sll);
-
-    if(en->color==CANDIDATE)
-    {
-      WALK_LIST(tmp,*l)
-      {
-        if(tmp->en==en)
-       {
-         rem_node(NODE tmp);
-         flag=1;
-         break;
-       }
-      }
-    }
-
-    if(flag!=1)
-    {
-      tmp=sl_alloc(s);
-      tmp->en=en;
-    }
 
-    en->dist=dist;
-    en->color=CANDIDATE;
+  en->dist=dist;
+  en->color=CANDIDATE;
 
-    prev=NULL;
+  prev=NULL;
 
-    WALK_LIST(tmp,*l)
+  WALK_LIST(n,*l)
+  {
+    act=SKIP_BACK(struct top_hash_entry, cn, n);
+    if((act->dist>dist)||
+      ((act->dist==dist)&&(act->lsa.type==LSA_T_NET)))
     {
-      if((tmp->en->dist>dist)||
-        ((tmp->en->dist==dist)&&(tmp->en->lsa.type==LSA_T_NET)))
-      {
-        if(prev==NULL) add_head(l,NODE tmp);
-       else insert_node(NODE tmp,prev);
-        break;
-      }
+      if(prev==NULL) add_head(l,&en->cn);
+      else insert_node(&en->cn,prev);
+      break;
     }
-    /* FIXME Some VLINK staff should be here */
+    prev=n;
   }
+  /* FIXME Some VLINK staff should be here */
+  
 }
 
-list *
-calc_next_hop(struct top_hash_entry *par, slab *sl, slab *sll)
+struct top_hash_entry *
+calc_next_hop(struct top_hash_entry *par)
 {
-  struct spf_n *nh;
-  list *l;
-
   if(par->nh==NULL)
   {
     if(par->lsa.type!=LSA_T_RT) return NULL;
-    l=sl_alloc(sll);
-    init_list(l);
-    nh=sl_alloc(sl);
-    nh->en=par;
-    add_head(l, NODE nh);
-    return l;
   }
-  return par->nh;
+  return par;
 }
-
-list *
-multi_next_hop(struct top_hash_entry *par, struct top_hash_entry *en, slab *sl,
- slab *sll)
-{
-  struct spf_n *n1,*n2;
-  list *l1,*l2;
-
-  l1=calc_next_hop(par,sl,sll);
-  if(l1==NULL) return en->nh;
-  if(en->nh==NULL) return l1;
-
-  l2=sl_alloc(sll);
-  init_list(l2);
-  WALK_LIST(n1, *l1)
-  {
-    n2=sl_alloc(sl);
-    memcpy(n2,n1,sizeof(struct spf_n));
-    add_tail(l2,NODE n2);
-  }
-
-  WALK_LIST(n1, *en->nh)
-  {
-    n2=sl_alloc(sl);
-    memcpy(n2,n1,sizeof(struct spf_n));
-    add_tail(l2,NODE n2);
-  }
-  return l2;
-}
-
index fd827b0095eceaf186367a9718817124e18335c8..eb8c43cf428717d4d5fb2624498bdd03d28f8668 100644 (file)
 
 void ospf_rt_spfa(struct ospf_area *oa, struct proto *p);
 void add_cand(list *l, struct top_hash_entry *en, struct top_hash_entry *par,
-  u16 dist, slab *s, slab *sll);
-list *calc_next_hop(struct top_hash_entry *par, slab *sl, slab *sll);
-list *multi_next_hop(struct top_hash_entry *par, struct top_hash_entry *en,
-  slab *sl, slab *sll);
-
+  u16 dist);
+struct top_hash_entry *calc_next_hop(struct top_hash_entry *par);
 
 #endif /* _BIRD_OSPF_RT_H_ */
index e825de73f25f071c8489c9666c9aaff0ac7c1973..1c3e9ea5fd8dc9369733daa2d22ac8708a62078d 100644 (file)
 
 struct top_hash_entry {  /* Index for fast mapping (type,rtrid,LSid)->vertex */
    snode n;
+   node cn;
   struct top_hash_entry *next;         /* Next in hash chain */
   struct ospf_lsa_header lsa;
   void *lsa_body;
   bird_clock_t inst_t;                 /* Time of installation into DB */
-  list *nh;                            /* List of next hops */
+  struct top_hash_entry *nh;           /* Next hop */
   u16 dist;                            /* Distance from the root */
   u8 color;
 #define OUTSPF 0