diff options
Diffstat (limited to 'lib/table.h')
-rw-r--r-- | lib/table.h | 78 |
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 *); |