diff options
Diffstat (limited to 'nest')
-rw-r--r-- | nest/protocol.h | 3 | ||||
-rw-r--r-- | nest/route.h | 1 | ||||
-rw-r--r-- | nest/rt-table.c | 14 |
3 files changed, 16 insertions, 2 deletions
diff --git a/nest/protocol.h b/nest/protocol.h index ec4408f..6059f7c 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -58,7 +58,6 @@ struct proto { unsigned debug; /* Debugging flags */ pool *pool; /* Local objects */ unsigned preference; /* Default route preference */ - int ready; /* Already initialized */ void (*if_notify)(struct proto *, unsigned flags, struct iface *new, struct iface *old); void (*rt_notify)(struct proto *, struct network *net, struct rte *new, struct rte *old); @@ -69,6 +68,8 @@ struct proto { int (*rta_same)(struct rtattr *, struct rtattr *); int (*rte_better)(struct rte *, struct rte *); + int (*rte_insert)(struct network *, struct rte *); + int (*rte_remove)(struct network *, struct rte *); /* Reconfigure function? */ /* Interface patterns */ diff --git a/nest/route.h b/nest/route.h index 1bd20b6..e50de07 100644 --- a/nest/route.h +++ b/nest/route.h @@ -123,6 +123,7 @@ 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 rt_dump(rtable *); void rt_dump_all(void); diff --git a/nest/rt-table.c b/nest/rt-table.c index e04d599..0b8b793 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -198,8 +198,20 @@ rte_update(net *net, struct proto *p, rte *new) } } if (old) - rte_free(old); + { + if (p->rte_remove) + p->rte_remove(net, old); + rte_free(old); + } new->lastmod = now; + if (p->rte_insert) + p->rte_insert(net, new); +} + +void +rte_discard(net *net, rte *old) /* Non-filtered route deletion, used during garbage collection */ +{ + rte_update(net, old->attrs->proto, NULL); } void |