From: Martin Mares Date: Fri, 26 Mar 1999 21:50:43 +0000 (+0000) Subject: Added everything protocols need to know about multiple routing tables, X-Git-Tag: v1.2.0~1648 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7dc4827c968053e45bcb7f145e9986eeb20c993b;p=thirdparty%2Fbird.git 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. --- diff --git a/nest/proto.c b/nest/proto.c index 04ee289b5..450128e34 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 626dd994f..1e6276524 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 c122b967b..a92fe6f9b 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 249026d36..060446f7b 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 873abe3db..3a485bf3f 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); }