]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Routing table calculation for ext LSAs having next-hop=!0.0.0.0
authorOndrej Filip <feela@network.cz>
Tue, 16 May 2000 22:34:49 +0000 (22:34 +0000)
committerOndrej Filip <feela@network.cz>
Tue, 16 May 2000 22:34:49 +0000 (22:34 +0000)
proto/ospf/rt.c

index cbda6c0c9adb4bcfb32938cc88fc68ef9461c9e6..9b1b5faa0fae7d3d4024f997feb1a29363535174 100644 (file)
@@ -289,6 +289,11 @@ ospf_ext_spfa(struct proto_ospf *po)       /* FIXME looking into inter-area */
     if(lt->metric==LSINFINITY) continue;
     ip=ipa_and(ipa_from_u32(en->lsa.id),le->netmask);
     mlen=ipa_mklen(le->netmask);
+    if((mlen<0)||(mlen>32))
+    {
+      die("Invalid length of prefix! ID: %I, RT: %I, Type: %u, mask %I",
+        en->lsa.id,en->lsa.rt,en->lsa.type,le->netmask);
+    }
 
     nf=NULL;
 
@@ -304,32 +309,57 @@ ospf_ext_spfa(struct proto_ospf *po)      /* FIXME looking into inter-area */
 
     met=0;met2=0;
 
+    WALK_LIST(atmp,po->area_list)
+    {
+      if((etmp=ospf_hash_find(atmp->gr,en->lsa.rt,en->lsa.rt,LSA_T_RT))!=NULL)
+      {
+        if((absr==NULL) || (absr->dist>etmp->dist) ||
+          ((etmp->dist==absr->dist) && (absroa->areaid<atmp->areaid)))
+        {
+          absr=etmp;
+          absroa=atmp;
+         break;
+        }
+      }
+    }
+    if(absr==NULL) continue;
+
     if(1 || ipa_compare(lt->fwaddr,ipa_from_u32(0))==0)        /* FIXME add fwaddr */
     {
+      if(lt->etos>0)
+      {
+        met=absr->dist;
+        met2=lt->metric;
+      }
+      else
+      {
+        met=absr->dist+lt->metric;
+       met2=0;
+      }
+    }
+    else
+    {
+      nf=NULL;
       WALK_LIST(atmp,po->area_list)
       {
-        if((etmp=ospf_hash_find(atmp->gr,en->lsa.rt,en->lsa.rt,LSA_T_RT))!=NULL)
+        if((nf=fib_route(&atmp->infib,lt->fwaddr,32))!=NULL)
        {
-         if((absr==NULL) || (absr->dist>etmp->dist) ||
-            ((etmp->dist==absr->dist) && (absroa->areaid<atmp->areaid)))
-         {
-           absr=etmp;
-           absroa=atmp;
-         }
+         break;
        }
       }
-      if(absr==NULL) continue;
+      if(nf==NULL) continue;
       if(lt->etos>0)
       {
-        met=absr->dist;
+        met=nf->metric;
         met2=lt->metric;
       }
       else
       {
-        met=absr->dist+lt->metric;
+        met=nf->metric+lt->metric;
        met2=0;
       }
     }
+
     nf=fib_get(ef,&ip, mlen);
     if((nf->metric>met) || ((nf->metric==met)&&(nf->metric2>met2)))
     {