diff --git a/nest/iface.c b/nest/iface.c index a3dff4af..28e7739b 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 83cbdb07..378cf3d1 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 f96d37dc..21f36307 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);