2 * Copyright (C) 2016 CumulusNetworks
5 * This file is part of Quagga
7 * Quagga is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * Quagga is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "srcdest_table.h"
31 #include "zebra/debug.h"
32 #include "zebra/zserv.h"
33 #include "zebra/rib.h"
34 #include "zebra/zebra_vrf.h"
35 #include "zebra/zebra_rnh.h"
36 #include "zebra/router-id.h"
37 #include "zebra/zebra_memory.h"
38 #include "zebra/zebra_static.h"
39 #include "zebra/interface.h"
40 #include "zebra/zebra_mpls.h"
41 #include "zebra/zebra_vxlan.h"
43 extern struct zebra_t zebrad
;
45 static void zebra_vrf_table_create(struct zebra_vrf
*zvrf
, afi_t afi
,
47 static void zebra_rnhtable_node_cleanup(struct route_table
*table
,
48 struct route_node
*node
);
50 /* VRF information update. */
51 static void zebra_vrf_add_update(struct zebra_vrf
*zvrf
)
53 struct listnode
*node
, *nnode
;
56 if (IS_ZEBRA_DEBUG_EVENT
)
57 zlog_debug("MESSAGE: ZEBRA_VRF_ADD %s", zvrf_name(zvrf
));
59 for (ALL_LIST_ELEMENTS(zebrad
.client_list
, node
, nnode
, client
))
60 zsend_vrf_add(client
, zvrf
);
63 static void zebra_vrf_delete_update(struct zebra_vrf
*zvrf
)
65 struct listnode
*node
, *nnode
;
68 if (IS_ZEBRA_DEBUG_EVENT
)
69 zlog_debug("MESSAGE: ZEBRA_VRF_DELETE %s", zvrf_name(zvrf
));
71 for (ALL_LIST_ELEMENTS(zebrad
.client_list
, node
, nnode
, client
))
72 zsend_vrf_delete(client
, zvrf
);
75 void zebra_vrf_update_all(struct zserv
*client
)
79 RB_FOREACH (vrf
, vrf_id_head
, &vrfs_by_id
) {
80 if (vrf
->vrf_id
!= VRF_UNKNOWN
)
81 zsend_vrf_add(client
, vrf_info_lookup(vrf
->vrf_id
));
85 /* Callback upon creating a new VRF. */
86 static int zebra_vrf_new(struct vrf
*vrf
)
88 struct zebra_vrf
*zvrf
;
90 if (IS_ZEBRA_DEBUG_EVENT
)
91 zlog_info("VRF %s created, id %u", vrf
->name
, vrf
->vrf_id
);
93 zvrf
= zebra_vrf_alloc();
100 /* Callback upon enabling a VRF. */
101 static int zebra_vrf_enable(struct vrf
*vrf
)
103 struct zebra_vrf
*zvrf
= vrf
->info
;
104 struct route_table
*stable
;
105 struct route_node
*rn
;
106 struct static_route
*si
;
107 struct route_table
*table
;
108 struct interface
*ifp
;
113 if (IS_ZEBRA_DEBUG_EVENT
)
114 zlog_debug("VRF %s id %u is now active", zvrf_name(zvrf
),
117 if (vrf_is_backend_netns())
118 zvrf
->zns
= zebra_ns_lookup((ns_id_t
)vrf
->vrf_id
);
120 zvrf
->zns
= zebra_ns_lookup(NS_DEFAULT
);
121 /* Inform clients that the VRF is now active. This is an
122 * add for the clients.
124 zebra_vrf_add_update(zvrf
);
126 /* Allocate tables */
127 for (afi
= AFI_IP
; afi
<= AFI_IP6
; afi
++) {
128 for (safi
= SAFI_UNICAST
; safi
<= SAFI_MULTICAST
; safi
++)
129 zebra_vrf_table_create(zvrf
, afi
, safi
);
131 table
= route_table_init();
132 table
->cleanup
= zebra_rnhtable_node_cleanup
;
133 zvrf
->rnh_table
[afi
] = table
;
135 table
= route_table_init();
136 table
->cleanup
= zebra_rnhtable_node_cleanup
;
137 zvrf
->import_check_table
[afi
] = table
;
140 /* Install any static routes configured for this VRF. */
141 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
142 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++) {
143 stable
= zvrf
->stable
[afi
][safi
];
147 for (rn
= route_top(stable
); rn
; rn
= route_next(rn
))
148 for (si
= rn
->info
; si
; si
= si
->next
) {
149 si
->vrf_id
= vrf
->vrf_id
;
151 ifp
= if_lookup_by_name(
152 si
->ifname
, si
->vrf_id
);
159 static_install_route(afi
, safi
, &rn
->p
,
164 /* Kick off any VxLAN-EVPN processing. */
165 zebra_vxlan_vrf_enable(zvrf
);
170 /* Callback upon disabling a VRF. */
171 static int zebra_vrf_disable(struct vrf
*vrf
)
173 struct zebra_vrf
*zvrf
= vrf
->info
;
174 struct route_table
*stable
;
175 struct route_node
*rn
;
176 struct static_route
*si
;
177 struct route_table
*table
;
178 struct interface
*ifp
;
184 if (IS_ZEBRA_DEBUG_EVENT
)
185 zlog_debug("VRF %s id %u is now inactive", zvrf_name(zvrf
),
188 /* Uninstall any static routes configured for this VRF. */
189 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
190 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++) {
191 stable
= zvrf
->stable
[afi
][safi
];
195 for (rn
= route_top(stable
); rn
; rn
= route_next(rn
))
196 for (si
= rn
->info
; si
; si
= si
->next
)
197 static_uninstall_route(
198 afi
, safi
, &rn
->p
, NULL
, si
);
201 /* Stop any VxLAN-EVPN processing. */
202 zebra_vxlan_vrf_disable(zvrf
);
204 /* Inform clients that the VRF is now inactive. This is a
205 * delete for the clients.
207 zebra_vrf_delete_update(zvrf
);
209 /* If asked to retain routes, there's nothing more to do. */
210 if (CHECK_FLAG(zvrf
->flags
, ZEBRA_VRF_RETAIN
))
213 /* Remove all routes. */
214 for (afi
= AFI_IP
; afi
<= AFI_IP6
; afi
++) {
215 for (safi
= SAFI_UNICAST
; safi
<= SAFI_MULTICAST
; safi
++)
216 rib_close_table(zvrf
->table
[afi
][safi
]);
219 /* Cleanup Vxlan, MPLS and PW tables. */
220 zebra_vxlan_cleanup_tables(zvrf
);
221 zebra_mpls_cleanup_tables(zvrf
);
224 /* Remove link-local IPv4 addresses created for BGP unnumbered peering.
226 FOR_ALL_INTERFACES (vrf
, ifp
)
227 if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(ifp
);
229 /* clean-up work queues */
230 for (i
= 0; i
< MQ_SIZE
; i
++) {
231 struct listnode
*lnode
, *nnode
;
232 struct route_node
*rnode
;
235 for (ALL_LIST_ELEMENTS(zebrad
.mq
->subq
[i
], lnode
, nnode
,
237 dest
= rib_dest_from_rnode(rnode
);
238 if (dest
&& rib_dest_vrf(dest
) == zvrf
) {
239 route_unlock_node(rnode
);
240 list_delete_node(zebrad
.mq
->subq
[i
], lnode
);
246 /* Cleanup (free) routing tables and NHT tables. */
247 for (afi
= AFI_IP
; afi
<= AFI_IP6
; afi
++) {
250 for (safi
= SAFI_UNICAST
; safi
<= SAFI_MULTICAST
; safi
++) {
251 table
= zvrf
->table
[afi
][safi
];
252 table_info
= table
->info
;
253 route_table_finish(table
);
254 XFREE(MTYPE_RIB_TABLE_INFO
, table_info
);
255 zvrf
->table
[afi
][safi
] = NULL
;
258 route_table_finish(zvrf
->rnh_table
[afi
]);
259 zvrf
->rnh_table
[afi
] = NULL
;
260 route_table_finish(zvrf
->import_check_table
[afi
]);
261 zvrf
->import_check_table
[afi
] = NULL
;
267 static int zebra_vrf_delete(struct vrf
*vrf
)
269 struct zebra_vrf
*zvrf
= vrf
->info
;
270 struct route_table
*table
;
276 if (IS_ZEBRA_DEBUG_EVENT
)
277 zlog_debug("VRF %s id %u deleted", zvrf_name(zvrf
),
280 /* clean-up work queues */
281 for (i
= 0; i
< MQ_SIZE
; i
++) {
282 struct listnode
*lnode
, *nnode
;
283 struct route_node
*rnode
;
286 for (ALL_LIST_ELEMENTS(zebrad
.mq
->subq
[i
], lnode
, nnode
,
288 dest
= rib_dest_from_rnode(rnode
);
289 if (dest
&& rib_dest_vrf(dest
) == zvrf
) {
290 route_unlock_node(rnode
);
291 list_delete_node(zebrad
.mq
->subq
[i
], lnode
);
297 /* Free Vxlan and MPLS. */
298 zebra_vxlan_close_tables(zvrf
);
299 zebra_mpls_close_tables(zvrf
);
301 /* release allocated memory */
302 for (afi
= AFI_IP
; afi
<= AFI_IP6
; afi
++) {
305 for (safi
= SAFI_UNICAST
; safi
<= SAFI_MULTICAST
; safi
++) {
306 table
= zvrf
->table
[afi
][safi
];
308 table_info
= table
->info
;
309 route_table_finish(table
);
310 XFREE(MTYPE_RIB_TABLE_INFO
, table_info
);
313 table
= zvrf
->stable
[afi
][safi
];
314 route_table_finish(table
);
317 route_table_finish(zvrf
->rnh_table
[afi
]);
318 route_table_finish(zvrf
->import_check_table
[afi
]);
321 /* Cleanup EVPN states for vrf */
322 zebra_vxlan_vrf_delete(zvrf
);
324 list_delete_all_node(zvrf
->rid_all_sorted_list
);
325 list_delete_all_node(zvrf
->rid_lo_sorted_list
);
326 XFREE(MTYPE_ZEBRA_VRF
, zvrf
);
332 /* Return if this VRF has any FRR configuration or not.
333 * IMPORTANT: This function needs to be updated when additional configuration
334 * is added for a VRF.
336 int zebra_vrf_has_config(struct zebra_vrf
*zvrf
)
340 struct route_table
*stable
;
342 /* NOTE: This is a don't care for the default VRF, but we go through
343 * the motions to keep things consistent.
345 /* Any static routes? */
346 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
347 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++) {
348 stable
= zvrf
->stable
[afi
][safi
];
351 if (route_table_count(stable
))
363 /* Lookup the routing table in a VRF based on both VRF-Id and table-id.
364 * NOTE: Table-id is relevant only in the Default VRF.
366 struct route_table
*zebra_vrf_table_with_table_id(afi_t afi
, safi_t safi
,
370 struct route_table
*table
= NULL
;
372 if (afi
>= AFI_MAX
|| safi
>= SAFI_MAX
)
375 if (vrf_id
== VRF_DEFAULT
) {
376 if (table_id
== RT_TABLE_MAIN
377 || table_id
== zebrad
.rtm_table_default
)
378 table
= zebra_vrf_table(afi
, safi
, vrf_id
);
380 table
= zebra_vrf_other_route_table(afi
, table_id
,
383 table
= zebra_vrf_table(afi
, safi
, vrf_id
);
388 void zebra_rtable_node_cleanup(struct route_table
*table
,
389 struct route_node
*node
)
391 struct route_entry
*re
, *next
;
393 RNODE_FOREACH_RE_SAFE (node
, re
, next
) {
394 rib_unlink(node
, re
);
398 XFREE(MTYPE_RIB_DEST
, node
->info
);
401 static void zebra_stable_node_cleanup(struct route_table
*table
,
402 struct route_node
*node
)
404 struct static_route
*si
, *next
;
407 for (si
= node
->info
; si
; si
= next
) {
409 XFREE(MTYPE_STATIC_ROUTE
, si
);
413 static void zebra_rnhtable_node_cleanup(struct route_table
*table
,
414 struct route_node
*node
)
417 zebra_free_rnh(node
->info
);
421 * Create a routing table for the specific AFI/SAFI in the given VRF.
423 static void zebra_vrf_table_create(struct zebra_vrf
*zvrf
, afi_t afi
,
426 rib_table_info_t
*info
;
427 struct route_table
*table
;
429 assert(!zvrf
->table
[afi
][safi
]);
432 table
= srcdest_table_init();
434 table
= route_table_init();
435 table
->cleanup
= zebra_rtable_node_cleanup
;
436 zvrf
->table
[afi
][safi
] = table
;
438 info
= XCALLOC(MTYPE_RIB_TABLE_INFO
, sizeof(*info
));
445 /* Allocate new zebra VRF. */
446 struct zebra_vrf
*zebra_vrf_alloc(void)
448 struct zebra_vrf
*zvrf
;
451 struct route_table
*table
;
453 zvrf
= XCALLOC(MTYPE_ZEBRA_VRF
, sizeof(struct zebra_vrf
));
455 /* Allocate table for static route configuration. */
456 for (afi
= AFI_IP
; afi
<= AFI_IP6
; afi
++) {
457 for (safi
= SAFI_UNICAST
; safi
<= SAFI_MULTICAST
; safi
++) {
459 table
= srcdest_table_init();
461 table
= route_table_init();
462 table
->cleanup
= zebra_stable_node_cleanup
;
463 zvrf
->stable
[afi
][safi
] = table
;
467 zebra_vxlan_init_tables(zvrf
);
468 zebra_mpls_init_tables(zvrf
);
474 /* Lookup VRF by identifier. */
475 struct zebra_vrf
*zebra_vrf_lookup_by_id(vrf_id_t vrf_id
)
477 return vrf_info_lookup(vrf_id
);
480 /* Lookup VRF by name. */
481 struct zebra_vrf
*zebra_vrf_lookup_by_name(const char *name
)
486 name
= VRF_DEFAULT_NAME
;
488 vrf
= vrf_lookup_by_name(name
);
490 return ((struct zebra_vrf
*)vrf
->info
);
495 /* Lookup the routing table in an enabled VRF. */
496 struct route_table
*zebra_vrf_table(afi_t afi
, safi_t safi
, vrf_id_t vrf_id
)
498 struct zebra_vrf
*zvrf
= vrf_info_lookup(vrf_id
);
503 if (afi
>= AFI_MAX
|| safi
>= SAFI_MAX
)
506 return zvrf
->table
[afi
][safi
];
509 /* Lookup the static routing table in a VRF. */
510 struct route_table
*zebra_vrf_static_table(afi_t afi
, safi_t safi
,
511 struct zebra_vrf
*zvrf
)
516 if (afi
>= AFI_MAX
|| safi
>= SAFI_MAX
)
519 return zvrf
->stable
[afi
][safi
];
522 struct route_table
*zebra_vrf_other_route_table(afi_t afi
, u_int32_t table_id
,
525 struct zebra_vrf
*zvrf
;
526 struct zebra_ns
*zns
;
528 zvrf
= vrf_info_lookup(vrf_id
);
537 if ((vrf_id
== VRF_DEFAULT
) && (table_id
!= RT_TABLE_MAIN
)
538 && (table_id
!= zebrad
.rtm_table_default
)) {
539 return zebra_ns_get_table(zns
, zvrf
, table_id
, afi
);
542 return zvrf
->table
[afi
][SAFI_UNICAST
];
545 static int vrf_config_write(struct vty
*vty
)
548 struct zebra_vrf
*zvrf
;
550 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
556 if (zvrf_id(zvrf
) == VRF_DEFAULT
) {
558 vty_out(vty
, "vni %u\n", zvrf
->l3vni
);
562 if (vrf_is_user_cfged(vrf
)) {
563 vty_out(vty
, "vrf %s\n", zvrf_name(zvrf
));
565 vty_out(vty
, " vni %u%s\n", zvrf
->l3vni
,
566 is_l3vni_for_prefix_routes_only(
568 ? " prefix-routes-only"
570 zebra_ns_config_write(vty
, (struct ns
*)vrf
->ns_ctxt
);
574 static_config(vty
, zvrf
, AFI_IP
, SAFI_UNICAST
, "ip route");
575 static_config(vty
, zvrf
, AFI_IP
, SAFI_MULTICAST
, "ip mroute");
576 static_config(vty
, zvrf
, AFI_IP6
, SAFI_UNICAST
, "ipv6 route");
578 if (vrf
->vrf_id
!= VRF_DEFAULT
)
584 /* Zebra VRF initialization. */
585 void zebra_vrf_init(void)
587 vrf_init(zebra_vrf_new
, zebra_vrf_enable
, zebra_vrf_disable
,
590 vrf_cmd_init(vrf_config_write
);