summaryrefslogtreecommitdiffstats
path: root/nest
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-02-13 21:55:08 +0100
committerMartin Mares <mj@ucw.cz>1999-02-13 21:55:08 +0100
commit783f8b689a29aaffbe75e964fdd09a3c219ea81c (patch)
tree556bb1e5180d85a1ce97316239e3f75a6971593c /nest
parent013a9b91fe495371cbf9a5690613de45b634e3af (diff)
downloadbird-783f8b689a29aaffbe75e964fdd09a3c219ea81c.tar
bird-783f8b689a29aaffbe75e964fdd09a3c219ea81c.zip
When protocols go down, prune the neighbor list.
Diffstat (limited to 'nest')
-rw-r--r--nest/iface.c25
-rw-r--r--nest/iface.h1
-rw-r--r--nest/proto.c1
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);