diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2012-01-01 12:02:20 +0100 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2012-01-01 12:14:42 +0100 |
commit | 69a8259c5e438f949bd58b1a2f8e1d12a49f9216 (patch) | |
tree | 5d685368ce58732ce4a9133b5f5bc43b20b78476 /proto/static/static.c | |
parent | c32c3f88f0c8788118ed3701c11a5aea2aaf9356 (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.c | 14 |
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; |