diff options
author | Martin Mares <mj@ucw.cz> | 1998-10-18 13:13:16 +0200 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1998-10-18 13:13:16 +0200 |
commit | 5b22683d2f27fcc5954cc9d4d58e55e539414d53 (patch) | |
tree | 028d2f41b2a4ab6c888f567619c4c4ca62ea50b3 | |
parent | 570ce189d77fc40841e8e9f8f86ea3c3840aa450 (diff) | |
download | bird-5b22683d2f27fcc5954cc9d4d58e55e539414d53.tar bird-5b22683d2f27fcc5954cc9d4d58e55e539414d53.zip |
After contemplating about RIP route timeouts for a long time, I've implemented
protocol callbacks for route insertion and deletion from the central table.
RIP should maintain its own per-protocol queue of existing routes, scan it
periodically and call rte_discard() for routes that have timed out.
-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 |