1 /* Routing Information Base.
2 * Copyright (C) 1997, 98, 99, 2001 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GNU Zebra; see the file COPYING. If not, write to the Free
18 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
31 #include "sockunion.h"
34 #include "workqueue.h"
38 #include "zebra/rib.h"
40 #include "zebra/zserv.h"
41 #include "zebra/redistribute.h"
42 #include "zebra/debug.h"
44 /* Default rtm_table for all clients */
45 extern struct zebra_t zebrad
;
47 /* Hold time for RIB process, should be very minimal.
48 * it is useful to able to set it otherwise for testing, hence exported
49 * as global here for test-rig code.
51 int rib_process_hold_time
= 10;
53 /* Each route type's string and default distance value. */
60 {ZEBRA_ROUTE_SYSTEM
, 0},
61 {ZEBRA_ROUTE_KERNEL
, 0},
62 {ZEBRA_ROUTE_CONNECT
, 0},
63 {ZEBRA_ROUTE_STATIC
, 1},
64 {ZEBRA_ROUTE_RIP
, 120},
65 {ZEBRA_ROUTE_RIPNG
, 120},
66 {ZEBRA_ROUTE_OSPF
, 110},
67 {ZEBRA_ROUTE_OSPF6
, 110},
68 {ZEBRA_ROUTE_ISIS
, 115},
69 {ZEBRA_ROUTE_BGP
, 20 /* IBGP is 200. */}
72 /* Vector for routing table. */
75 /* Allocate new VRF. */
77 vrf_alloc (const char *name
)
81 vrf
= XCALLOC (MTYPE_VRF
, sizeof (struct vrf
));
85 vrf
->name
= XSTRDUP (MTYPE_VRF_NAME
, name
);
87 /* Allocate routing table and static table. */
88 vrf
->table
[AFI_IP
][SAFI_UNICAST
] = route_table_init ();
89 vrf
->table
[AFI_IP6
][SAFI_UNICAST
] = route_table_init ();
90 vrf
->stable
[AFI_IP
][SAFI_UNICAST
] = route_table_init ();
91 vrf
->stable
[AFI_IP6
][SAFI_UNICAST
] = route_table_init ();
98 vrf_free (struct vrf
*vrf
)
101 XFREE (MTYPE_VRF_NAME
, vrf
->name
);
102 XFREE (MTYPE_VRF
, vrf
);
105 /* Lookup VRF by identifier. */
107 vrf_lookup (u_int32_t id
)
109 return vector_lookup (vrf_vector
, id
);
112 /* Lookup VRF by name. */
114 vrf_lookup_by_name (char *name
)
119 for (i
= 0; i
< vector_active (vrf_vector
); i
++)
120 if ((vrf
= vector_slot (vrf_vector
, i
)) != NULL
)
121 if (vrf
->name
&& name
&& strcmp (vrf
->name
, name
) == 0)
126 /* Initialize VRF. */
130 struct vrf
*default_table
;
132 /* Allocate VRF vector. */
133 vrf_vector
= vector_init (1);
135 /* Allocate default main table. */
136 default_table
= vrf_alloc ("Default-IP-Routing-Table");
138 /* Default table index must be 0. */
139 vector_set_index (vrf_vector
, 0, default_table
);
142 /* Lookup route table. */
144 vrf_table (afi_t afi
, safi_t safi
, u_int32_t id
)
148 vrf
= vrf_lookup (id
);
152 return vrf
->table
[afi
][safi
];
155 /* Lookup static route table. */
157 vrf_static_table (afi_t afi
, safi_t safi
, u_int32_t id
)
161 vrf
= vrf_lookup (id
);
165 return vrf
->stable
[afi
][safi
];
168 /* Add nexthop to the end of the list. */
170 nexthop_add (struct rib
*rib
, struct nexthop
*nexthop
)
172 struct nexthop
*last
;
174 for (last
= rib
->nexthop
; last
&& last
->next
; last
= last
->next
)
177 last
->next
= nexthop
;
179 rib
->nexthop
= nexthop
;
180 nexthop
->prev
= last
;
185 /* Delete specified nexthop from the list. */
187 nexthop_delete (struct rib
*rib
, struct nexthop
*nexthop
)
190 nexthop
->next
->prev
= nexthop
->prev
;
192 nexthop
->prev
->next
= nexthop
->next
;
194 rib
->nexthop
= nexthop
->next
;
200 nexthop_free (struct nexthop
*nexthop
)
203 XFREE (0, nexthop
->ifname
);
204 XFREE (MTYPE_NEXTHOP
, nexthop
);
208 nexthop_ifindex_add (struct rib
*rib
, unsigned int ifindex
)
210 struct nexthop
*nexthop
;
212 nexthop
= XMALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
213 memset (nexthop
, 0, sizeof (struct nexthop
));
214 nexthop
->type
= NEXTHOP_TYPE_IFINDEX
;
215 nexthop
->ifindex
= ifindex
;
217 nexthop_add (rib
, nexthop
);
223 nexthop_ifname_add (struct rib
*rib
, char *ifname
)
225 struct nexthop
*nexthop
;
227 nexthop
= XMALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
228 memset (nexthop
, 0, sizeof (struct nexthop
));
229 nexthop
->type
= NEXTHOP_TYPE_IFNAME
;
230 nexthop
->ifname
= XSTRDUP (0, ifname
);
232 nexthop_add (rib
, nexthop
);
238 nexthop_ipv4_add (struct rib
*rib
, struct in_addr
*ipv4
, struct in_addr
*src
)
240 struct nexthop
*nexthop
;
242 nexthop
= XMALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
243 memset (nexthop
, 0, sizeof (struct nexthop
));
244 nexthop
->type
= NEXTHOP_TYPE_IPV4
;
245 nexthop
->gate
.ipv4
= *ipv4
;
247 nexthop
->src
.ipv4
= *src
;
249 nexthop_add (rib
, nexthop
);
254 static struct nexthop
*
255 nexthop_ipv4_ifindex_add (struct rib
*rib
, struct in_addr
*ipv4
,
256 struct in_addr
*src
, unsigned int ifindex
)
258 struct nexthop
*nexthop
;
260 nexthop
= XMALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
261 memset (nexthop
, 0, sizeof (struct nexthop
));
262 nexthop
->type
= NEXTHOP_TYPE_IPV4_IFINDEX
;
263 nexthop
->gate
.ipv4
= *ipv4
;
265 nexthop
->src
.ipv4
= *src
;
266 nexthop
->ifindex
= ifindex
;
268 nexthop_add (rib
, nexthop
);
275 nexthop_ipv6_add (struct rib
*rib
, struct in6_addr
*ipv6
)
277 struct nexthop
*nexthop
;
279 nexthop
= XMALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
280 memset (nexthop
, 0, sizeof (struct nexthop
));
281 nexthop
->type
= NEXTHOP_TYPE_IPV6
;
282 nexthop
->gate
.ipv6
= *ipv6
;
284 nexthop_add (rib
, nexthop
);
289 static struct nexthop
*
290 nexthop_ipv6_ifname_add (struct rib
*rib
, struct in6_addr
*ipv6
,
293 struct nexthop
*nexthop
;
295 nexthop
= XMALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
296 memset (nexthop
, 0, sizeof (struct nexthop
));
297 nexthop
->type
= NEXTHOP_TYPE_IPV6_IFNAME
;
298 nexthop
->gate
.ipv6
= *ipv6
;
299 nexthop
->ifname
= XSTRDUP (0, ifname
);
301 nexthop_add (rib
, nexthop
);
306 static struct nexthop
*
307 nexthop_ipv6_ifindex_add (struct rib
*rib
, struct in6_addr
*ipv6
,
308 unsigned int ifindex
)
310 struct nexthop
*nexthop
;
312 nexthop
= XMALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
313 memset (nexthop
, 0, sizeof (struct nexthop
));
314 nexthop
->type
= NEXTHOP_TYPE_IPV6_IFINDEX
;
315 nexthop
->gate
.ipv6
= *ipv6
;
316 nexthop
->ifindex
= ifindex
;
318 nexthop_add (rib
, nexthop
);
322 #endif /* HAVE_IPV6 */
325 nexthop_blackhole_add (struct rib
*rib
)
327 struct nexthop
*nexthop
;
329 nexthop
= XMALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
330 memset (nexthop
, 0, sizeof (struct nexthop
));
331 nexthop
->type
= NEXTHOP_TYPE_BLACKHOLE
;
332 SET_FLAG (rib
->flags
, ZEBRA_FLAG_BLACKHOLE
);
334 nexthop_add (rib
, nexthop
);
339 /* If force flag is not set, do not modify falgs at all for uninstall
340 the route from FIB. */
342 nexthop_active_ipv4 (struct rib
*rib
, struct nexthop
*nexthop
, int set
,
343 struct route_node
*top
)
345 struct prefix_ipv4 p
;
346 struct route_table
*table
;
347 struct route_node
*rn
;
349 struct nexthop
*newhop
;
351 if (nexthop
->type
== NEXTHOP_TYPE_IPV4
)
352 nexthop
->ifindex
= 0;
355 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
);
357 /* Make lookup prefix. */
358 memset (&p
, 0, sizeof (struct prefix_ipv4
));
360 p
.prefixlen
= IPV4_MAX_PREFIXLEN
;
361 p
.prefix
= nexthop
->gate
.ipv4
;
364 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
368 rn
= route_node_match (table
, (struct prefix
*) &p
);
371 route_unlock_node (rn
);
373 /* If lookup self prefix return immidiately. */
377 /* Pick up selected route. */
378 for (match
= rn
->info
; match
; match
= match
->next
)
379 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
382 /* If there is no selected route or matched route is EGP, go up
385 || match
->type
== ZEBRA_ROUTE_BGP
)
389 } while (rn
&& rn
->info
== NULL
);
391 route_lock_node (rn
);
395 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
397 /* Directly point connected route. */
398 newhop
= match
->nexthop
;
399 if (newhop
&& nexthop
->type
== NEXTHOP_TYPE_IPV4
)
400 nexthop
->ifindex
= newhop
->ifindex
;
404 else if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_INTERNAL
))
406 for (newhop
= match
->nexthop
; newhop
; newhop
= newhop
->next
)
407 if (CHECK_FLAG (newhop
->flags
, NEXTHOP_FLAG_FIB
)
408 && ! CHECK_FLAG (newhop
->flags
, NEXTHOP_FLAG_RECURSIVE
))
412 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
);
413 nexthop
->rtype
= newhop
->type
;
414 if (newhop
->type
== NEXTHOP_TYPE_IPV4
||
415 newhop
->type
== NEXTHOP_TYPE_IPV4_IFINDEX
)
416 nexthop
->rgate
.ipv4
= newhop
->gate
.ipv4
;
417 if (newhop
->type
== NEXTHOP_TYPE_IFINDEX
418 || newhop
->type
== NEXTHOP_TYPE_IFNAME
419 || newhop
->type
== NEXTHOP_TYPE_IPV4_IFINDEX
)
420 nexthop
->rifindex
= newhop
->ifindex
;
436 /* If force flag is not set, do not modify falgs at all for uninstall
437 the route from FIB. */
439 nexthop_active_ipv6 (struct rib
*rib
, struct nexthop
*nexthop
, int set
,
440 struct route_node
*top
)
442 struct prefix_ipv6 p
;
443 struct route_table
*table
;
444 struct route_node
*rn
;
446 struct nexthop
*newhop
;
448 if (nexthop
->type
== NEXTHOP_TYPE_IPV6
)
449 nexthop
->ifindex
= 0;
452 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
);
454 /* Make lookup prefix. */
455 memset (&p
, 0, sizeof (struct prefix_ipv6
));
457 p
.prefixlen
= IPV6_MAX_PREFIXLEN
;
458 p
.prefix
= nexthop
->gate
.ipv6
;
461 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
465 rn
= route_node_match (table
, (struct prefix
*) &p
);
468 route_unlock_node (rn
);
470 /* If lookup self prefix return immidiately. */
474 /* Pick up selected route. */
475 for (match
= rn
->info
; match
; match
= match
->next
)
476 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
479 /* If there is no selected route or matched route is EGP, go up
482 || match
->type
== ZEBRA_ROUTE_BGP
)
486 } while (rn
&& rn
->info
== NULL
);
488 route_lock_node (rn
);
492 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
494 /* Directly point connected route. */
495 newhop
= match
->nexthop
;
497 if (newhop
&& nexthop
->type
== NEXTHOP_TYPE_IPV6
)
498 nexthop
->ifindex
= newhop
->ifindex
;
502 else if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_INTERNAL
))
504 for (newhop
= match
->nexthop
; newhop
; newhop
= newhop
->next
)
505 if (CHECK_FLAG (newhop
->flags
, NEXTHOP_FLAG_FIB
)
506 && ! CHECK_FLAG (newhop
->flags
, NEXTHOP_FLAG_RECURSIVE
))
510 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
);
511 nexthop
->rtype
= newhop
->type
;
512 if (newhop
->type
== NEXTHOP_TYPE_IPV6
513 || newhop
->type
== NEXTHOP_TYPE_IPV6_IFINDEX
514 || newhop
->type
== NEXTHOP_TYPE_IPV6_IFNAME
)
515 nexthop
->rgate
.ipv6
= newhop
->gate
.ipv6
;
516 if (newhop
->type
== NEXTHOP_TYPE_IFINDEX
517 || newhop
->type
== NEXTHOP_TYPE_IFNAME
518 || newhop
->type
== NEXTHOP_TYPE_IPV6_IFINDEX
519 || newhop
->type
== NEXTHOP_TYPE_IPV6_IFNAME
)
520 nexthop
->rifindex
= newhop
->ifindex
;
534 #endif /* HAVE_IPV6 */
537 rib_match_ipv4 (struct in_addr addr
)
539 struct prefix_ipv4 p
;
540 struct route_table
*table
;
541 struct route_node
*rn
;
543 struct nexthop
*newhop
;
546 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
550 memset (&p
, 0, sizeof (struct prefix_ipv4
));
552 p
.prefixlen
= IPV4_MAX_PREFIXLEN
;
555 rn
= route_node_match (table
, (struct prefix
*) &p
);
559 route_unlock_node (rn
);
561 /* Pick up selected route. */
562 for (match
= rn
->info
; match
; match
= match
->next
)
563 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
566 /* If there is no selected route or matched route is EGP, go up
569 || match
->type
== ZEBRA_ROUTE_BGP
)
573 } while (rn
&& rn
->info
== NULL
);
575 route_lock_node (rn
);
579 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
580 /* Directly point connected route. */
584 for (newhop
= match
->nexthop
; newhop
; newhop
= newhop
->next
)
585 if (CHECK_FLAG (newhop
->flags
, NEXTHOP_FLAG_FIB
))
595 rib_lookup_ipv4 (struct prefix_ipv4
*p
)
597 struct route_table
*table
;
598 struct route_node
*rn
;
600 struct nexthop
*nexthop
;
603 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
607 rn
= route_node_lookup (table
, (struct prefix
*) p
);
609 /* No route for this prefix. */
614 route_unlock_node (rn
);
616 /* Pick up selected route. */
617 for (match
= rn
->info
; match
; match
= match
->next
)
618 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
621 if (! match
|| match
->type
== ZEBRA_ROUTE_BGP
)
624 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
627 for (nexthop
= match
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
628 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
635 * This clone function, unlike its original rib_lookup_ipv4(), checks
636 * if specified IPv4 route record (prefix/mask -> gate) exists in
637 * the whole RIB and has ZEBRA_FLAG_SELECTED set.
641 * 0: exact match found
642 * 1: a match was found with a different gate
643 * 2: connected route found
644 * 3: no matches found
647 rib_lookup_ipv4_route (struct prefix_ipv4
*p
, union sockunion
* qgate
)
649 struct route_table
*table
;
650 struct route_node
*rn
;
652 struct nexthop
*nexthop
;
655 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
657 return ZEBRA_RIB_LOOKUP_ERROR
;
659 /* Scan the RIB table for exactly matching RIB entry. */
660 rn
= route_node_lookup (table
, (struct prefix
*) p
);
662 /* No route for this prefix. */
664 return ZEBRA_RIB_NOTFOUND
;
667 route_unlock_node (rn
);
669 /* Find out if a "selected" RR for the discovered RIB entry exists ever. */
670 for (match
= rn
->info
; match
; match
= match
->next
)
672 if (CHECK_FLAG (match
->status
, RIB_ENTRY_REMOVED
))
674 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
678 /* None such found :( */
680 return ZEBRA_RIB_NOTFOUND
;
682 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
683 return ZEBRA_RIB_FOUND_CONNECTED
;
685 /* Ok, we have a cood candidate, let's check it's nexthop list... */
686 for (nexthop
= match
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
687 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
689 /* We are happy with either direct or recursive hexthop */
690 if (nexthop
->gate
.ipv4
.s_addr
== qgate
->sin
.sin_addr
.s_addr
||
691 nexthop
->rgate
.ipv4
.s_addr
== qgate
->sin
.sin_addr
.s_addr
)
692 return ZEBRA_RIB_FOUND_EXACT
;
695 if (IS_ZEBRA_DEBUG_RIB
)
697 char gate_buf
[INET_ADDRSTRLEN
], rgate_buf
[INET_ADDRSTRLEN
], qgate_buf
[INET_ADDRSTRLEN
];
698 inet_ntop (AF_INET
, &nexthop
->gate
.ipv4
.s_addr
, gate_buf
, INET_ADDRSTRLEN
);
699 inet_ntop (AF_INET
, &nexthop
->rgate
.ipv4
.s_addr
, rgate_buf
, INET_ADDRSTRLEN
);
700 inet_ntop (AF_INET
, &qgate
->sin
.sin_addr
.s_addr
, qgate_buf
, INET_ADDRSTRLEN
);
701 zlog_debug ("%s: qgate == %s, gate == %s, rgate == %s", __func__
, qgate_buf
, gate_buf
, rgate_buf
);
703 return ZEBRA_RIB_FOUND_NOGATE
;
707 return ZEBRA_RIB_NOTFOUND
;
712 rib_match_ipv6 (struct in6_addr
*addr
)
714 struct prefix_ipv6 p
;
715 struct route_table
*table
;
716 struct route_node
*rn
;
718 struct nexthop
*newhop
;
721 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
725 memset (&p
, 0, sizeof (struct prefix_ipv6
));
727 p
.prefixlen
= IPV6_MAX_PREFIXLEN
;
728 IPV6_ADDR_COPY (&p
.prefix
, addr
);
730 rn
= route_node_match (table
, (struct prefix
*) &p
);
734 route_unlock_node (rn
);
736 /* Pick up selected route. */
737 for (match
= rn
->info
; match
; match
= match
->next
)
738 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
741 /* If there is no selected route or matched route is EGP, go up
744 || match
->type
== ZEBRA_ROUTE_BGP
)
748 } while (rn
&& rn
->info
== NULL
);
750 route_lock_node (rn
);
754 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
755 /* Directly point connected route. */
759 for (newhop
= match
->nexthop
; newhop
; newhop
= newhop
->next
)
760 if (CHECK_FLAG (newhop
->flags
, NEXTHOP_FLAG_FIB
))
768 #endif /* HAVE_IPV6 */
770 #define RIB_SYSTEM_ROUTE(R) \
771 ((R)->type == ZEBRA_ROUTE_KERNEL || (R)->type == ZEBRA_ROUTE_CONNECT)
773 /* This function verifies reachability of one given nexthop, which can be
774 * numbered or unnumbered, IPv4 or IPv6. The result is unconditionally stored
775 * in nexthop->flags field. If the 4th parameter, 'set', is non-zero,
776 * nexthop->ifindex will be updated appropriately as well.
777 * An existing route map can turn (otherwise active) nexthop into inactive, but
780 * The return value is the final value of 'ACTIVE' flag.
784 nexthop_active_check (struct route_node
*rn
, struct rib
*rib
,
785 struct nexthop
*nexthop
, int set
)
787 struct interface
*ifp
;
788 route_map_result_t ret
= RMAP_MATCH
;
789 extern char *proto_rm
[AFI_MAX
][ZEBRA_ROUTE_MAX
+1];
790 struct route_map
*rmap
;
794 switch (nexthop
->type
)
796 case NEXTHOP_TYPE_IFINDEX
:
797 ifp
= if_lookup_by_index (nexthop
->ifindex
);
798 if (ifp
&& if_is_up (ifp
))
799 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
801 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
803 case NEXTHOP_TYPE_IPV6_IFNAME
:
805 case NEXTHOP_TYPE_IFNAME
:
806 ifp
= if_lookup_by_name (nexthop
->ifname
);
807 if (ifp
&& if_is_up (ifp
))
810 nexthop
->ifindex
= ifp
->ifindex
;
811 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
816 nexthop
->ifindex
= 0;
817 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
820 case NEXTHOP_TYPE_IPV4
:
821 case NEXTHOP_TYPE_IPV4_IFINDEX
:
823 if (nexthop_active_ipv4 (rib
, nexthop
, set
, rn
))
824 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
826 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
829 case NEXTHOP_TYPE_IPV6
:
831 if (nexthop_active_ipv6 (rib
, nexthop
, set
, rn
))
832 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
834 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
836 case NEXTHOP_TYPE_IPV6_IFINDEX
:
838 if (IN6_IS_ADDR_LINKLOCAL (&nexthop
->gate
.ipv6
))
840 ifp
= if_lookup_by_index (nexthop
->ifindex
);
841 if (ifp
&& if_is_up (ifp
))
842 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
844 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
848 if (nexthop_active_ipv6 (rib
, nexthop
, set
, rn
))
849 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
851 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
854 #endif /* HAVE_IPV6 */
855 case NEXTHOP_TYPE_BLACKHOLE
:
856 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
861 if (! CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
))
864 if (RIB_SYSTEM_ROUTE(rib
) ||
865 (family
== AFI_IP
&& rn
->p
.family
!= AF_INET
) ||
866 (family
== AFI_IP6
&& rn
->p
.family
!= AF_INET6
))
867 return CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
870 if (rib
->type
>= 0 && rib
->type
< ZEBRA_ROUTE_MAX
&&
871 proto_rm
[family
][rib
->type
])
872 rmap
= route_map_lookup_by_name (proto_rm
[family
][rib
->type
]);
873 if (!rmap
&& proto_rm
[family
][ZEBRA_ROUTE_MAX
])
874 rmap
= route_map_lookup_by_name (proto_rm
[family
][ZEBRA_ROUTE_MAX
]);
876 ret
= route_map_apply(rmap
, &rn
->p
, RMAP_ZEBRA
, nexthop
);
879 if (ret
== RMAP_DENYMATCH
)
880 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
881 return CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
884 /* Iterate over all nexthops of the given RIB entry and refresh their
885 * ACTIVE flag. rib->nexthop_active_num is updated accordingly. If any
886 * nexthop is found to toggle the ACTIVE flag, the whole rib structure
887 * is flagged with ZEBRA_FLAG_CHANGED. The 4th 'set' argument is
888 * transparently passed to nexthop_active_check().
890 * Return value is the new number of active nexthops.
894 nexthop_active_update (struct route_node
*rn
, struct rib
*rib
, int set
)
896 struct nexthop
*nexthop
;
897 int prev_active
, new_active
;
899 rib
->nexthop_active_num
= 0;
900 UNSET_FLAG (rib
->flags
, ZEBRA_FLAG_CHANGED
);
902 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
904 prev_active
= CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
905 if ((new_active
= nexthop_active_check (rn
, rib
, nexthop
, set
)))
906 rib
->nexthop_active_num
++;
907 if (prev_active
!= new_active
)
908 SET_FLAG (rib
->flags
, ZEBRA_FLAG_CHANGED
);
910 return rib
->nexthop_active_num
;
916 rib_install_kernel (struct route_node
*rn
, struct rib
*rib
)
919 struct nexthop
*nexthop
;
921 switch (PREFIX_FAMILY (&rn
->p
))
924 ret
= kernel_add_ipv4 (&rn
->p
, rib
);
928 ret
= kernel_add_ipv6 (&rn
->p
, rib
);
930 #endif /* HAVE_IPV6 */
933 /* This condition is never met, if we are using rt_socket.c */
936 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
937 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
941 /* Uninstall the route from kernel. */
943 rib_uninstall_kernel (struct route_node
*rn
, struct rib
*rib
)
946 struct nexthop
*nexthop
;
948 switch (PREFIX_FAMILY (&rn
->p
))
951 ret
= kernel_delete_ipv4 (&rn
->p
, rib
);
955 if (IS_ZEBRA_DEBUG_RIB
)
956 zlog_debug ("%s: calling kernel_delete_ipv4 (%p, %p)", __func__
, rn
, rib
);
957 ret
= kernel_delete_ipv6 (&rn
->p
, rib
);
959 #endif /* HAVE_IPV6 */
962 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
963 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
968 /* Uninstall the route from kernel. */
970 rib_uninstall (struct route_node
*rn
, struct rib
*rib
)
972 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
974 redistribute_delete (&rn
->p
, rib
);
975 if (! RIB_SYSTEM_ROUTE (rib
))
976 rib_uninstall_kernel (rn
, rib
);
977 UNSET_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
);
981 static void rib_unlink (struct route_node
*, struct rib
*);
983 /* Core function for processing routing information base. */
984 static wq_item_status
985 rib_process (struct work_queue
*wq
, void *data
)
989 struct rib
*fib
= NULL
;
990 struct rib
*select
= NULL
;
991 struct rib
*del
= NULL
;
992 struct route_node
*rn
= data
;
994 struct nexthop
*nexthop
= NULL
;
995 char buf
[INET_ADDRSTRLEN
];
999 if (IS_ZEBRA_DEBUG_RIB
|| IS_ZEBRA_DEBUG_RIB_Q
)
1000 inet_ntop (AF_INET
, &rn
->p
.u
.prefix
, buf
, INET_ADDRSTRLEN
);
1002 for (rib
= rn
->info
; rib
; rib
= next
)
1004 /* The next pointer is saved, because current pointer
1005 * may be passed to rib_unlink() in the middle of iteration.
1009 /* Currently installed rib. */
1010 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
1012 assert (fib
== NULL
);
1016 /* Unlock removed routes, so they'll be freed, bar the FIB entry,
1017 * which we need to do do further work with below.
1019 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1023 if (IS_ZEBRA_DEBUG_RIB
)
1024 zlog_debug ("%s: %s/%d: rn %p, removing rib %p", __func__
,
1025 buf
, rn
->p
.prefixlen
, rn
, rib
);
1026 rib_unlink (rn
, rib
);
1034 /* Skip unreachable nexthop. */
1035 if (! nexthop_active_update (rn
, rib
, 0))
1038 /* Infinit distance. */
1039 if (rib
->distance
== DISTANCE_INFINITY
)
1042 /* Newly selected rib, the common case. */
1049 /* filter route selection in following order:
1050 * - connected beats other types
1051 * - lower distance beats higher
1052 * - lower metric beats higher for equal distance
1053 * - last, hence oldest, route wins tie break.
1056 /* Connected routes. Pick the last connected
1057 * route of the set of lowest metric connected routes.
1059 if (rib
->type
== ZEBRA_ROUTE_CONNECT
)
1061 if (select
->type
!= ZEBRA_ROUTE_CONNECT
1062 || rib
->metric
<= select
->metric
)
1066 else if (select
->type
== ZEBRA_ROUTE_CONNECT
)
1069 /* higher distance loses */
1070 if (rib
->distance
> select
->distance
)
1074 if (rib
->distance
< select
->distance
)
1080 /* metric tie-breaks equal distance */
1081 if (rib
->metric
<= select
->metric
)
1083 } /* for (rib = rn->info; rib; rib = next) */
1085 /* After the cycle is finished, the following pointers will be set:
1086 * select --- the winner RIB entry, if any was found, otherwise NULL
1087 * fib --- the SELECTED RIB entry, if any, otherwise NULL
1088 * del --- equal to fib, if fib is queued for deletion, NULL otherwise
1092 /* Same RIB entry is selected. Update FIB and finish. */
1093 if (select
&& select
== fib
)
1095 if (IS_ZEBRA_DEBUG_RIB
)
1096 zlog_debug ("%s: %s/%d: Updating existing route, select %p, fib %p",
1097 __func__
, buf
, rn
->p
.prefixlen
, select
, fib
);
1098 if (CHECK_FLAG (select
->flags
, ZEBRA_FLAG_CHANGED
))
1100 redistribute_delete (&rn
->p
, select
);
1101 if (! RIB_SYSTEM_ROUTE (select
))
1102 rib_uninstall_kernel (rn
, select
);
1104 /* Set real nexthop. */
1105 nexthop_active_update (rn
, select
, 1);
1107 if (! RIB_SYSTEM_ROUTE (select
))
1108 rib_install_kernel (rn
, select
);
1109 redistribute_add (&rn
->p
, select
);
1111 else if (! RIB_SYSTEM_ROUTE (select
))
1113 /* Housekeeping code to deal with
1114 race conditions in kernel with linux
1115 netlink reporting interface up before IPv4 or IPv6 protocol
1116 is ready to add routes.
1117 This makes sure the routes are IN the kernel.
1120 for (nexthop
= select
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1122 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
1126 rib_install_kernel (rn
, select
);
1131 /* At this point we either haven't found the best RIB entry or it is
1132 * different from what we currently intend to flag with SELECTED. In both
1133 * cases, if a RIB block is present in FIB, it should be withdrawn.
1137 if (IS_ZEBRA_DEBUG_RIB
)
1138 zlog_debug ("%s: %s/%d: Removing existing route, fib %p", __func__
,
1139 buf
, rn
->p
.prefixlen
, fib
);
1140 redistribute_delete (&rn
->p
, fib
);
1141 if (! RIB_SYSTEM_ROUTE (fib
))
1142 rib_uninstall_kernel (rn
, fib
);
1143 UNSET_FLAG (fib
->flags
, ZEBRA_FLAG_SELECTED
);
1145 /* Set real nexthop. */
1146 nexthop_active_update (rn
, fib
, 1);
1149 /* Regardless of some RIB entry being SELECTED or not before, now we can
1150 * tell, that if a new winner exists, FIB is still not updated with this
1151 * data, but ready to be.
1155 if (IS_ZEBRA_DEBUG_RIB
)
1156 zlog_debug ("%s: %s/%d: Adding route, select %p", __func__
, buf
,
1157 rn
->p
.prefixlen
, select
);
1158 /* Set real nexthop. */
1159 nexthop_active_update (rn
, select
, 1);
1161 if (! RIB_SYSTEM_ROUTE (select
))
1162 rib_install_kernel (rn
, select
);
1163 SET_FLAG (select
->flags
, ZEBRA_FLAG_SELECTED
);
1164 redistribute_add (&rn
->p
, select
);
1167 /* FIB route was removed, should be deleted */
1170 if (IS_ZEBRA_DEBUG_RIB
)
1171 zlog_debug ("%s: %s/%d: Deleting fib %p, rn %p", __func__
, buf
,
1172 rn
->p
.prefixlen
, del
, rn
);
1173 rib_unlink (rn
, del
);
1177 if (IS_ZEBRA_DEBUG_RIB_Q
)
1178 zlog_debug ("%s: %s/%d: rn %p dequeued", __func__
, buf
, rn
->p
.prefixlen
, rn
);
1180 UNSET_FLAG (((struct rib
*)rn
->info
)->rn_status
, RIB_ROUTE_QUEUED
);
1181 route_unlock_node (rn
); /* rib queue lock */
1185 /* Add route_node to work queue and schedule processing */
1187 rib_queue_add (struct zebra_t
*zebra
, struct route_node
*rn
)
1189 char buf
[INET_ADDRSTRLEN
];
1190 assert (zebra
&& rn
);
1192 if (IS_ZEBRA_DEBUG_RIB_Q
)
1193 inet_ntop (AF_INET
, &rn
->p
.u
.prefix
, buf
, INET_ADDRSTRLEN
);
1195 /* Pointless to queue a route_node with no RIB entries to add or remove */
1198 zlog_debug ("%s: called for route_node (%p, %d) with no ribs",
1199 __func__
, rn
, rn
->lock
);
1200 zlog_backtrace(LOG_DEBUG
);
1204 /* Route-table node already queued, so nothing to do */
1205 if (CHECK_FLAG (((struct rib
*)rn
->info
)->rn_status
, RIB_ROUTE_QUEUED
))
1207 if (IS_ZEBRA_DEBUG_RIB_Q
)
1208 zlog_debug ("%s: %s/%d: rn %p already queued", __func__
, buf
,
1209 rn
->p
.prefixlen
, rn
);
1213 route_lock_node (rn
); /* rib queue lock */
1215 if (IS_ZEBRA_DEBUG_RIB_Q
)
1216 zlog_info ("%s: %s/%d: work queue added", __func__
, buf
, rn
->p
.prefixlen
);
1220 if (zebra
->ribq
== NULL
)
1222 zlog_err ("%s: work_queue does not exist!", __func__
);
1223 route_unlock_node (rn
);
1227 work_queue_add (zebra
->ribq
, rn
);
1229 SET_FLAG (((struct rib
*)rn
->info
)->rn_status
, RIB_ROUTE_QUEUED
);
1231 if (IS_ZEBRA_DEBUG_RIB_Q
)
1232 zlog_debug ("%s: %s/%d: rn %p queued", __func__
, buf
, rn
->p
.prefixlen
, rn
);
1237 /* initialise zebra rib work queue */
1239 rib_queue_init (struct zebra_t
*zebra
)
1243 if (! (zebra
->ribq
= work_queue_new (zebra
->master
,
1244 "route_node processing")))
1246 zlog_err ("%s: could not initialise work queue!", __func__
);
1250 /* fill in the work queue spec */
1251 zebra
->ribq
->spec
.workfunc
= &rib_process
;
1252 zebra
->ribq
->spec
.errorfunc
= NULL
;
1253 /* XXX: TODO: These should be runtime configurable via vty */
1254 zebra
->ribq
->spec
.max_retries
= 3;
1255 zebra
->ribq
->spec
.hold
= rib_process_hold_time
;
1260 /* RIB updates are processed via a queue of pointers to route_nodes.
1262 * The queue length is bounded by the maximal size of the routing table,
1263 * as a route_node will not be requeued, if already queued.
1265 * RIBs are submitted via rib_addnode or rib_delnode which set minimal
1266 * state, or static_install_ipv{4,6} (when an existing RIB is updated)
1267 * and then submit route_node to queue for best-path selection later.
1268 * Order of add/delete state changes are preserved for any given RIB.
1270 * Deleted RIBs are reaped during best-path selection.
1273 * |-> rib_link or unset RIB_ENTRY_REMOVE |->Update kernel with
1274 * |-------->| | best RIB, if required
1276 * static_install->|->rib_addqueue...... -> rib_process
1278 * |-------->| |-> rib_unlink
1279 * |-> set RIB_ENTRY_REMOVE |
1280 * rib_delnode (RIB freed)
1283 * Queueing state for a route_node is kept in the head RIB entry, this
1284 * state must be preserved as and when the head RIB entry of a
1285 * route_node is changed by rib_unlink / rib_link. A small complication,
1286 * but saves having to allocate a dedicated object for this.
1288 * Refcounting (aka "locking" throughout the GNU Zebra and Quagga code):
1290 * - route_nodes: refcounted by:
1291 * - RIBs attached to route_node:
1292 * - managed by: rib_link/unlink
1293 * - route_node processing queue
1294 * - managed by: rib_addqueue, rib_process.
1298 /* Add RIB to head of the route node. */
1300 rib_link (struct route_node
*rn
, struct rib
*rib
)
1303 char buf
[INET_ADDRSTRLEN
];
1307 route_lock_node (rn
); /* rn route table reference */
1309 if (IS_ZEBRA_DEBUG_RIB
)
1311 inet_ntop (AF_INET
, &rn
->p
.u
.prefix
, buf
, INET_ADDRSTRLEN
);
1312 zlog_debug ("%s: %s/%d: rn %p, rib %p", __func__
,
1313 buf
, rn
->p
.prefixlen
, rn
, rib
);
1319 if (IS_ZEBRA_DEBUG_RIB
)
1320 zlog_debug ("%s: %s/%d: new head, rn_status copied over", __func__
,
1321 buf
, rn
->p
.prefixlen
);
1323 /* Transfer the rn status flags to the new head RIB */
1324 rib
->rn_status
= head
->rn_status
;
1328 rib_queue_add (&zebrad
, rn
);
1332 rib_addnode (struct route_node
*rn
, struct rib
*rib
)
1334 /* RIB node has been un-removed before route-node is processed.
1335 * route_node must hence already be on the queue for processing..
1337 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1339 if (IS_ZEBRA_DEBUG_RIB
)
1341 char buf
[INET_ADDRSTRLEN
];
1342 inet_ntop (AF_INET
, &rn
->p
.u
.prefix
, buf
, INET_ADDRSTRLEN
);
1343 zlog_debug ("%s: %s/%d: rn %p, un-removed rib %p",
1344 __func__
, buf
, rn
->p
.prefixlen
, rn
, rib
);
1346 UNSET_FLAG (rib
->status
, RIB_ENTRY_REMOVED
);
1353 rib_unlink (struct route_node
*rn
, struct rib
*rib
)
1355 struct nexthop
*nexthop
, *next
;
1356 char buf
[INET_ADDRSTRLEN
];
1360 if (IS_ZEBRA_DEBUG_RIB
)
1362 inet_ntop (AF_INET
, &rn
->p
.u
.prefix
, buf
, INET_ADDRSTRLEN
);
1363 zlog_debug ("%s: %s/%d: rn %p, rib %p",
1364 __func__
, buf
, rn
->p
.prefixlen
, rn
, rib
);
1368 rib
->next
->prev
= rib
->prev
;
1371 rib
->prev
->next
= rib
->next
;
1374 rn
->info
= rib
->next
;
1378 if (IS_ZEBRA_DEBUG_RIB
)
1379 zlog_debug ("%s: %s/%d: rn %p, rib %p, new head copy",
1380 __func__
, buf
, rn
->p
.prefixlen
, rn
, rib
);
1381 rib
->next
->rn_status
= rib
->rn_status
;
1385 /* free RIB and nexthops */
1386 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= next
)
1388 next
= nexthop
->next
;
1389 nexthop_free (nexthop
);
1391 XFREE (MTYPE_RIB
, rib
);
1393 route_unlock_node (rn
); /* rn route table reference */
1397 rib_delnode (struct route_node
*rn
, struct rib
*rib
)
1399 if (IS_ZEBRA_DEBUG_RIB
)
1401 char buf
[INET_ADDRSTRLEN
];
1402 inet_ntop (AF_INET
, &rn
->p
.u
.prefix
, buf
, INET_ADDRSTRLEN
);
1403 zlog_debug ("%s: %s/%d: rn %p, rib %p, removing", __func__
,
1404 buf
, rn
->p
.prefixlen
, rn
, rib
);
1406 SET_FLAG (rib
->status
, RIB_ENTRY_REMOVED
);
1407 rib_queue_add (&zebrad
, rn
);
1411 rib_add_ipv4 (int type
, int flags
, struct prefix_ipv4
*p
,
1412 struct in_addr
*gate
, struct in_addr
*src
,
1413 unsigned int ifindex
, u_int32_t vrf_id
,
1414 u_int32_t metric
, u_char distance
)
1417 struct rib
*same
= NULL
;
1418 struct route_table
*table
;
1419 struct route_node
*rn
;
1420 struct nexthop
*nexthop
;
1423 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1427 /* Make it sure prefixlen is applied to the prefix. */
1428 apply_mask_ipv4 (p
);
1430 /* Set default distance by route type. */
1433 distance
= route_info
[type
].distance
;
1435 /* iBGP distance is 200. */
1436 if (type
== ZEBRA_ROUTE_BGP
&& CHECK_FLAG (flags
, ZEBRA_FLAG_IBGP
))
1440 /* Lookup route node.*/
1441 rn
= route_node_get (table
, (struct prefix
*) p
);
1443 /* If same type of route are installed, treat it as a implicit
1445 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1447 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1450 if (rib
->type
!= type
)
1452 if (rib
->type
!= ZEBRA_ROUTE_CONNECT
)
1457 /* Duplicate connected route comes in. */
1458 else if ((nexthop
= rib
->nexthop
) &&
1459 nexthop
->type
== NEXTHOP_TYPE_IFINDEX
&&
1460 nexthop
->ifindex
== ifindex
&&
1461 !CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1468 /* Allocate new rib structure. */
1469 rib
= XCALLOC (MTYPE_RIB
, sizeof (struct rib
));
1471 rib
->distance
= distance
;
1473 rib
->metric
= metric
;
1474 rib
->table
= vrf_id
;
1475 rib
->nexthop_num
= 0;
1476 rib
->uptime
= time (NULL
);
1478 /* Nexthop settings. */
1482 nexthop_ipv4_ifindex_add (rib
, gate
, src
, ifindex
);
1484 nexthop_ipv4_add (rib
, gate
, src
);
1487 nexthop_ifindex_add (rib
, ifindex
);
1489 /* If this route is kernel route, set FIB flag to the route. */
1490 if (type
== ZEBRA_ROUTE_KERNEL
|| type
== ZEBRA_ROUTE_CONNECT
)
1491 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1492 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
1494 /* Link new rib to node.*/
1495 if (IS_ZEBRA_DEBUG_RIB
)
1496 zlog_debug ("%s: calling rib_addnode (%p, %p)", __func__
, rn
, rib
);
1497 rib_addnode (rn
, rib
);
1499 /* Free implicit route.*/
1502 if (IS_ZEBRA_DEBUG_RIB
)
1503 zlog_debug ("%s: calling rib_delnode (%p, %p)", __func__
, rn
, rib
);
1504 rib_delnode (rn
, same
);
1507 route_unlock_node (rn
);
1511 /* This function dumps the contents of a given RIB entry into
1512 * standard debug log. Calling function name and IP prefix in
1513 * question are passed as 1st and 2nd arguments.
1516 void rib_dump (const char * func
, const struct prefix_ipv4
* p
, const struct rib
* rib
)
1518 char straddr1
[INET_ADDRSTRLEN
], straddr2
[INET_ADDRSTRLEN
];
1519 struct nexthop
*nexthop
;
1521 inet_ntop (AF_INET
, &p
->prefix
, straddr1
, INET_ADDRSTRLEN
);
1522 zlog_debug ("%s: dumping RIB entry %p for %s/%d", func
, rib
, straddr1
, p
->prefixlen
);
1525 "%s: refcnt == %lu, uptime == %u, type == %u, table == %d",
1534 "%s: metric == %u, distance == %u, flags == %u, status == %u",
1543 "%s: nexthop_num == %u, nexthop_active_num == %u, nexthop_fib_num == %u",
1546 rib
->nexthop_active_num
,
1547 rib
->nexthop_fib_num
1549 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1551 inet_ntop (AF_INET
, &nexthop
->gate
.ipv4
.s_addr
, straddr1
, INET_ADDRSTRLEN
);
1552 inet_ntop (AF_INET
, &nexthop
->rgate
.ipv4
.s_addr
, straddr2
, INET_ADDRSTRLEN
);
1555 "%s: NH %s (%s) with flags %s%s%s",
1559 (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
) ? "ACTIVE " : ""),
1560 (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
) ? "FIB " : ""),
1561 (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
) ? "RECURSIVE" : "")
1564 zlog_debug ("%s: dump complete", func
);
1567 /* This is an exported helper to rtm_read() to dump the strange
1568 * RIB entry found by rib_lookup_ipv4_route()
1571 void rib_lookup_and_dump (struct prefix_ipv4
* p
)
1573 struct route_table
*table
;
1574 struct route_node
*rn
;
1576 char prefix_buf
[INET_ADDRSTRLEN
];
1579 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1582 zlog_err ("%s: vrf_table() returned NULL", __func__
);
1586 inet_ntop (AF_INET
, &p
->prefix
.s_addr
, prefix_buf
, INET_ADDRSTRLEN
);
1587 /* Scan the RIB table for exactly matching RIB entry. */
1588 rn
= route_node_lookup (table
, (struct prefix
*) p
);
1590 /* No route for this prefix. */
1593 zlog_debug ("%s: lookup failed for %s/%d", __func__
, prefix_buf
, p
->prefixlen
);
1598 route_unlock_node (rn
);
1601 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1605 "%s: rn %p, rib %p: %s, %s",
1609 (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
) ? "removed" : "NOT removed"),
1610 (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
) ? "selected" : "NOT selected")
1612 rib_dump (__func__
, p
, rib
);
1617 rib_add_ipv4_multipath (struct prefix_ipv4
*p
, struct rib
*rib
)
1619 struct route_table
*table
;
1620 struct route_node
*rn
;
1622 struct nexthop
*nexthop
;
1625 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1628 /* Make it sure prefixlen is applied to the prefix. */
1629 apply_mask_ipv4 (p
);
1631 /* Set default distance by route type. */
1632 if (rib
->distance
== 0)
1634 rib
->distance
= route_info
[rib
->type
].distance
;
1636 /* iBGP distance is 200. */
1637 if (rib
->type
== ZEBRA_ROUTE_BGP
1638 && CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_IBGP
))
1639 rib
->distance
= 200;
1642 /* Lookup route node.*/
1643 rn
= route_node_get (table
, (struct prefix
*) p
);
1645 /* If same type of route are installed, treat it as a implicit
1647 for (same
= rn
->info
; same
; same
= same
->next
)
1649 if (CHECK_FLAG (same
->status
, RIB_ENTRY_REMOVED
))
1652 if (same
->type
== rib
->type
&& same
->table
== rib
->table
1653 && same
->type
!= ZEBRA_ROUTE_CONNECT
)
1657 /* If this route is kernel route, set FIB flag to the route. */
1658 if (rib
->type
== ZEBRA_ROUTE_KERNEL
|| rib
->type
== ZEBRA_ROUTE_CONNECT
)
1659 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1660 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
1662 /* Link new rib to node.*/
1663 rib_addnode (rn
, rib
);
1664 if (IS_ZEBRA_DEBUG_RIB
)
1666 zlog_debug ("%s: called rib_addnode (%p, %p) on new RIB entry",
1668 rib_dump (__func__
, p
, rib
);
1671 /* Free implicit route.*/
1674 if (IS_ZEBRA_DEBUG_RIB
)
1676 zlog_debug ("%s: calling rib_delnode (%p, %p) on existing RIB entry",
1677 __func__
, rn
, same
);
1678 rib_dump (__func__
, p
, same
);
1680 rib_delnode (rn
, same
);
1683 route_unlock_node (rn
);
1687 /* XXX factor with rib_delete_ipv6 */
1689 rib_delete_ipv4 (int type
, int flags
, struct prefix_ipv4
*p
,
1690 struct in_addr
*gate
, unsigned int ifindex
, u_int32_t vrf_id
)
1692 struct route_table
*table
;
1693 struct route_node
*rn
;
1695 struct rib
*fib
= NULL
;
1696 struct rib
*same
= NULL
;
1697 struct nexthop
*nexthop
;
1702 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1707 apply_mask_ipv4 (p
);
1709 if (IS_ZEBRA_DEBUG_KERNEL
&& gate
)
1710 zlog_debug ("rib_delete_ipv4(): route delete %s/%d via %s ifindex %d",
1711 inet_ntop (AF_INET
, &p
->prefix
, buf1
, BUFSIZ
),
1716 /* Lookup route node. */
1717 rn
= route_node_lookup (table
, (struct prefix
*) p
);
1720 if (IS_ZEBRA_DEBUG_KERNEL
)
1723 zlog_debug ("route %s/%d via %s ifindex %d doesn't exist in rib",
1724 inet_ntop (AF_INET
, &p
->prefix
, buf1
, BUFSIZ
),
1726 inet_ntop (AF_INET
, gate
, buf2
, BUFSIZ
),
1729 zlog_debug ("route %s/%d ifindex %d doesn't exist in rib",
1730 inet_ntop (AF_INET
, &p
->prefix
, buf1
, BUFSIZ
),
1734 return ZEBRA_ERR_RTNOEXIST
;
1737 /* Lookup same type route. */
1738 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1740 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1743 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
1746 if (rib
->type
!= type
)
1748 if (rib
->type
== ZEBRA_ROUTE_CONNECT
&& (nexthop
= rib
->nexthop
) &&
1749 nexthop
->type
== NEXTHOP_TYPE_IFINDEX
&& nexthop
->ifindex
== ifindex
)
1754 route_unlock_node (rn
);
1755 route_unlock_node (rn
);
1761 /* Make sure that the route found has the same gateway. */
1762 else if (gate
== NULL
||
1763 ((nexthop
= rib
->nexthop
) &&
1764 (IPV4_ADDR_SAME (&nexthop
->gate
.ipv4
, gate
) ||
1765 IPV4_ADDR_SAME (&nexthop
->rgate
.ipv4
, gate
))))
1772 /* If same type of route can't be found and this message is from
1776 if (fib
&& type
== ZEBRA_ROUTE_KERNEL
)
1779 for (nexthop
= fib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1780 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
1782 UNSET_FLAG (fib
->flags
, ZEBRA_FLAG_SELECTED
);
1786 if (IS_ZEBRA_DEBUG_KERNEL
)
1789 zlog_debug ("route %s/%d via %s ifindex %d type %d doesn't exist in rib",
1790 inet_ntop (AF_INET
, &p
->prefix
, buf1
, BUFSIZ
),
1792 inet_ntop (AF_INET
, gate
, buf2
, BUFSIZ
),
1796 zlog_debug ("route %s/%d ifindex %d type %d doesn't exist in rib",
1797 inet_ntop (AF_INET
, &p
->prefix
, buf1
, BUFSIZ
),
1802 route_unlock_node (rn
);
1803 return ZEBRA_ERR_RTNOEXIST
;
1808 rib_delnode (rn
, same
);
1810 route_unlock_node (rn
);
1814 /* Install static route into rib. */
1816 static_install_ipv4 (struct prefix
*p
, struct static_ipv4
*si
)
1819 struct route_node
*rn
;
1820 struct route_table
*table
;
1823 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1827 /* Lookup existing route */
1828 rn
= route_node_get (table
, p
);
1829 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1831 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1834 if (rib
->type
== ZEBRA_ROUTE_STATIC
&& rib
->distance
== si
->distance
)
1840 /* Same distance static route is there. Update it with new
1842 route_unlock_node (rn
);
1845 case STATIC_IPV4_GATEWAY
:
1846 nexthop_ipv4_add (rib
, &si
->gate
.ipv4
, NULL
);
1848 case STATIC_IPV4_IFNAME
:
1849 nexthop_ifname_add (rib
, si
->gate
.ifname
);
1851 case STATIC_IPV4_BLACKHOLE
:
1852 nexthop_blackhole_add (rib
);
1855 rib_queue_add (&zebrad
, rn
);
1859 /* This is new static route. */
1860 rib
= XCALLOC (MTYPE_RIB
, sizeof (struct rib
));
1862 rib
->type
= ZEBRA_ROUTE_STATIC
;
1863 rib
->distance
= si
->distance
;
1865 rib
->nexthop_num
= 0;
1869 case STATIC_IPV4_GATEWAY
:
1870 nexthop_ipv4_add (rib
, &si
->gate
.ipv4
, NULL
);
1872 case STATIC_IPV4_IFNAME
:
1873 nexthop_ifname_add (rib
, si
->gate
.ifname
);
1875 case STATIC_IPV4_BLACKHOLE
:
1876 nexthop_blackhole_add (rib
);
1880 /* Save the flags of this static routes (reject, blackhole) */
1881 rib
->flags
= si
->flags
;
1883 /* Link this rib to the tree. */
1884 rib_addnode (rn
, rib
);
1889 static_ipv4_nexthop_same (struct nexthop
*nexthop
, struct static_ipv4
*si
)
1891 if (nexthop
->type
== NEXTHOP_TYPE_IPV4
1892 && si
->type
== STATIC_IPV4_GATEWAY
1893 && IPV4_ADDR_SAME (&nexthop
->gate
.ipv4
, &si
->gate
.ipv4
))
1895 if (nexthop
->type
== NEXTHOP_TYPE_IFNAME
1896 && si
->type
== STATIC_IPV4_IFNAME
1897 && strcmp (nexthop
->ifname
, si
->gate
.ifname
) == 0)
1899 if (nexthop
->type
== NEXTHOP_TYPE_BLACKHOLE
1900 && si
->type
== STATIC_IPV4_BLACKHOLE
)
1905 /* Uninstall static route from RIB. */
1907 static_uninstall_ipv4 (struct prefix
*p
, struct static_ipv4
*si
)
1909 struct route_node
*rn
;
1911 struct nexthop
*nexthop
;
1912 struct route_table
*table
;
1915 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1919 /* Lookup existing route with type and distance. */
1920 rn
= route_node_lookup (table
, p
);
1924 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1926 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1929 if (rib
->type
== ZEBRA_ROUTE_STATIC
&& rib
->distance
== si
->distance
)
1935 route_unlock_node (rn
);
1939 /* Lookup nexthop. */
1940 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1941 if (static_ipv4_nexthop_same (nexthop
, si
))
1944 /* Can't find nexthop. */
1947 route_unlock_node (rn
);
1951 /* Check nexthop. */
1952 if (rib
->nexthop_num
== 1)
1953 rib_delnode (rn
, rib
);
1956 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
1957 rib_uninstall (rn
, rib
);
1958 nexthop_delete (rib
, nexthop
);
1959 nexthop_free (nexthop
);
1960 rib_queue_add (&zebrad
, rn
);
1963 route_unlock_node (rn
);
1966 /* Add static route into static route configuration. */
1968 static_add_ipv4 (struct prefix
*p
, struct in_addr
*gate
, const char *ifname
,
1969 u_char flags
, u_char distance
, u_int32_t vrf_id
)
1972 struct route_node
*rn
;
1973 struct static_ipv4
*si
;
1974 struct static_ipv4
*pp
;
1975 struct static_ipv4
*cp
;
1976 struct static_ipv4
*update
= NULL
;
1977 struct route_table
*stable
;
1980 stable
= vrf_static_table (AFI_IP
, SAFI_UNICAST
, vrf_id
);
1984 /* Lookup static route prefix. */
1985 rn
= route_node_get (stable
, p
);
1989 type
= STATIC_IPV4_GATEWAY
;
1991 type
= STATIC_IPV4_IFNAME
;
1993 type
= STATIC_IPV4_BLACKHOLE
;
1995 /* Do nothing if there is a same static route. */
1996 for (si
= rn
->info
; si
; si
= si
->next
)
1998 if (type
== si
->type
1999 && (! gate
|| IPV4_ADDR_SAME (gate
, &si
->gate
.ipv4
))
2000 && (! ifname
|| strcmp (ifname
, si
->gate
.ifname
) == 0))
2002 if (distance
== si
->distance
)
2004 route_unlock_node (rn
);
2012 /* Distance changed. */
2014 static_delete_ipv4 (p
, gate
, ifname
, update
->distance
, vrf_id
);
2016 /* Make new static route structure. */
2017 si
= XMALLOC (MTYPE_STATIC_IPV4
, sizeof (struct static_ipv4
));
2018 memset (si
, 0, sizeof (struct static_ipv4
));
2021 si
->distance
= distance
;
2025 si
->gate
.ipv4
= *gate
;
2027 si
->gate
.ifname
= XSTRDUP (0, ifname
);
2029 /* Add new static route information to the tree with sort by
2030 distance value and gateway address. */
2031 for (pp
= NULL
, cp
= rn
->info
; cp
; pp
= cp
, cp
= cp
->next
)
2033 if (si
->distance
< cp
->distance
)
2035 if (si
->distance
> cp
->distance
)
2037 if (si
->type
== STATIC_IPV4_GATEWAY
&& cp
->type
== STATIC_IPV4_GATEWAY
)
2039 if (ntohl (si
->gate
.ipv4
.s_addr
) < ntohl (cp
->gate
.ipv4
.s_addr
))
2041 if (ntohl (si
->gate
.ipv4
.s_addr
) > ntohl (cp
->gate
.ipv4
.s_addr
))
2046 /* Make linked list. */
2056 /* Install into rib. */
2057 static_install_ipv4 (p
, si
);
2062 /* Delete static route from static route configuration. */
2064 static_delete_ipv4 (struct prefix
*p
, struct in_addr
*gate
, const char *ifname
,
2065 u_char distance
, u_int32_t vrf_id
)
2068 struct route_node
*rn
;
2069 struct static_ipv4
*si
;
2070 struct route_table
*stable
;
2073 stable
= vrf_static_table (AFI_IP
, SAFI_UNICAST
, vrf_id
);
2077 /* Lookup static route prefix. */
2078 rn
= route_node_lookup (stable
, p
);
2084 type
= STATIC_IPV4_GATEWAY
;
2086 type
= STATIC_IPV4_IFNAME
;
2088 type
= STATIC_IPV4_BLACKHOLE
;
2090 /* Find same static route is the tree */
2091 for (si
= rn
->info
; si
; si
= si
->next
)
2092 if (type
== si
->type
2093 && (! gate
|| IPV4_ADDR_SAME (gate
, &si
->gate
.ipv4
))
2094 && (! ifname
|| strcmp (ifname
, si
->gate
.ifname
) == 0))
2097 /* Can't find static route. */
2100 route_unlock_node (rn
);
2104 /* Install into rib. */
2105 static_uninstall_ipv4 (p
, si
);
2107 /* Unlink static route from linked list. */
2109 si
->prev
->next
= si
->next
;
2111 rn
->info
= si
->next
;
2113 si
->next
->prev
= si
->prev
;
2114 route_unlock_node (rn
);
2116 /* Free static route configuration. */
2118 XFREE (0, si
->gate
.ifname
);
2119 XFREE (MTYPE_STATIC_IPV4
, si
);
2121 route_unlock_node (rn
);
2129 rib_bogus_ipv6 (int type
, struct prefix_ipv6
*p
,
2130 struct in6_addr
*gate
, unsigned int ifindex
, int table
)
2132 if (type
== ZEBRA_ROUTE_CONNECT
&& IN6_IS_ADDR_UNSPECIFIED (&p
->prefix
)) {
2133 #if defined (MUSICA) || defined (LINUX)
2134 /* IN6_IS_ADDR_V4COMPAT(&p->prefix) */
2135 if (p
->prefixlen
== 96)
2140 if (type
== ZEBRA_ROUTE_KERNEL
&& IN6_IS_ADDR_UNSPECIFIED (&p
->prefix
)
2141 && p
->prefixlen
== 96 && gate
&& IN6_IS_ADDR_UNSPECIFIED (gate
))
2143 kernel_delete_ipv6_old (p
, gate
, ifindex
, 0, table
);
2150 rib_add_ipv6 (int type
, int flags
, struct prefix_ipv6
*p
,
2151 struct in6_addr
*gate
, unsigned int ifindex
, u_int32_t vrf_id
,
2152 u_int32_t metric
, u_char distance
)
2155 struct rib
*same
= NULL
;
2156 struct route_table
*table
;
2157 struct route_node
*rn
;
2158 struct nexthop
*nexthop
;
2161 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
2165 /* Make sure mask is applied. */
2166 apply_mask_ipv6 (p
);
2168 /* Set default distance by route type. */
2170 distance
= route_info
[type
].distance
;
2172 if (type
== ZEBRA_ROUTE_BGP
&& CHECK_FLAG (flags
, ZEBRA_FLAG_IBGP
))
2175 /* Filter bogus route. */
2176 if (rib_bogus_ipv6 (type
, p
, gate
, ifindex
, 0))
2179 /* Lookup route node.*/
2180 rn
= route_node_get (table
, (struct prefix
*) p
);
2182 /* If same type of route are installed, treat it as a implicit
2184 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2186 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
2189 if (rib
->type
!= type
)
2191 if (rib
->type
!= ZEBRA_ROUTE_CONNECT
)
2196 else if ((nexthop
= rib
->nexthop
) &&
2197 nexthop
->type
== NEXTHOP_TYPE_IFINDEX
&&
2198 nexthop
->ifindex
== ifindex
)
2205 /* Allocate new rib structure. */
2206 rib
= XCALLOC (MTYPE_RIB
, sizeof (struct rib
));
2209 rib
->distance
= distance
;
2211 rib
->metric
= metric
;
2212 rib
->table
= vrf_id
;
2213 rib
->nexthop_num
= 0;
2214 rib
->uptime
= time (NULL
);
2216 /* Nexthop settings. */
2220 nexthop_ipv6_ifindex_add (rib
, gate
, ifindex
);
2222 nexthop_ipv6_add (rib
, gate
);
2225 nexthop_ifindex_add (rib
, ifindex
);
2227 /* If this route is kernel route, set FIB flag to the route. */
2228 if (type
== ZEBRA_ROUTE_KERNEL
|| type
== ZEBRA_ROUTE_CONNECT
)
2229 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
2230 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
2232 /* Link new rib to node.*/
2233 rib_addnode (rn
, rib
);
2235 /* Free implicit route.*/
2237 rib_delnode (rn
, same
);
2239 route_unlock_node (rn
);
2243 /* XXX factor with rib_delete_ipv6 */
2245 rib_delete_ipv6 (int type
, int flags
, struct prefix_ipv6
*p
,
2246 struct in6_addr
*gate
, unsigned int ifindex
, u_int32_t vrf_id
)
2248 struct route_table
*table
;
2249 struct route_node
*rn
;
2251 struct rib
*fib
= NULL
;
2252 struct rib
*same
= NULL
;
2253 struct nexthop
*nexthop
;
2258 apply_mask_ipv6 (p
);
2261 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
2265 /* Lookup route node. */
2266 rn
= route_node_lookup (table
, (struct prefix
*) p
);
2269 if (IS_ZEBRA_DEBUG_KERNEL
)
2272 zlog_debug ("route %s/%d via %s ifindex %d doesn't exist in rib",
2273 inet_ntop (AF_INET6
, &p
->prefix
, buf1
, BUFSIZ
),
2275 inet_ntop (AF_INET6
, gate
, buf2
, BUFSIZ
),
2278 zlog_debug ("route %s/%d ifindex %d doesn't exist in rib",
2279 inet_ntop (AF_INET6
, &p
->prefix
, buf1
, BUFSIZ
),
2283 return ZEBRA_ERR_RTNOEXIST
;
2286 /* Lookup same type route. */
2287 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2289 if (CHECK_FLAG(rib
->status
, RIB_ENTRY_REMOVED
))
2292 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
2295 if (rib
->type
!= type
)
2297 if (rib
->type
== ZEBRA_ROUTE_CONNECT
&& (nexthop
= rib
->nexthop
) &&
2298 nexthop
->type
== NEXTHOP_TYPE_IFINDEX
&& nexthop
->ifindex
== ifindex
)
2303 route_unlock_node (rn
);
2304 route_unlock_node (rn
);
2310 /* Make sure that the route found has the same gateway. */
2311 else if (gate
== NULL
||
2312 ((nexthop
= rib
->nexthop
) &&
2313 (IPV6_ADDR_SAME (&nexthop
->gate
.ipv6
, gate
) ||
2314 IPV6_ADDR_SAME (&nexthop
->rgate
.ipv6
, gate
))))
2321 /* If same type of route can't be found and this message is from
2325 if (fib
&& type
== ZEBRA_ROUTE_KERNEL
)
2328 for (nexthop
= fib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
2329 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
2331 UNSET_FLAG (fib
->flags
, ZEBRA_FLAG_SELECTED
);
2335 if (IS_ZEBRA_DEBUG_KERNEL
)
2338 zlog_debug ("route %s/%d via %s ifindex %d type %d doesn't exist in rib",
2339 inet_ntop (AF_INET6
, &p
->prefix
, buf1
, BUFSIZ
),
2341 inet_ntop (AF_INET6
, gate
, buf2
, BUFSIZ
),
2345 zlog_debug ("route %s/%d ifindex %d type %d doesn't exist in rib",
2346 inet_ntop (AF_INET6
, &p
->prefix
, buf1
, BUFSIZ
),
2351 route_unlock_node (rn
);
2352 return ZEBRA_ERR_RTNOEXIST
;
2357 rib_delnode (rn
, same
);
2359 route_unlock_node (rn
);
2363 /* Install static route into rib. */
2365 static_install_ipv6 (struct prefix
*p
, struct static_ipv6
*si
)
2368 struct route_table
*table
;
2369 struct route_node
*rn
;
2372 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
2376 /* Lookup existing route */
2377 rn
= route_node_get (table
, p
);
2378 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2380 if (CHECK_FLAG(rib
->status
, RIB_ENTRY_REMOVED
))
2383 if (rib
->type
== ZEBRA_ROUTE_STATIC
&& rib
->distance
== si
->distance
)
2389 /* Same distance static route is there. Update it with new
2391 route_unlock_node (rn
);
2395 case STATIC_IPV6_GATEWAY
:
2396 nexthop_ipv6_add (rib
, &si
->ipv6
);
2398 case STATIC_IPV6_IFNAME
:
2399 nexthop_ifname_add (rib
, si
->ifname
);
2401 case STATIC_IPV6_GATEWAY_IFNAME
:
2402 nexthop_ipv6_ifname_add (rib
, &si
->ipv6
, si
->ifname
);
2405 rib_queue_add (&zebrad
, rn
);
2409 /* This is new static route. */
2410 rib
= XCALLOC (MTYPE_RIB
, sizeof (struct rib
));
2412 rib
->type
= ZEBRA_ROUTE_STATIC
;
2413 rib
->distance
= si
->distance
;
2415 rib
->nexthop_num
= 0;
2419 case STATIC_IPV6_GATEWAY
:
2420 nexthop_ipv6_add (rib
, &si
->ipv6
);
2422 case STATIC_IPV6_IFNAME
:
2423 nexthop_ifname_add (rib
, si
->ifname
);
2425 case STATIC_IPV6_GATEWAY_IFNAME
:
2426 nexthop_ipv6_ifname_add (rib
, &si
->ipv6
, si
->ifname
);
2430 /* Save the flags of this static routes (reject, blackhole) */
2431 rib
->flags
= si
->flags
;
2433 /* Link this rib to the tree. */
2434 rib_addnode (rn
, rib
);
2439 static_ipv6_nexthop_same (struct nexthop
*nexthop
, struct static_ipv6
*si
)
2441 if (nexthop
->type
== NEXTHOP_TYPE_IPV6
2442 && si
->type
== STATIC_IPV6_GATEWAY
2443 && IPV6_ADDR_SAME (&nexthop
->gate
.ipv6
, &si
->ipv6
))
2445 if (nexthop
->type
== NEXTHOP_TYPE_IFNAME
2446 && si
->type
== STATIC_IPV6_IFNAME
2447 && strcmp (nexthop
->ifname
, si
->ifname
) == 0)
2449 if (nexthop
->type
== NEXTHOP_TYPE_IPV6_IFNAME
2450 && si
->type
== STATIC_IPV6_GATEWAY_IFNAME
2451 && IPV6_ADDR_SAME (&nexthop
->gate
.ipv6
, &si
->ipv6
)
2452 && strcmp (nexthop
->ifname
, si
->ifname
) == 0)
2458 static_uninstall_ipv6 (struct prefix
*p
, struct static_ipv6
*si
)
2460 struct route_table
*table
;
2461 struct route_node
*rn
;
2463 struct nexthop
*nexthop
;
2466 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
2470 /* Lookup existing route with type and distance. */
2471 rn
= route_node_lookup (table
, (struct prefix
*) p
);
2475 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2477 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
2480 if (rib
->type
== ZEBRA_ROUTE_STATIC
&& rib
->distance
== si
->distance
)
2486 route_unlock_node (rn
);
2490 /* Lookup nexthop. */
2491 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
2492 if (static_ipv6_nexthop_same (nexthop
, si
))
2495 /* Can't find nexthop. */
2498 route_unlock_node (rn
);
2502 /* Check nexthop. */
2503 if (rib
->nexthop_num
== 1)
2505 rib_delnode (rn
, rib
);
2509 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
2510 rib_uninstall (rn
, rib
);
2511 nexthop_delete (rib
, nexthop
);
2512 nexthop_free (nexthop
);
2513 rib_queue_add (&zebrad
, rn
);
2516 route_unlock_node (rn
);
2519 /* Add static route into static route configuration. */
2521 static_add_ipv6 (struct prefix
*p
, u_char type
, struct in6_addr
*gate
,
2522 const char *ifname
, u_char flags
, u_char distance
,
2525 struct route_node
*rn
;
2526 struct static_ipv6
*si
;
2527 struct static_ipv6
*pp
;
2528 struct static_ipv6
*cp
;
2529 struct route_table
*stable
;
2532 stable
= vrf_static_table (AFI_IP6
, SAFI_UNICAST
, vrf_id
);
2537 (type
== STATIC_IPV6_GATEWAY
|| type
== STATIC_IPV6_GATEWAY_IFNAME
))
2541 (type
== STATIC_IPV6_GATEWAY_IFNAME
|| type
== STATIC_IPV6_IFNAME
))
2544 /* Lookup static route prefix. */
2545 rn
= route_node_get (stable
, p
);
2547 /* Do nothing if there is a same static route. */
2548 for (si
= rn
->info
; si
; si
= si
->next
)
2550 if (distance
== si
->distance
2552 && (! gate
|| IPV6_ADDR_SAME (gate
, &si
->ipv6
))
2553 && (! ifname
|| strcmp (ifname
, si
->ifname
) == 0))
2555 route_unlock_node (rn
);
2560 /* Make new static route structure. */
2561 si
= XMALLOC (MTYPE_STATIC_IPV6
, sizeof (struct static_ipv6
));
2562 memset (si
, 0, sizeof (struct static_ipv6
));
2565 si
->distance
= distance
;
2570 case STATIC_IPV6_GATEWAY
:
2573 case STATIC_IPV6_IFNAME
:
2574 si
->ifname
= XSTRDUP (0, ifname
);
2576 case STATIC_IPV6_GATEWAY_IFNAME
:
2578 si
->ifname
= XSTRDUP (0, ifname
);
2582 /* Add new static route information to the tree with sort by
2583 distance value and gateway address. */
2584 for (pp
= NULL
, cp
= rn
->info
; cp
; pp
= cp
, cp
= cp
->next
)
2586 if (si
->distance
< cp
->distance
)
2588 if (si
->distance
> cp
->distance
)
2592 /* Make linked list. */
2602 /* Install into rib. */
2603 static_install_ipv6 (p
, si
);
2608 /* Delete static route from static route configuration. */
2610 static_delete_ipv6 (struct prefix
*p
, u_char type
, struct in6_addr
*gate
,
2611 const char *ifname
, u_char distance
, u_int32_t vrf_id
)
2613 struct route_node
*rn
;
2614 struct static_ipv6
*si
;
2615 struct route_table
*stable
;
2618 stable
= vrf_static_table (AFI_IP6
, SAFI_UNICAST
, vrf_id
);
2622 /* Lookup static route prefix. */
2623 rn
= route_node_lookup (stable
, p
);
2627 /* Find same static route is the tree */
2628 for (si
= rn
->info
; si
; si
= si
->next
)
2629 if (distance
== si
->distance
2631 && (! gate
|| IPV6_ADDR_SAME (gate
, &si
->ipv6
))
2632 && (! ifname
|| strcmp (ifname
, si
->ifname
) == 0))
2635 /* Can't find static route. */
2638 route_unlock_node (rn
);
2642 /* Install into rib. */
2643 static_uninstall_ipv6 (p
, si
);
2645 /* Unlink static route from linked list. */
2647 si
->prev
->next
= si
->next
;
2649 rn
->info
= si
->next
;
2651 si
->next
->prev
= si
->prev
;
2653 /* Free static route configuration. */
2655 XFREE (0, si
->ifname
);
2656 XFREE (MTYPE_STATIC_IPV6
, si
);
2660 #endif /* HAVE_IPV6 */
2662 /* RIB update function. */
2666 struct route_node
*rn
;
2667 struct route_table
*table
;
2669 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
2671 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
2673 rib_queue_add (&zebrad
, rn
);
2675 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
2677 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
2679 rib_queue_add (&zebrad
, rn
);
2682 /* Interface goes up. */
2684 rib_if_up (struct interface
*ifp
)
2689 /* Interface goes down. */
2691 rib_if_down (struct interface
*ifp
)
2696 /* Remove all routes which comes from non main table. */
2698 rib_weed_table (struct route_table
*table
)
2700 struct route_node
*rn
;
2705 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
2706 for (rib
= rn
->info
; rib
; rib
= next
)
2710 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
2713 if (rib
->table
!= zebrad
.rtm_table_default
&&
2714 rib
->table
!= RT_TABLE_MAIN
)
2715 rib_delnode (rn
, rib
);
2719 /* Delete all routes from non main table. */
2721 rib_weed_tables (void)
2723 rib_weed_table (vrf_table (AFI_IP
, SAFI_UNICAST
, 0));
2724 rib_weed_table (vrf_table (AFI_IP6
, SAFI_UNICAST
, 0));
2727 /* Delete self installed routes after zebra is relaunched. */
2729 rib_sweep_table (struct route_table
*table
)
2731 struct route_node
*rn
;
2737 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
2738 for (rib
= rn
->info
; rib
; rib
= next
)
2742 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
2745 if (rib
->type
== ZEBRA_ROUTE_KERNEL
&&
2746 CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELFROUTE
))
2748 ret
= rib_uninstall_kernel (rn
, rib
);
2750 rib_delnode (rn
, rib
);
2755 /* Sweep all RIB tables. */
2757 rib_sweep_route (void)
2759 rib_sweep_table (vrf_table (AFI_IP
, SAFI_UNICAST
, 0));
2760 rib_sweep_table (vrf_table (AFI_IP6
, SAFI_UNICAST
, 0));
2763 /* Close RIB and clean up kernel routes. */
2765 rib_close_table (struct route_table
*table
)
2767 struct route_node
*rn
;
2771 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
2772 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2774 if (! RIB_SYSTEM_ROUTE (rib
)
2775 && CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
2776 rib_uninstall_kernel (rn
, rib
);
2780 /* Close all RIB tables. */
2784 rib_close_table (vrf_table (AFI_IP
, SAFI_UNICAST
, 0));
2785 rib_close_table (vrf_table (AFI_IP6
, SAFI_UNICAST
, 0));
2788 /* Routing information base initialize. */
2792 rib_queue_init (&zebrad
);
2793 /* VRF initialization. */