summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-03-26 21:50:43 +0000
committerMartin Mares <mj@ucw.cz>1999-03-26 21:50:43 +0000
commit7dc4827c968053e45bcb7f145e9986eeb20c993b (patch)
tree81363b40e7ed12b7a40d00752680bd694afcdf0d
parent7e5f5ffdda7232048c4baf3fdec358afb494a29d (diff)
Added everything protocols need to know about multiple routing tables,
i.e. struct proto now contains field 'table' pointing to routing table the protocol is attached to. Use this instead of &master_table. Modified all protocols except the kernel syncer to use this field.
-rw-r--r--nest/proto.c1
-rw-r--r--nest/protocol.h3
-rw-r--r--nest/rt-dev.c6
-rw-r--r--proto/rip/rip.c2
-rw-r--r--proto/static/static.c4
5 files changed, 8 insertions, 8 deletions
diff --git a/nest/proto.c b/nest/proto.c
index 04ee289b..450128e3 100644
--- a/nest/proto.c
+++ b/nest/proto.c
@@ -86,6 +86,7 @@ proto_new(struct proto_config *c, unsigned size)
p->preference = c->preference;
p->disabled = c->disabled;
p->proto = pr;
+ p->table = &master_table;
p->in_filter = c->in_filter;
p->out_filter = c->out_filter;
return p;
diff --git a/nest/protocol.h b/nest/protocol.h
index 626dd994..1e627652 100644
--- a/nest/protocol.h
+++ b/nest/protocol.h
@@ -99,11 +99,10 @@ struct proto {
void (*rte_insert)(struct network *, struct rte *);
void (*rte_remove)(struct network *, struct rte *);
+ struct rtable *table; /* Routing table we're connected to */
struct filter *in_filter; /* Input filter */
struct filter *out_filter; /* Output filter */
- /* Connection to routing tables? */
-
/* Hic sunt protocol-specific data */
};
diff --git a/nest/rt-dev.c b/nest/rt-dev.c
index c122b967..a92fe6f9 100644
--- a/nest/rt-dev.c
+++ b/nest/rt-dev.c
@@ -31,7 +31,7 @@ dev_if_notify(struct proto *p, unsigned c, struct iface *new, struct iface *old)
net *n;
debug("dev_if_notify: %s going down\n", old->name);
- n = net_find(&master_table, 0, old->prefix, old->pxlen);
+ n = net_find(p->table, 0, old->prefix, old->pxlen);
if (!n)
{
debug("dev_if_notify: device shutdown: prefix not found\n");
@@ -56,9 +56,9 @@ dev_if_notify(struct proto *p, unsigned c, struct iface *new, struct iface *old)
A.attrs = NULL;
a = rta_lookup(&A);
if (new->flags & IF_UNNUMBERED)
- n = net_get(&master_table, 0, new->opposite, new->pxlen);
+ n = net_get(p->table, 0, new->opposite, new->pxlen);
else
- n = net_get(&master_table, 0, new->prefix, new->pxlen);
+ n = net_get(p->table, 0, new->prefix, new->pxlen);
e = rte_get_temp(a);
e->net = n;
e->pflags = 0;
diff --git a/proto/rip/rip.c b/proto/rip/rip.c
index 249026d3..060446f7 100644
--- a/proto/rip/rip.c
+++ b/proto/rip/rip.c
@@ -226,7 +226,7 @@ advertise_entry( struct proto *p, struct rip_block *b, ip_addr whotoldme )
log( L_ERR "%I asked me to route %I/%I, but that is not valid netmask.", A.from, b->network, b->netmask );
return;
}
- n = net_get( &master_table, 0, b->network, ipa_mklen( b->netmask ));
+ n = net_get( p->table, 0, b->network, ipa_mklen( b->netmask ));
r = rte_get_temp(a);
r->u.rip.metric = ntohl(b->metric) + rif->metric;
if (r->u.rip.metric > P_CF->infinity) r->u.rip.metric = P_CF->infinity;
diff --git a/proto/static/static.c b/proto/static/static.c
index 873abe3d..3a485bf3 100644
--- a/proto/static/static.c
+++ b/proto/static/static.c
@@ -37,7 +37,7 @@ static_install(struct proto *p, struct static_route *r, struct iface *ifa)
a.iface = ifa;
aa = rta_lookup(&a);
- n = net_get(&master_table, a.tos, r->net, r->masklen);
+ n = net_get(p->table, a.tos, r->net, r->masklen);
e = rte_get_temp(aa);
e->net = n;
e->pflags = 0;
@@ -50,7 +50,7 @@ static_remove(struct proto *p, struct static_route *r)
net *n;
DBG("Removing static route %I/%d\n", r->net, r->masklen);
- n = net_find(&master_table, 0, r->net, r->masklen);
+ n = net_find(p->table, 0, r->net, r->masklen);
if (n)
rte_update(n, p, NULL);
}