summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nest/protocol.h3
-rw-r--r--nest/route.h1
-rw-r--r--nest/rt-table.c14
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