summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDinesh Dutt <ddutt@cumulusnetworks.com>2013-08-24 07:54:17 +0000
committerDavid Lamparter <equinox@opensourcerouting.org>2013-11-07 18:15:42 -0800
commit2449fcd64ae95d5fbfd95d93468fc57003def57d (patch)
tree8c152a482f2080ee425cd06381861d2bf69769d4
parent3810e06eebe14f75c66fb17a88574384573e95fa (diff)
downloadquagga-2449fcd64ae95d5fbfd95d93468fc57003def57d.tar.bz2
quagga-2449fcd64ae95d5fbfd95d93468fc57003def57d.tar.xz
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>
-rw-r--r--lib/libospf.h2
-rw-r--r--ospf6d/ospf6_lsdb.c23
-rw-r--r--ospf6d/ospf6_lsdb.h15
-rw-r--r--ospf6d/ospf6_top.c32
-rw-r--r--ospfd/ospfd.c2
-rw-r--r--ospfd/ospfd.h2
6 files changed, 51 insertions, 25 deletions
diff --git a/lib/libospf.h b/lib/libospf.h
index 2282c072..9a60ce9e 100644
--- a/lib/libospf.h
+++ b/lib/libospf.h
@@ -77,6 +77,6 @@
#define OSPF_SPF_MAX_HOLDTIME_DEFAULT 10000
#define OSPF_LSA_MAXAGE_CHECK_INTERVAL 30
-#define OSFP_LSA_MAXAGE_REMOVE_DELAY_DEFAULT 60
+#define OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT 60
#endif /* _LIBOSPFD_H */
diff --git a/ospf6d/ospf6_lsdb.c b/ospf6d/ospf6_lsdb.c
index 7455d835..0edc7a34 100644
--- a/ospf6d/ospf6_lsdb.c
+++ b/ospf6d/ospf6_lsdb.c
@@ -481,6 +481,29 @@ ospf6_lsdb_remove_all (struct ospf6_lsdb *lsdb)
ospf6_lsdb_remove (lsa, lsdb);
}
+int
+ospf6_lsdb_maxage_remover (struct ospf6_lsdb *lsdb)
+{
+ int reschedule = 0;
+ struct ospf6_lsa *lsa;
+
+ for (lsa = ospf6_lsdb_head (lsdb); lsa; lsa = ospf6_lsdb_next (lsa))
+ {
+ if (! OSPF6_LSA_IS_MAXAGE (lsa))
+ continue;
+ if (lsa->retrans_count != 0)
+ {
+ reschedule = 1;
+ continue;
+ }
+ if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type))
+ zlog_debug ("Remove MaxAge %s", lsa->name);
+ ospf6_lsdb_remove (lsa, lsdb);
+ }
+
+ return (reschedule);
+}
+
void
ospf6_lsdb_show (struct vty *vty, int level,
u_int16_t *type, u_int32_t *id, u_int32_t *adv_router,
diff --git a/ospf6d/ospf6_lsdb.h b/ospf6d/ospf6_lsdb.h
index 71297dae..2974ffb1 100644
--- a/ospf6d/ospf6_lsdb.h
+++ b/ospf6d/ospf6_lsdb.h
@@ -34,21 +34,6 @@ struct ospf6_lsdb
void (*hook_remove) (struct ospf6_lsa *);
};
-#define OSPF6_LSDB_MAXAGE_REMOVER(lsdb) \
- do { \
- struct ospf6_lsa *lsa; \
- for (lsa = ospf6_lsdb_head (lsdb); lsa; lsa = ospf6_lsdb_next (lsa)) \
- { \
- if (! OSPF6_LSA_IS_MAXAGE (lsa)) \
- continue; \
- if (lsa->retrans_count != 0) \
- continue; \
- if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type)) \
- zlog_debug ("Remove MaxAge %s", lsa->name); \
- ospf6_lsdb_remove (lsa, lsdb); \
- } \
- } while (0)
-
/* Function Prototypes */
extern struct ospf6_lsdb *ospf6_lsdb_create (void *data);
extern void ospf6_lsdb_delete (struct ospf6_lsdb *lsdb);
diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c
index 540ef382..e9fe7a4e 100644
--- a/ospf6d/ospf6_top.c
+++ b/ospf6d/ospf6_top.c
@@ -208,7 +208,7 @@ ospf6_disable (struct ospf6 *o)
}
}
-static int
+int
ospf6_maxage_remover (struct thread *thread)
{
struct ospf6 *o = (struct ospf6 *) THREAD_ARG (thread);
@@ -216,6 +216,7 @@ ospf6_maxage_remover (struct thread *thread)
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 @@ ospf6_maxage_remover (struct thread *thread)
{
if (on->state != OSPF6_NEIGHBOR_EXCHANGE &&
on->state != OSPF6_NEIGHBOR_LOADING)
- continue;
+ continue;
+ ospf6_maxage_remove (o);
return 0;
}
}
@@ -237,11 +239,28 @@ ospf6_maxage_remover (struct thread *thread)
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;
+ }
+ }
+
+ if (ospf6_lsdb_maxage_remover (o->lsdb))
+ {
+ reschedule = 1;
+ }
+
+ if (reschedule)
+ {
+ ospf6_maxage_remove (o);
}
- OSPF6_LSDB_MAXAGE_REMOVER (o->lsdb);
return 0;
}
@@ -250,7 +269,8 @@ void
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 */
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index 3e2b2348..538bc094 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -200,7 +200,7 @@ ospf_new (void)
new->spf_hold_multiplier = 1;
/* MaxAge init. */
- new->maxage_delay = OSFP_LSA_MAXAGE_REMOVE_DELAY_DEFAULT;
+ new->maxage_delay = OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT;
new->maxage_lsa = route_table_init();
new->t_maxage_walker =
thread_add_timer (master, ospf_lsa_maxage_walker,
diff --git a/ospfd/ospfd.h b/ospfd/ospfd.h
index fe9d77e9..4242aa01 100644
--- a/ospfd/ospfd.h
+++ b/ospfd/ospfd.h
@@ -211,10 +211,8 @@ struct ospf
struct thread *t_opaque_lsa_self; /* Type-11 Opaque-LSAs origin event. */
#endif /* HAVE_OPAQUE_LSA */
-#define OSFP_LSA_MAXAGE_REMOVE_DELAY_DEFAULT 60
unsigned int maxage_delay; /* Delay on Maxage remover timer, sec */
struct thread *t_maxage; /* MaxAge LSA remover timer. */
-#define OSPF_LSA_MAXAGE_CHECK_INTERVAL 30
struct thread *t_maxage_walker; /* MaxAge LSA checking timer. */
struct thread *t_deferred_shutdown; /* deferred/stub-router shutdown timer*/