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.
This commit is contained in:
Martin Mares 1999-03-26 21:50:43 +00:00
parent 7e5f5ffdda
commit 7dc4827c96
5 changed files with 8 additions and 8 deletions

View file

@ -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;

View file

@ -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 */
};

View file

@ -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;

View file

@ -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;

View file

@ -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);
}