diff options
Diffstat (limited to 'zebra/rib.h')
| -rw-r--r-- | zebra/rib.h | 450 | 
1 files changed, 218 insertions, 232 deletions
diff --git a/zebra/rib.h b/zebra/rib.h index e910facb44..7319478f4f 100644 --- a/zebra/rib.h +++ b/zebra/rib.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_RIB_H @@ -38,64 +38,63 @@  #define DISTANCE_INFINITY  255  #define ZEBRA_KERNEL_TABLE_MAX 252 /* support for no more than this rt tables */ -struct rib -{ -  /* Link list. */ -  struct rib *next; -  struct rib *prev; -   -  /* Nexthop structure */ -  struct nexthop *nexthop; -   -  /* Refrence count. */ -  unsigned long refcnt; -   -  /* Tag */ -  route_tag_t tag; - -  /* Uptime. */ -  time_t uptime; - -  /* Type fo this route. */ -  int type; - -  /* Source protocol instance */ -  u_short instance; - -  /* VRF identifier. */ -  vrf_id_t vrf_id; - -  /* Which routing table */ -  uint32_t table; - -  /* Metric */ -  u_int32_t metric; - -  /* MTU */ -  u_int32_t mtu; -  u_int32_t nexthop_mtu; - -  /* Distance. */ -  u_char distance; - -  /* Flags of this route. -   * This flag's definition is in lib/zebra.h ZEBRA_FLAG_* and is exposed -   * to clients via Zserv -   */ -  u_int32_t flags; - -  /* RIB internal status */ -  u_char status; +struct rib { +	/* Link list. */ +	struct rib *next; +	struct rib *prev; + +	/* Nexthop structure */ +	struct nexthop *nexthop; + +	/* Refrence count. */ +	unsigned long refcnt; + +	/* Tag */ +	route_tag_t tag; + +	/* Uptime. */ +	time_t uptime; + +	/* Type fo this route. */ +	int type; + +	/* Source protocol instance */ +	u_short instance; + +	/* VRF identifier. */ +	vrf_id_t vrf_id; + +	/* Which routing table */ +	uint32_t table; + +	/* Metric */ +	u_int32_t metric; + +	/* MTU */ +	u_int32_t mtu; +	u_int32_t nexthop_mtu; + +	/* Distance. */ +	u_char distance; + +	/* Flags of this route. +	 * This flag's definition is in lib/zebra.h ZEBRA_FLAG_* and is exposed +	 * to clients via Zserv +	 */ +	u_int32_t flags; + +	/* RIB internal status */ +	u_char status;  #define RIB_ENTRY_REMOVED	   0x1 -  /* to simplify NHT logic when NHs change, instead of doing a NH by NH cmp */ +/* to simplify NHT logic when NHs change, instead of doing a NH by NH cmp */  #define RIB_ENTRY_NEXTHOPS_CHANGED 0x2  #define RIB_ENTRY_CHANGED          0x4  #define RIB_ENTRY_SELECTED_FIB     0x8  #define RIB_ENTRY_LABELS_CHANGED   0x10 -  /* Nexthop information. */ -  u_char nexthop_num; -  u_char nexthop_active_num; +	/* Nexthop information. */ +	u_char nexthop_num; +	u_char nexthop_active_num;  };  /* meta-queue structure: @@ -106,38 +105,36 @@ struct rib   * sub-queue 4: any other origin (if any)   */  #define MQ_SIZE 5 -struct meta_queue -{ -  struct list *subq[MQ_SIZE]; -  u_int32_t size; /* sum of lengths of all subqueues */ +struct meta_queue { +	struct list *subq[MQ_SIZE]; +	u_int32_t size; /* sum of lengths of all subqueues */  };  /*   * Structure that represents a single destination (prefix).   */ -typedef struct rib_dest_t_ -{ +typedef struct rib_dest_t_ { -  /* -   * Back pointer to the route node for this destination. This helps -   * us get to the prefix that this structure is for. -   */ -  struct route_node *rnode; +	/* +	 * Back pointer to the route node for this destination. This helps +	 * us get to the prefix that this structure is for. +	 */ +	struct route_node *rnode; -  /* -   * Doubly-linked list of routes for this prefix. -   */ -  struct rib *routes; +	/* +	 * Doubly-linked list of routes for this prefix. +	 */ +	struct rib *routes; -  /* -   * Flags, see below. -   */ -  u_int32_t flags; +	/* +	 * Flags, see below. +	 */ +	u_int32_t flags; -  /* -   * Linkage to put dest on the FPM processing queue. -   */ -  TAILQ_ENTRY(rib_dest_t_) fpm_q_entries; +	/* +	 * Linkage to put dest on the FPM processing queue. +	 */ +	TAILQ_ENTRY(rib_dest_t_) fpm_q_entries;  } rib_dest_t; @@ -163,22 +160,21 @@ typedef struct rib_dest_t_  /*   * Macro to iterate over each route for a destination (prefix).   */ -#define RIB_DEST_FOREACH_ROUTE(dest, rib)				\ -  for ((rib) = (dest) ? (dest)->routes : NULL; (rib); (rib) = (rib)->next) +#define RIB_DEST_FOREACH_ROUTE(dest, rib)                                      \ +	for ((rib) = (dest) ? (dest)->routes : NULL; (rib); (rib) = (rib)->next)  /*   * Same as above, but allows the current node to be unlinked.   */ -#define RIB_DEST_FOREACH_ROUTE_SAFE(dest, rib, next)	\ -  for ((rib) = (dest) ? (dest)->routes : NULL;		\ -       (rib) && ((next) = (rib)->next, 1);		\ -       (rib) = (next)) +#define RIB_DEST_FOREACH_ROUTE_SAFE(dest, rib, next)                           \ +	for ((rib) = (dest) ? (dest)->routes : NULL;                           \ +	     (rib) && ((next) = (rib)->next, 1); (rib) = (next)) -#define RNODE_FOREACH_RIB(rn, rib)				\ -  RIB_DEST_FOREACH_ROUTE (rib_dest_from_rnode (rn), rib) +#define RNODE_FOREACH_RIB(rn, rib)                                             \ +	RIB_DEST_FOREACH_ROUTE(rib_dest_from_rnode(rn), rib) -#define RNODE_FOREACH_RIB_SAFE(rn, rib, next)				\ -  RIB_DEST_FOREACH_ROUTE_SAFE (rib_dest_from_rnode (rn), rib, next) +#define RNODE_FOREACH_RIB_SAFE(rn, rib, next)                                  \ +	RIB_DEST_FOREACH_ROUTE_SAFE(rib_dest_from_rnode(rn), rib, next)  /* The following for loop allows to iterate over the nexthop   * structure of routes. @@ -217,26 +213,29 @@ typedef struct rib_dest_t_   * to `tnexthop->next', progressing to the next position in the top-level   * chain and possibly to its end marked by NULL.   */ -#define ALL_NEXTHOPS_RO(head, nexthop, tnexthop, recursing) \ -  (tnexthop) = (nexthop) = (head), (recursing) = 0; \ -  (nexthop); \ -  (nexthop) = CHECK_FLAG((nexthop)->flags, NEXTHOP_FLAG_RECURSIVE) \ -    ? (((recursing) = 1), (nexthop)->resolved) \ -    : ((nexthop)->next ? ((recursing) ? (nexthop)->next \ -                                      : ((tnexthop) = (nexthop)->next)) \ -                       : (((recursing) = 0),((tnexthop) = (tnexthop)->next))) - -#if defined (HAVE_RTADV) +#define ALL_NEXTHOPS_RO(head, nexthop, tnexthop, recursing)                    \ +	(tnexthop) = (nexthop) = (head), (recursing) = 0;                      \ +	(nexthop);                                                             \ +	(nexthop) =                                                            \ +		CHECK_FLAG((nexthop)->flags, NEXTHOP_FLAG_RECURSIVE)           \ +			? (((recursing) = 1), (nexthop)->resolved)             \ +			: ((nexthop)->next                                     \ +				   ? ((recursing) ? (nexthop)->next            \ +						  : ((tnexthop) =              \ +							     (nexthop)->next)) \ +				   : (((recursing) = 0),                       \ +				      ((tnexthop) = (tnexthop)->next))) + +#if defined(HAVE_RTADV)  /* Structure which hold status of router advertisement. */ -struct rtadv -{ -  int sock; +struct rtadv { +	int sock; -  int adv_if_count; -  int adv_msec_if_count; +	int adv_if_count; +	int adv_msec_if_count; -  struct thread *ra_read; -  struct thread *ra_timer; +	struct thread *ra_read; +	struct thread *ra_timer;  };  #endif /* HAVE_RTADV */ @@ -246,139 +245,135 @@ struct rtadv   * Structure that is hung off of a route_table that holds information about   * the table.   */ -typedef struct rib_table_info_t_ -{ +typedef struct rib_table_info_t_ { -  /* -   * Back pointer to zebra_vrf. -   */ -  struct zebra_vrf *zvrf; -  afi_t afi; -  safi_t safi; +	/* +	 * Back pointer to zebra_vrf. +	 */ +	struct zebra_vrf *zvrf; +	afi_t afi; +	safi_t safi;  } rib_table_info_t; -typedef enum -{ -  RIB_TABLES_ITER_S_INIT, -  RIB_TABLES_ITER_S_ITERATING, -  RIB_TABLES_ITER_S_DONE +typedef enum { +	RIB_TABLES_ITER_S_INIT, +	RIB_TABLES_ITER_S_ITERATING, +	RIB_TABLES_ITER_S_DONE  } rib_tables_iter_state_t;  /*   * Structure that holds state for iterating over all tables in the   * Routing Information Base.   */ -typedef struct rib_tables_iter_t_ -{ -  vrf_id_t vrf_id; -  int afi_safi_ix; +typedef struct rib_tables_iter_t_ { +	vrf_id_t vrf_id; +	int afi_safi_ix; -  rib_tables_iter_state_t state; +	rib_tables_iter_state_t state;  } rib_tables_iter_t;  /* Events/reasons triggering a RIB update. */ -typedef enum -{ -  RIB_UPDATE_IF_CHANGE, -  RIB_UPDATE_RMAP_CHANGE, -  RIB_UPDATE_OTHER +typedef enum { +	RIB_UPDATE_IF_CHANGE, +	RIB_UPDATE_RMAP_CHANGE, +	RIB_UPDATE_OTHER  } rib_update_event_t; -extern struct nexthop *rib_nexthop_ifindex_add (struct rib *, ifindex_t); -extern struct nexthop *rib_nexthop_blackhole_add (struct rib *); -extern struct nexthop *rib_nexthop_ipv4_add (struct rib *, struct in_addr *, -					     struct in_addr *); -extern struct nexthop *rib_nexthop_ipv4_ifindex_add (struct rib *, -						     struct in_addr *, -						     struct in_addr *, -						     ifindex_t); -extern void rib_nexthop_add (struct rib *rib, struct nexthop *nexthop); -extern void rib_copy_nexthops (struct rib *rib, struct nexthop *nh); +extern struct nexthop *rib_nexthop_ifindex_add(struct rib *, ifindex_t); +extern struct nexthop *rib_nexthop_blackhole_add(struct rib *); +extern struct nexthop *rib_nexthop_ipv4_add(struct rib *, struct in_addr *, +					    struct in_addr *); +extern struct nexthop *rib_nexthop_ipv4_ifindex_add(struct rib *, +						    struct in_addr *, +						    struct in_addr *, +						    ifindex_t); +extern void rib_nexthop_add(struct rib *rib, struct nexthop *nexthop); +extern void rib_copy_nexthops(struct rib *rib, struct nexthop *nh);  /* RPF lookup behaviour */ -enum multicast_mode -{ -  MCAST_NO_CONFIG = 0,	/* MIX_MRIB_FIRST, but no show in config write */ -  MCAST_MRIB_ONLY,	/* MRIB only */ -  MCAST_URIB_ONLY,	/* URIB only */ -  MCAST_MIX_MRIB_FIRST,	/* MRIB, if nothing at all then URIB */ -  MCAST_MIX_DISTANCE,	/* MRIB & URIB, lower distance wins */ -  MCAST_MIX_PFXLEN,	/* MRIB & URIB, longer prefix wins */ -			/* on equal value, MRIB wins for last 2 */ +enum multicast_mode { +	MCAST_NO_CONFIG = 0,  /* MIX_MRIB_FIRST, but no show in config write */ +	MCAST_MRIB_ONLY,      /* MRIB only */ +	MCAST_URIB_ONLY,      /* URIB only */ +	MCAST_MIX_MRIB_FIRST, /* MRIB, if nothing at all then URIB */ +	MCAST_MIX_DISTANCE,   /* MRIB & URIB, lower distance wins */ +	MCAST_MIX_PFXLEN,     /* MRIB & URIB, longer prefix wins */ +			      /* on equal value, MRIB wins for last 2 */  }; -extern void multicast_mode_ipv4_set (enum multicast_mode mode); -extern enum multicast_mode multicast_mode_ipv4_get (void); +extern void multicast_mode_ipv4_set(enum multicast_mode mode); +extern enum multicast_mode multicast_mode_ipv4_get(void);  extern int nexthop_has_fib_child(struct nexthop *); -extern void rib_lookup_and_dump (struct prefix_ipv4 *, vrf_id_t); -extern void rib_lookup_and_pushup (struct prefix_ipv4 *, vrf_id_t); +extern void rib_lookup_and_dump(struct prefix_ipv4 *, vrf_id_t); +extern void rib_lookup_and_pushup(struct prefix_ipv4 *, vrf_id_t);  #define rib_dump(prefix, src, rib) _rib_dump(__func__, prefix, src, rib) -extern void _rib_dump (const char *, -		       union prefixconstptr, -		       union prefixconstptr, const struct rib *); -extern int rib_lookup_ipv4_route (struct prefix_ipv4 *, union sockunion *, -                                  vrf_id_t); +extern void _rib_dump(const char *, union prefixconstptr, union prefixconstptr, +		      const struct rib *); +extern int rib_lookup_ipv4_route(struct prefix_ipv4 *, union sockunion *, +				 vrf_id_t);  #define ZEBRA_RIB_LOOKUP_ERROR -1  #define ZEBRA_RIB_FOUND_EXACT 0  #define ZEBRA_RIB_FOUND_NOGATE 1  #define ZEBRA_RIB_FOUND_CONNECTED 2  #define ZEBRA_RIB_NOTFOUND 3 -extern void rib_nexthop_delete (struct rib *rib, struct nexthop *nexthop); -extern struct nexthop *rib_nexthop_ipv6_add (struct rib *, struct in6_addr *); -extern struct nexthop *rib_nexthop_ipv6_ifindex_add (struct rib *rib, -						     struct in6_addr *ipv6, -						     ifindex_t ifindex); +extern void rib_nexthop_delete(struct rib *rib, struct nexthop *nexthop); +extern struct nexthop *rib_nexthop_ipv6_add(struct rib *, struct in6_addr *); +extern struct nexthop *rib_nexthop_ipv6_ifindex_add(struct rib *rib, +						    struct in6_addr *ipv6, +						    ifindex_t ifindex);  extern int is_zebra_valid_kernel_table(u_int32_t table_id);  extern int is_zebra_main_routing_table(u_int32_t table_id); -extern int zebra_check_addr (struct prefix *p); +extern int zebra_check_addr(struct prefix *p); -extern void rib_addnode (struct route_node *rn, struct rib *rib, int process); -extern void rib_delnode (struct route_node *rn, struct rib *rib); -extern int rib_install_kernel (struct route_node *rn, struct rib *rib, struct rib *old); -extern int rib_uninstall_kernel (struct route_node *rn, struct rib *rib); +extern void rib_addnode(struct route_node *rn, struct rib *rib, int process); +extern void rib_delnode(struct route_node *rn, struct rib *rib); +extern int rib_install_kernel(struct route_node *rn, struct rib *rib, +			      struct rib *old); +extern int rib_uninstall_kernel(struct route_node *rn, struct rib *rib);  /* NOTE:   * All rib_add function will not just add prefix into RIB, but   * also implicitly withdraw equal prefix of same type. */ -extern int rib_add (afi_t afi, safi_t safi, vrf_id_t vrf_id, int type, -		    u_short instance, int flags, struct prefix *p, -		    struct prefix_ipv6 *src_p, union g_addr *gate, union g_addr *src, -		    ifindex_t ifindex, u_int32_t table_id, -		    u_int32_t, u_int32_t, u_char); - -extern int rib_add_multipath (afi_t afi, safi_t safi, struct prefix *, -			      struct prefix_ipv6 *src_p, struct rib *); - -extern void rib_delete (afi_t afi, safi_t safi, vrf_id_t vrf_id, int type, -			u_short instance, int flags, struct prefix *p, -			struct prefix_ipv6 *src_p, union g_addr *gate, -			ifindex_t ifindex, u_int32_t table_id); - -extern struct rib *rib_match (afi_t afi, safi_t safi, vrf_id_t, union g_addr *, -			      struct route_node **rn_out); -extern struct rib *rib_match_ipv4_multicast (vrf_id_t vrf_id, struct in_addr addr, -					     struct route_node **rn_out); - -extern struct rib *rib_lookup_ipv4 (struct prefix_ipv4 *, vrf_id_t); - -extern void rib_update (vrf_id_t, rib_update_event_t); -extern void rib_weed_tables (void); -extern void rib_sweep_route (void); -extern void rib_close_table (struct route_table *); -extern void rib_init (void); -extern unsigned long rib_score_proto (u_char proto, u_short instance); -extern void rib_queue_add (struct route_node *rn); -extern void meta_queue_free (struct meta_queue *mq); +extern int rib_add(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type, +		   u_short instance, int flags, struct prefix *p, +		   struct prefix_ipv6 *src_p, union g_addr *gate, +		   union g_addr *src, ifindex_t ifindex, u_int32_t table_id, +		   u_int32_t, u_int32_t, u_char); + +extern int rib_add_multipath(afi_t afi, safi_t safi, struct prefix *, +			     struct prefix_ipv6 *src_p, struct rib *); + +extern void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type, +		       u_short instance, int flags, struct prefix *p, +		       struct prefix_ipv6 *src_p, union g_addr *gate, +		       ifindex_t ifindex, u_int32_t table_id); + +extern struct rib *rib_match(afi_t afi, safi_t safi, vrf_id_t, union g_addr *, +			     struct route_node **rn_out); +extern struct rib *rib_match_ipv4_multicast(vrf_id_t vrf_id, +					    struct in_addr addr, +					    struct route_node **rn_out); + +extern struct rib *rib_lookup_ipv4(struct prefix_ipv4 *, vrf_id_t); + +extern void rib_update(vrf_id_t, rib_update_event_t); +extern void rib_weed_tables(void); +extern void rib_sweep_route(void); +extern void rib_close_table(struct route_table *); +extern void rib_init(void); +extern unsigned long rib_score_proto(u_char proto, u_short instance); +extern void rib_queue_add(struct route_node *rn); +extern void meta_queue_free(struct meta_queue *mq);  extern struct route_table *rib_table_ipv6; -extern void rib_unlink (struct route_node *, struct rib *); -extern int rib_gc_dest (struct route_node *rn); -extern struct route_table *rib_tables_iter_next (rib_tables_iter_t *iter); +extern void rib_unlink(struct route_node *, struct rib *); +extern int rib_gc_dest(struct route_node *rn); +extern struct route_table *rib_tables_iter_next(rib_tables_iter_t *iter);  extern u_char route_distance(int type); @@ -389,19 +384,17 @@ extern u_char route_distance(int type);  /*   * rib_table_info   */ -static inline rib_table_info_t * -rib_table_info (struct route_table *table) +static inline rib_table_info_t *rib_table_info(struct route_table *table)  { -  return (rib_table_info_t *) table->info; +	return (rib_table_info_t *)table->info;  }  /*   * rib_dest_from_rnode   */ -static inline rib_dest_t * -rib_dest_from_rnode (struct route_node *rn) +static inline rib_dest_t *rib_dest_from_rnode(struct route_node *rn)  { -  return (rib_dest_t *) rn->info; +	return (rib_dest_t *)rn->info;  }  /* @@ -410,25 +403,23 @@ rib_dest_from_rnode (struct route_node *rn)   * Returns a pointer to the list of routes corresponding to the given   * route_node.   */ -static inline struct rib * -rnode_to_ribs (struct route_node *rn) +static inline struct rib *rnode_to_ribs(struct route_node *rn)  { -  rib_dest_t *dest; +	rib_dest_t *dest; -  dest = rib_dest_from_rnode (rn); -  if (!dest) -    return NULL; +	dest = rib_dest_from_rnode(rn); +	if (!dest) +		return NULL; -  return dest->routes; +	return dest->routes;  }  /*   * rib_dest_prefix   */ -static inline struct prefix * -rib_dest_prefix (rib_dest_t *dest) +static inline struct prefix *rib_dest_prefix(rib_dest_t *dest)  { -  return &dest->rnode->p; +	return &dest->rnode->p;  }  /* @@ -436,39 +427,35 @@ rib_dest_prefix (rib_dest_t *dest)   *   * Returns the address family that the destination is for.   */ -static inline u_char -rib_dest_af (rib_dest_t *dest) +static inline u_char rib_dest_af(rib_dest_t *dest)  { -  return dest->rnode->p.family; +	return dest->rnode->p.family;  }  /*   * rib_dest_table   */ -static inline struct route_table * -rib_dest_table (rib_dest_t *dest) +static inline struct route_table *rib_dest_table(rib_dest_t *dest)  { -  return srcdest_rnode_table(dest->rnode); +	return srcdest_rnode_table(dest->rnode);  }  /*   * rib_dest_vrf   */ -static inline struct zebra_vrf * -rib_dest_vrf (rib_dest_t *dest) +static inline struct zebra_vrf *rib_dest_vrf(rib_dest_t *dest)  { -  return rib_table_info (rib_dest_table (dest))->zvrf; +	return rib_table_info(rib_dest_table(dest))->zvrf;  }  /*   * rib_tables_iter_init   */ -static inline void -rib_tables_iter_init (rib_tables_iter_t *iter) +static inline void rib_tables_iter_init(rib_tables_iter_t *iter)  { -  memset (iter, 0, sizeof (*iter)); -  iter->state = RIB_TABLES_ITER_S_INIT; +	memset(iter, 0, sizeof(*iter)); +	iter->state = RIB_TABLES_ITER_S_INIT;  }  /* @@ -477,21 +464,20 @@ rib_tables_iter_init (rib_tables_iter_t *iter)   * Returns TRUE if this iterator has started iterating over the set of   * tables.   */ -static inline int -rib_tables_iter_started (rib_tables_iter_t *iter) +static inline int rib_tables_iter_started(rib_tables_iter_t *iter)  { -  return iter->state != RIB_TABLES_ITER_S_INIT; +	return iter->state != RIB_TABLES_ITER_S_INIT;  }  /*   * rib_tables_iter_cleanup   */ -static inline void -rib_tables_iter_cleanup (rib_tables_iter_t *iter) +static inline void rib_tables_iter_cleanup(rib_tables_iter_t *iter)  { -  iter->state = RIB_TABLES_ITER_S_DONE; +	iter->state = RIB_TABLES_ITER_S_DONE;  } -DECLARE_HOOK(rib_update, (struct route_node *rn, const char *reason), (rn, reason)) +DECLARE_HOOK(rib_update, (struct route_node * rn, const char *reason), +	     (rn, reason))  #endif /*_ZEBRA_RIB_H */  | 
