summaryrefslogtreecommitdiff
path: root/lib/table.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/table.h')
-rw-r--r--lib/table.h78
1 files changed, 63 insertions, 15 deletions
diff --git a/lib/table.h b/lib/table.h
index 1e8df46d..4d3eddb1 100644
--- a/lib/table.h
+++ b/lib/table.h
@@ -23,39 +23,87 @@
#ifndef _ZEBRA_TABLE_H
#define _ZEBRA_TABLE_H
+/*
+ * Forward declarations.
+ */
+struct route_node;
+struct route_table;
+
+/*
+ * route_table_delegate_t
+ *
+ * Function vector that can be used by a client to customize the
+ * behavior of one or more route tables.
+ */
+typedef struct route_table_delegate_t_ route_table_delegate_t;
+
+typedef struct route_node * (*route_table_create_node_func_t)
+ (route_table_delegate_t *, struct route_table *);
+
+typedef void (*route_table_destroy_node_func_t)
+ (route_table_delegate_t *, struct route_table *, struct route_node *);
+
+struct route_table_delegate_t_
+{
+ route_table_create_node_func_t create_node;
+ route_table_destroy_node_func_t destroy_node;
+};
+
/* Routing table top structure. */
struct route_table
{
struct route_node *top;
+ /*
+ * Delegate that performs certain functions for this table.
+ */
+ route_table_delegate_t *delegate;
+
unsigned long count;
+
+ /*
+ * User data.
+ */
+ void *info;
};
+/*
+ * Macro that defines all fields in a route node.
+ */
+#define ROUTE_NODE_FIELDS \
+ /* Actual prefix of this radix. */ \
+ struct prefix p; \
+ \
+ /* Tree link. */ \
+ struct route_table *table; \
+ struct route_node *parent; \
+ struct route_node *link[2]; \
+ \
+ /* Lock of this radix */ \
+ unsigned int lock; \
+ \
+ /* Each node of route. */ \
+ void *info; \
+ \
+ /* Aggregation. */ \
+ void *aggregate;
+
+
/* Each routing entry. */
struct route_node
{
- /* Actual prefix of this radix. */
- struct prefix p;
+ ROUTE_NODE_FIELDS;
- /* Tree link. */
- struct route_table *table;
- struct route_node *parent;
- struct route_node *link[2];
#define l_left link[0]
#define l_right link[1]
-
- /* Lock of this radix */
- unsigned int lock;
-
- /* Each node of route. */
- void *info;
-
- /* Aggregation. */
- void *aggregate;
};
/* Prototypes. */
extern struct route_table *route_table_init (void);
+
+extern struct route_table *
+route_table_init_with_delegate (route_table_delegate_t *);
+
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 *);