summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-03-26 22:50:43 +0100
committerMartin Mares <mj@ucw.cz>1999-03-26 22:50:43 +0100
commit7dc4827c968053e45bcb7f145e9986eeb20c993b (patch)
tree81363b40e7ed12b7a40d00752680bd694afcdf0d
parent7e5f5ffdda7232048c4baf3fdec358afb494a29d (diff)
downloadbird-7dc4827c968053e45bcb7f145e9986eeb20c993b.tar
bird-7dc4827c968053e45bcb7f145e9986eeb20c993b.zip
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 04ee289..450128e 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 626dd99..1e62765 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 c122b96..a92fe6f 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 249026d..060446f 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 873abe3..3a485bf 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);
}