summaryrefslogtreecommitdiffstats
path: root/zebra/rib.h
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/rib.h')
-rw-r--r--zebra/rib.h450
1 files changed, 218 insertions, 232 deletions
diff --git a/zebra/rib.h b/zebra/rib.h
index e910facb4..7319478f4 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 */