]> git.proxmox.com Git - mirror_frr.git/blobdiff - staticd/static_routes.c
doc: add frr_{each,with} to coding style
[mirror_frr.git] / staticd / static_routes.c
index a5f0f74b003e667d21ae201ee068b29e3f8412c2..34f58a98e23ff8d6b63aad239c8623a9f7d6b7c5 100644 (file)
@@ -39,7 +39,7 @@ static void static_install_route(struct route_node *rn,
        struct static_route *si;
 
        for (si = rn->info; si; si = si->next)
-               static_zebra_nht_register(si, true);
+               static_zebra_nht_register(rn, si, true);
 
        si = rn->info;
        if (si)
@@ -73,6 +73,7 @@ int static_add_route(afi_t afi, safi_t safi, uint8_t type, struct prefix *p,
        struct static_route *cp;
        struct static_route *update = NULL;
        struct route_table *stable = svrf->stable[afi][safi];
+       struct interface *ifp;
 
        if (!stable)
                return -1;
@@ -127,7 +128,7 @@ int static_add_route(afi_t afi, safi_t safi, uint8_t type, struct prefix *p,
        si->tag = tag;
        si->vrf_id = svrf->vrf->vrf_id;
        si->nh_vrf_id = nh_svrf->vrf->vrf_id;
-       strcpy(si->nh_vrfname, nh_svrf->vrf->name);
+       strlcpy(si->nh_vrfname, nh_svrf->vrf->name, sizeof(si->nh_vrfname));
        si->table_id = table_id;
        si->onlink = onlink;
 
@@ -182,11 +183,26 @@ int static_add_route(afi_t afi, safi_t safi, uint8_t type, struct prefix *p,
        si->next = cp;
 
        /* check whether interface exists in system & install if it does */
-       if (!ifname)
-               static_install_route(rn, si, safi);
-       else {
-               struct interface *ifp;
+       switch (si->type) {
+       case STATIC_IPV4_GATEWAY:
+       case STATIC_IPV6_GATEWAY:
+               static_zebra_nht_register(rn, si, true);
+               break;
+       case STATIC_IPV4_GATEWAY_IFNAME:
+       case STATIC_IPV6_GATEWAY_IFNAME:
+               ifp =  if_lookup_by_name(ifname, nh_svrf->vrf->vrf_id);
+               if (ifp && ifp->ifindex != IFINDEX_INTERNAL)
+                       si->ifindex = ifp->ifindex;
+               else
+                       zlog_warn("Static Route using %s interface not installed because the interface does not exist in specified vrf",
+                                 ifname);
 
+               static_zebra_nht_register(rn, si, true);
+               break;
+       case STATIC_BLACKHOLE:
+               static_install_route(rn, si, safi);
+               break;
+       case STATIC_IFNAME:
                ifp = if_lookup_by_name(ifname, nh_svrf->vrf->vrf_id);
                if (ifp && ifp->ifindex != IFINDEX_INTERNAL) {
                        si->ifindex = ifp->ifindex;
@@ -194,6 +210,8 @@ int static_add_route(afi_t afi, safi_t safi, uint8_t type, struct prefix *p,
                } else
                        zlog_warn("Static Route using %s interface not installed because the interface does not exist in specified vrf",
                                  ifname);
+
+               break;
        }
 
        return 1;
@@ -242,7 +260,7 @@ int static_delete_route(afi_t afi, safi_t safi, uint8_t type, struct prefix *p,
                return 0;
        }
 
-       static_zebra_nht_register(si, false);
+       static_zebra_nht_register(rn, si, false);
 
        /* Unlink static route from linked list. */
        if (si->prev)
@@ -329,6 +347,7 @@ static void static_fixup_vrf(struct static_vrf *svrf,
                                continue;
 
                        si->nh_vrf_id = svrf->vrf->vrf_id;
+                       si->nh_registered = false;
                        if (si->ifindex) {
                                ifp = if_lookup_by_name(si->ifname,
                                                        si->nh_vrf_id);