diff options
author | Martin Mares <mj@ucw.cz> | 1999-02-13 21:55:08 +0100 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1999-02-13 21:55:08 +0100 |
commit | 783f8b689a29aaffbe75e964fdd09a3c219ea81c (patch) | |
tree | 556bb1e5180d85a1ce97316239e3f75a6971593c /nest | |
parent | 013a9b91fe495371cbf9a5690613de45b634e3af (diff) | |
download | bird-783f8b689a29aaffbe75e964fdd09a3c219ea81c.tar bird-783f8b689a29aaffbe75e964fdd09a3c219ea81c.zip |
When protocols go down, prune the neighbor list.
Diffstat (limited to 'nest')
-rw-r--r-- | nest/iface.c | 25 | ||||
-rw-r--r-- | nest/iface.h | 1 | ||||
-rw-r--r-- | nest/proto.c | 1 |
3 files changed, 26 insertions, 1 deletions
diff --git a/nest/iface.c b/nest/iface.c index a3dff4a..28e7739 100644 --- a/nest/iface.c +++ b/nest/iface.c @@ -23,7 +23,6 @@ static void auto_router_id(void); * Neighbor Cache * * FIXME: Use hashing to get some real speed. - * FIXME: Cleanup when a protocol goes down. */ static slab *neigh_slab; @@ -160,6 +159,30 @@ neigh_if_down(struct iface *i) } } +void +neigh_prune(void) +{ + neighbor *n, *m, **N; + struct iface *i; + + DBG("Pruning neighbors\n"); + WALK_LIST(i, iface_list) + { + N = &i->neigh; + while (n = *N) + { + if (n->proto->core_state == FS_HUNGRY || n->proto->core_state == FS_FLUSHING) + { + *N = n->sibling; + rem_node(&n->n); + sl_free(neigh_slab, n); + continue; + } + N = &n->sibling; + } + } +} + /* * The Interface List */ diff --git a/nest/iface.h b/nest/iface.h index 83cbdb0..378cf3d 100644 --- a/nest/iface.h +++ b/nest/iface.h @@ -89,6 +89,7 @@ neighbor *neigh_find(struct proto *, ip_addr *, unsigned flags); void neigh_dump(neighbor *); void neigh_dump_all(void); +void neigh_prune(void); /* * Interface Pattern Lists diff --git a/nest/proto.c b/nest/proto.c index f96d37d..21f3630 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -330,6 +330,7 @@ proto_flush_all(void *unused) struct proto *p; rt_prune(&master_table); + neigh_prune(); while ((p = HEAD(flush_proto_list))->n.next) { DBG("Flushing protocol %s\n", p->name); |