Skip to content

Commit

Permalink
ospf6d: reinvoke MaxAge remover thread if not all MaxAge LSAs were fl…
Browse files Browse the repository at this point in the history
…ushed.

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>
  • Loading branch information
Dinesh Dutt authored and eqvinox committed Nov 8, 2013
1 parent 3810e06 commit 2449fcd
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 25 deletions.
2 changes: 1 addition & 1 deletion lib/libospf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
23 changes: 23 additions & 0 deletions ospf6d/ospf6_lsdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
15 changes: 0 additions & 15 deletions ospf6d/ospf6_lsdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
32 changes: 26 additions & 6 deletions ospf6d/ospf6_top.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,14 +208,15 @@ ospf6_disable (struct ospf6 *o)
}
}

static int
int
ospf6_maxage_remover (struct thread *thread)
{
struct ospf6 *o = (struct ospf6 *) THREAD_ARG (thread);
struct ospf6_area *oa;
struct ospf6_interface *oi;
struct ospf6_neighbor *on;
struct listnode *i, *j, *k;
int reschedule = 0;

o->maxage_remover = (struct thread *) NULL;

Expand All @@ -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;
}
}
Expand All @@ -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;
}
Expand All @@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion ospfd/ospfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 0 additions & 2 deletions ospfd/ospfd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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*/
Expand Down

0 comments on commit 2449fcd

Please sign in to comment.