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. */
73 static vector vrf_vector
;
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
= XCALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
213 nexthop
->type
= NEXTHOP_TYPE_IFINDEX
;
214 nexthop
->ifindex
= ifindex
;
216 nexthop_add (rib
, nexthop
);
222 nexthop_ifname_add (struct rib
*rib
, char *ifname
)
224 struct nexthop
*nexthop
;
226 nexthop
= XCALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
227 nexthop
->type
= NEXTHOP_TYPE_IFNAME
;
228 nexthop
->ifname
= XSTRDUP (0, ifname
);
230 nexthop_add (rib
, nexthop
);
236 nexthop_ipv4_add (struct rib
*rib
, struct in_addr
*ipv4
, struct in_addr
*src
)
238 struct nexthop
*nexthop
;
240 nexthop
= XCALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
241 nexthop
->type
= NEXTHOP_TYPE_IPV4
;
242 nexthop
->gate
.ipv4
= *ipv4
;
244 nexthop
->src
.ipv4
= *src
;
246 nexthop_add (rib
, nexthop
);
251 static struct nexthop
*
252 nexthop_ipv4_ifindex_add (struct rib
*rib
, struct in_addr
*ipv4
,
253 struct in_addr
*src
, unsigned int ifindex
)
255 struct nexthop
*nexthop
;
257 nexthop
= XCALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
258 nexthop
->type
= NEXTHOP_TYPE_IPV4_IFINDEX
;
259 nexthop
->gate
.ipv4
= *ipv4
;
261 nexthop
->src
.ipv4
= *src
;
262 nexthop
->ifindex
= ifindex
;
264 nexthop_add (rib
, nexthop
);
271 nexthop_ipv6_add (struct rib
*rib
, struct in6_addr
*ipv6
)
273 struct nexthop
*nexthop
;
275 nexthop
= XCALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
276 nexthop
->type
= NEXTHOP_TYPE_IPV6
;
277 nexthop
->gate
.ipv6
= *ipv6
;
279 nexthop_add (rib
, nexthop
);
284 static struct nexthop
*
285 nexthop_ipv6_ifname_add (struct rib
*rib
, struct in6_addr
*ipv6
,
288 struct nexthop
*nexthop
;
290 nexthop
= XCALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
291 nexthop
->type
= NEXTHOP_TYPE_IPV6_IFNAME
;
292 nexthop
->gate
.ipv6
= *ipv6
;
293 nexthop
->ifname
= XSTRDUP (0, ifname
);
295 nexthop_add (rib
, nexthop
);
300 static struct nexthop
*
301 nexthop_ipv6_ifindex_add (struct rib
*rib
, struct in6_addr
*ipv6
,
302 unsigned int ifindex
)
304 struct nexthop
*nexthop
;
306 nexthop
= XCALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
307 nexthop
->type
= NEXTHOP_TYPE_IPV6_IFINDEX
;
308 nexthop
->gate
.ipv6
= *ipv6
;
309 nexthop
->ifindex
= ifindex
;
311 nexthop_add (rib
, nexthop
);
315 #endif /* HAVE_IPV6 */
318 nexthop_blackhole_add (struct rib
*rib
)
320 struct nexthop
*nexthop
;
322 nexthop
= XCALLOC (MTYPE_NEXTHOP
, sizeof (struct nexthop
));
323 nexthop
->type
= NEXTHOP_TYPE_BLACKHOLE
;
324 SET_FLAG (rib
->flags
, ZEBRA_FLAG_BLACKHOLE
);
326 nexthop_add (rib
, nexthop
);
331 /* If force flag is not set, do not modify falgs at all for uninstall
332 the route from FIB. */
334 nexthop_active_ipv4 (struct rib
*rib
, struct nexthop
*nexthop
, int set
,
335 struct route_node
*top
)
337 struct prefix_ipv4 p
;
338 struct route_table
*table
;
339 struct route_node
*rn
;
341 struct nexthop
*newhop
;
343 if (nexthop
->type
== NEXTHOP_TYPE_IPV4
)
344 nexthop
->ifindex
= 0;
347 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
);
349 /* Make lookup prefix. */
350 memset (&p
, 0, sizeof (struct prefix_ipv4
));
352 p
.prefixlen
= IPV4_MAX_PREFIXLEN
;
353 p
.prefix
= nexthop
->gate
.ipv4
;
356 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
360 rn
= route_node_match (table
, (struct prefix
*) &p
);
363 route_unlock_node (rn
);
365 /* If lookup self prefix return immidiately. */
369 /* Pick up selected route. */
370 for (match
= rn
->info
; match
; match
= match
->next
)
372 if (CHECK_FLAG (match
->status
, RIB_ENTRY_REMOVED
))
374 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
378 /* If there is no selected route or matched route is EGP, go up
381 || match
->type
== ZEBRA_ROUTE_BGP
)
385 } while (rn
&& rn
->info
== NULL
);
387 route_lock_node (rn
);
391 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
393 /* Directly point connected route. */
394 newhop
= match
->nexthop
;
395 if (newhop
&& nexthop
->type
== NEXTHOP_TYPE_IPV4
)
396 nexthop
->ifindex
= newhop
->ifindex
;
400 else if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_INTERNAL
))
402 for (newhop
= match
->nexthop
; newhop
; newhop
= newhop
->next
)
403 if (CHECK_FLAG (newhop
->flags
, NEXTHOP_FLAG_FIB
)
404 && ! CHECK_FLAG (newhop
->flags
, NEXTHOP_FLAG_RECURSIVE
))
408 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
);
409 nexthop
->rtype
= newhop
->type
;
410 if (newhop
->type
== NEXTHOP_TYPE_IPV4
||
411 newhop
->type
== NEXTHOP_TYPE_IPV4_IFINDEX
)
412 nexthop
->rgate
.ipv4
= newhop
->gate
.ipv4
;
413 if (newhop
->type
== NEXTHOP_TYPE_IFINDEX
414 || newhop
->type
== NEXTHOP_TYPE_IFNAME
415 || newhop
->type
== NEXTHOP_TYPE_IPV4_IFINDEX
)
416 nexthop
->rifindex
= newhop
->ifindex
;
432 /* If force flag is not set, do not modify falgs at all for uninstall
433 the route from FIB. */
435 nexthop_active_ipv6 (struct rib
*rib
, struct nexthop
*nexthop
, int set
,
436 struct route_node
*top
)
438 struct prefix_ipv6 p
;
439 struct route_table
*table
;
440 struct route_node
*rn
;
442 struct nexthop
*newhop
;
444 if (nexthop
->type
== NEXTHOP_TYPE_IPV6
)
445 nexthop
->ifindex
= 0;
448 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
);
450 /* Make lookup prefix. */
451 memset (&p
, 0, sizeof (struct prefix_ipv6
));
453 p
.prefixlen
= IPV6_MAX_PREFIXLEN
;
454 p
.prefix
= nexthop
->gate
.ipv6
;
457 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
461 rn
= route_node_match (table
, (struct prefix
*) &p
);
464 route_unlock_node (rn
);
466 /* If lookup self prefix return immidiately. */
470 /* Pick up selected route. */
471 for (match
= rn
->info
; match
; match
= match
->next
)
473 if (CHECK_FLAG (match
->status
, RIB_ENTRY_REMOVED
))
475 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
)
564 if (CHECK_FLAG (match
->status
, RIB_ENTRY_REMOVED
))
566 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
570 /* If there is no selected route or matched route is EGP, go up
573 || match
->type
== ZEBRA_ROUTE_BGP
)
577 } while (rn
&& rn
->info
== NULL
);
579 route_lock_node (rn
);
583 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
584 /* Directly point connected route. */
588 for (newhop
= match
->nexthop
; newhop
; newhop
= newhop
->next
)
589 if (CHECK_FLAG (newhop
->flags
, NEXTHOP_FLAG_FIB
))
599 rib_lookup_ipv4 (struct prefix_ipv4
*p
)
601 struct route_table
*table
;
602 struct route_node
*rn
;
604 struct nexthop
*nexthop
;
607 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
611 rn
= route_node_lookup (table
, (struct prefix
*) p
);
613 /* No route for this prefix. */
618 route_unlock_node (rn
);
620 for (match
= rn
->info
; match
; match
= match
->next
)
622 if (CHECK_FLAG (match
->status
, RIB_ENTRY_REMOVED
))
624 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
628 if (! match
|| match
->type
== ZEBRA_ROUTE_BGP
)
631 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
634 for (nexthop
= match
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
635 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
642 * This clone function, unlike its original rib_lookup_ipv4(), checks
643 * if specified IPv4 route record (prefix/mask -> gate) exists in
644 * the whole RIB and has ZEBRA_FLAG_SELECTED set.
648 * 0: exact match found
649 * 1: a match was found with a different gate
650 * 2: connected route found
651 * 3: no matches found
654 rib_lookup_ipv4_route (struct prefix_ipv4
*p
, union sockunion
* qgate
)
656 struct route_table
*table
;
657 struct route_node
*rn
;
659 struct nexthop
*nexthop
;
662 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
664 return ZEBRA_RIB_LOOKUP_ERROR
;
666 /* Scan the RIB table for exactly matching RIB entry. */
667 rn
= route_node_lookup (table
, (struct prefix
*) p
);
669 /* No route for this prefix. */
671 return ZEBRA_RIB_NOTFOUND
;
674 route_unlock_node (rn
);
676 /* Find out if a "selected" RR for the discovered RIB entry exists ever. */
677 for (match
= rn
->info
; match
; match
= match
->next
)
679 if (CHECK_FLAG (match
->status
, RIB_ENTRY_REMOVED
))
681 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
685 /* None such found :( */
687 return ZEBRA_RIB_NOTFOUND
;
689 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
690 return ZEBRA_RIB_FOUND_CONNECTED
;
692 /* Ok, we have a cood candidate, let's check it's nexthop list... */
693 for (nexthop
= match
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
694 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
696 /* We are happy with either direct or recursive hexthop */
697 if (nexthop
->gate
.ipv4
.s_addr
== qgate
->sin
.sin_addr
.s_addr
||
698 nexthop
->rgate
.ipv4
.s_addr
== qgate
->sin
.sin_addr
.s_addr
)
699 return ZEBRA_RIB_FOUND_EXACT
;
702 if (IS_ZEBRA_DEBUG_RIB
)
704 char gate_buf
[INET_ADDRSTRLEN
], rgate_buf
[INET_ADDRSTRLEN
], qgate_buf
[INET_ADDRSTRLEN
];
705 inet_ntop (AF_INET
, &nexthop
->gate
.ipv4
.s_addr
, gate_buf
, INET_ADDRSTRLEN
);
706 inet_ntop (AF_INET
, &nexthop
->rgate
.ipv4
.s_addr
, rgate_buf
, INET_ADDRSTRLEN
);
707 inet_ntop (AF_INET
, &qgate
->sin
.sin_addr
.s_addr
, qgate_buf
, INET_ADDRSTRLEN
);
708 zlog_debug ("%s: qgate == %s, gate == %s, rgate == %s", __func__
, qgate_buf
, gate_buf
, rgate_buf
);
710 return ZEBRA_RIB_FOUND_NOGATE
;
714 return ZEBRA_RIB_NOTFOUND
;
719 rib_match_ipv6 (struct in6_addr
*addr
)
721 struct prefix_ipv6 p
;
722 struct route_table
*table
;
723 struct route_node
*rn
;
725 struct nexthop
*newhop
;
728 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
732 memset (&p
, 0, sizeof (struct prefix_ipv6
));
734 p
.prefixlen
= IPV6_MAX_PREFIXLEN
;
735 IPV6_ADDR_COPY (&p
.prefix
, addr
);
737 rn
= route_node_match (table
, (struct prefix
*) &p
);
741 route_unlock_node (rn
);
743 /* Pick up selected route. */
744 for (match
= rn
->info
; match
; match
= match
->next
)
746 if (CHECK_FLAG (match
->status
, RIB_ENTRY_REMOVED
))
748 if (CHECK_FLAG (match
->flags
, ZEBRA_FLAG_SELECTED
))
752 /* If there is no selected route or matched route is EGP, go up
755 || match
->type
== ZEBRA_ROUTE_BGP
)
759 } while (rn
&& rn
->info
== NULL
);
761 route_lock_node (rn
);
765 if (match
->type
== ZEBRA_ROUTE_CONNECT
)
766 /* Directly point connected route. */
770 for (newhop
= match
->nexthop
; newhop
; newhop
= newhop
->next
)
771 if (CHECK_FLAG (newhop
->flags
, NEXTHOP_FLAG_FIB
))
779 #endif /* HAVE_IPV6 */
781 #define RIB_SYSTEM_ROUTE(R) \
782 ((R)->type == ZEBRA_ROUTE_KERNEL || (R)->type == ZEBRA_ROUTE_CONNECT)
784 /* This function verifies reachability of one given nexthop, which can be
785 * numbered or unnumbered, IPv4 or IPv6. The result is unconditionally stored
786 * in nexthop->flags field. If the 4th parameter, 'set', is non-zero,
787 * nexthop->ifindex will be updated appropriately as well.
788 * An existing route map can turn (otherwise active) nexthop into inactive, but
791 * The return value is the final value of 'ACTIVE' flag.
795 nexthop_active_check (struct route_node
*rn
, struct rib
*rib
,
796 struct nexthop
*nexthop
, int set
)
798 struct interface
*ifp
;
799 route_map_result_t ret
= RMAP_MATCH
;
800 extern char *proto_rm
[AFI_MAX
][ZEBRA_ROUTE_MAX
+1];
801 struct route_map
*rmap
;
805 switch (nexthop
->type
)
807 case NEXTHOP_TYPE_IFINDEX
:
808 ifp
= if_lookup_by_index (nexthop
->ifindex
);
809 if (ifp
&& if_is_operative(ifp
))
810 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
812 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
814 case NEXTHOP_TYPE_IPV6_IFNAME
:
816 case NEXTHOP_TYPE_IFNAME
:
817 ifp
= if_lookup_by_name (nexthop
->ifname
);
818 if (ifp
&& if_is_operative(ifp
))
821 nexthop
->ifindex
= ifp
->ifindex
;
822 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
827 nexthop
->ifindex
= 0;
828 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
831 case NEXTHOP_TYPE_IPV4
:
832 case NEXTHOP_TYPE_IPV4_IFINDEX
:
834 if (nexthop_active_ipv4 (rib
, nexthop
, set
, rn
))
835 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
837 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
840 case NEXTHOP_TYPE_IPV6
:
842 if (nexthop_active_ipv6 (rib
, nexthop
, set
, rn
))
843 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
845 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
847 case NEXTHOP_TYPE_IPV6_IFINDEX
:
849 if (IN6_IS_ADDR_LINKLOCAL (&nexthop
->gate
.ipv6
))
851 ifp
= if_lookup_by_index (nexthop
->ifindex
);
852 if (ifp
&& if_is_operative(ifp
))
853 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
855 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
859 if (nexthop_active_ipv6 (rib
, nexthop
, set
, rn
))
860 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
862 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
865 #endif /* HAVE_IPV6 */
866 case NEXTHOP_TYPE_BLACKHOLE
:
867 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
872 if (! CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
))
875 if (RIB_SYSTEM_ROUTE(rib
) ||
876 (family
== AFI_IP
&& rn
->p
.family
!= AF_INET
) ||
877 (family
== AFI_IP6
&& rn
->p
.family
!= AF_INET6
))
878 return CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
881 if (rib
->type
>= 0 && rib
->type
< ZEBRA_ROUTE_MAX
&&
882 proto_rm
[family
][rib
->type
])
883 rmap
= route_map_lookup_by_name (proto_rm
[family
][rib
->type
]);
884 if (!rmap
&& proto_rm
[family
][ZEBRA_ROUTE_MAX
])
885 rmap
= route_map_lookup_by_name (proto_rm
[family
][ZEBRA_ROUTE_MAX
]);
887 ret
= route_map_apply(rmap
, &rn
->p
, RMAP_ZEBRA
, nexthop
);
890 if (ret
== RMAP_DENYMATCH
)
891 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
892 return CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
895 /* Iterate over all nexthops of the given RIB entry and refresh their
896 * ACTIVE flag. rib->nexthop_active_num is updated accordingly. If any
897 * nexthop is found to toggle the ACTIVE flag, the whole rib structure
898 * is flagged with ZEBRA_FLAG_CHANGED. The 4th 'set' argument is
899 * transparently passed to nexthop_active_check().
901 * Return value is the new number of active nexthops.
905 nexthop_active_update (struct route_node
*rn
, struct rib
*rib
, int set
)
907 struct nexthop
*nexthop
;
908 int prev_active
, new_active
;
910 rib
->nexthop_active_num
= 0;
911 UNSET_FLAG (rib
->flags
, ZEBRA_FLAG_CHANGED
);
913 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
915 prev_active
= CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
);
916 if ((new_active
= nexthop_active_check (rn
, rib
, nexthop
, set
)))
917 rib
->nexthop_active_num
++;
918 if (prev_active
!= new_active
)
919 SET_FLAG (rib
->flags
, ZEBRA_FLAG_CHANGED
);
921 return rib
->nexthop_active_num
;
927 rib_install_kernel (struct route_node
*rn
, struct rib
*rib
)
930 struct nexthop
*nexthop
;
932 switch (PREFIX_FAMILY (&rn
->p
))
935 ret
= kernel_add_ipv4 (&rn
->p
, rib
);
939 ret
= kernel_add_ipv6 (&rn
->p
, rib
);
941 #endif /* HAVE_IPV6 */
944 /* This condition is never met, if we are using rt_socket.c */
947 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
948 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
952 /* Uninstall the route from kernel. */
954 rib_uninstall_kernel (struct route_node
*rn
, struct rib
*rib
)
957 struct nexthop
*nexthop
;
959 switch (PREFIX_FAMILY (&rn
->p
))
962 ret
= kernel_delete_ipv4 (&rn
->p
, rib
);
966 ret
= kernel_delete_ipv6 (&rn
->p
, rib
);
968 #endif /* HAVE_IPV6 */
971 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
972 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
977 /* Uninstall the route from kernel. */
979 rib_uninstall (struct route_node
*rn
, struct rib
*rib
)
981 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
983 redistribute_delete (&rn
->p
, rib
);
984 if (! RIB_SYSTEM_ROUTE (rib
))
985 rib_uninstall_kernel (rn
, rib
);
986 UNSET_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
);
990 static void rib_unlink (struct route_node
*, struct rib
*);
992 /* Core function for processing routing information base. */
994 rib_process (struct route_node
*rn
)
998 struct rib
*fib
= NULL
;
999 struct rib
*select
= NULL
;
1000 struct rib
*del
= NULL
;
1002 struct nexthop
*nexthop
= NULL
;
1003 char buf
[INET6_ADDRSTRLEN
];
1007 if (IS_ZEBRA_DEBUG_RIB
|| IS_ZEBRA_DEBUG_RIB_Q
)
1008 inet_ntop (rn
->p
.family
, &rn
->p
.u
.prefix
, buf
, INET6_ADDRSTRLEN
);
1010 for (rib
= rn
->info
; rib
; rib
= next
)
1012 /* The next pointer is saved, because current pointer
1013 * may be passed to rib_unlink() in the middle of iteration.
1017 /* Currently installed rib. */
1018 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
1020 assert (fib
== NULL
);
1024 /* Unlock removed routes, so they'll be freed, bar the FIB entry,
1025 * which we need to do do further work with below.
1027 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1031 if (IS_ZEBRA_DEBUG_RIB
)
1032 zlog_debug ("%s: %s/%d: rn %p, removing rib %p", __func__
,
1033 buf
, rn
->p
.prefixlen
, rn
, rib
);
1034 rib_unlink (rn
, rib
);
1042 /* Skip unreachable nexthop. */
1043 if (! nexthop_active_update (rn
, rib
, 0))
1046 /* Infinit distance. */
1047 if (rib
->distance
== DISTANCE_INFINITY
)
1050 /* Newly selected rib, the common case. */
1057 /* filter route selection in following order:
1058 * - connected beats other types
1059 * - lower distance beats higher
1060 * - lower metric beats higher for equal distance
1061 * - last, hence oldest, route wins tie break.
1064 /* Connected routes. Pick the last connected
1065 * route of the set of lowest metric connected routes.
1067 if (rib
->type
== ZEBRA_ROUTE_CONNECT
)
1069 if (select
->type
!= ZEBRA_ROUTE_CONNECT
1070 || rib
->metric
<= select
->metric
)
1074 else if (select
->type
== ZEBRA_ROUTE_CONNECT
)
1077 /* higher distance loses */
1078 if (rib
->distance
> select
->distance
)
1082 if (rib
->distance
< select
->distance
)
1088 /* metric tie-breaks equal distance */
1089 if (rib
->metric
<= select
->metric
)
1091 } /* for (rib = rn->info; rib; rib = next) */
1093 /* After the cycle is finished, the following pointers will be set:
1094 * select --- the winner RIB entry, if any was found, otherwise NULL
1095 * fib --- the SELECTED RIB entry, if any, otherwise NULL
1096 * del --- equal to fib, if fib is queued for deletion, NULL otherwise
1100 /* Same RIB entry is selected. Update FIB and finish. */
1101 if (select
&& select
== fib
)
1103 if (IS_ZEBRA_DEBUG_RIB
)
1104 zlog_debug ("%s: %s/%d: Updating existing route, select %p, fib %p",
1105 __func__
, buf
, rn
->p
.prefixlen
, select
, fib
);
1106 if (CHECK_FLAG (select
->flags
, ZEBRA_FLAG_CHANGED
))
1108 redistribute_delete (&rn
->p
, select
);
1109 if (! RIB_SYSTEM_ROUTE (select
))
1110 rib_uninstall_kernel (rn
, select
);
1112 /* Set real nexthop. */
1113 nexthop_active_update (rn
, select
, 1);
1115 if (! RIB_SYSTEM_ROUTE (select
))
1116 rib_install_kernel (rn
, select
);
1117 redistribute_add (&rn
->p
, select
);
1119 else if (! RIB_SYSTEM_ROUTE (select
))
1121 /* Housekeeping code to deal with
1122 race conditions in kernel with linux
1123 netlink reporting interface up before IPv4 or IPv6 protocol
1124 is ready to add routes.
1125 This makes sure the routes are IN the kernel.
1128 for (nexthop
= select
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1129 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
1135 rib_install_kernel (rn
, select
);
1140 /* At this point we either haven't found the best RIB entry or it is
1141 * different from what we currently intend to flag with SELECTED. In both
1142 * cases, if a RIB block is present in FIB, it should be withdrawn.
1146 if (IS_ZEBRA_DEBUG_RIB
)
1147 zlog_debug ("%s: %s/%d: Removing existing route, fib %p", __func__
,
1148 buf
, rn
->p
.prefixlen
, fib
);
1149 redistribute_delete (&rn
->p
, fib
);
1150 if (! RIB_SYSTEM_ROUTE (fib
))
1151 rib_uninstall_kernel (rn
, fib
);
1152 UNSET_FLAG (fib
->flags
, ZEBRA_FLAG_SELECTED
);
1154 /* Set real nexthop. */
1155 nexthop_active_update (rn
, fib
, 1);
1158 /* Regardless of some RIB entry being SELECTED or not before, now we can
1159 * tell, that if a new winner exists, FIB is still not updated with this
1160 * data, but ready to be.
1164 if (IS_ZEBRA_DEBUG_RIB
)
1165 zlog_debug ("%s: %s/%d: Adding route, select %p", __func__
, buf
,
1166 rn
->p
.prefixlen
, select
);
1167 /* Set real nexthop. */
1168 nexthop_active_update (rn
, select
, 1);
1170 if (! RIB_SYSTEM_ROUTE (select
))
1171 rib_install_kernel (rn
, select
);
1172 SET_FLAG (select
->flags
, ZEBRA_FLAG_SELECTED
);
1173 redistribute_add (&rn
->p
, select
);
1176 /* FIB route was removed, should be deleted */
1179 if (IS_ZEBRA_DEBUG_RIB
)
1180 zlog_debug ("%s: %s/%d: Deleting fib %p, rn %p", __func__
, buf
,
1181 rn
->p
.prefixlen
, del
, rn
);
1182 rib_unlink (rn
, del
);
1186 if (IS_ZEBRA_DEBUG_RIB_Q
)
1187 zlog_debug ("%s: %s/%d: rn %p dequeued", __func__
, buf
, rn
->p
.prefixlen
, rn
);
1190 /* Take a list of route_node structs and return 1, if there was a record
1191 * picked from it and processed by rib_process(). Don't process more,
1192 * than one RN record; operate only in the specified sub-queue.
1195 process_subq (struct list
* subq
, u_char qindex
)
1197 struct listnode
*lnode
= listhead (subq
);
1198 struct route_node
*rnode
;
1203 rnode
= listgetdata (lnode
);
1204 rib_process (rnode
);
1206 if (rnode
->info
) /* The first RIB record is holding the flags bitmask. */
1207 UNSET_FLAG (((struct rib
*)rnode
->info
)->rn_status
, RIB_ROUTE_QUEUED(qindex
));
1210 zlog_debug ("%s: called for route_node (%p, %d) with no ribs",
1211 __func__
, rnode
, rnode
->lock
);
1212 zlog_backtrace(LOG_DEBUG
);
1214 route_unlock_node (rnode
);
1215 list_delete_node (subq
, lnode
);
1219 /* Dispatch the meta queue by picking, processing and unlocking the next RN from
1220 * a non-empty sub-queue with lowest priority. wq is equal to zebra->ribq and data
1221 * is pointed to the meta queue structure.
1223 static wq_item_status
1224 meta_queue_process (struct work_queue
*dummy
, void *data
)
1226 struct meta_queue
* mq
= data
;
1229 for (i
= 0; i
< MQ_SIZE
; i
++)
1230 if (process_subq (mq
->subq
[i
], i
))
1235 return mq
->size
? WQ_REQUEUE
: WQ_SUCCESS
;
1238 /* Map from rib types to queue type (priority) in meta queue */
1239 static const u_char meta_queue_map
[ZEBRA_ROUTE_MAX
] = {
1240 [ZEBRA_ROUTE_SYSTEM
] = 4,
1241 [ZEBRA_ROUTE_KERNEL
] = 0,
1242 [ZEBRA_ROUTE_CONNECT
] = 0,
1243 [ZEBRA_ROUTE_STATIC
] = 1,
1244 [ZEBRA_ROUTE_RIP
] = 2,
1245 [ZEBRA_ROUTE_RIPNG
] = 2,
1246 [ZEBRA_ROUTE_OSPF
] = 2,
1247 [ZEBRA_ROUTE_OSPF6
] = 2,
1248 [ZEBRA_ROUTE_ISIS
] = 2,
1249 [ZEBRA_ROUTE_BGP
] = 3,
1250 [ZEBRA_ROUTE_HSLS
] = 4,
1253 /* Look into the RN and queue it into one or more priority queues,
1254 * increasing the size for each data push done.
1257 rib_meta_queue_add (struct meta_queue
*mq
, struct route_node
*rn
)
1260 char buf
[INET6_ADDRSTRLEN
];
1262 if (IS_ZEBRA_DEBUG_RIB_Q
)
1263 inet_ntop (rn
->p
.family
, &rn
->p
.u
.prefix
, buf
, INET6_ADDRSTRLEN
);
1265 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1267 u_char qindex
= meta_queue_map
[rib
->type
];
1269 /* Invariant: at this point we always have rn->info set. */
1270 if (CHECK_FLAG (((struct rib
*)rn
->info
)->rn_status
, RIB_ROUTE_QUEUED(qindex
)))
1272 if (IS_ZEBRA_DEBUG_RIB_Q
)
1273 zlog_debug ("%s: %s/%d: rn %p is already queued in sub-queue %u",
1274 __func__
, buf
, rn
->p
.prefixlen
, rn
, qindex
);
1278 SET_FLAG (((struct rib
*)rn
->info
)->rn_status
, RIB_ROUTE_QUEUED(qindex
));
1279 listnode_add (mq
->subq
[qindex
], rn
);
1280 route_lock_node (rn
);
1283 if (IS_ZEBRA_DEBUG_RIB_Q
)
1284 zlog_debug ("%s: %s/%d: queued rn %p into sub-queue %u",
1285 __func__
, buf
, rn
->p
.prefixlen
, rn
, qindex
);
1289 /* Add route_node to work queue and schedule processing */
1291 rib_queue_add (struct zebra_t
*zebra
, struct route_node
*rn
)
1293 char buf
[INET_ADDRSTRLEN
];
1294 assert (zebra
&& rn
);
1296 if (IS_ZEBRA_DEBUG_RIB_Q
)
1297 inet_ntop (AF_INET
, &rn
->p
.u
.prefix
, buf
, INET_ADDRSTRLEN
);
1299 /* Pointless to queue a route_node with no RIB entries to add or remove */
1302 zlog_debug ("%s: called for route_node (%p, %d) with no ribs",
1303 __func__
, rn
, rn
->lock
);
1304 zlog_backtrace(LOG_DEBUG
);
1308 if (IS_ZEBRA_DEBUG_RIB_Q
)
1309 zlog_info ("%s: %s/%d: work queue added", __func__
, buf
, rn
->p
.prefixlen
);
1313 if (zebra
->ribq
== NULL
)
1315 zlog_err ("%s: work_queue does not exist!", __func__
);
1319 /* The RIB queue should normally be either empty or holding the only work_queue_item
1320 * element. In the latter case this element would hold a pointer to the meta queue
1321 * structure, which must be used to actually queue the route nodes to process. So
1322 * create the MQ holder, if necessary, then push the work into it in any case.
1323 * This semantics was introduced after 0.99.9 release.
1326 /* Should I invent work_queue_empty() and use it, or it's Ok to do as follows? */
1327 if (!zebra
->ribq
->items
->count
)
1328 work_queue_add (zebra
->ribq
, zebra
->mq
);
1330 rib_meta_queue_add (zebra
->mq
, rn
);
1332 if (IS_ZEBRA_DEBUG_RIB_Q
)
1333 zlog_debug ("%s: %s/%d: rn %p queued", __func__
, buf
, rn
->p
.prefixlen
, rn
);
1338 /* Create new meta queue.
1339 A destructor function doesn't seem to be necessary here.
1341 static struct meta_queue
*
1342 meta_queue_new (void)
1344 struct meta_queue
*new;
1347 new = XCALLOC (MTYPE_WORK_QUEUE
, sizeof (struct meta_queue
));
1350 for (i
= 0; i
< MQ_SIZE
; i
++)
1352 new->subq
[i
] = list_new ();
1353 assert(new->subq
[i
]);
1359 /* initialise zebra rib work queue */
1361 rib_queue_init (struct zebra_t
*zebra
)
1365 if (! (zebra
->ribq
= work_queue_new (zebra
->master
,
1366 "route_node processing")))
1368 zlog_err ("%s: could not initialise work queue!", __func__
);
1372 /* fill in the work queue spec */
1373 zebra
->ribq
->spec
.workfunc
= &meta_queue_process
;
1374 zebra
->ribq
->spec
.errorfunc
= NULL
;
1375 /* XXX: TODO: These should be runtime configurable via vty */
1376 zebra
->ribq
->spec
.max_retries
= 3;
1377 zebra
->ribq
->spec
.hold
= rib_process_hold_time
;
1379 if (!(zebra
->mq
= meta_queue_new ()))
1381 zlog_err ("%s: could not initialise meta queue!", __func__
);
1387 /* RIB updates are processed via a queue of pointers to route_nodes.
1389 * The queue length is bounded by the maximal size of the routing table,
1390 * as a route_node will not be requeued, if already queued.
1392 * RIBs are submitted via rib_addnode or rib_delnode which set minimal
1393 * state, or static_install_ipv{4,6} (when an existing RIB is updated)
1394 * and then submit route_node to queue for best-path selection later.
1395 * Order of add/delete state changes are preserved for any given RIB.
1397 * Deleted RIBs are reaped during best-path selection.
1400 * |-> rib_link or unset RIB_ENTRY_REMOVE |->Update kernel with
1401 * |-------->| | best RIB, if required
1403 * static_install->|->rib_addqueue...... -> rib_process
1405 * |-------->| |-> rib_unlink
1406 * |-> set RIB_ENTRY_REMOVE |
1407 * rib_delnode (RIB freed)
1410 * Queueing state for a route_node is kept in the head RIB entry, this
1411 * state must be preserved as and when the head RIB entry of a
1412 * route_node is changed by rib_unlink / rib_link. A small complication,
1413 * but saves having to allocate a dedicated object for this.
1415 * Refcounting (aka "locking" throughout the GNU Zebra and Quagga code):
1417 * - route_nodes: refcounted by:
1418 * - RIBs attached to route_node:
1419 * - managed by: rib_link/unlink
1420 * - route_node processing queue
1421 * - managed by: rib_addqueue, rib_process.
1425 /* Add RIB to head of the route node. */
1427 rib_link (struct route_node
*rn
, struct rib
*rib
)
1430 char buf
[INET6_ADDRSTRLEN
];
1434 route_lock_node (rn
); /* rn route table reference */
1436 if (IS_ZEBRA_DEBUG_RIB
)
1438 inet_ntop (rn
->p
.family
, &rn
->p
.u
.prefix
, buf
, INET6_ADDRSTRLEN
);
1439 zlog_debug ("%s: %s/%d: rn %p, rib %p", __func__
,
1440 buf
, rn
->p
.prefixlen
, rn
, rib
);
1446 if (IS_ZEBRA_DEBUG_RIB
)
1447 zlog_debug ("%s: %s/%d: new head, rn_status copied over", __func__
,
1448 buf
, rn
->p
.prefixlen
);
1450 /* Transfer the rn status flags to the new head RIB */
1451 rib
->rn_status
= head
->rn_status
;
1455 rib_queue_add (&zebrad
, rn
);
1459 rib_addnode (struct route_node
*rn
, struct rib
*rib
)
1461 /* RIB node has been un-removed before route-node is processed.
1462 * route_node must hence already be on the queue for processing..
1464 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1466 if (IS_ZEBRA_DEBUG_RIB
)
1468 char buf
[INET6_ADDRSTRLEN
];
1469 inet_ntop (rn
->p
.family
, &rn
->p
.u
.prefix
, buf
, INET6_ADDRSTRLEN
);
1470 zlog_debug ("%s: %s/%d: rn %p, un-removed rib %p",
1471 __func__
, buf
, rn
->p
.prefixlen
, rn
, rib
);
1473 UNSET_FLAG (rib
->status
, RIB_ENTRY_REMOVED
);
1480 rib_unlink (struct route_node
*rn
, struct rib
*rib
)
1482 struct nexthop
*nexthop
, *next
;
1483 char buf
[INET6_ADDRSTRLEN
];
1487 if (IS_ZEBRA_DEBUG_RIB
)
1489 inet_ntop (rn
->p
.family
, &rn
->p
.u
.prefix
, buf
, INET6_ADDRSTRLEN
);
1490 zlog_debug ("%s: %s/%d: rn %p, rib %p",
1491 __func__
, buf
, rn
->p
.prefixlen
, rn
, rib
);
1495 rib
->next
->prev
= rib
->prev
;
1498 rib
->prev
->next
= rib
->next
;
1501 rn
->info
= rib
->next
;
1505 if (IS_ZEBRA_DEBUG_RIB
)
1506 zlog_debug ("%s: %s/%d: rn %p, rib %p, new head copy",
1507 __func__
, buf
, rn
->p
.prefixlen
, rn
, rib
);
1508 rib
->next
->rn_status
= rib
->rn_status
;
1512 /* free RIB and nexthops */
1513 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= next
)
1515 next
= nexthop
->next
;
1516 nexthop_free (nexthop
);
1518 XFREE (MTYPE_RIB
, rib
);
1520 route_unlock_node (rn
); /* rn route table reference */
1524 rib_delnode (struct route_node
*rn
, struct rib
*rib
)
1526 if (IS_ZEBRA_DEBUG_RIB
)
1528 char buf
[INET6_ADDRSTRLEN
];
1529 inet_ntop (rn
->p
.family
, &rn
->p
.u
.prefix
, buf
, INET6_ADDRSTRLEN
);
1530 zlog_debug ("%s: %s/%d: rn %p, rib %p, removing", __func__
,
1531 buf
, rn
->p
.prefixlen
, rn
, rib
);
1533 SET_FLAG (rib
->status
, RIB_ENTRY_REMOVED
);
1534 rib_queue_add (&zebrad
, rn
);
1538 rib_add_ipv4 (int type
, int flags
, struct prefix_ipv4
*p
,
1539 struct in_addr
*gate
, struct in_addr
*src
,
1540 unsigned int ifindex
, u_int32_t vrf_id
,
1541 u_int32_t metric
, u_char distance
)
1544 struct rib
*same
= NULL
;
1545 struct route_table
*table
;
1546 struct route_node
*rn
;
1547 struct nexthop
*nexthop
;
1550 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1554 /* Make it sure prefixlen is applied to the prefix. */
1555 apply_mask_ipv4 (p
);
1557 /* Set default distance by route type. */
1560 distance
= route_info
[type
].distance
;
1562 /* iBGP distance is 200. */
1563 if (type
== ZEBRA_ROUTE_BGP
&& CHECK_FLAG (flags
, ZEBRA_FLAG_IBGP
))
1567 /* Lookup route node.*/
1568 rn
= route_node_get (table
, (struct prefix
*) p
);
1570 /* If same type of route are installed, treat it as a implicit
1572 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1574 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1577 if (rib
->type
!= type
)
1579 if (rib
->type
!= ZEBRA_ROUTE_CONNECT
)
1584 /* Duplicate connected route comes in. */
1585 else if ((nexthop
= rib
->nexthop
) &&
1586 nexthop
->type
== NEXTHOP_TYPE_IFINDEX
&&
1587 nexthop
->ifindex
== ifindex
&&
1588 !CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1595 /* Allocate new rib structure. */
1596 rib
= XCALLOC (MTYPE_RIB
, sizeof (struct rib
));
1598 rib
->distance
= distance
;
1600 rib
->metric
= metric
;
1601 rib
->table
= vrf_id
;
1602 rib
->nexthop_num
= 0;
1603 rib
->uptime
= time (NULL
);
1605 /* Nexthop settings. */
1609 nexthop_ipv4_ifindex_add (rib
, gate
, src
, ifindex
);
1611 nexthop_ipv4_add (rib
, gate
, src
);
1614 nexthop_ifindex_add (rib
, ifindex
);
1616 /* If this route is kernel route, set FIB flag to the route. */
1617 if (type
== ZEBRA_ROUTE_KERNEL
|| type
== ZEBRA_ROUTE_CONNECT
)
1618 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1619 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
1621 /* Link new rib to node.*/
1622 if (IS_ZEBRA_DEBUG_RIB
)
1623 zlog_debug ("%s: calling rib_addnode (%p, %p)", __func__
, rn
, rib
);
1624 rib_addnode (rn
, rib
);
1626 /* Free implicit route.*/
1629 if (IS_ZEBRA_DEBUG_RIB
)
1630 zlog_debug ("%s: calling rib_delnode (%p, %p)", __func__
, rn
, rib
);
1631 rib_delnode (rn
, same
);
1634 route_unlock_node (rn
);
1638 /* This function dumps the contents of a given RIB entry into
1639 * standard debug log. Calling function name and IP prefix in
1640 * question are passed as 1st and 2nd arguments.
1643 void rib_dump (const char * func
, const struct prefix_ipv4
* p
, const struct rib
* rib
)
1645 char straddr1
[INET_ADDRSTRLEN
], straddr2
[INET_ADDRSTRLEN
];
1646 struct nexthop
*nexthop
;
1648 inet_ntop (AF_INET
, &p
->prefix
, straddr1
, INET_ADDRSTRLEN
);
1649 zlog_debug ("%s: dumping RIB entry %p for %s/%d", func
, rib
, straddr1
, p
->prefixlen
);
1652 "%s: refcnt == %lu, uptime == %u, type == %u, table == %d",
1661 "%s: metric == %u, distance == %u, flags == %u, status == %u",
1670 "%s: nexthop_num == %u, nexthop_active_num == %u, nexthop_fib_num == %u",
1673 rib
->nexthop_active_num
,
1674 rib
->nexthop_fib_num
1676 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1678 inet_ntop (AF_INET
, &nexthop
->gate
.ipv4
.s_addr
, straddr1
, INET_ADDRSTRLEN
);
1679 inet_ntop (AF_INET
, &nexthop
->rgate
.ipv4
.s_addr
, straddr2
, INET_ADDRSTRLEN
);
1682 "%s: NH %s (%s) with flags %s%s%s",
1686 (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
) ? "ACTIVE " : ""),
1687 (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
) ? "FIB " : ""),
1688 (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
) ? "RECURSIVE" : "")
1691 zlog_debug ("%s: dump complete", func
);
1694 /* This is an exported helper to rtm_read() to dump the strange
1695 * RIB entry found by rib_lookup_ipv4_route()
1698 void rib_lookup_and_dump (struct prefix_ipv4
* p
)
1700 struct route_table
*table
;
1701 struct route_node
*rn
;
1703 char prefix_buf
[INET_ADDRSTRLEN
];
1706 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1709 zlog_err ("%s: vrf_table() returned NULL", __func__
);
1713 inet_ntop (AF_INET
, &p
->prefix
.s_addr
, prefix_buf
, INET_ADDRSTRLEN
);
1714 /* Scan the RIB table for exactly matching RIB entry. */
1715 rn
= route_node_lookup (table
, (struct prefix
*) p
);
1717 /* No route for this prefix. */
1720 zlog_debug ("%s: lookup failed for %s/%d", __func__
, prefix_buf
, p
->prefixlen
);
1725 route_unlock_node (rn
);
1728 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1732 "%s: rn %p, rib %p: %s, %s",
1736 (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
) ? "removed" : "NOT removed"),
1737 (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
) ? "selected" : "NOT selected")
1739 rib_dump (__func__
, p
, rib
);
1743 /* Check if requested address assignment will fail due to another
1744 * route being installed by zebra in FIB already. Take necessary
1745 * actions, if needed: remove such a route from FIB and deSELECT
1746 * corresponding RIB entry. Then put affected RN into RIBQ head.
1748 void rib_lookup_and_pushup (struct prefix_ipv4
* p
)
1750 struct route_table
*table
;
1751 struct route_node
*rn
;
1753 unsigned changed
= 0;
1755 if (NULL
== (table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0)))
1757 zlog_err ("%s: vrf_table() returned NULL", __func__
);
1761 /* No matches would be the simplest case. */
1762 if (NULL
== (rn
= route_node_lookup (table
, (struct prefix
*) p
)))
1766 route_unlock_node (rn
);
1768 /* Check all RIB entries. In case any changes have to be done, requeue
1769 * the RN into RIBQ head. If the routing message about the new connected
1770 * route (generated by the IP address we are going to assign very soon)
1771 * comes before the RIBQ is processed, the new RIB entry will join
1772 * RIBQ record already on head. This is necessary for proper revalidation
1773 * of the rest of the RIB.
1775 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1777 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
) &&
1778 ! RIB_SYSTEM_ROUTE (rib
))
1781 if (IS_ZEBRA_DEBUG_RIB
)
1783 char buf
[INET_ADDRSTRLEN
];
1784 inet_ntop (rn
->p
.family
, &p
->prefix
, buf
, INET_ADDRSTRLEN
);
1785 zlog_debug ("%s: freeing way for connected prefix %s/%d", __func__
, buf
, p
->prefixlen
);
1786 rib_dump (__func__
, (struct prefix_ipv4
*)&rn
->p
, rib
);
1788 rib_uninstall (rn
, rib
);
1792 rib_queue_add (&zebrad
, rn
);
1796 rib_add_ipv4_multipath (struct prefix_ipv4
*p
, struct rib
*rib
)
1798 struct route_table
*table
;
1799 struct route_node
*rn
;
1801 struct nexthop
*nexthop
;
1804 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1807 /* Make it sure prefixlen is applied to the prefix. */
1808 apply_mask_ipv4 (p
);
1810 /* Set default distance by route type. */
1811 if (rib
->distance
== 0)
1813 rib
->distance
= route_info
[rib
->type
].distance
;
1815 /* iBGP distance is 200. */
1816 if (rib
->type
== ZEBRA_ROUTE_BGP
1817 && CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_IBGP
))
1818 rib
->distance
= 200;
1821 /* Lookup route node.*/
1822 rn
= route_node_get (table
, (struct prefix
*) p
);
1824 /* If same type of route are installed, treat it as a implicit
1826 for (same
= rn
->info
; same
; same
= same
->next
)
1828 if (CHECK_FLAG (same
->status
, RIB_ENTRY_REMOVED
))
1831 if (same
->type
== rib
->type
&& same
->table
== rib
->table
1832 && same
->type
!= ZEBRA_ROUTE_CONNECT
)
1836 /* If this route is kernel route, set FIB flag to the route. */
1837 if (rib
->type
== ZEBRA_ROUTE_KERNEL
|| rib
->type
== ZEBRA_ROUTE_CONNECT
)
1838 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1839 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
1841 /* Link new rib to node.*/
1842 rib_addnode (rn
, rib
);
1843 if (IS_ZEBRA_DEBUG_RIB
)
1845 zlog_debug ("%s: called rib_addnode (%p, %p) on new RIB entry",
1847 rib_dump (__func__
, p
, rib
);
1850 /* Free implicit route.*/
1853 if (IS_ZEBRA_DEBUG_RIB
)
1855 zlog_debug ("%s: calling rib_delnode (%p, %p) on existing RIB entry",
1856 __func__
, rn
, same
);
1857 rib_dump (__func__
, p
, same
);
1859 rib_delnode (rn
, same
);
1862 route_unlock_node (rn
);
1866 /* XXX factor with rib_delete_ipv6 */
1868 rib_delete_ipv4 (int type
, int flags
, struct prefix_ipv4
*p
,
1869 struct in_addr
*gate
, unsigned int ifindex
, u_int32_t vrf_id
)
1871 struct route_table
*table
;
1872 struct route_node
*rn
;
1874 struct rib
*fib
= NULL
;
1875 struct rib
*same
= NULL
;
1876 struct nexthop
*nexthop
;
1877 char buf1
[INET_ADDRSTRLEN
];
1878 char buf2
[INET_ADDRSTRLEN
];
1881 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1886 apply_mask_ipv4 (p
);
1888 if (IS_ZEBRA_DEBUG_KERNEL
&& gate
)
1889 zlog_debug ("rib_delete_ipv4(): route delete %s/%d via %s ifindex %d",
1890 inet_ntop (AF_INET
, &p
->prefix
, buf1
, INET_ADDRSTRLEN
),
1895 /* Lookup route node. */
1896 rn
= route_node_lookup (table
, (struct prefix
*) p
);
1899 if (IS_ZEBRA_DEBUG_KERNEL
)
1902 zlog_debug ("route %s/%d via %s ifindex %d doesn't exist in rib",
1903 inet_ntop (AF_INET
, &p
->prefix
, buf1
, INET_ADDRSTRLEN
),
1905 inet_ntop (AF_INET
, gate
, buf2
, INET_ADDRSTRLEN
),
1908 zlog_debug ("route %s/%d ifindex %d doesn't exist in rib",
1909 inet_ntop (AF_INET
, &p
->prefix
, buf1
, INET_ADDRSTRLEN
),
1913 return ZEBRA_ERR_RTNOEXIST
;
1916 /* Lookup same type route. */
1917 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1919 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
1922 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
1925 if (rib
->type
!= type
)
1927 if (rib
->type
== ZEBRA_ROUTE_CONNECT
&& (nexthop
= rib
->nexthop
) &&
1928 nexthop
->type
== NEXTHOP_TYPE_IFINDEX
&& nexthop
->ifindex
== ifindex
)
1933 route_unlock_node (rn
);
1934 route_unlock_node (rn
);
1940 /* Make sure that the route found has the same gateway. */
1941 else if (gate
== NULL
||
1942 ((nexthop
= rib
->nexthop
) &&
1943 (IPV4_ADDR_SAME (&nexthop
->gate
.ipv4
, gate
) ||
1944 IPV4_ADDR_SAME (&nexthop
->rgate
.ipv4
, gate
))))
1951 /* If same type of route can't be found and this message is from
1955 if (fib
&& type
== ZEBRA_ROUTE_KERNEL
)
1958 for (nexthop
= fib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1959 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
1961 UNSET_FLAG (fib
->flags
, ZEBRA_FLAG_SELECTED
);
1965 if (IS_ZEBRA_DEBUG_KERNEL
)
1968 zlog_debug ("route %s/%d via %s ifindex %d type %d doesn't exist in rib",
1969 inet_ntop (AF_INET
, &p
->prefix
, buf1
, INET_ADDRSTRLEN
),
1971 inet_ntop (AF_INET
, gate
, buf2
, INET_ADDRSTRLEN
),
1975 zlog_debug ("route %s/%d ifindex %d type %d doesn't exist in rib",
1976 inet_ntop (AF_INET
, &p
->prefix
, buf1
, INET_ADDRSTRLEN
),
1981 route_unlock_node (rn
);
1982 return ZEBRA_ERR_RTNOEXIST
;
1987 rib_delnode (rn
, same
);
1989 route_unlock_node (rn
);
1993 /* Install static route into rib. */
1995 static_install_ipv4 (struct prefix
*p
, struct static_ipv4
*si
)
1998 struct route_node
*rn
;
1999 struct route_table
*table
;
2002 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
2006 /* Lookup existing route */
2007 rn
= route_node_get (table
, p
);
2008 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2010 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
2013 if (rib
->type
== ZEBRA_ROUTE_STATIC
&& rib
->distance
== si
->distance
)
2019 /* Same distance static route is there. Update it with new
2021 route_unlock_node (rn
);
2024 case STATIC_IPV4_GATEWAY
:
2025 nexthop_ipv4_add (rib
, &si
->gate
.ipv4
, NULL
);
2027 case STATIC_IPV4_IFNAME
:
2028 nexthop_ifname_add (rib
, si
->gate
.ifname
);
2030 case STATIC_IPV4_BLACKHOLE
:
2031 nexthop_blackhole_add (rib
);
2034 rib_queue_add (&zebrad
, rn
);
2038 /* This is new static route. */
2039 rib
= XCALLOC (MTYPE_RIB
, sizeof (struct rib
));
2041 rib
->type
= ZEBRA_ROUTE_STATIC
;
2042 rib
->distance
= si
->distance
;
2044 rib
->nexthop_num
= 0;
2048 case STATIC_IPV4_GATEWAY
:
2049 nexthop_ipv4_add (rib
, &si
->gate
.ipv4
, NULL
);
2051 case STATIC_IPV4_IFNAME
:
2052 nexthop_ifname_add (rib
, si
->gate
.ifname
);
2054 case STATIC_IPV4_BLACKHOLE
:
2055 nexthop_blackhole_add (rib
);
2059 /* Save the flags of this static routes (reject, blackhole) */
2060 rib
->flags
= si
->flags
;
2062 /* Link this rib to the tree. */
2063 rib_addnode (rn
, rib
);
2068 static_ipv4_nexthop_same (struct nexthop
*nexthop
, struct static_ipv4
*si
)
2070 if (nexthop
->type
== NEXTHOP_TYPE_IPV4
2071 && si
->type
== STATIC_IPV4_GATEWAY
2072 && IPV4_ADDR_SAME (&nexthop
->gate
.ipv4
, &si
->gate
.ipv4
))
2074 if (nexthop
->type
== NEXTHOP_TYPE_IFNAME
2075 && si
->type
== STATIC_IPV4_IFNAME
2076 && strcmp (nexthop
->ifname
, si
->gate
.ifname
) == 0)
2078 if (nexthop
->type
== NEXTHOP_TYPE_BLACKHOLE
2079 && si
->type
== STATIC_IPV4_BLACKHOLE
)
2084 /* Uninstall static route from RIB. */
2086 static_uninstall_ipv4 (struct prefix
*p
, struct static_ipv4
*si
)
2088 struct route_node
*rn
;
2090 struct nexthop
*nexthop
;
2091 struct route_table
*table
;
2094 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
2098 /* Lookup existing route with type and distance. */
2099 rn
= route_node_lookup (table
, p
);
2103 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2105 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
2108 if (rib
->type
== ZEBRA_ROUTE_STATIC
&& rib
->distance
== si
->distance
)
2114 route_unlock_node (rn
);
2118 /* Lookup nexthop. */
2119 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
2120 if (static_ipv4_nexthop_same (nexthop
, si
))
2123 /* Can't find nexthop. */
2126 route_unlock_node (rn
);
2130 /* Check nexthop. */
2131 if (rib
->nexthop_num
== 1)
2132 rib_delnode (rn
, rib
);
2135 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
2136 rib_uninstall (rn
, rib
);
2137 nexthop_delete (rib
, nexthop
);
2138 nexthop_free (nexthop
);
2139 rib_queue_add (&zebrad
, rn
);
2142 route_unlock_node (rn
);
2145 /* Add static route into static route configuration. */
2147 static_add_ipv4 (struct prefix
*p
, struct in_addr
*gate
, const char *ifname
,
2148 u_char flags
, u_char distance
, u_int32_t vrf_id
)
2151 struct route_node
*rn
;
2152 struct static_ipv4
*si
;
2153 struct static_ipv4
*pp
;
2154 struct static_ipv4
*cp
;
2155 struct static_ipv4
*update
= NULL
;
2156 struct route_table
*stable
;
2159 stable
= vrf_static_table (AFI_IP
, SAFI_UNICAST
, vrf_id
);
2163 /* Lookup static route prefix. */
2164 rn
= route_node_get (stable
, p
);
2168 type
= STATIC_IPV4_GATEWAY
;
2170 type
= STATIC_IPV4_IFNAME
;
2172 type
= STATIC_IPV4_BLACKHOLE
;
2174 /* Do nothing if there is a same static route. */
2175 for (si
= rn
->info
; si
; si
= si
->next
)
2177 if (type
== si
->type
2178 && (! gate
|| IPV4_ADDR_SAME (gate
, &si
->gate
.ipv4
))
2179 && (! ifname
|| strcmp (ifname
, si
->gate
.ifname
) == 0))
2181 if (distance
== si
->distance
)
2183 route_unlock_node (rn
);
2191 /* Distance changed. */
2193 static_delete_ipv4 (p
, gate
, ifname
, update
->distance
, vrf_id
);
2195 /* Make new static route structure. */
2196 si
= XCALLOC (MTYPE_STATIC_IPV4
, sizeof (struct static_ipv4
));
2199 si
->distance
= distance
;
2203 si
->gate
.ipv4
= *gate
;
2205 si
->gate
.ifname
= XSTRDUP (0, ifname
);
2207 /* Add new static route information to the tree with sort by
2208 distance value and gateway address. */
2209 for (pp
= NULL
, cp
= rn
->info
; cp
; pp
= cp
, cp
= cp
->next
)
2211 if (si
->distance
< cp
->distance
)
2213 if (si
->distance
> cp
->distance
)
2215 if (si
->type
== STATIC_IPV4_GATEWAY
&& cp
->type
== STATIC_IPV4_GATEWAY
)
2217 if (ntohl (si
->gate
.ipv4
.s_addr
) < ntohl (cp
->gate
.ipv4
.s_addr
))
2219 if (ntohl (si
->gate
.ipv4
.s_addr
) > ntohl (cp
->gate
.ipv4
.s_addr
))
2224 /* Make linked list. */
2234 /* Install into rib. */
2235 static_install_ipv4 (p
, si
);
2240 /* Delete static route from static route configuration. */
2242 static_delete_ipv4 (struct prefix
*p
, struct in_addr
*gate
, const char *ifname
,
2243 u_char distance
, u_int32_t vrf_id
)
2246 struct route_node
*rn
;
2247 struct static_ipv4
*si
;
2248 struct route_table
*stable
;
2251 stable
= vrf_static_table (AFI_IP
, SAFI_UNICAST
, vrf_id
);
2255 /* Lookup static route prefix. */
2256 rn
= route_node_lookup (stable
, p
);
2262 type
= STATIC_IPV4_GATEWAY
;
2264 type
= STATIC_IPV4_IFNAME
;
2266 type
= STATIC_IPV4_BLACKHOLE
;
2268 /* Find same static route is the tree */
2269 for (si
= rn
->info
; si
; si
= si
->next
)
2270 if (type
== si
->type
2271 && (! gate
|| IPV4_ADDR_SAME (gate
, &si
->gate
.ipv4
))
2272 && (! ifname
|| strcmp (ifname
, si
->gate
.ifname
) == 0))
2275 /* Can't find static route. */
2278 route_unlock_node (rn
);
2282 /* Install into rib. */
2283 static_uninstall_ipv4 (p
, si
);
2285 /* Unlink static route from linked list. */
2287 si
->prev
->next
= si
->next
;
2289 rn
->info
= si
->next
;
2291 si
->next
->prev
= si
->prev
;
2292 route_unlock_node (rn
);
2294 /* Free static route configuration. */
2296 XFREE (0, si
->gate
.ifname
);
2297 XFREE (MTYPE_STATIC_IPV4
, si
);
2299 route_unlock_node (rn
);
2307 rib_bogus_ipv6 (int type
, struct prefix_ipv6
*p
,
2308 struct in6_addr
*gate
, unsigned int ifindex
, int table
)
2310 if (type
== ZEBRA_ROUTE_CONNECT
&& IN6_IS_ADDR_UNSPECIFIED (&p
->prefix
)) {
2311 #if defined (MUSICA) || defined (LINUX)
2312 /* IN6_IS_ADDR_V4COMPAT(&p->prefix) */
2313 if (p
->prefixlen
== 96)
2318 if (type
== ZEBRA_ROUTE_KERNEL
&& IN6_IS_ADDR_UNSPECIFIED (&p
->prefix
)
2319 && p
->prefixlen
== 96 && gate
&& IN6_IS_ADDR_UNSPECIFIED (gate
))
2321 kernel_delete_ipv6_old (p
, gate
, ifindex
, 0, table
);
2328 rib_add_ipv6 (int type
, int flags
, struct prefix_ipv6
*p
,
2329 struct in6_addr
*gate
, unsigned int ifindex
, u_int32_t vrf_id
,
2330 u_int32_t metric
, u_char distance
)
2333 struct rib
*same
= NULL
;
2334 struct route_table
*table
;
2335 struct route_node
*rn
;
2336 struct nexthop
*nexthop
;
2339 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
2343 /* Make sure mask is applied. */
2344 apply_mask_ipv6 (p
);
2346 /* Set default distance by route type. */
2348 distance
= route_info
[type
].distance
;
2350 if (type
== ZEBRA_ROUTE_BGP
&& CHECK_FLAG (flags
, ZEBRA_FLAG_IBGP
))
2353 /* Filter bogus route. */
2354 if (rib_bogus_ipv6 (type
, p
, gate
, ifindex
, 0))
2357 /* Lookup route node.*/
2358 rn
= route_node_get (table
, (struct prefix
*) p
);
2360 /* If same type of route are installed, treat it as a implicit
2362 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2364 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
2367 if (rib
->type
!= type
)
2369 if (rib
->type
!= ZEBRA_ROUTE_CONNECT
)
2374 else if ((nexthop
= rib
->nexthop
) &&
2375 nexthop
->type
== NEXTHOP_TYPE_IFINDEX
&&
2376 nexthop
->ifindex
== ifindex
)
2383 /* Allocate new rib structure. */
2384 rib
= XCALLOC (MTYPE_RIB
, sizeof (struct rib
));
2387 rib
->distance
= distance
;
2389 rib
->metric
= metric
;
2390 rib
->table
= vrf_id
;
2391 rib
->nexthop_num
= 0;
2392 rib
->uptime
= time (NULL
);
2394 /* Nexthop settings. */
2398 nexthop_ipv6_ifindex_add (rib
, gate
, ifindex
);
2400 nexthop_ipv6_add (rib
, gate
);
2403 nexthop_ifindex_add (rib
, ifindex
);
2405 /* If this route is kernel route, set FIB flag to the route. */
2406 if (type
== ZEBRA_ROUTE_KERNEL
|| type
== ZEBRA_ROUTE_CONNECT
)
2407 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
2408 SET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
2410 /* Link new rib to node.*/
2411 rib_addnode (rn
, rib
);
2413 /* Free implicit route.*/
2415 rib_delnode (rn
, same
);
2417 route_unlock_node (rn
);
2421 /* XXX factor with rib_delete_ipv6 */
2423 rib_delete_ipv6 (int type
, int flags
, struct prefix_ipv6
*p
,
2424 struct in6_addr
*gate
, unsigned int ifindex
, u_int32_t vrf_id
)
2426 struct route_table
*table
;
2427 struct route_node
*rn
;
2429 struct rib
*fib
= NULL
;
2430 struct rib
*same
= NULL
;
2431 struct nexthop
*nexthop
;
2432 char buf1
[INET6_ADDRSTRLEN
];
2433 char buf2
[INET6_ADDRSTRLEN
];
2436 apply_mask_ipv6 (p
);
2439 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
2443 /* Lookup route node. */
2444 rn
= route_node_lookup (table
, (struct prefix
*) p
);
2447 if (IS_ZEBRA_DEBUG_KERNEL
)
2450 zlog_debug ("route %s/%d via %s ifindex %d doesn't exist in rib",
2451 inet_ntop (AF_INET6
, &p
->prefix
, buf1
, INET6_ADDRSTRLEN
),
2453 inet_ntop (AF_INET6
, gate
, buf2
, INET6_ADDRSTRLEN
),
2456 zlog_debug ("route %s/%d ifindex %d doesn't exist in rib",
2457 inet_ntop (AF_INET6
, &p
->prefix
, buf1
, INET6_ADDRSTRLEN
),
2461 return ZEBRA_ERR_RTNOEXIST
;
2464 /* Lookup same type route. */
2465 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2467 if (CHECK_FLAG(rib
->status
, RIB_ENTRY_REMOVED
))
2470 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
2473 if (rib
->type
!= type
)
2475 if (rib
->type
== ZEBRA_ROUTE_CONNECT
&& (nexthop
= rib
->nexthop
) &&
2476 nexthop
->type
== NEXTHOP_TYPE_IFINDEX
&& nexthop
->ifindex
== ifindex
)
2481 route_unlock_node (rn
);
2482 route_unlock_node (rn
);
2488 /* Make sure that the route found has the same gateway. */
2489 else if (gate
== NULL
||
2490 ((nexthop
= rib
->nexthop
) &&
2491 (IPV6_ADDR_SAME (&nexthop
->gate
.ipv6
, gate
) ||
2492 IPV6_ADDR_SAME (&nexthop
->rgate
.ipv6
, gate
))))
2499 /* If same type of route can't be found and this message is from
2503 if (fib
&& type
== ZEBRA_ROUTE_KERNEL
)
2506 for (nexthop
= fib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
2507 UNSET_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
);
2509 UNSET_FLAG (fib
->flags
, ZEBRA_FLAG_SELECTED
);
2513 if (IS_ZEBRA_DEBUG_KERNEL
)
2516 zlog_debug ("route %s/%d via %s ifindex %d type %d doesn't exist in rib",
2517 inet_ntop (AF_INET6
, &p
->prefix
, buf1
, INET6_ADDRSTRLEN
),
2519 inet_ntop (AF_INET6
, gate
, buf2
, INET6_ADDRSTRLEN
),
2523 zlog_debug ("route %s/%d ifindex %d type %d doesn't exist in rib",
2524 inet_ntop (AF_INET6
, &p
->prefix
, buf1
, INET6_ADDRSTRLEN
),
2529 route_unlock_node (rn
);
2530 return ZEBRA_ERR_RTNOEXIST
;
2535 rib_delnode (rn
, same
);
2537 route_unlock_node (rn
);
2541 /* Install static route into rib. */
2543 static_install_ipv6 (struct prefix
*p
, struct static_ipv6
*si
)
2546 struct route_table
*table
;
2547 struct route_node
*rn
;
2550 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
2554 /* Lookup existing route */
2555 rn
= route_node_get (table
, p
);
2556 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2558 if (CHECK_FLAG(rib
->status
, RIB_ENTRY_REMOVED
))
2561 if (rib
->type
== ZEBRA_ROUTE_STATIC
&& rib
->distance
== si
->distance
)
2567 /* Same distance static route is there. Update it with new
2569 route_unlock_node (rn
);
2573 case STATIC_IPV6_GATEWAY
:
2574 nexthop_ipv6_add (rib
, &si
->ipv6
);
2576 case STATIC_IPV6_IFNAME
:
2577 nexthop_ifname_add (rib
, si
->ifname
);
2579 case STATIC_IPV6_GATEWAY_IFNAME
:
2580 nexthop_ipv6_ifname_add (rib
, &si
->ipv6
, si
->ifname
);
2583 rib_queue_add (&zebrad
, rn
);
2587 /* This is new static route. */
2588 rib
= XCALLOC (MTYPE_RIB
, sizeof (struct rib
));
2590 rib
->type
= ZEBRA_ROUTE_STATIC
;
2591 rib
->distance
= si
->distance
;
2593 rib
->nexthop_num
= 0;
2597 case STATIC_IPV6_GATEWAY
:
2598 nexthop_ipv6_add (rib
, &si
->ipv6
);
2600 case STATIC_IPV6_IFNAME
:
2601 nexthop_ifname_add (rib
, si
->ifname
);
2603 case STATIC_IPV6_GATEWAY_IFNAME
:
2604 nexthop_ipv6_ifname_add (rib
, &si
->ipv6
, si
->ifname
);
2608 /* Save the flags of this static routes (reject, blackhole) */
2609 rib
->flags
= si
->flags
;
2611 /* Link this rib to the tree. */
2612 rib_addnode (rn
, rib
);
2617 static_ipv6_nexthop_same (struct nexthop
*nexthop
, struct static_ipv6
*si
)
2619 if (nexthop
->type
== NEXTHOP_TYPE_IPV6
2620 && si
->type
== STATIC_IPV6_GATEWAY
2621 && IPV6_ADDR_SAME (&nexthop
->gate
.ipv6
, &si
->ipv6
))
2623 if (nexthop
->type
== NEXTHOP_TYPE_IFNAME
2624 && si
->type
== STATIC_IPV6_IFNAME
2625 && strcmp (nexthop
->ifname
, si
->ifname
) == 0)
2627 if (nexthop
->type
== NEXTHOP_TYPE_IPV6_IFNAME
2628 && si
->type
== STATIC_IPV6_GATEWAY_IFNAME
2629 && IPV6_ADDR_SAME (&nexthop
->gate
.ipv6
, &si
->ipv6
)
2630 && strcmp (nexthop
->ifname
, si
->ifname
) == 0)
2636 static_uninstall_ipv6 (struct prefix
*p
, struct static_ipv6
*si
)
2638 struct route_table
*table
;
2639 struct route_node
*rn
;
2641 struct nexthop
*nexthop
;
2644 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
2648 /* Lookup existing route with type and distance. */
2649 rn
= route_node_lookup (table
, (struct prefix
*) p
);
2653 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2655 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
2658 if (rib
->type
== ZEBRA_ROUTE_STATIC
&& rib
->distance
== si
->distance
)
2664 route_unlock_node (rn
);
2668 /* Lookup nexthop. */
2669 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
2670 if (static_ipv6_nexthop_same (nexthop
, si
))
2673 /* Can't find nexthop. */
2676 route_unlock_node (rn
);
2680 /* Check nexthop. */
2681 if (rib
->nexthop_num
== 1)
2683 rib_delnode (rn
, rib
);
2687 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
2688 rib_uninstall (rn
, rib
);
2689 nexthop_delete (rib
, nexthop
);
2690 nexthop_free (nexthop
);
2691 rib_queue_add (&zebrad
, rn
);
2694 route_unlock_node (rn
);
2697 /* Add static route into static route configuration. */
2699 static_add_ipv6 (struct prefix
*p
, u_char type
, struct in6_addr
*gate
,
2700 const char *ifname
, u_char flags
, u_char distance
,
2703 struct route_node
*rn
;
2704 struct static_ipv6
*si
;
2705 struct static_ipv6
*pp
;
2706 struct static_ipv6
*cp
;
2707 struct route_table
*stable
;
2710 stable
= vrf_static_table (AFI_IP6
, SAFI_UNICAST
, vrf_id
);
2715 (type
== STATIC_IPV6_GATEWAY
|| type
== STATIC_IPV6_GATEWAY_IFNAME
))
2719 (type
== STATIC_IPV6_GATEWAY_IFNAME
|| type
== STATIC_IPV6_IFNAME
))
2722 /* Lookup static route prefix. */
2723 rn
= route_node_get (stable
, p
);
2725 /* Do nothing if there is a same static route. */
2726 for (si
= rn
->info
; si
; si
= si
->next
)
2728 if (distance
== si
->distance
2730 && (! gate
|| IPV6_ADDR_SAME (gate
, &si
->ipv6
))
2731 && (! ifname
|| strcmp (ifname
, si
->ifname
) == 0))
2733 route_unlock_node (rn
);
2738 /* Make new static route structure. */
2739 si
= XCALLOC (MTYPE_STATIC_IPV6
, sizeof (struct static_ipv6
));
2742 si
->distance
= distance
;
2747 case STATIC_IPV6_GATEWAY
:
2750 case STATIC_IPV6_IFNAME
:
2751 si
->ifname
= XSTRDUP (0, ifname
);
2753 case STATIC_IPV6_GATEWAY_IFNAME
:
2755 si
->ifname
= XSTRDUP (0, ifname
);
2759 /* Add new static route information to the tree with sort by
2760 distance value and gateway address. */
2761 for (pp
= NULL
, cp
= rn
->info
; cp
; pp
= cp
, cp
= cp
->next
)
2763 if (si
->distance
< cp
->distance
)
2765 if (si
->distance
> cp
->distance
)
2769 /* Make linked list. */
2779 /* Install into rib. */
2780 static_install_ipv6 (p
, si
);
2785 /* Delete static route from static route configuration. */
2787 static_delete_ipv6 (struct prefix
*p
, u_char type
, struct in6_addr
*gate
,
2788 const char *ifname
, u_char distance
, u_int32_t vrf_id
)
2790 struct route_node
*rn
;
2791 struct static_ipv6
*si
;
2792 struct route_table
*stable
;
2795 stable
= vrf_static_table (AFI_IP6
, SAFI_UNICAST
, vrf_id
);
2799 /* Lookup static route prefix. */
2800 rn
= route_node_lookup (stable
, p
);
2804 /* Find same static route is the tree */
2805 for (si
= rn
->info
; si
; si
= si
->next
)
2806 if (distance
== si
->distance
2808 && (! gate
|| IPV6_ADDR_SAME (gate
, &si
->ipv6
))
2809 && (! ifname
|| strcmp (ifname
, si
->ifname
) == 0))
2812 /* Can't find static route. */
2815 route_unlock_node (rn
);
2819 /* Install into rib. */
2820 static_uninstall_ipv6 (p
, si
);
2822 /* Unlink static route from linked list. */
2824 si
->prev
->next
= si
->next
;
2826 rn
->info
= si
->next
;
2828 si
->next
->prev
= si
->prev
;
2830 /* Free static route configuration. */
2832 XFREE (0, si
->ifname
);
2833 XFREE (MTYPE_STATIC_IPV6
, si
);
2837 #endif /* HAVE_IPV6 */
2839 /* RIB update function. */
2843 struct route_node
*rn
;
2844 struct route_table
*table
;
2846 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
2848 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
2850 rib_queue_add (&zebrad
, rn
);
2852 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
2854 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
2856 rib_queue_add (&zebrad
, rn
);
2859 /* Interface goes up. */
2861 rib_if_up (struct interface
*ifp
)
2866 /* Interface goes down. */
2868 rib_if_down (struct interface
*ifp
)
2873 /* Remove all routes which comes from non main table. */
2875 rib_weed_table (struct route_table
*table
)
2877 struct route_node
*rn
;
2882 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
2883 for (rib
= rn
->info
; rib
; rib
= next
)
2887 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
2890 if (rib
->table
!= zebrad
.rtm_table_default
&&
2891 rib
->table
!= RT_TABLE_MAIN
)
2892 rib_delnode (rn
, rib
);
2896 /* Delete all routes from non main table. */
2898 rib_weed_tables (void)
2900 rib_weed_table (vrf_table (AFI_IP
, SAFI_UNICAST
, 0));
2901 rib_weed_table (vrf_table (AFI_IP6
, SAFI_UNICAST
, 0));
2904 /* Delete self installed routes after zebra is relaunched. */
2906 rib_sweep_table (struct route_table
*table
)
2908 struct route_node
*rn
;
2914 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
2915 for (rib
= rn
->info
; rib
; rib
= next
)
2919 if (CHECK_FLAG (rib
->status
, RIB_ENTRY_REMOVED
))
2922 if (rib
->type
== ZEBRA_ROUTE_KERNEL
&&
2923 CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELFROUTE
))
2925 ret
= rib_uninstall_kernel (rn
, rib
);
2927 rib_delnode (rn
, rib
);
2932 /* Sweep all RIB tables. */
2934 rib_sweep_route (void)
2936 rib_sweep_table (vrf_table (AFI_IP
, SAFI_UNICAST
, 0));
2937 rib_sweep_table (vrf_table (AFI_IP6
, SAFI_UNICAST
, 0));
2940 /* Close RIB and clean up kernel routes. */
2942 rib_close_table (struct route_table
*table
)
2944 struct route_node
*rn
;
2948 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
2949 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
2951 if (! RIB_SYSTEM_ROUTE (rib
)
2952 && CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
2953 rib_uninstall_kernel (rn
, rib
);
2957 /* Close all RIB tables. */
2961 rib_close_table (vrf_table (AFI_IP
, SAFI_UNICAST
, 0));
2962 rib_close_table (vrf_table (AFI_IP6
, SAFI_UNICAST
, 0));
2965 /* Routing information base initialize. */
2969 rib_queue_init (&zebrad
);
2970 /* VRF initialization. */