diff options
Diffstat (limited to 'lib/table.h')
| -rw-r--r-- | lib/table.h | 282 | 
1 files changed, 136 insertions, 146 deletions
diff --git a/lib/table.h b/lib/table.h index 1691a8e20a..1eeed5c437 100644 --- a/lib/table.h +++ b/lib/table.h @@ -17,7 +17,7 @@   * You should have received a copy of the GNU General Public License   * along with GNU Zebra; see the file COPYING.  If not, write to the Free   * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA.   + * 02111-1307, USA.   */  #ifndef _ZEBRA_TABLE_H @@ -41,63 +41,61 @@ struct route_table;   */  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 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 *); +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; +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; -  void (*cleanup)(struct route_table *, struct route_node *); -   -  unsigned long count; -   -  /* -   * User data. -   */ -  void *info; +struct route_table { +	struct route_node *top; + +	/* +	 * Delegate that performs certain functions for this table. +	 */ +	route_table_delegate_t *delegate; +	void (*cleanup)(struct route_table *, struct route_node *); + +	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; +#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 -{ -  ROUTE_NODE_FIELDS +struct route_node { +	ROUTE_NODE_FIELDS  #define l_left   link[0]  #define l_right  link[1] @@ -105,89 +103,85 @@ struct route_node  typedef struct route_table_iter_t_ route_table_iter_t; -typedef enum  -{ -  RT_ITER_STATE_INIT, -  RT_ITER_STATE_ITERATING, -  RT_ITER_STATE_PAUSED, -  RT_ITER_STATE_DONE +typedef enum { +	RT_ITER_STATE_INIT, +	RT_ITER_STATE_ITERATING, +	RT_ITER_STATE_PAUSED, +	RT_ITER_STATE_DONE  } route_table_iter_state_t;  /*   * route_table_iter_t - *  + *   * Structure that holds state for iterating over a route table.   */ -struct route_table_iter_t_  -{ +struct route_table_iter_t_ { -  route_table_iter_state_t state; +	route_table_iter_state_t state; -  /* -   * Routing table that we are iterating over. The caller must ensure -   * that that table outlives the iterator. -   */ -  struct route_table *table; +	/* +	 * Routing table that we are iterating over. The caller must ensure +	 * that that table outlives the iterator. +	 */ +	struct route_table *table; -  /* -   * The node that the iterator is currently on. -   */ -  struct route_node *current; +	/* +	 * The node that the iterator is currently on. +	 */ +	struct route_node *current; -  /* -   * The last prefix that the iterator processed before it was paused. -   */   -  struct prefix pause_prefix; +	/* +	 * The last prefix that the iterator processed before it was paused. +	 */ +	struct prefix pause_prefix;  };  /* Prototypes. */ -extern struct route_table *route_table_init (void); +extern struct route_table *route_table_init(void);  extern struct route_table * -route_table_init_with_delegate (route_table_delegate_t *); - -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 *, -                                            struct route_node *); -extern struct route_node *route_node_get (struct route_table *const, -                                          const struct prefix *); -extern struct route_node *route_node_lookup (const struct route_table *, -                                             const struct prefix *); -extern struct route_node *route_node_lookup_maynull (const struct route_table *, -                                             const struct prefix *); -extern struct route_node *route_lock_node (struct route_node *node); -extern struct route_node *route_node_match (const struct route_table *, -                                            const struct prefix *); -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 *); - -extern struct route_node * -route_table_get_next (const struct route_table *table, struct prefix *p); -extern int -route_table_prefix_iter_cmp (struct prefix *p1, struct prefix *p2); +route_table_init_with_delegate(route_table_delegate_t *); + +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 *, +					   struct route_node *); +extern struct route_node *route_node_get(struct route_table *const, +					 const struct prefix *); +extern struct route_node *route_node_lookup(const struct route_table *, +					    const struct prefix *); +extern struct route_node *route_node_lookup_maynull(const struct route_table *, +						    const struct prefix *); +extern struct route_node *route_lock_node(struct route_node *node); +extern struct route_node *route_node_match(const struct route_table *, +					   const struct prefix *); +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 *); + +extern struct route_node *route_table_get_next(const struct route_table *table, +					       struct prefix *p); +extern int route_table_prefix_iter_cmp(struct prefix *p1, struct prefix *p2);  /*   * Iterator functions.   */ -extern void route_table_iter_init (route_table_iter_t *iter, -				   struct route_table *table); -extern void route_table_iter_pause (route_table_iter_t *iter); -extern void route_table_iter_cleanup (route_table_iter_t *iter); +extern void route_table_iter_init(route_table_iter_t *iter, +				  struct route_table *table); +extern void route_table_iter_pause(route_table_iter_t *iter); +extern void route_table_iter_cleanup(route_table_iter_t *iter);  /*   * Inline functions. @@ -198,48 +192,46 @@ extern void route_table_iter_cleanup (route_table_iter_t *iter);   *   * Get the next node in the tree.   */ -static inline struct route_node * -route_table_iter_next (route_table_iter_t * iter) +static inline struct route_node *route_table_iter_next(route_table_iter_t *iter)  { -  struct route_node *node; +	struct route_node *node; -  switch (iter->state) -    { +	switch (iter->state) { -    case RT_ITER_STATE_INIT: +	case RT_ITER_STATE_INIT: -      /* -       * We're just starting the iteration. -       */ -      node = route_top (iter->table); -      break; +		/* +		 * We're just starting the iteration. +		 */ +		node = route_top(iter->table); +		break; -    case RT_ITER_STATE_ITERATING: -      node = route_next (iter->current); -      break; +	case RT_ITER_STATE_ITERATING: +		node = route_next(iter->current); +		break; -    case RT_ITER_STATE_PAUSED: +	case RT_ITER_STATE_PAUSED: -      /* -       * Start with the node following pause_prefix. -       */ -      node = route_table_get_next (iter->table, &iter->pause_prefix); -      break; +		/* +		 * Start with the node following pause_prefix. +		 */ +		node = route_table_get_next(iter->table, &iter->pause_prefix); +		break; -    case RT_ITER_STATE_DONE: -      return NULL; +	case RT_ITER_STATE_DONE: +		return NULL; -    default: -      assert (0); -    } +	default: +		assert(0); +	} -  iter->current = node; -  if (node) -    iter->state = RT_ITER_STATE_ITERATING; -  else -    iter->state = RT_ITER_STATE_DONE; +	iter->current = node; +	if (node) +		iter->state = RT_ITER_STATE_ITERATING; +	else +		iter->state = RT_ITER_STATE_DONE; -  return node; +	return node;  }  /* @@ -247,10 +239,9 @@ route_table_iter_next (route_table_iter_t * iter)   *   * Returns TRUE if the iteration is complete.   */ -static inline int -route_table_iter_is_done (route_table_iter_t *iter) +static inline int route_table_iter_is_done(route_table_iter_t *iter)  { -  return iter->state == RT_ITER_STATE_DONE; +	return iter->state == RT_ITER_STATE_DONE;  }  /* @@ -258,10 +249,9 @@ route_table_iter_is_done (route_table_iter_t *iter)   *   * Returns TRUE if this iterator has started iterating over the tree.   */ -static inline int -route_table_iter_started (route_table_iter_t *iter) +static inline int route_table_iter_started(route_table_iter_t *iter)  { -  return iter->state != RT_ITER_STATE_INIT; +	return iter->state != RT_ITER_STATE_INIT;  }  #endif /* _ZEBRA_TABLE_H */  | 
