]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospfd: correctly process interface creation/destruction
authorIgor Ryzhov <iryzhov@nfware.com>
Tue, 13 Oct 2020 22:20:53 +0000 (01:20 +0300)
committerIgor Ryzhov <iryzhov@nfware.com>
Wed, 28 Oct 2020 18:35:49 +0000 (21:35 +0300)
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
ospfd/ospf_interface.c

index 31ea603e0fd4867349c728a89b11f7fd11506cbd..a2e7d2b1f8b7e9aeeb310174b893f3c250852d1c 100644 (file)
@@ -1241,6 +1241,9 @@ void ospf_if_interface(struct interface *ifp)
 static int ospf_ifp_create(struct interface *ifp)
 {
        struct ospf *ospf = NULL;
+       struct ospf_if_params *params;
+       struct route_node *rn;
+       uint32_t count = 0;
 
        if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
                zlog_debug(
@@ -1262,6 +1265,19 @@ static int ospf_ifp_create(struct interface *ifp)
        if (!ospf)
                return 0;
 
+       params = IF_DEF_PARAMS(ifp);
+       if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
+               count++;
+
+       for (rn = route_top(IF_OIFS_PARAMS(ifp)); rn; rn = route_next(rn))
+               if ((params = rn->info) && OSPF_IF_PARAM_CONFIGURED(params, if_area))
+                       count++;
+
+       if (count > 0) {
+               ospf->if_ospf_cli_count += count;
+               ospf_interface_area_set(ospf, ifp);
+       }
+
        ospf_if_recalculate_output_cost(ifp);
 
        ospf_if_update(ospf, ifp);
@@ -1327,7 +1343,10 @@ static int ospf_ifp_down(struct interface *ifp)
 
 static int ospf_ifp_destroy(struct interface *ifp)
 {
+       struct ospf *ospf;
+       struct ospf_if_params *params;
        struct route_node *rn;
+       uint32_t count = 0;
 
        if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
                zlog_debug(
@@ -1338,6 +1357,22 @@ static int ospf_ifp_destroy(struct interface *ifp)
 
        hook_call(ospf_if_delete, ifp);
 
+       ospf = ospf_lookup_by_vrf_id(ifp->vrf_id);
+       if (ospf) {
+               params = IF_DEF_PARAMS(ifp);
+               if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
+                       count++;
+
+               for (rn = route_top(IF_OIFS_PARAMS(ifp)); rn; rn = route_next(rn))
+                       if ((params = rn->info) && OSPF_IF_PARAM_CONFIGURED(params, if_area))
+                               count++;
+
+               if (count > 0) {
+                       ospf->if_ospf_cli_count -= count;
+                       ospf_interface_area_unset(ospf, ifp);
+               }
+       }
+
        for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn))
                if (rn->info)
                        ospf_if_free((struct ospf_interface *)rn->info);