summaryrefslogtreecommitdiffstats
path: root/ospfd/ospfd.c
diff options
context:
space:
mode:
authorIgor Ryzhov <iryzhov@nfware.com>2021-03-29 13:47:43 +0200
committerIgor Ryzhov <iryzhov@nfware.com>2021-03-30 10:51:21 +0200
commitcbf32f74ef26de9c4b4eaa128b25d35d2c55b809 (patch)
tree3784884b4e809eebb8b7df8cc0e911d75c858bfc /ospfd/ospfd.c
parentMerge pull request #8326 from idryzhov/hide-show-config (diff)
downloadfrr-cbf32f74ef26de9c4b4eaa128b25d35d2c55b809.tar.xz
frr-cbf32f74ef26de9c4b4eaa128b25d35d2c55b809.zip
ospfd: fix counting of "ip ospf area" commands
Instead of trying to maintain if_ospf_cli_count, let's directly count the number of configured interfaces when it is needed. Current approach sometimes leads to an incorrect counter. Fixes #8321. Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
Diffstat (limited to 'ospfd/ospfd.c')
-rw-r--r--ospfd/ospfd.c47
1 files changed, 17 insertions, 30 deletions
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index 9856e6013..077d7c0fb 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -476,41 +476,11 @@ struct ospf *ospf_lookup_by_inst_name(unsigned short instance, const char *name)
static void ospf_init(struct ospf *ospf)
{
- struct vrf *vrf;
- struct interface *ifp;
-
ospf_opaque_type11_lsa_init(ospf);
if (ospf->vrf_id != VRF_UNKNOWN)
ospf->oi_running = 1;
- /* Activate 'ip ospf area x' configured interfaces for given
- * vrf. Activate area on vrf x aware interfaces.
- * vrf_enable callback calls router_id_update which
- * internally will call ospf_if_update to trigger
- * network_run_state
- */
- vrf = vrf_lookup_by_id(ospf->vrf_id);
-
- FOR_ALL_INTERFACES (vrf, ifp) {
- struct ospf_if_params *params;
- struct route_node *rn;
- uint32_t count = 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_interface_area_set(ospf, ifp);
- ospf->if_ospf_cli_count += count;
- }
- }
-
ospf_router_id_update(ospf);
}
@@ -554,6 +524,23 @@ struct ospf *ospf_lookup_by_vrf_id(vrf_id_t vrf_id)
return (vrf->info) ? (struct ospf *)vrf->info : NULL;
}
+uint32_t ospf_count_area_params(struct ospf *ospf)
+{
+ struct vrf *vrf;
+ struct interface *ifp;
+ uint32_t count = 0;
+
+ if (ospf->vrf_id != VRF_UNKNOWN) {
+ vrf = vrf_lookup_by_id(ospf->vrf_id);
+
+ FOR_ALL_INTERFACES (vrf, ifp) {
+ count += ospf_if_count_area_params(ifp);
+ }
+ }
+
+ return count;
+}
+
/* It should only be used when processing incoming info update from zebra.
* Other situations, it is not sufficient to lookup the ospf instance by
* vrf_name only without using the instance number.