diff options
author | Russ White <russ@riw.us> | 2018-11-01 02:41:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-01 02:41:28 +0100 |
commit | 55123eb040781bda93b4055d09d7c303af2e38ac (patch) | |
tree | 84b6a953cac365dfd5cda4b510afa09baa7a1417 /ospfd | |
parent | Merge pull request #3139 from adharkar/frr-bgp_cli (diff) | |
parent | ospfd: do not remove area structure, while vls are configured (diff) | |
download | frr-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.c | 17 | ||||
-rw-r--r-- | ospfd/ospf_interface.h | 1 | ||||
-rw-r--r-- | ospfd/ospfd.c | 1 |
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 |