]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
rte_better implemented.
authorOndrej Filip <feela@network.cz>
Wed, 17 May 2000 19:27:51 +0000 (19:27 +0000)
committerOndrej Filip <feela@network.cz>
Wed, 17 May 2000 19:27:51 +0000 (19:27 +0000)
proto/ospf/ospf.c
proto/ospf/ospf.h

index 710c41466a2935346d3649c348f082e32560d00f..e73e1ceab548f5ff7ca7ea792cc0683af86d3baf 100644 (file)
@@ -15,6 +15,7 @@ ospf_start(struct proto *p)
   DBG("%s: Start\n",p->name);
 
   p->if_notify=ospf_if_notify;
+  p->rte_better=ospf_rte_better;
   fib_init(&po->efib,p->pool,sizeof(struct extfib),16,init_efib);
 
   return PS_UP;
@@ -69,6 +70,34 @@ ospf_init(struct proto_config *c)
   return p;
 }
 
+/* If new is better return 1 */
+static int
+ospf_rte_better(struct rte *new, struct rte *old)
+{
+  struct proto *p = new->attrs->proto;
+
+  if(new->u.ospf.metric1=LSINFINITY) return 0;
+
+  if(((new->attrs->source==RTS_OSPF) || (new->attrs->source==RTS_OSPF_IA))
+    && (old->attrs->source==RTS_OSPF_EXT)) return 1;
+
+  if(((old->attrs->source==RTS_OSPF) || (old->attrs->source==RTS_OSPF_IA))
+    && (new->attrs->source==RTS_OSPF_EXT)) return 0;
+
+  if(new->u.ospf.metric2!=0)
+  {
+    if(old->u.ospf.metric2==0) return 0;
+    if(new->u.ospf.metric2<old->u.ospf.metric2) return 1;
+    return 0;
+  }
+  else
+  {
+    if(old->u.ospf.metric2!=0) return 1;
+    if(new->u.ospf.metric1<old->u.ospf.metric1) return 1;
+    return 0;
+  }
+}
+
 static void
 ospf_postconfig(struct proto_config *c)
 {
index 13ce8fe08fb18ff719ad030dd64681f9552ef195..7214a00d6da88526e8f906001f5149352ac72a9c 100644 (file)
@@ -349,6 +349,8 @@ static void ospf_dump(struct proto *p);
 static struct proto *ospf_init(struct proto_config *c);
 static void ospf_preconfig(struct protocol *p, struct config *c);
 static void ospf_postconfig(struct proto_config *c);
+static int ospf_rte_better(struct rte *new, struct rte *old);
+
 
 #include "proto/ospf/hello.h"
 #include "proto/ospf/packet.h"