Merge pull request #3295 from pguibert6WIND/ospf_area_unconfigure

ospfd: permit reconfiguring network after area suppressed
This commit is contained in:
David Lamparter 2018-11-13 16:40:58 +01:00 committed by GitHub
commit cd5b3742d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 2 deletions

View File

@ -245,8 +245,11 @@ DEFUN_NOSH (router_ospf,
return ret;
}
}
ospf_interface_area_set(ospf, ifp);
ospf->if_ospf_cli_count++;
if (!ospf_interface_area_is_already_set(ospf,
ifp)) {
ospf_interface_area_set(ospf, ifp);
ospf->if_ospf_cli_count++;
}
}
}

View File

@ -1149,6 +1149,32 @@ void ospf_interface_area_unset(struct ospf *ospf, struct interface *ifp)
update_redistributed(ospf, 0); /* interfaces possibly removed */
}
bool ospf_interface_area_is_already_set(struct ospf *ospf,
struct interface *ifp)
{
struct route_node *rn_oi;
if (!ospf)
return false; /* Ospf not ready yet */
/* Find interfaces that may need to be removed. */
for (rn_oi = route_top(IF_OIFS(ifp)); rn_oi;
rn_oi = route_next(rn_oi)) {
struct ospf_interface *oi = rn_oi->info;
if (oi == NULL)
continue;
if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
continue;
/* at least one route covered by interface
* that implies already done
*/
return true;
}
return false;
}
/* Check whether interface matches given network
* returns: 1, true. 0, false
*/

View File

@ -561,6 +561,8 @@ extern void ospf_area_del_if(struct ospf_area *, struct ospf_interface *);
extern void ospf_interface_area_set(struct ospf *, struct interface *);
extern void ospf_interface_area_unset(struct ospf *, struct interface *);
extern bool ospf_interface_area_is_already_set(struct ospf *ospf,
struct interface *ifp);
extern void ospf_route_map_init(void);