diff --git a/nest/route.h b/nest/route.h index 39c6ef7b..d3a1304c 100644 --- a/nest/route.h +++ b/nest/route.h @@ -85,7 +85,8 @@ typedef struct network { typedef struct rte { struct rte *next; - struct rtattr *attrs; + net *net; /* Network this RTE belongs to */ + struct rtattr *attrs; /* Attributes of this route */ byte flags; /* Flags (REF_...) */ byte pflags; /* Protocol-specific flags */ word pref; /* Route preference */ @@ -125,8 +126,8 @@ net *net_get(rtable *tab, unsigned tos, ip_addr addr, unsigned len); rte *rte_find(net *net, struct proto *p); rte *rte_get_temp(struct rtattr *); void rte_update(net *net, struct proto *p, rte *new); -void rte_discard(net *net, rte *old); -void rte_dump(net *, rte *); +void rte_discard(rte *old); +void rte_dump(rte *); void rt_dump(rtable *); void rt_dump_all(void); void rt_feed_baby(struct proto *p); diff --git a/nest/rt-dev.c b/nest/rt-dev.c index 1794b90a..7ef04f09 100644 --- a/nest/rt-dev.c +++ b/nest/rt-dev.c @@ -53,6 +53,7 @@ dev_if_notify(struct proto *p, unsigned c, struct iface *old, struct iface *new) else n = net_get(&master_table, 0, new->prefix, new->pxlen); e = rte_get_temp(a); + e->net = n; e->pflags = 0; rte_update(n, p, e); } diff --git a/nest/rt-table.c b/nest/rt-table.c index f278c517..7ec40113 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -209,16 +209,19 @@ rte_update(net *net, struct proto *p, rte *new) } void -rte_discard(net *net, rte *old) /* Non-filtered route deletion, used during garbage collection */ +rte_discard(rte *old) /* Non-filtered route deletion, used during garbage collection */ { - rte_update(net, old->attrs->proto, NULL); + rte_update(old->net, old->attrs->proto, NULL); } void -rte_dump(net *n, rte *e) +rte_dump(rte *e) { + net *n = e->net; if (n) debug("%1I/%2d ", n->n.prefix, n->n.pxlen); + else + debug("??? "); debug("PF=%02x pref=%d lm=%d ", e->pflags, e->pref, now-e->lastmod); rta_dump(e->attrs); if (e->flags & REF_CHOSEN) @@ -240,7 +243,7 @@ rt_dump(rtable *t) { n = (net *) fn; for(e=n->routes; e; e=e->next) - rte_dump(n, e); + rte_dump(e); } FIB_WALK_END; t = t->sibling;