summaryrefslogtreecommitdiffstats
path: root/ospfd
diff options
context:
space:
mode:
authorRuss White <russ@riw.us>2018-11-01 02:41:28 +0100
committerGitHub <noreply@github.com>2018-11-01 02:41:28 +0100
commit55123eb040781bda93b4055d09d7c303af2e38ac (patch)
tree84b6a953cac365dfd5cda4b510afa09baa7a1417 /ospfd
parentMerge pull request #3139 from adharkar/frr-bgp_cli (diff)
parentospfd: do not remove area structure, while vls are configured (diff)
downloadfrr-55123eb040781bda93b4055d09d7c303af2e38ac.tar.xz
frr-55123eb040781bda93b4055d09d7c303af2e38ac.zip
Merge pull request #3239 from pguibert6WIND/ospf_virtual_link_config
ospfd: do not remove area structure, while vls are configured
Diffstat (limited to 'ospfd')
-rw-r--r--ospfd/ospf_interface.c17
-rw-r--r--ospfd/ospf_interface.h1
-rw-r--r--ospfd/ospfd.c1
3 files changed, 19 insertions, 0 deletions
diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c
index ddb25a20f..f1477ba14 100644
--- a/ospfd/ospf_interface.c
+++ b/ospfd/ospf_interface.c
@@ -920,6 +920,23 @@ static void ospf_vl_if_delete(struct ospf_vl_data *vl_data)
vlink_count--;
}
+/* for a defined area, count the number of configured vl
+ */
+int ospf_vl_count(struct ospf *ospf, struct ospf_area *area)
+{
+ int count = 0;
+ struct ospf_vl_data *vl_data;
+ struct listnode *node;
+
+ for (ALL_LIST_ELEMENTS_RO(ospf->vlinks, node, vl_data)) {
+ if (area
+ && !IPV4_ADDR_SAME(&vl_data->vl_area_id, &area->area_id))
+ continue;
+ count++;
+ }
+ return count;
+}
+
/* Look up vl_data for given peer, optionally qualified to be in the
* specified area. NULL area returns first found..
*/
diff --git a/ospfd/ospf_interface.h b/ospfd/ospf_interface.h
index 73ded208c..b88d40587 100644
--- a/ospfd/ospf_interface.h
+++ b/ospfd/ospf_interface.h
@@ -300,6 +300,7 @@ extern struct ospf_vl_data *ospf_vl_data_new(struct ospf_area *,
struct in_addr);
extern struct ospf_vl_data *ospf_vl_lookup(struct ospf *, struct ospf_area *,
struct in_addr);
+extern int ospf_vl_count(struct ospf *ospf, struct ospf_area *area);
extern void ospf_vl_data_free(struct ospf_vl_data *);
extern void ospf_vl_add(struct ospf *, struct ospf_vl_data *);
extern void ospf_vl_delete(struct ospf *, struct ospf_vl_data *);
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index aa40dd0eb..d5d1a7a60 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -890,6 +890,7 @@ void ospf_area_check_free(struct ospf *ospf, struct in_addr area_id)
area = ospf_area_lookup_by_area_id(ospf, area_id);
if (area && listcount(area->oiflist) == 0 && area->ranges->top == NULL
+ && !ospf_vl_count(ospf, area)
&& area->shortcut_configured == OSPF_SHORTCUT_DEFAULT
&& area->external_routing == OSPF_AREA_DEFAULT
&& area->no_summary == 0 && area->default_cost == 1