diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2012-10-08 00:01:10 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2012-10-08 00:01:10 +0200 |
commit | a934dcc3ce78b22a0ff4db5d353a3d8dcc2b5f1d (patch) | |
tree | cba93f8f90b56a47d5537238198ea68476bbfe3e /ffd/announce.c | |
parent | 5d538bb78e1820a807a8670cd3075757f2e115f0 (diff) | |
download | ffd-a934dcc3ce78b22a0ff4db5d353a3d8dcc2b5f1d.tar ffd-a934dcc3ce78b22a0ff4db5d353a3d8dcc2b5f1d.zip |
Purge old neigh and announce entries
Diffstat (limited to 'ffd/announce.c')
-rw-r--r-- | ffd/announce.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/ffd/announce.c b/ffd/announce.c index 99bf1aa..6b30ec6 100644 --- a/ffd/announce.c +++ b/ffd/announce.c @@ -28,6 +28,35 @@ #include "neigh.h" +static void maintain_nexthops(ffd_announce_t *announce) { + ffd_nexthop_t **cur, **next; + for (cur = &announce->nexthop_list; *cur; cur = next) { + ffd_nexthop_t *nexthop = *cur; + next = &nexthop->next; + + if (!nexthop->neigh) /* local */ + continue; + + if (timespec_diff(&now, &nexthop->last_update) > FFD_UPDATE_TIMEOUT(nexthop->interval)) { + if (nexthop->metric_seqno.metric == 0xffff) { + *cur = *next; + next = cur; + + if (announce->selected == nexthop) + announce->selected = NULL; + + nexthop->neigh->nexthop_refs--; + + free(nexthop); + } + else { + nexthop->metric_seqno.metric = 0xffff; + add_interval(&nexthop->last_update, FFD_UPDATE_TIMEOUT(nexthop->interval)); + } + } + } +} + static ffd_nexthop_t* select_nexthop(const ffd_announce_t *announce) { uint16_t ret_metric = 0xffff; ffd_nexthop_t *ret = NULL; @@ -63,6 +92,8 @@ ffd_metric_seqno_t get_metric(const ffd_announce_t *announce) { } void ffd_announce_update(ffd_announce_t *announce) { + maintain_nexthops(announce); + announce->selected = select_nexthop(announce); announce->metric = get_metric(announce); } |