Fixed a couple of bugs in static protocol. All static routes except device
ones seem to work well.
This commit is contained in:
parent
618533af91
commit
980297d289
2 changed files with 29 additions and 16 deletions
|
@ -65,30 +65,42 @@ static_start(struct proto *P)
|
||||||
|
|
||||||
DBG("Static: take off!\n");
|
DBG("Static: take off!\n");
|
||||||
WALK_LIST(r, p->other_routes)
|
WALK_LIST(r, p->other_routes)
|
||||||
if (r->dest == RTD_ROUTER)
|
switch (r->dest)
|
||||||
|
{
|
||||||
|
case RTD_ROUTER:
|
||||||
{
|
{
|
||||||
struct neighbor *n = neigh_find(P, &r->via, NEF_STICKY);
|
struct neighbor *n = neigh_find(P, &r->via, NEF_STICKY);
|
||||||
if (n)
|
if (n)
|
||||||
{
|
{
|
||||||
|
r->chain = n->data;
|
||||||
n->data = r;
|
n->data = r;
|
||||||
r->neigh = n;
|
r->neigh = n;
|
||||||
static_install(p, r, n->iface);
|
static_install(p, r, n->iface);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
log(L_ERR "Static route destination %I is invalid. Ignoring.\n", r->via);
|
log(L_ERR "Static route destination %I is invalid. Ignoring.\n", r->via);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case RTD_DEVICE:
|
||||||
|
die("Static device routes are not supported");
|
||||||
|
/* FIXME: Static device routes */
|
||||||
|
default:
|
||||||
static_install(p, r, NULL);
|
static_install(p, r, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
static_neigh_notify(struct neighbor *n)
|
static_neigh_notify(struct neighbor *n)
|
||||||
{
|
{
|
||||||
|
struct static_proto *p = (struct static_proto *) n->proto;
|
||||||
|
struct static_route *r;
|
||||||
|
|
||||||
DBG("Static: neighbor notify for %I: iface %p\n", n->addr, n->iface);
|
DBG("Static: neighbor notify for %I: iface %p\n", n->addr, n->iface);
|
||||||
|
for(r=n->data; r; r=r->chain)
|
||||||
if (n->iface)
|
if (n->iface)
|
||||||
static_install((struct static_proto *) n->proto, n->data, n->iface);
|
static_install(p, r, n->iface);
|
||||||
else
|
else
|
||||||
static_remove((struct static_proto *) n->proto, n->data);
|
static_remove(p, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -19,6 +19,7 @@ void static_init_instance(struct static_proto *);
|
||||||
|
|
||||||
struct static_route {
|
struct static_route {
|
||||||
node n;
|
node n;
|
||||||
|
struct static_route *chain; /* Next for the same neighbor */
|
||||||
ip_addr net; /* Network we route */
|
ip_addr net; /* Network we route */
|
||||||
int masklen; /* Mask length */
|
int masklen; /* Mask length */
|
||||||
int dest; /* Destination type (RTD_*) */
|
int dest; /* Destination type (RTD_*) */
|
||||||
|
|
Loading…
Reference in a new issue