summaryrefslogtreecommitdiffstats
path: root/nest/neighbor.c
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2000-06-01 14:58:04 +0200
committerMartin Mares <mj@ucw.cz>2000-06-01 14:58:04 +0200
commit0f32f2a65a086561fdfd31d4efdea839ec9ce573 (patch)
tree9c92f46776f440fca0aa764c4eeefa07c47e0bad /nest/neighbor.c
parent56ca7acd3afd0df7928b3adfe4a8db8b29b89fb2 (diff)
downloadbird-0f32f2a65a086561fdfd31d4efdea839ec9ce573.tar
bird-0f32f2a65a086561fdfd31d4efdea839ec9ce573.zip
Modified the neighbor cache to remember local addresses as well.
neighbor->scope now contains proper address scope which is zero (SCOPE_HOST) for local addresses, higher (SCOPE_LINK, ..., SCOPE_UNIVERSE) for remote ones.
Diffstat (limited to 'nest/neighbor.c')
-rw-r--r--nest/neighbor.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/nest/neighbor.c b/nest/neighbor.c
index 5522238..8ebdd3a 100644
--- a/nest/neighbor.c
+++ b/nest/neighbor.c
@@ -30,15 +30,15 @@ if_connected(ip_addr *a, struct iface *i) /* -1=error, 1=match, 0=no match */
struct ifa *b;
if (!(i->flags & IF_UP))
- return 0;
+ return -1;
WALK_LIST(b, i->addrs)
{
if (ipa_equal(*a, b->ip))
- return -1;
+ return SCOPE_HOST;
if (b->flags & IA_UNNUMBERED)
{
if (ipa_equal(*a, b->opposite))
- return 1;
+ return b->scope;
}
else
{
@@ -47,18 +47,18 @@ if_connected(ip_addr *a, struct iface *i) /* -1=error, 1=match, 0=no match */
if (ipa_equal(*a, b->prefix) || /* Network address */
ipa_equal(*a, b->brd)) /* Broadcast */
return -1;
- return 1;
+ return b->scope;
}
}
}
- return 0;
+ return -1;
}
neighbor *
neigh_find(struct proto *p, ip_addr *a, unsigned flags)
{
neighbor *n;
- int class;
+ int class, scope = SCOPE_HOST;
unsigned int h = neigh_hash(p, a);
struct iface *i, *j;
@@ -75,14 +75,10 @@ neigh_find(struct proto *p, ip_addr *a, unsigned flags)
j = NULL;
WALK_LIST(i, iface_list)
- switch (if_connected(a, i))
+ if ((scope = if_connected(a, i)) >= 0)
{
- case -1:
- return NULL;
- case 1:
- if (!j)
- j = i;
- /* Fall-thru */
+ j = i;
+ break;
}
if (!j && !(flags & NEF_STICKY))
return NULL;
@@ -101,6 +97,7 @@ neigh_find(struct proto *p, ip_addr *a, unsigned flags)
n->data = NULL;
n->aux = 0;
n->flags = flags;
+ n->scope = scope;
return n;
}
@@ -112,7 +109,7 @@ neigh_dump(neighbor *n)
debug("%s ", n->iface->name);
else
debug("[] ");
- debug("%s %p %08x", n->proto->name, n->data, n->aux);
+ debug("%s %p %08x scope %s", n->proto->name, n->data, n->aux, ip_scope_text(n->scope));
if (n->flags & NEF_STICKY)
debug(" STICKY");
debug("\n");
@@ -137,11 +134,13 @@ void
neigh_if_up(struct iface *i)
{
neighbor *n, *next;
+ int scope;
WALK_LIST_DELSAFE(n, next, sticky_neigh_list)
- if (if_connected(&n->addr, i) > 0)
+ if ((scope = if_connected(&n->addr, i)) >= 0)
{
n->iface = i;
+ n->scope = scope;
add_tail(&i->neighbors, &n->if_n);
rem_node(&n->n);
add_tail(&neigh_hash_table[neigh_hash(n->proto, &n->addr)], &n->n);