summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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*/