]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospfd: do not remove area structure, while vls are configured
authorPhilippe Guibert <philippe.guibert@6wind.com>
Thu, 25 Oct 2018 07:02:24 +0000 (09:02 +0200)
committerEmanuele Di Pascale <emanuele@voltanet.io>
Thu, 10 Jan 2019 12:26:51 +0000 (13:26 +0100)
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 <philippe.guibert@6wind.com>
ospfd/ospf_interface.c
ospfd/ospf_interface.h
ospfd/ospfd.c

index 24584f671312912113614856b7eb4c90de5a1d11..7d77c38660468004ff80ca1adcc9278dcaf75565 100644 (file)
@@ -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..
  */
index 73ded208cf9940088624800881410629ae98ac15..b88d405875a5f4fee04695f828c0241562b41f0b 100644 (file)
@@ -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 *);
index b7dfedd15a42c5c283389a1c0bd24249aa32eb75..6f4a01becf6657136ab9340ac025f54b0d591b6a 100644 (file)
@@ -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