#include "memory.h"
#include "hash.h"
+#include "prefix.h"
DECLARE_MTYPE(ROUTE_TABLE)
DECLARE_MTYPE(ROUTE_NODE)
\
/* Each node of route. */ \
void *info; \
- \
- /* Aggregation. */ \
- void *aggregate;
/* Each routing entry. */
extern struct route_table *route_table_init(void);
extern struct route_table *
-route_table_init_with_delegate(route_table_delegate_t *);
+route_table_init_with_delegate(route_table_delegate_t *delegate);
extern route_table_delegate_t *route_table_get_default_delegate(void);
-extern void route_table_finish(struct route_table *);
-extern void route_unlock_node(struct route_node *node);
-extern struct route_node *route_top(struct route_table *);
-extern struct route_node *route_next(struct route_node *);
-extern struct route_node *route_next_until(struct route_node *,
- const struct route_node *);
-extern struct route_node *route_node_get(struct route_table *const,
- union prefixconstptr);
-extern struct route_node *route_node_lookup(const struct route_table *,
- union prefixconstptr);
-extern struct route_node *route_node_lookup_maynull(const struct route_table *,
- union prefixconstptr);
-extern struct route_node *route_lock_node(struct route_node *node);
-extern struct route_node *route_node_match(const struct route_table *,
- union prefixconstptr);
-extern struct route_node *route_node_match_ipv4(const struct route_table *,
- const struct in_addr *);
-extern struct route_node *route_node_match_ipv6(const struct route_table *,
- const struct in6_addr *);
-
-extern unsigned long route_table_count(const struct route_table *);
-
-extern struct route_node *route_node_create(route_table_delegate_t *,
- struct route_table *);
-extern void route_node_destroy(route_table_delegate_t *, struct route_table *,
- struct route_node *);
+static inline void *route_table_get_info(struct route_table *table)
+{
+ return table->info;
+}
+
+static inline void route_table_set_info(struct route_table *table, void *d)
+{
+ table->info = d;
+}
+
+extern void route_table_finish(struct route_table *table);
+extern struct route_node *route_top(struct route_table *table);
+extern struct route_node *route_next(struct route_node *node);
+extern struct route_node *route_next_until(struct route_node *node,
+ const struct route_node *limit);
+extern struct route_node *route_node_get(struct route_table *const table,
+ union prefixconstptr pu);
+extern struct route_node *route_node_lookup(const struct route_table *table,
+ union prefixconstptr pu);
+extern struct route_node *
+route_node_lookup_maynull(const struct route_table *table,
+ union prefixconstptr pu);
+extern struct route_node *route_node_match(const struct route_table *table,
+ union prefixconstptr pu);
+extern struct route_node *route_node_match_ipv4(const struct route_table *table,
+ const struct in_addr *addr);
+extern struct route_node *route_node_match_ipv6(const struct route_table *table,
+ const struct in6_addr *addr);
+
+extern unsigned long route_table_count(const struct route_table *table);
+
+extern struct route_node *route_node_create(route_table_delegate_t *delegate,
+ struct route_table *table);
+extern void route_node_delete(struct route_node *node);
+extern void route_node_destroy(route_table_delegate_t *delegate,
+ struct route_table *table,
+ struct route_node *node);
extern struct route_node *route_table_get_next(const struct route_table *table,
union prefixconstptr pu);
* Inline functions.
*/
+/* Lock node. */
+static inline struct route_node *route_lock_node(struct route_node *node)
+{
+ (*(unsigned *)&node->lock)++;
+ return node;
+}
+
+/* Unlock node. */
+static inline void route_unlock_node(struct route_node *node)
+{
+ assert(node->lock > 0);
+ (*(unsigned *)&node->lock)--;
+
+ if (node->lock == 0)
+ route_node_delete(node);
+}
+
/*
* route_table_iter_next
*