[ospfd] Fix assertion in DB-exchange fix, hit by ogier-db-ex-opt commit

2006-08-28 Andy Gay <andy@andynet.net>

	* ospf_packet.c: (ospf_make_db_desc) Assert added with More-bit
	  fixes does not hold up with addition of Ogier DB-Exchange
	  optimisation, which can empty the db-summary list in between
	  sent DD packets. Remove assert, update More-bit always when
	  in Exchange.
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index 0015ee6..4da013a 100644
--- a/ospfd/ChangeLog
+++ b/ospfd/ChangeLog
@@ -1,3 +1,11 @@
+2006-08-28 Andy Gay <andy@andynet.net>
+
+	* ospf_packet.c: (ospf_make_db_desc) Assert added with More-bit
+	  fixes does not hold up with addition of Ogier DB-Exchange
+	  optimisation, which can empty the db-summary list in between
+	  sent DD packets. Remove assert, update More-bit always when
+	  in Exchange.
+
 2006-08-27 J.J. Krabbendam <jkrabbendam@aimsys.nl>
 
 	* ospfd.c: (ospf_finish_final) default redistribute should be
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index d7a3564..9152739 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -2712,25 +2712,9 @@
   /* Set DD Sequence Number. */
   stream_putl (s, nbr->dd_seqnum);
 
+  /* shortcut unneeded walk of (empty) summary LSDBs */
   if (ospf_db_summary_isempty (nbr))
-    {
-      /* Sanity check:
-       *
-       * Must be here either:
-       * - Initial DBD (ospf_nsm.c)
-       *   - M must be set
-       * or
-       * - finishing Exchange, and DB-Summary list empty
-       *   - from ospf_db_desc_proc()
-       *   - M must not be set
-       */
-      if (nbr->state >= NSM_Exchange)
-	assert (!IS_SET_DD_M(nbr->dd_flags));
-      else
-        assert (IS_SET_DD_M(nbr->dd_flags));
-
-      return length;
-    }
+    goto empty;
 
   /* Describe LSA Header from Database Summary List. */
   lsdb = &nbr->db_sum;
@@ -2785,9 +2769,17 @@
   /* Update 'More' bit */
   if (ospf_db_summary_isempty (nbr))
     {
-      UNSET_FLAG (nbr->dd_flags, OSPF_DD_FLAG_M);
-      /* Rewrite DD flags */
-      stream_putc_at (s, pp, nbr->dd_flags);
+empty:
+      if (nbr->state >= NSM_Exchange)
+        {
+          UNSET_FLAG (nbr->dd_flags, OSPF_DD_FLAG_M);
+          /* Rewrite DD flags */
+          stream_putc_at (s, pp, nbr->dd_flags);
+        }
+      else
+        {
+          assert (IS_SET_DD_M(nbr->dd_flags));
+        }
     }
   return length;
 }