/* Flush (inline) all external LSAs which now match the new
router-id,
- need to adjust the OSPF_LSA_SELF flag, so the flush doesnt
+ need to adjust the OSPF_LSA_SELF flag, so the flush doesn't
hit
asserts in ospf_refresher_unregister_lsa(). This step is
needed
new->instance = instance;
new->router_id.s_addr = htonl(0);
new->router_id_static.s_addr = htonl(0);
- if (name && !strmatch(name, VRF_DEFAULT_NAME)) {
- new->vrf_id = VRF_UNKNOWN;
+ if (name) {
+ vrf = vrf_lookup_by_name(name);
+ if (vrf)
+ new->vrf_id = vrf->vrf_id;
+ else
+ new->vrf_id = VRF_UNKNOWN;
/* Freed in ospf_finish_final */
new->name = XSTRDUP(MTYPE_OSPF_TOP, name);
if (IS_DEBUG_OSPF_EVENT)
new->lsa_refresh_interval, &new->t_lsa_refresher);
new->lsa_refresher_started = monotime(NULL);
- if ((new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE + 1)) == NULL) {
- zlog_err(
- "ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
- OSPF_MAX_PACKET_SIZE + 1);
- exit(1);
- }
+ new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE + 1);
+
new->t_read = NULL;
new->oi_write_q = list_new();
new->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
new->fd = -1;
if ((ospf_sock_init(new)) < 0) {
if (new->vrf_id != VRF_UNKNOWN)
- zlog_warn(
+ flog_err(
+ EC_LIB_SOCKET,
"%s: ospf_sock_init is unable to open a socket",
__func__);
return new;
vrf = vrf_lookup_by_id(vrf_id);
if (!vrf)
return NULL;
+ return ospf_lookup_by_vrf(vrf);
+}
+
+struct ospf *ospf_lookup_by_vrf(struct vrf *vrf)
+{
return (vrf->info) ? (struct ospf *)vrf->info : NULL;
}
for (ALL_LIST_ELEMENTS(ospf->vlinks, node, nnode, vl_data))
ospf_vl_delete(ospf, vl_data);
- list_delete_and_null(&ospf->vlinks);
+ list_delete(&ospf->vlinks);
/* Remove any ospf interface config params */
FOR_ALL_INTERFACES (vrf, ifp) {
/* Reset interface. */
for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi))
ospf_if_free(oi);
- list_delete_and_null(&ospf->oiflist);
+ list_delete(&ospf->oiflist);
/* De-Register VRF */
ospf_zebra_vrf_deregister(ospf);
ospf_lsdb_free(ospf->lsdb);
for (rn = route_top(ospf->maxage_lsa); rn; rn = route_next(rn)) {
- struct ospf_lsa *lsa;
-
if ((lsa = rn->info) != NULL) {
ospf_lsa_unlock(&lsa);
rn->info = NULL;
ospf_ase_external_lsas_finish(ospf->external_lsas);
}
- list_delete_and_null(&ospf->areas);
- list_delete_and_null(&ospf->oi_write_q);
+ list_delete(&ospf->areas);
+ list_delete(&ospf->oi_write_q);
for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++) {
struct list *ext_list;
- struct listnode *node;
struct ospf_external *ext;
ext_list = ospf->external[i];
ospf_lsa_unlock(&area->router_lsa_self);
route_table_finish(area->ranges);
- list_delete_and_null(&area->oiflist);
+ list_delete(&area->oiflist);
if (EXPORT_NAME(area))
free(EXPORT_NAME(area));
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
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
*/
if ((lst = (struct list *)rn->info)) {
for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
ospf_lsa_unlock(&lsa); /* oi->ls_upd_queue */
- list_delete_and_null(&lst);
+ list_delete(&lst);
rn->info = NULL;
}
if (IS_DEBUG_OSPF_EVENT)
zlog_debug(
- "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
- __PRETTY_FUNCTION__, ifp->name, ifp->vrf_id,
+ "%s: interface %s ifp->vrf->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
+ __PRETTY_FUNCTION__, ifp->name, vrf_to_id(ifp->vrf),
ospf_vrf_id_to_name(ospf->vrf_id), ospf->vrf_id,
inet_ntoa(ospf->router_id));