diff options
author | Avneesh Sachdev <avneesh@opensourcerouting.org> | 2012-08-17 17:19:48 +0200 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2012-09-26 21:48:49 +0200 |
commit | f9c1b7bb9b98342f1f3b0bfe3af01844f364dce9 (patch) | |
tree | 350c8e0d98e4dcc53b126c6ce1c7568c440fcb06 /lib/table.h | |
parent | lib: bring some changes over from bgp_table to table (diff) | |
download | frr-f9c1b7bb9b98342f1f3b0bfe3af01844f364dce9.tar.xz frr-f9c1b7bb9b98342f1f3b0bfe3af01844f364dce9.zip |
lib: prepare table code for reuse by bgp_table
* lib/table.[ch]
- Add a macro (ROUTE_NODE_FIELDS) that expands to all the fields
of a route_node structure.
- Add the route_table_delegate_t structure, a function vector
which allows clients to customize the behavior of one or more
tables.
The delegate currently contains the 'create_node' and
'destroy_node' functions, and hence enables a table to use an
alternative node structure. The alternative node is expected to
embed the fields of a route_node using ROUTE_NODE_FIELDS.
- Add route_table_init_with_delegate() to create a new table with
a given delegate.
- Make route_table_init() a thin wrapper around
route_table_init_with_delegate(). The delegate it passes in
simply creates/destroys route_node structures as before.
- Add a user data pointer (info) to the route_table
structure. This can be used by a client to keep per-table state.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
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 1e8df46d5..4d3eddb1d 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 *); |