diff options
Diffstat (limited to 'staticd/static_vrf.c')
| -rw-r--r-- | staticd/static_vrf.c | 68 |
1 files changed, 54 insertions, 14 deletions
diff --git a/staticd/static_vrf.c b/staticd/static_vrf.c index 6c065932a1..39b86787ff 100644 --- a/staticd/static_vrf.c +++ b/staticd/static_vrf.c @@ -30,26 +30,39 @@ #include "static_zebra.h" #include "static_vty.h" +DEFINE_MTYPE_STATIC(STATIC, STATIC_RTABLE_INFO, "Static Route Table Info"); + static void zebra_stable_node_cleanup(struct route_table *table, struct route_node *node) { - struct static_route *si, *next; - - if (node->info) - for (si = node->info; si; si = next) { - next = si->next; - XFREE(MTYPE_STATIC_ROUTE, si); + struct static_nexthop *nh; + struct static_path *pn; + struct static_route_info *si; + + si = node->info; + + if (si) { + frr_each_safe(static_path_list, &si->path_list, pn) { + frr_each_safe(static_nexthop_list, &pn->nexthop_list, + nh) { + static_nexthop_list_del(&pn->nexthop_list, nh); + XFREE(MTYPE_STATIC_NEXTHOP, nh); + } + static_path_list_del(&si->path_list, pn); + XFREE(MTYPE_STATIC_PATH, pn); } + } } static struct static_vrf *static_vrf_alloc(void) { struct route_table *table; struct static_vrf *svrf; + struct stable_info *info; safi_t safi; afi_t afi; - svrf = XCALLOC(MTYPE_TMP, sizeof(struct static_vrf)); + svrf = XCALLOC(MTYPE_STATIC_RTABLE_INFO, sizeof(struct static_vrf)); for (afi = AFI_IP; afi <= AFI_IP6; afi++) { for (safi = SAFI_UNICAST; safi <= SAFI_MULTICAST; safi++) { @@ -57,6 +70,14 @@ static struct static_vrf *static_vrf_alloc(void) table = srcdest_table_init(); else table = route_table_init(); + + info = XCALLOC(MTYPE_STATIC_RTABLE_INFO, + sizeof(struct stable_info)); + info->svrf = svrf; + info->afi = afi; + info->safi = safi; + route_table_set_info(table, info); + table->cleanup = zebra_stable_node_cleanup; svrf->stable[afi][safi] = table; } @@ -81,12 +102,6 @@ static int static_vrf_enable(struct vrf *vrf) static_fixup_vrf_ids(vrf->info); - /* - * We may have static routes that are now possible to - * insert into the appropriate tables - */ - static_config_install_delayed_routes(vrf->info); - return 0; } @@ -102,16 +117,19 @@ static int static_vrf_delete(struct vrf *vrf) struct static_vrf *svrf; safi_t safi; afi_t afi; + void *info; svrf = vrf->info; for (afi = AFI_IP; afi <= AFI_IP6; afi++) { for (safi = SAFI_UNICAST; safi <= SAFI_MULTICAST; safi++) { table = svrf->stable[afi][safi]; + info = route_table_get_info(table); route_table_finish(table); + XFREE(MTYPE_STATIC_RTABLE_INFO, info); svrf->stable[afi][safi] = NULL; } } - XFREE(MTYPE_TMP, svrf); + XFREE(MTYPE_STATIC_RTABLE_INFO, svrf); return 0; } @@ -210,3 +228,25 @@ void static_vrf_terminate(void) { vrf_terminate(); } + +struct static_vrf *static_vty_get_unknown_vrf(const char *vrf_name) +{ + struct static_vrf *svrf; + struct vrf *vrf; + + svrf = static_vrf_lookup_by_name(vrf_name); + + if (svrf) + return svrf; + + vrf = vrf_get(VRF_UNKNOWN, vrf_name); + if (!vrf) + return NULL; + svrf = vrf->info; + if (!svrf) + return NULL; + /* Mark as having FRR configuration */ + vrf_set_user_cfged(vrf); + + return svrf; +} |
