]> git.proxmox.com Git - mirror_frr.git/blobdiff - ripd/ripd.c
Merge pull request #5005 from Frankkkkk/dockerfile
[mirror_frr.git] / ripd / ripd.c
index ad373aebdfbbf3cfc9af9edb1de934d2705cfdde..1b5a582cb1006014c47f03d3caa7b435d624f732 100644 (file)
@@ -3641,6 +3641,37 @@ static int rip_vrf_enable(struct vrf *vrf)
        int socket;
 
        rip = rip_lookup_by_vrf_name(vrf->name);
+       if (!rip) {
+               char *old_vrf_name = NULL;
+
+               rip = (struct rip *)vrf->info;
+               if (!rip)
+                       return 0;
+               /* update vrf name */
+               if (rip->vrf_name)
+                       old_vrf_name = rip->vrf_name;
+               rip->vrf_name = XSTRDUP(MTYPE_RIP_VRF_NAME, vrf->name);
+               /*
+                * HACK: Change the RIP VRF in the running configuration directly,
+                * bypassing the northbound layer. This is necessary to avoid deleting
+                * the RIP and readding it in the new VRF, which would have
+                * several implications.
+                */
+               if (yang_module_find("frr-ripd") && old_vrf_name) {
+                       struct lyd_node *rip_dnode;
+
+                       rip_dnode = yang_dnode_get(
+                               running_config->dnode,
+                               "/frr-ripd:ripd/instance[vrf='%s']/vrf",
+                               old_vrf_name);
+                       if (rip_dnode) {
+                               yang_dnode_change_leaf(rip_dnode, vrf->name);
+                               running_config->version++;
+                       }
+               }
+               if (old_vrf_name)
+                       XFREE(MTYPE_RIP_VRF_NAME, old_vrf_name);
+       }
        if (!rip || rip->enabled)
                return 0;
 
@@ -3682,7 +3713,7 @@ static int rip_vrf_disable(struct vrf *vrf)
 void rip_vrf_init(void)
 {
        vrf_init(rip_vrf_new, rip_vrf_enable, rip_vrf_disable, rip_vrf_delete,
-                NULL);
+                rip_vrf_enable);
 }
 
 void rip_vrf_terminate(void)