summaryrefslogtreecommitdiff
path: root/proto/static/static.c
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2012-01-01 12:02:20 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2012-01-01 12:14:42 +0100
commit69a8259c5e438f949bd58b1a2f8e1d12a49f9216 (patch)
tree5d685368ce58732ce4a9133b5f5bc43b20b78476 /proto/static/static.c
parentc32c3f88f0c8788118ed3701c11a5aea2aaf9356 (diff)
Allows sticky link-local neighbors.
Allows using NEF_STICKY neighbors with link-local addresses. This is used for static route nexthops, they can be specified like fe80::1%eth0 .
Diffstat (limited to 'proto/static/static.c')
-rw-r--r--proto/static/static.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/proto/static/static.c b/proto/static/static.c
index e5b293c0..3323c7ee 100644
--- a/proto/static/static.c
+++ b/proto/static/static.c
@@ -138,12 +138,10 @@ static_decide(struct static_config *cf, struct static_route *r)
/* r->dest != RTD_MULTIPATH, but may be RTD_NONE (part of multipath route)
the route also have to be valid (r->neigh != NULL) */
- struct iface *ifa = r->neigh->iface;
-
- if (!ifa)
+ if (r->neigh->scope < 0)
return 0;
- if (cf->check_link && !(ifa->flags & IF_LINK_UP))
+ if (cf->check_link && !(r->neigh->iface->flags & IF_LINK_UP))
return 0;
return 1;
@@ -158,7 +156,7 @@ static_add(struct proto *p, struct static_config *cf, struct static_route *r)
{
case RTD_ROUTER:
{
- struct neighbor *n = neigh_find(p, &r->via, NEF_STICKY);
+ struct neighbor *n = neigh_find2(p, &r->via, r->via_if, NEF_STICKY);
if (n)
{
r->chain = n->data;
@@ -187,7 +185,7 @@ static_add(struct proto *p, struct static_config *cf, struct static_route *r)
for (r2 = r->mp_next; r2; r2 = r2->mp_next)
{
- struct neighbor *n = neigh_find(p, &r2->via, NEF_STICKY);
+ struct neighbor *n = neigh_find2(p, &r2->via, r2->via_if, NEF_STICKY);
if (n)
{
r2->chain = n->data;
@@ -385,7 +383,7 @@ static_same_dest(struct static_route *x, struct static_route *y)
switch (x->dest)
{
case RTD_ROUTER:
- return ipa_equal(x->via, y->via);
+ return ipa_equal(x->via, y->via) && (x->via_if == y->via_if);
case RTD_DEVICE:
return !strcmp(x->if_name, y->if_name);
@@ -394,7 +392,7 @@ static_same_dest(struct static_route *x, struct static_route *y)
for (x = x->mp_next, y = y->mp_next;
x && y;
x = x->mp_next, y = y->mp_next)
- if (!ipa_equal(x->via, y->via))
+ if (!ipa_equal(x->via, y->via) || (x->via_if != y->via_if))
return 0;
return !x && !y;