]> git.proxmox.com Git - mirror_frr.git/blobdiff - staticd/static_routes.c
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[mirror_frr.git] / staticd / static_routes.c
index cd0330ed82065a17fa5a45af0a425103fb49b95e..a5f0f74b003e667d21ae201ee068b29e3f8412c2 100644 (file)
@@ -497,6 +497,66 @@ void static_cleanup_vrf_ids(struct static_vrf *disable_svrf)
        }
 }
 
+/*
+ * This function enables static routes when an interface it relies
+ * on in a different vrf is coming up.
+ *
+ * stable -> The stable we are looking at.
+ * ifp -> interface coming up
+ * afi -> the afi in question
+ * safi -> the safi in question
+ */
+static void static_fixup_intf_nh(struct route_table *stable,
+                                struct interface *ifp,
+                                afi_t afi, safi_t safi)
+{
+       struct route_node *rn;
+       struct static_route *si;
+
+       for (rn = route_top(stable); rn; rn = route_next(rn)) {
+               for (si = rn->info; si; si = si->next) {
+                       if (si->nh_vrf_id != ifp->vrf_id)
+                               continue;
+
+                       if (si->ifindex != ifp->ifindex)
+                               continue;
+
+                       static_install_route(rn, si, safi);
+               }
+       }
+}
+
+/*
+ * This function enables static routes that rely on an interface in
+ * a different vrf when that interface comes up.
+ */
+void static_install_intf_nh(struct interface *ifp)
+{
+       struct route_table *stable;
+       struct vrf *vrf;
+       afi_t afi;
+       safi_t safi;
+
+       RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) {
+               struct static_vrf *svrf = vrf->info;
+
+               /* Not needed if same vrf since happens naturally */
+               if (vrf->vrf_id == ifp->vrf_id)
+                       continue;
+
+               /* Install any static routes configured for this interface. */
+               for (afi = AFI_IP; afi < AFI_MAX; afi++) {
+                       for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
+                               stable = svrf->stable[afi][safi];
+                               if (!stable)
+                                       continue;
+
+                               static_fixup_intf_nh(stable, ifp, afi, safi);
+                       }
+               }
+       }
+}
+
 /* called from if_{add,delete}_update, i.e. when ifindex becomes [in]valid */
 void static_ifindex_update(struct interface *ifp, bool up)
 {