]> git.proxmox.com Git - mirror_frr.git/blame - zebra/rib.h
zebra: let /32 host route with same IP cross VRF
[mirror_frr.git] / zebra / rib.h
CommitLineData
718e3744 1/*
2 * Routing Information Base header
3 * Copyright (C) 1997 Kunihiro Ishiguro
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
896014f4
DL
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
718e3744 20 */
21
22#ifndef _ZEBRA_RIB_H
23#define _ZEBRA_RIB_H
24
dc9ffce8 25#include "zebra.h"
224ccf29 26#include "memory.h"
4f8ea50c 27#include "hook.h"
aa57abfb 28#include "typesafe.h"
c6ffe645 29#include "linklist.h"
ec1a4283 30#include "prefix.h"
9fd92e3c 31#include "table.h"
5adc2528 32#include "queue.h"
fb018d25 33#include "nexthop.h"
7ee30f28 34#include "nexthop_group.h"
244a59d2 35#include "vrf.h"
fb148af4 36#include "if.h"
40c7bdb0 37#include "mpls.h"
05737783 38#include "srcdest_table.h"
5463ce26 39#include "zebra/zebra_nhg.h"
ec1a4283 40
51e94aa7
EDP
41#ifdef __cplusplus
42extern "C" {
43#endif
44
224ccf29
DL
45DECLARE_MGROUP(ZEBRA);
46
47DECLARE_MTYPE(RE);
48
960b9a53 49PREDECL_LIST(rnh_list);
aa57abfb
DS
50
51/* Nexthop structure. */
52struct rnh {
53 uint8_t flags;
54
ed6cec97
DS
55#define ZEBRA_NHT_CONNECTED 0x1
56#define ZEBRA_NHT_DELETED 0x2
57#define ZEBRA_NHT_EXACT_MATCH 0x4
58#define ZEBRA_NHT_RESOLVE_VIA_DEFAULT 0x8
aa57abfb
DS
59
60 /* VRF identifier. */
61 vrf_id_t vrf_id;
62
63 afi_t afi;
d597533a 64 safi_t safi;
aa57abfb 65
aa57abfb
DS
66 uint32_t seqno;
67
68 struct route_entry *state;
69 struct prefix resolved_route;
70 struct list *client_list;
71
72 /* pseudowires dependent on this nh */
73 struct list *zebra_pseudowire_list;
74
75 struct route_node *node;
76
77 /*
78 * if this has been filtered for the client
79 */
80 int filtered[ZEBRA_ROUTE_MAX];
81
82 struct rnh_list_item rnh_list_item;
83};
84
718e3744 85#define DISTANCE_INFINITY 255
7a4bb9c5 86#define ZEBRA_KERNEL_TABLE_MAX 252 /* support for no more than this rt tables */
718e3744 87
960b9a53 88PREDECL_LIST(re_list);
045207e2 89
b86c1f4f 90struct re_opaque {
a29a6001
DS
91 uint16_t length;
92 uint8_t data[];
93};
94
d62a17ae 95struct route_entry {
96 /* Link list. */
045207e2 97 struct re_list_item next;
d62a17ae 98
0eb97b86
MS
99 /* Nexthop group, shared/refcounted, based on the nexthop(s)
100 * provided by the owner of the route
101 */
102 struct nhg_hash_entry *nhe;
d62a17ae 103
0eb97b86 104 /* Nexthop group from FIB (optional), reflecting what is actually
4db01e79
MS
105 * installed in the FIB if that differs. The 'backup' group is used
106 * when backup nexthops are present in the route's nhg.
0eb97b86 107 */
ee5e8a48 108 struct nexthop_group fib_ng;
4db01e79 109 struct nexthop_group fib_backup_ng;
ee5e8a48 110
002930f7
MS
111 /* Nexthop group hash entry IDs. The "installed" id is the id
112 * used in linux/netlink, if available.
113 */
8e766379 114 uint32_t nhe_id;
002930f7 115 uint32_t nhe_installed_id;
f0cb8e16 116
d62a17ae 117 /* Tag */
118 route_tag_t tag;
119
120 /* Uptime. */
121 time_t uptime;
122
1d48702e 123 /* Type of this route. */
d62a17ae 124 int type;
125
d62a17ae 126 /* VRF identifier. */
127 vrf_id_t vrf_id;
128
129 /* Which routing table */
130 uint32_t table;
131
132 /* Metric */
d7c0a89a 133 uint32_t metric;
d62a17ae 134
135 /* MTU */
d7c0a89a
QY
136 uint32_t mtu;
137 uint32_t nexthop_mtu;
d62a17ae 138
d62a17ae 139 /* Flags of this route.
140 * This flag's definition is in lib/zebra.h ZEBRA_FLAG_* and is exposed
141 * to clients via Zserv
142 */
d7c0a89a 143 uint32_t flags;
d62a17ae 144
145 /* RIB internal status */
88f7ea31 146 uint32_t status;
f0f77c9a 147#define ROUTE_ENTRY_REMOVED 0x1
88f7ea31 148/* The Route Entry has changed */
42fc558e 149#define ROUTE_ENTRY_CHANGED 0x2
88f7ea31 150/* The Label has changed on the Route entry */
42fc558e 151#define ROUTE_ENTRY_LABELS_CHANGED 0x4
88f7ea31 152/* Route is queued for Installation into the Data Plane */
42fc558e 153#define ROUTE_ENTRY_QUEUED 0x8
88f7ea31 154/* Route is installed into the Data Plane */
42fc558e 155#define ROUTE_ENTRY_INSTALLED 0x10
88f7ea31 156/* Route has Failed installation into the Data Plane in some manner */
42fc558e 157#define ROUTE_ENTRY_FAILED 0x20
7483dcbe
MS
158/* Route has a 'fib' set of nexthops, probably because the installed set
159 * differs from the rib/normal set of nexthops.
160 */
161#define ROUTE_ENTRY_USE_FIB_NHG 0x40
6d691129 162
7cdb1a84
MS
163 /* Sequence value incremented for each dataplane operation */
164 uint32_t dplane_sequence;
7a741326
DS
165
166 /* Source protocol instance */
167 uint16_t instance;
168
169 /* Distance. */
170 uint8_t distance;
a29a6001 171
b86c1f4f 172 struct re_opaque *opaque;
718e3744 173};
174
66cb1845 175#define RIB_SYSTEM_ROUTE(R) RSYSTEM_ROUTE((R)->type)
84340a15 176
66cb1845 177#define RIB_KERNEL_ROUTE(R) RKERNEL_ROUTE((R)->type)
84340a15 178
e96f9203 179/* meta-queue structure:
e22e8001 180 * sub-queue 0: nexthop group objects
32367e7a
MS
181 * sub-queue 1: EVPN/VxLAN objects
182 * sub-queue 2: connected
183 * sub-queue 3: kernel
184 * sub-queue 4: static
185 * sub-queue 5: RIP, RIPng, OSPF, OSPF6, IS-IS, EIGRP, NHRP
186 * sub-queue 6: iBGP, eBGP
187 * sub-queue 7: any other origin (if any) typically those that
c17b2d5b 188 * don't generate routes
e96f9203 189 */
32367e7a 190#define MQ_SIZE 8
d62a17ae 191struct meta_queue {
192 struct list *subq[MQ_SIZE];
d7c0a89a 193 uint32_t size; /* sum of lengths of all subqueues */
e96f9203
DO
194};
195
9fd92e3c
AS
196/*
197 * Structure that represents a single destination (prefix).
198 */
d62a17ae 199typedef struct rib_dest_t_ {
9fd92e3c 200
d62a17ae 201 /*
202 * Back pointer to the route node for this destination. This helps
203 * us get to the prefix that this structure is for.
204 */
205 struct route_node *rnode;
9fd92e3c 206
d62a17ae 207 /*
208 * Doubly-linked list of routes for this prefix.
209 */
045207e2 210 struct re_list_head routes;
9fd92e3c 211
5f7a4718
DS
212 struct route_entry *selected_fib;
213
d62a17ae 214 /*
215 * Flags, see below.
216 */
d7c0a89a 217 uint32_t flags;
9fd92e3c 218
699dae23
DS
219 /*
220 * The list of nht prefixes that have ended up
221 * depending on this route node.
222 * After route processing is returned from
223 * the data plane we will run evaluate_rnh
224 * on these prefixes.
225 */
aa57abfb 226 struct rnh_list_head nht;
699dae23 227
d62a17ae 228 /*
229 * Linkage to put dest on the FPM processing queue.
230 */
231 TAILQ_ENTRY(rib_dest_t_) fpm_q_entries;
5adc2528 232
9fd92e3c
AS
233} rib_dest_t;
234
aa57abfb 235DECLARE_LIST(rnh_list, struct rnh, rnh_list_item);
045207e2 236DECLARE_LIST(re_list, struct route_entry, next);
aa57abfb 237
9fd92e3c 238#define RIB_ROUTE_QUEUED(x) (1 << (x))
1ca60f2c 239// If MQ_SIZE is modified this value needs to be updated.
e22e8001 240#define RIB_ROUTE_ANY_QUEUED 0x3F
9fd92e3c
AS
241
242/*
243 * The maximum qindex that can be used.
244 */
245#define ZEBRA_MAX_QINDEX (MQ_SIZE - 1)
246
5adc2528
AS
247/*
248 * This flag indicates that a given prefix has been 'advertised' to
249 * the FPM to be installed in the forwarding plane.
250 */
251#define RIB_DEST_SENT_TO_FPM (1 << (ZEBRA_MAX_QINDEX + 1))
252
253/*
254 * This flag is set when we need to send an update to the FPM about a
255 * dest.
256 */
257#define RIB_DEST_UPDATE_FPM (1 << (ZEBRA_MAX_QINDEX + 2))
258
a1494c25
DS
259#define RIB_DEST_UPDATE_LSPS (1 << (ZEBRA_MAX_QINDEX + 3))
260
9fd92e3c
AS
261/*
262 * Macro to iterate over each route for a destination (prefix).
263 */
d62a17ae 264#define RE_DEST_FOREACH_ROUTE(dest, re) \
045207e2
DS
265 for ((re) = (dest) ? re_list_first(&((dest)->routes)) : NULL; (re); \
266 (re) = re_list_next(&((dest)->routes), (re)))
9fd92e3c
AS
267
268/*
269 * Same as above, but allows the current node to be unlinked.
270 */
d62a17ae 271#define RE_DEST_FOREACH_ROUTE_SAFE(dest, re, next) \
045207e2
DS
272 for ((re) = (dest) ? re_list_first(&((dest)->routes)) : NULL; \
273 (re) && ((next) = re_list_next(&((dest)->routes), (re)), 1); \
274 (re) = (next))
9fd92e3c 275
db856683
CS
276#define RE_DEST_FIRST_ROUTE(dest, re) \
277 ((re) = (dest) ? re_list_first(&((dest)->routes)) : NULL)
278
279#define RE_DEST_NEXT_ROUTE(dest, re) \
280 ((re) = (dest) ? re_list_next(&((dest)->routes), (re)) : NULL)
281
d62a17ae 282#define RNODE_FOREACH_RE(rn, re) \
996c9314 283 RE_DEST_FOREACH_ROUTE (rib_dest_from_rnode(rn), re)
9fd92e3c 284
d62a17ae 285#define RNODE_FOREACH_RE_SAFE(rn, re, next) \
996c9314 286 RE_DEST_FOREACH_ROUTE_SAFE (rib_dest_from_rnode(rn), re, next)
9fd92e3c 287
db856683
CS
288#define RNODE_FIRST_RE(rn, re) RE_DEST_FIRST_ROUTE(rib_dest_from_rnode(rn), re)
289
290#define RNODE_NEXT_RE(rn, re) RE_DEST_NEXT_ROUTE(rib_dest_from_rnode(rn), re)
291
d62a17ae 292#if defined(HAVE_RTADV)
7c2ddfb9 293PREDECL_SORTLIST_UNIQ(adv_if_list);
cd80d74f 294/* Structure which hold status of router advertisement. */
d62a17ae 295struct rtadv {
296 int sock;
cd80d74f 297
7c2ddfb9
SW
298 struct adv_if_list_head adv_if;
299 struct adv_if_list_head adv_msec_if;
cd80d74f 300
d62a17ae 301 struct thread *ra_read;
302 struct thread *ra_timer;
cd80d74f 303};
7c2ddfb9
SW
304
305/* adv list node */
306struct adv_if {
307 char name[INTERFACE_NAMSIZ];
308 struct adv_if_list_item list_item;
309};
310
311static int adv_if_cmp(const struct adv_if *a, const struct adv_if *b)
312{
313 return if_cmp_name_func(a->name, b->name);
314}
315
316DECLARE_SORTLIST_UNIQ(adv_if_list, struct adv_if, list_item, adv_if_cmp);
8da4e946 317#endif /* HAVE_RTADV */
cd80d74f 318
1b5ed1b0
AS
319/*
320 * rib_table_info_t
321 *
322 * Structure that is hung off of a route_table that holds information about
323 * the table.
324 */
630d5962 325struct rib_table_info {
1b5ed1b0 326
d62a17ae 327 /*
328 * Back pointer to zebra_vrf.
329 */
330 struct zebra_vrf *zvrf;
331 afi_t afi;
332 safi_t safi;
b62983cf 333 uint32_t table_id;
630d5962 334};
1b5ed1b0 335
4d5647d0 336enum rib_tables_iter_state {
d62a17ae 337 RIB_TABLES_ITER_S_INIT,
338 RIB_TABLES_ITER_S_ITERATING,
339 RIB_TABLES_ITER_S_DONE
4d5647d0 340};
0915bb0c
AS
341
342/*
343 * Structure that holds state for iterating over all tables in the
344 * Routing Information Base.
345 */
d62a17ae 346typedef struct rib_tables_iter_t_ {
347 vrf_id_t vrf_id;
348 int afi_safi_ix;
0915bb0c 349
4d5647d0 350 enum rib_tables_iter_state state;
0915bb0c
AS
351} rib_tables_iter_t;
352
1c848137 353/* Events/reasons triggering a RIB update. */
91e6f25b 354enum rib_update_event {
2a99ab95 355 RIB_UPDATE_KERNEL,
d62a17ae 356 RIB_UPDATE_RMAP_CHANGE,
2a99ab95
SW
357 RIB_UPDATE_OTHER,
358 RIB_UPDATE_MAX
91e6f25b 359};
1c848137 360
d62a17ae 361extern void route_entry_copy_nexthops(struct route_entry *re,
362 struct nexthop *nh);
cd7108ba
EDP
363int route_entry_update_nhe(struct route_entry *re,
364 struct nhg_hash_entry *new_nhghe);
f0f77c9a 365
1f655680 366/* NHG replace has happend, we have to update route_entry pointers to new one */
2e8db20d
EDP
367void rib_handle_nhg_replace(struct nhg_hash_entry *old_entry,
368 struct nhg_hash_entry *new_entry);
1f655680 369
f0f77c9a 370#define route_entry_dump(prefix, src, re) _route_entry_dump(__func__, prefix, src, re)
072834ca
DS
371extern void _route_entry_dump(const char *func, union prefixconstptr pp,
372 union prefixconstptr src_pp,
373 const struct route_entry *re);
4623d897 374
dc95824a
DO
375#define ZEBRA_RIB_LOOKUP_ERROR -1
376#define ZEBRA_RIB_FOUND_EXACT 0
377#define ZEBRA_RIB_FOUND_NOGATE 1
378#define ZEBRA_RIB_FOUND_CONNECTED 2
379#define ZEBRA_RIB_NOTFOUND 3
380
d7c0a89a
QY
381extern int is_zebra_valid_kernel_table(uint32_t table_id);
382extern int is_zebra_main_routing_table(uint32_t table_id);
86391e56 383extern int zebra_check_addr(const struct prefix *p);
718e3744 384
d62a17ae 385extern void rib_delnode(struct route_node *rn, struct route_entry *re);
0c555cc6
DS
386extern void rib_install_kernel(struct route_node *rn, struct route_entry *re,
387 struct route_entry *old);
388extern void rib_uninstall_kernel(struct route_node *rn, struct route_entry *re);
28f6dde8 389
d24af186 390/* NOTE:
b4c034b0 391 * All rib_add function will not just add prefix into RIB, but
d24af186 392 * also implicitly withdraw equal prefix of same type. */
4a7371e9 393extern int rib_add(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
acde7f6b 394 unsigned short instance, uint32_t flags, struct prefix *p,
fd36be7e 395 struct prefix_ipv6 *src_p, const struct nexthop *nh,
8032b717 396 uint32_t nhe_id, uint32_t table_id, uint32_t metric,
c6eee91f
DS
397 uint32_t mtu, uint8_t distance, route_tag_t tag,
398 bool startup);
1d48702e
MS
399/*
400 * Multipath route apis.
401 */
072834ca 402extern int rib_add_multipath(afi_t afi, safi_t safi, struct prefix *p,
0eb97b86 403 struct prefix_ipv6 *src_p, struct route_entry *re,
c6eee91f 404 struct nexthop_group *ng, bool startup);
38c764dd
DS
405/*
406 * -1 -> some sort of error
407 * 0 -> an add
408 * 1 -> an update
409 */
1d48702e
MS
410extern int rib_add_multipath_nhe(afi_t afi, safi_t safi, struct prefix *p,
411 struct prefix_ipv6 *src_p,
412 struct route_entry *re,
c6eee91f 413 struct nhg_hash_entry *nhe, bool startup);
d62a17ae 414
415extern void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
acde7f6b
DS
416 unsigned short instance, uint32_t flags,
417 struct prefix *p, struct prefix_ipv6 *src_p,
418 const struct nexthop *nh, uint32_t nhe_id,
419 uint32_t table_id, uint32_t metric, uint8_t distance,
3ceae22b 420 bool fromkernel);
d62a17ae 421
072834ca 422extern struct route_entry *rib_match(afi_t afi, safi_t safi, vrf_id_t vrf_id,
bc77c3bb 423 const union g_addr *addr,
d62a17ae 424 struct route_node **rn_out);
425extern struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id,
426 struct in_addr addr,
427 struct route_node **rn_out);
428
072834ca
DS
429extern struct route_entry *rib_lookup_ipv4(struct prefix_ipv4 *p,
430 vrf_id_t vrf_id);
d62a17ae 431
91e6f25b 432extern void rib_update(enum rib_update_event event);
d5b8c216 433extern void rib_update_table(struct route_table *table,
54aeba35 434 enum rib_update_event event, int rtype);
cc9f21da 435extern void rib_sweep_route(struct thread *t);
072834ca
DS
436extern void rib_sweep_table(struct route_table *table);
437extern void rib_close_table(struct route_table *table);
d62a17ae 438extern void rib_init(void);
d7c0a89a
QY
439extern unsigned long rib_score_proto(uint8_t proto, unsigned short instance);
440extern unsigned long rib_score_proto_table(uint8_t proto,
441 unsigned short instance,
47a08aa9 442 struct route_table *table);
e22e8001
SW
443
444extern int rib_queue_add(struct route_node *rn);
445
446struct nhg_ctx; /* Forward declaration */
447
04bec7b2
MS
448/* Enqueue incoming nhg from OS for processing */
449extern int rib_queue_nhg_ctx_add(struct nhg_ctx *ctx);
450
451/* Enqueue incoming nhg from proto daemon for processing */
452extern int rib_queue_nhe_add(struct nhg_hash_entry *nhe);
e22e8001 453
32367e7a
MS
454/* Enqueue evpn route for processing */
455int zebra_rib_queue_evpn_route_add(vrf_id_t vrf_id, const struct ethaddr *rmac,
456 const struct ipaddr *vtep_ip,
457 const struct prefix *host_prefix);
458int zebra_rib_queue_evpn_route_del(vrf_id_t vrf_id,
459 const struct ipaddr *vtep_ip,
460 const struct prefix *host_prefix);
461/* Enqueue EVPN remote ES for processing */
462int zebra_rib_queue_evpn_rem_es_add(const esi_t *esi,
463 const struct in_addr *vtep_ip,
464 bool esr_rxed, uint8_t df_alg,
465 uint16_t df_pref);
466int zebra_rib_queue_evpn_rem_es_del(const esi_t *esi,
467 const struct in_addr *vtep_ip);
7f7e49d1
MS
468/* Enqueue EVPN remote macip update for processing */
469int zebra_rib_queue_evpn_rem_macip_del(vni_t vni, const struct ethaddr *macaddr,
470 const struct ipaddr *ip,
471 struct in_addr vtep_ip);
472int zebra_rib_queue_evpn_rem_macip_add(vni_t vni, const struct ethaddr *macaddr,
473 const struct ipaddr *ipaddr,
474 uint8_t flags, uint32_t seq,
475 struct in_addr vtep_ip,
476 const esi_t *esi);
7e5b0b2b
MS
477/* Enqueue VXLAN remote vtep update for processing */
478int zebra_rib_queue_evpn_rem_vtep_add(vrf_id_t vrf_id, vni_t vni,
479 struct in_addr vtep_ip,
480 int flood_control);
481int zebra_rib_queue_evpn_rem_vtep_del(vrf_id_t vrf_id, vni_t vni,
482 struct in_addr vtep_ip);
32367e7a 483
d62a17ae 484extern void meta_queue_free(struct meta_queue *mq);
0ef6eacc
IR
485extern void rib_meta_queue_free_vrf(struct meta_queue *mq,
486 struct zebra_vrf *zvrf);
d62a17ae 487extern int zebra_rib_labeled_unicast(struct route_entry *re);
718e3744 488extern struct route_table *rib_table_ipv6;
489
072834ca 490extern void rib_unlink(struct route_node *rn, struct route_entry *re);
d62a17ae 491extern int rib_gc_dest(struct route_node *rn);
492extern struct route_table *rib_tables_iter_next(rib_tables_iter_t *iter);
9fd92e3c 493
fd289fc8 494extern uint8_t route_distance(int type);
40c7bdb0 495
f99f1ff5
SP
496extern void zebra_rib_evaluate_rn_nexthops(struct route_node *rn, uint32_t seq,
497 bool rt_delete);
699dae23 498
a7704e1b
DS
499extern struct route_node *
500rib_find_rn_from_ctx(const struct zebra_dplane_ctx *ctx);
501
9fd92e3c
AS
502/*
503 * Inline functions.
504 */
505
1b5ed1b0
AS
506/*
507 * rib_table_info
508 */
630d5962 509static inline struct rib_table_info *rib_table_info(struct route_table *table)
1b5ed1b0 510{
630d5962 511 return (struct rib_table_info *)route_table_get_info(table);
1b5ed1b0
AS
512}
513
9fd92e3c
AS
514/*
515 * rib_dest_from_rnode
516 */
d62a17ae 517static inline rib_dest_t *rib_dest_from_rnode(struct route_node *rn)
9fd92e3c 518{
d62a17ae 519 return (rib_dest_t *)rn->info;
9fd92e3c
AS
520}
521
522/*
523 * rnode_to_ribs
524 *
525 * Returns a pointer to the list of routes corresponding to the given
526 * route_node.
527 */
d62a17ae 528static inline struct route_entry *rnode_to_ribs(struct route_node *rn)
9fd92e3c 529{
d62a17ae 530 rib_dest_t *dest;
9fd92e3c 531
d62a17ae 532 dest = rib_dest_from_rnode(rn);
533 if (!dest)
534 return NULL;
9fd92e3c 535
045207e2 536 return re_list_first(&dest->routes);
9fd92e3c
AS
537}
538
539/*
540 * rib_dest_prefix
541 */
d62a17ae 542static inline struct prefix *rib_dest_prefix(rib_dest_t *dest)
9fd92e3c 543{
d62a17ae 544 return &dest->rnode->p;
9fd92e3c
AS
545}
546
547/*
548 * rib_dest_af
549 *
550 * Returns the address family that the destination is for.
551 */
d7c0a89a 552static inline uint8_t rib_dest_af(rib_dest_t *dest)
9fd92e3c 553{
d62a17ae 554 return dest->rnode->p.family;
9fd92e3c
AS
555}
556
557/*
558 * rib_dest_table
559 */
d62a17ae 560static inline struct route_table *rib_dest_table(rib_dest_t *dest)
9fd92e3c 561{
d62a17ae 562 return srcdest_rnode_table(dest->rnode);
9fd92e3c
AS
563}
564
1b5ed1b0
AS
565/*
566 * rib_dest_vrf
567 */
d62a17ae 568static inline struct zebra_vrf *rib_dest_vrf(rib_dest_t *dest)
1b5ed1b0 569{
d62a17ae 570 return rib_table_info(rib_dest_table(dest))->zvrf;
1b5ed1b0
AS
571}
572
434434f7
DS
573/*
574 * Create the rib_dest_t and attach it to the specified node
575 */
576extern rib_dest_t *zebra_rib_create_dest(struct route_node *rn);
577
0915bb0c
AS
578/*
579 * rib_tables_iter_init
580 */
d62a17ae 581static inline void rib_tables_iter_init(rib_tables_iter_t *iter)
0915bb0c
AS
582
583{
d62a17ae 584 memset(iter, 0, sizeof(*iter));
585 iter->state = RIB_TABLES_ITER_S_INIT;
0915bb0c
AS
586}
587
588/*
589 * rib_tables_iter_started
590 *
2951a7a4 591 * Returns true if this iterator has started iterating over the set of
0915bb0c
AS
592 * tables.
593 */
d62a17ae 594static inline int rib_tables_iter_started(rib_tables_iter_t *iter)
0915bb0c 595{
d62a17ae 596 return iter->state != RIB_TABLES_ITER_S_INIT;
0915bb0c
AS
597}
598
599/*
600 * rib_tables_iter_cleanup
601 */
d62a17ae 602static inline void rib_tables_iter_cleanup(rib_tables_iter_t *iter)
0915bb0c 603{
d62a17ae 604 iter->state = RIB_TABLES_ITER_S_DONE;
0915bb0c
AS
605}
606
d62a17ae 607DECLARE_HOOK(rib_update, (struct route_node * rn, const char *reason),
8451921b 608 (rn, reason));
4f8ea50c 609
ee5e8a48 610/*
7483dcbe
MS
611 * Access installed/fib nexthops, which may be a subset of the
612 * rib nexthops.
ee5e8a48 613 */
4db01e79 614static inline struct nexthop_group *rib_get_fib_nhg(struct route_entry *re)
ee5e8a48 615{
7483dcbe
MS
616 /* If the fib set is a subset of the active rib set,
617 * use the dedicated fib list.
618 */
619 if (CHECK_FLAG(re->status, ROUTE_ENTRY_USE_FIB_NHG))
ee5e8a48
MS
620 return &(re->fib_ng);
621 else
c415d895 622 return &(re->nhe->nhg);
ee5e8a48 623}
05f7f5db 624
4db01e79 625/*
7483dcbe
MS
626 * Access backup nexthop-group that represents the installed backup nexthops;
627 * any installed backup will be on the fib list.
4db01e79
MS
628 */
629static inline struct nexthop_group *rib_get_fib_backup_nhg(
630 struct route_entry *re)
631{
7483dcbe 632 return &(re->fib_backup_ng);
4db01e79
MS
633}
634
05f7f5db 635extern void zebra_vty_init(void);
4060008b 636
05f7f5db
DS
637extern pid_t pid;
638
6b093863 639extern bool v6_rr_semantics;
51e94aa7
EDP
640
641#ifdef __cplusplus
642}
643#endif
644
718e3744 645#endif /*_ZEBRA_RIB_H */