From 771d72dea934d0a53ea0b4153ad5a7add41f63e4 Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Thu, 25 Oct 2018 09:02:24 +0200 Subject: [PATCH] ospfd: do not remove area structure, while vls are configured when adding/removing virtual links per interface, sometimes, the ospf virtual link can not be removed, whereas the associated area is already removed. Do not remove the area while a virtual link is yet configured. Signed-off-by: Philippe Guibert --- ospfd/ospf_interface.c | 17 +++++++++++++++++ ospfd/ospf_interface.h | 1 + ospfd/ospfd.c | 1 + 3 files changed, 19 insertions(+) diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index 24584f6713..7d77c38660 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 73ded208cf..b88d405875 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 b7dfedd15a..6f4a01becf 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -895,6 +895,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 -- 2.39.5