From 64e08775251960a2b009fc35a084610c9c4c4909 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Wed, 1 Feb 2023 12:10:34 +0100 Subject: Proto: Adding a list of associated neighbors This makes for safer and faster pruning and notifying as protocol now on its shutdown prunes only its neighbors and nothing else. --- nest/neighbor.c | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) (limited to 'nest/neighbor.c') diff --git a/nest/neighbor.c b/nest/neighbor.c index 81da24d5..c27db989 100644 --- a/nest/neighbor.c +++ b/nest/neighbor.c @@ -256,6 +256,7 @@ neigh_find(struct proto *p, ip_addr a, struct iface *iface, uint flags) n = sl_allocz(neigh_slab); add_tail(&neigh_hash_table[h], &n->n); add_tail((scope >= 0) ? &iface->neighbors : &sticky_neigh_list, &n->if_n); + proto_neigh_add_tail(&p->neighbors, n); n->addr = a; n->ifa = addr; n->iface = iface; @@ -308,7 +309,7 @@ neigh_dump_all(void) static inline void neigh_notify(neighbor *n) { - if (n->proto->neigh_notify && (n->proto->proto_state != PS_STOP)) + if (n->proto && n->proto->neigh_notify && (n->proto->proto_state != PS_STOP)) n->proto->neigh_notify(n); } @@ -343,8 +344,12 @@ neigh_down(neighbor *n) static inline void neigh_free(neighbor *n) { + proto_neigh_rem_node(&n->proto->neighbors, n); + n->proto = NULL; + rem_node(&n->n); rem_node(&n->if_n); + sl_free(n); } @@ -519,15 +524,6 @@ neigh_ifa_down(struct ifa *a) neigh_update(n, i); } -static inline void -neigh_prune_one(neighbor *n) -{ - if (n->proto->proto_state != PS_DOWN) - return; - - neigh_free(n); -} - /** * neigh_prune - prune neighbor cache * @@ -536,16 +532,10 @@ neigh_prune_one(neighbor *n) * is shut down to get rid of all its heritage. */ void -neigh_prune(void) +neigh_prune(struct proto *p) { - neighbor *n; - node *m; - int i; - - DBG("Pruning neighbors\n"); - for(i=0; ineighbors)) + neigh_free(THEAD(proto_neigh, &p->neighbors)); } /** -- cgit v1.2.3