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