]> git.proxmox.com Git - mirror_frr.git/blobdiff - staticd/static_vrf.c
staticd : Configuration northbound implementation
[mirror_frr.git] / staticd / static_vrf.c
index 6c065932a10a4757fcc519932edc97bbd874fbe3..39b86787ff60543573fead3f61fca12d7f45b1c7 100644 (file)
 #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;
+}