summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2012-08-16 13:09:26 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2012-08-16 13:09:26 +0200
commit8ecbaf9c70b802a1200ad37f2bfd4bc64173c5fe (patch)
treec71ee80e694fffb9481df7a2eaeeab71180c13e8
parentd760229ab897fa1bf1fd0fe7019cc2431d21a1cc (diff)
Fixes a bug with neighbor cache and overlapping IP prefixes.
When there are overlapping IP prefixes and one disappears, neighbors associated with it was removed even if there is another covering IP prefix.
-rw-r--r--nest/neighbor.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/nest/neighbor.c b/nest/neighbor.c
index 506d9bde..9dce8119 100644
--- a/nest/neighbor.c
+++ b/nest/neighbor.c
@@ -114,7 +114,7 @@ neighbor *
neigh_find2(struct proto *p, ip_addr *a, struct iface *ifa, unsigned flags)
{
neighbor *n;
- int class, scope = -1; ;
+ int class, scope = -1;
unsigned int h = neigh_hash(p, a);
struct iface *i;
@@ -240,7 +240,21 @@ neigh_down(neighbor *n)
n->proto->neigh_notify(n);
rem_node(&n->n);
if (n->flags & NEF_STICKY)
- add_tail(&sticky_neigh_list, &n->n);
+ {
+ add_tail(&sticky_neigh_list, &n->n);
+
+ /* Respawn neighbor if there is another matching prefix */
+ struct iface *i;
+ int scope;
+
+ if (!n->iface)
+ WALK_LIST(i, iface_list)
+ if ((scope = if_connected(&n->addr, i)) >= 0)
+ {
+ neigh_up(n, i, scope);
+ return;
+ }
+ }
else
sl_free(neigh_slab, n);
}