]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixes a bug in LSA flooding.
authorOndrej Zajicek <santiago@crfreenet.org>
Fri, 7 May 2010 13:54:27 +0000 (15:54 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Fri, 7 May 2010 13:54:27 +0000 (15:54 +0200)
LSAs are sometimes prematurely removed from LS retransmission lists.

proto/ospf/lsack.c
proto/ospf/lsupd.c

index c05f019619c2fa5035adb6be916e5311804a337d..53422e53a3d74c7c98ed5cac7c0784f42eaf5296 100644 (file)
@@ -183,9 +183,6 @@ ospf_lsack_receive(struct ospf_packet *ps_i, struct ospf_iface *ifa,
     DBG("Deleting LS Id: %R RT: %R Type: %u from LS Retl for neighbor %R\n",
        lsa.id, lsa.rt, lsa.type, n->rid);
     s_rem_node(SNODE en);
-    if (en->lsa_body != NULL)
-      mb_free(en->lsa_body);
-    en->lsa_body = NULL;
     ospf_hash_delete(n->lsrth, en);
   }
 }
index 7d5d89dab4e4d755731b6b4bcc5f7369cd5387d6..62e7eac1cdea41c4cda883338a53c670c97bba3b 100644 (file)
@@ -241,9 +241,6 @@ ospf_lsupd_flood(struct proto_ospf *po,
        if ((en = ospf_hash_find_header(nn->lsrth, domain, hh)) != NULL)
        {
          s_rem_node(SNODE en);
-         if (en->lsa_body != NULL)
-           mb_free(en->lsa_body);
-         en->lsa_body = NULL;
          ospf_hash_delete(nn->lsrth, en);
        }
       }
@@ -585,20 +582,9 @@ ospf_lsupd_receive(struct ospf_packet *ps_i, struct ospf_iface *ifa,
        continue;
       }
 
-      if (ospf_lsupd_flood(po, n, lsa, &lsatmp, domain, 1) == 0)
-      {
-       DBG("Wasn't flooded back\n");   /* ps 144(5e), pg 153 */
-       if (ifa->state == OSPF_IS_BACKUP)
-       {
-         if (ifa->drid == n->rid)
-           ospf_lsack_enqueue(n, lsa, ACKL_DELAY);
-       }
-       else
-         ospf_lsack_enqueue(n, lsa, ACKL_DELAY);
-      }
-
       /* Remove old from all ret lists */
       /* pg 144 (5c) */
+      /* Must be done before (5b), otherwise it also removes the new entries from (5b) */
       if (lsadb)
        WALK_LIST(ift, po->iface_list)
          WALK_LIST(ntmp, ift->neigh_list)
@@ -608,13 +594,23 @@ ospf_lsupd_receive(struct ospf_packet *ps_i, struct ospf_iface *ifa,
          if ((en = ospf_hash_find_header(ntmp->lsrth, domain, &lsadb->lsa)) != NULL)
          {
            s_rem_node(SNODE en);
-           if (en->lsa_body != NULL)
-             mb_free(en->lsa_body);
-           en->lsa_body = NULL;
            ospf_hash_delete(ntmp->lsrth, en);
          }
       }
 
+      /* pg 144 (5b) */
+      if (ospf_lsupd_flood(po, n, lsa, &lsatmp, domain, 1) == 0)
+      {
+       DBG("Wasn't flooded back\n");   /* ps 144(5e), pg 153 */
+       if (ifa->state == OSPF_IS_BACKUP)
+       {
+         if (ifa->drid == n->rid)
+           ospf_lsack_enqueue(n, lsa, ACKL_DELAY);
+       }
+       else
+         ospf_lsack_enqueue(n, lsa, ACKL_DELAY);
+      }
+
       if ((lsatmp.age == LSA_MAXAGE) && (lsatmp.sn == LSA_MAXSEQNO)
          && lsadb && can_flush_lsa(po))
       {
@@ -661,10 +657,8 @@ ospf_lsupd_receive(struct ospf_packet *ps_i, struct ospf_iface *ifa,
       {
        /* pg145 (7a) */
        s_rem_node(SNODE en);
-       if (en->lsa_body != NULL)
-         mb_free(en->lsa_body);
-       en->lsa_body = NULL;
        ospf_hash_delete(n->lsrth, en);
+
        if (ifa->state == OSPF_IS_BACKUP)
        {
          if (n->rid == ifa->drid)