ospf6d: reinvoke MaxAge remover thread if not all MaxAge LSAs were flushed.

MaxAge LSAs are being flushed out only on an event, unlike OSPFv2 where they're flushed out
periodically. This causes certain LSAs to hang around forever, never getting flushed out.
This patch makes flushing out MaxAge LSAs periodic, retriggered after a certain period if
not all MaxAge LSAs were flushed out.

Signed-off-by: Dinesh G Dutt <ddutt at cumulusnetworks.com>
Reviewed-by: Scott Feldman <sfeldma at cumulusnetworks.com>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c
index 540ef38..e9fe7a4 100644
--- a/ospf6d/ospf6_top.c
+++ b/ospf6d/ospf6_top.c
@@ -208,7 +208,7 @@
     }
 }
 
-static int
+int
 ospf6_maxage_remover (struct thread *thread)
 {
   struct ospf6 *o = (struct ospf6 *) THREAD_ARG (thread);
@@ -216,6 +216,7 @@
   struct ospf6_interface *oi;
   struct ospf6_neighbor *on;
   struct listnode *i, *j, *k;
+  int reschedule = 0;
 
   o->maxage_remover = (struct thread *) NULL;
 
@@ -227,8 +228,9 @@
             {
               if (on->state != OSPF6_NEIGHBOR_EXCHANGE &&
                   on->state != OSPF6_NEIGHBOR_LOADING)
-                continue;
+		  continue;
 
+	      ospf6_maxage_remove (o);
               return 0;
             }
         }
@@ -237,11 +239,28 @@
   for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
       for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
-        OSPF6_LSDB_MAXAGE_REMOVER (oi->lsdb);
+	{
+	  if (ospf6_lsdb_maxage_remover (oi->lsdb))
+	    {
+	      reschedule = 1;
+	    }
+	}
       
-      OSPF6_LSDB_MAXAGE_REMOVER (oa->lsdb);
+      if (ospf6_lsdb_maxage_remover (oa->lsdb))
+	{
+	    reschedule = 1;
+	}
     }
-  OSPF6_LSDB_MAXAGE_REMOVER (o->lsdb);
+
+  if (ospf6_lsdb_maxage_remover (o->lsdb))
+    {
+      reschedule = 1;
+    }
+
+  if (reschedule)
+    {
+      ospf6_maxage_remove (o);
+    }
 
   return 0;
 }
@@ -250,7 +269,8 @@
 ospf6_maxage_remove (struct ospf6 *o)
 {
   if (o && ! o->maxage_remover)
-    o->maxage_remover = thread_add_event (master, ospf6_maxage_remover, o, 0);
+    o->maxage_remover = thread_add_timer (master, ospf6_maxage_remover, o,
+					  OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT);
 }
 
 /* start ospf6 */