]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixes bug in OSPF ext-LSA origination.
authorOndrej Zajicek <santiago@crfreenet.org>
Sat, 31 Jul 2010 09:37:30 +0000 (11:37 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Sat, 31 Jul 2010 09:37:30 +0000 (11:37 +0200)
proto/ospf/topology.c

index ea674e2c9db5eb13e4eacf3775aca9695c301c41..16a066763de63a725489f1f7568785b8908b1a6b 100644 (file)
@@ -145,7 +145,7 @@ get_seqnum(struct top_hash_entry *en)
 
   if (en->lsa.sn == LSA_MAXSEQNO)
   {
-    log(L_WARN, "OSPF: Premature origination of LSA (Type: %04x, Id: %R, Rt: %R)",
+    log(L_WARN "OSPF: Premature origination of LSA (Type: %04x, Id: %R, Rt: %R)",
        en->lsa.type, en->lsa.id, en->lsa.rt);
     return LSA_INITSEQNO;
   }
@@ -657,7 +657,7 @@ check_sum_lsa_same(struct top_hash_entry *en, u32 metric)
 {
   /* Netmask already checked in check_sum_net_lsaid_collision() */
   struct ospf_lsa_sum *sum = en->lsa_body;
-  return (sum->metric == metric);
+  return (en->lsa.sn != LSA_MAXSEQNO) && (sum->metric == metric);
 }
 
 #define check_sum_net_lsa_same(en,metric) \
@@ -700,7 +700,7 @@ check_sum_net_lsa_same(struct top_hash_entry *en, u32 metric)
 {
   /* Prefix already checked in check_sum_net_lsaid_collision() */
   struct ospf_lsa_sum_net *sum = en->lsa_body;
-  return (sum->metric == metric);
+  return (en->lsa.sn != LSA_MAXSEQNO) && (sum->metric == metric);
 }
 
 static inline void *
@@ -720,7 +720,8 @@ static inline int
 check_sum_rt_lsa_same(struct top_hash_entry *en, u32 drid, u32 metric, u32 options)
 {
   struct ospf_lsa_sum_rt *sum = en->lsa_body;
-  return (sum->options == options) && (sum->metric == metric) && (sum->drid == drid);
+  return (en->lsa.sn != LSA_MAXSEQNO) && (sum->options == options) &&
+    (sum->metric == metric) && (sum->drid == drid);
 }
 
 #endif
@@ -886,7 +887,8 @@ check_ext_lsa(struct top_hash_entry *en, struct fib_node *fn, u32 metric, ip_add
   if  (fn->pxlen != ipa_mklen(ext->netmask))
     return -1;
 
-  return (ext->metric == metric) && (ext->tag == tag) && ipa_equal(ext->fwaddr,fwaddr);
+  return (en->lsa.sn != LSA_MAXSEQNO) && (ext->metric == metric) &&
+    (ext->tag == tag) && ipa_equal(ext->fwaddr,fwaddr);
 }
 
 #else /* OSPFv3 */
@@ -938,6 +940,9 @@ check_ext_lsa(struct top_hash_entry *en, struct fib_node *fn, u32 metric, ip_add
   if ((fn->pxlen != pxlen) || !ipa_equal(fn->prefix, prefix))
     return -1;
 
+  if (en->lsa.sn == LSA_MAXSEQNO)
+    return 0;
+
   u32 rt_metric = ext->metric & METRIC_MASK;
   ip_addr rt_fwaddr = IPA_NONE;
   u32 rt_tag = 0;