Commit 7dc4827c authored by Martin Mareš's avatar Martin Mareš
Browse files

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.
parent 7e5f5ffd
......@@ -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;
......
......@@ -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 */
};
......
......@@ -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;
......
......@@ -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;
......
......@@ -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);
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment