]> git.proxmox.com Git - mirror_frr.git/blobdiff - staticd/static_nht.c
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[mirror_frr.git] / staticd / static_nht.c
index c6e4587b6aafa1691cffb49082a7c12c73b1fea9..44f7fb79da8d45eb6fba677a93078d1d9cb6941e 100644 (file)
@@ -29,8 +29,8 @@
 #include "static_zebra.h"
 #include "static_nht.h"
 
-void static_nht_update(struct prefix *p, uint32_t nh_num,
-                      afi_t afi, vrf_id_t vrf_id)
+void static_nht_update(struct prefix *p, uint32_t nh_num, afi_t afi,
+                      vrf_id_t nh_vrf_id)
 {
        struct route_table *stable;
        struct static_route *si;
@@ -40,41 +40,47 @@ void static_nht_update(struct prefix *p, uint32_t nh_num,
        bool orig;
        bool reinstall;
 
-       vrf = vrf_lookup_by_id(vrf_id);
+       RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+               svrf = vrf->info;
+               if (!svrf)
+                       continue;
 
-       if (!vrf || !vrf->info)
-               return;
+               stable = static_vrf_static_table(afi, SAFI_UNICAST, svrf);
+               if (!stable)
+                       continue;
 
-       svrf = vrf->info;
-       stable = static_vrf_static_table(afi, SAFI_UNICAST, svrf);
-       if (!stable)
-               return;
+               for (rn = route_top(stable); rn; rn = route_next(rn)) {
+                       reinstall = false;
+                       for (si = rn->info; si; si = si->next) {
+                               if (si->nh_vrf_id != nh_vrf_id)
+                                       continue;
 
-       for (rn = route_top(stable); rn; rn = route_next(rn)) {
-               reinstall = false;
-               for (si = rn->info; si; si = si->next) {
-                       if (si->type != STATIC_IPV4_GATEWAY &&
-                           si->type != STATIC_IPV4_GATEWAY_IFNAME &&
-                           si->type != STATIC_IPV6_GATEWAY &&
-                           si->type != STATIC_IPV6_GATEWAY_IFNAME)
-                               continue;
+                               if (si->type != STATIC_IPV4_GATEWAY
+                                   && si->type != STATIC_IPV4_GATEWAY_IFNAME
+                                   && si->type != STATIC_IPV6_GATEWAY
+                                   && si->type != STATIC_IPV6_GATEWAY_IFNAME)
+                                       continue;
 
-                       orig = si->nh_valid;
-                       if (p->family == AF_INET &&
-                           p->u.prefix4.s_addr == si->addr.ipv4.s_addr)
-                               si->nh_valid = !!nh_num;
+                               orig = si->nh_valid;
+                               if (p->family == AF_INET
+                                   && p->u.prefix4.s_addr
+                                              == si->addr.ipv4.s_addr)
+                                       si->nh_valid = !!nh_num;
 
-                       if (p->family == AF_INET6 &&
-                           memcmp(&p->u.prefix6, &si->addr.ipv6, 16) == 0)
-                               si->nh_valid = !!nh_num;
+                               if (p->family == AF_INET6
+                                   && memcmp(&p->u.prefix6, &si->addr.ipv6, 16)
+                                              == 0)
+                                       si->nh_valid = !!nh_num;
 
-                       if (orig != si->nh_valid)
-                               reinstall = true;
+                               if (orig != si->nh_valid)
+                                       reinstall = true;
 
-                       if (reinstall) {
-                               static_zebra_route_add(rn, si, vrf_id,
-                                                      SAFI_UNICAST, true);
-                               reinstall = false;
+                               if (reinstall) {
+                                       static_zebra_route_add(
+                                               rn, si, vrf->vrf_id,
+                                               SAFI_UNICAST, true);
+                                       reinstall = false;
+                               }
                        }
                }
        }