/*
* Extended Link/Prefix termination function
*
- * @param - node
- *
+ * @param - none
* @return - none
*/
void ospf_ext_term(void)
{
+ if ((OspfEXT.scope != OSPF_OPAQUE_AREA_LSA)
+ || (OspfEXT.scope != OSPF_OPAQUE_AS_LSA))
+ zlog_warn(
+ "EXT: Unable to unregister Extended Prefix "
+ "Opaque LSA functions: Wrong scope!");
+ else
+ ospf_delete_opaque_functab(OspfEXT.scope,
+ OPAQUE_TYPE_EXTENDED_PREFIX_LSA);
+
+ ospf_delete_opaque_functab(OSPF_OPAQUE_AREA_LSA,
+ OPAQUE_TYPE_EXTENDED_LINK_LSA);
+
list_delete_and_null(&OspfEXT.iflist);
OspfEXT.scope = 0;
OspfEXT.enabled = false;
+ return;
+}
+
+/*
+ * Extended Link/Prefix finish function
+ *
+ * @param - none
+ * @return - none
+ */
+void ospf_ext_finish(void)
+{
+ // list_delete_all_node(OspfEXT.iflist);
+ OspfEXT.enabled = false;
}
/*
/* Prototypes. */
extern int ospf_ext_init(void);
extern void ospf_ext_term(void);
+extern void ospf_ext_finish(void);
extern void ospf_ext_update_sr(bool enable);
extern uint32_t ospf_ext_schedule_prefix_index(struct interface *ifp,
uint32_t index,
return;
}
+void ospf_opaque_finish(void)
+{
+ ospf_router_info_finish();
+
+ ospf_ext_finish();
+
+ ospf_sr_finish();
+}
+
int ospf_opaque_type9_lsa_init(struct ospf_interface *oi)
{
if (oi->opaque_lsa_self != NULL)
extern void ospf_opaque_init(void);
extern void ospf_opaque_term(void);
+extern void ospf_opaque_finish(void);
extern int ospf_opaque_type9_lsa_init(struct ospf_interface *oi);
extern void ospf_opaque_type9_lsa_term(struct ospf_interface *oi);
extern int ospf_opaque_type10_lsa_init(struct ospf_area *area);
return rc;
}
+static int ospf_router_info_unregister()
+{
+
+ if ((OspfRI.scope != OSPF_OPAQUE_AS_LSA)
+ && (OspfRI.scope != OSPF_OPAQUE_AREA_LSA)) {
+ zlog_warn(
+ "Unable to unregister Router Info functions: Wrong scope!");
+ return -1;
+ }
+
+ ospf_delete_opaque_functab(OspfRI.scope,
+ OPAQUE_TYPE_ROUTER_INFORMATION_LSA);
+
+ OspfRI.registered = 0;
+ return 0;
+}
+
void ospf_router_info_term(void)
{
OspfRI.enabled = false;
+ ospf_router_info_unregister();
+
return;
}
+void ospf_router_info_finish(void)
+{
+ list_delete_all_node(OspfRI.pce_info.pce_domain);
+ list_delete_all_node(OspfRI.pce_info.pce_neighbor);
+
+ OspfRI.enabled = false;
+}
+
static void del_pce_info(void *val)
{
XFREE(MTYPE_OSPF_PCE_PARAMS, val);
/* Prototypes. */
extern int ospf_router_info_init(void);
extern void ospf_router_info_term(void);
+extern void ospf_router_info_finish(void);
extern int ospf_router_info_enable(void);
extern void ospf_router_info_update_sr(bool enable, struct sr_srgb srgb,
uint8_t msd);
* Segment Routing termination function
*
* @param - nothing
- *
* @return - nothing
*/
void ospf_sr_term(void)
if (OspfSR.prefix)
route_table_finish(OspfSR.prefix);
+ OspfSR.enabled = false;
+ OspfSR.self = NULL;
+}
+
+/*
+ * Segment Routing finish function
+ *
+ * @param - nothing
+ * @return - nothing
+ */
+void ospf_sr_finish(void)
+{
+ /* Stop Segment Routing */
+ ospf_sr_stop();
+
OspfSR.enabled = false;
}
/* Segment Routing initialisation functions */
extern int ospf_sr_init(void);
extern void ospf_sr_term(void);
+extern void ospf_sr_finish(void);
/* Segment Routing LSA update & delete functions */
extern void ospf_sr_ri_lsa_update(struct ospf_lsa *lsa);
extern void ospf_sr_ri_lsa_delete(struct ospf_lsa *lsa);
return rc;
}
+static int ospf_mpls_te_unregister()
+{
+ u_int8_t scope;
+
+ if (OspfMplsTE.inter_as == Off)
+ return 0;
+
+ if (OspfMplsTE.inter_as == AS)
+ scope = OSPF_OPAQUE_AS_LSA;
+ else
+ scope = OSPF_OPAQUE_AREA_LSA;
+
+ ospf_delete_opaque_functab(scope, OPAQUE_TYPE_INTER_AS_LSA);
+
+ return 0;
+}
+
void ospf_mpls_te_term(void)
{
list_delete_and_null(&OspfMplsTE.iflist);
+ ospf_delete_opaque_functab(OSPF_OPAQUE_AREA_LSA,
+ OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA);
+
OspfMplsTE.enabled = false;
+ ospf_mpls_te_unregister();
OspfMplsTE.inter_as = Off;
return;
}
+void ospf_mpls_te_finish(void)
+{
+ // list_delete_all_node(OspfMplsTE.iflist);
+
+ OspfMplsTE.enabled = false;
+ OspfMplsTE.inter_as = Off;
+}
+
/*------------------------------------------------------------------------*
* Followings are control functions for MPLS-TE parameters management.
*------------------------------------------------------------------------*/
ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA);
}
+ /* Deregister the Callbacks for Inter-AS suport */
+ ospf_mpls_te_unregister();
+
return CMD_SUCCESS;
}
/* Prototypes. */
extern int ospf_mpls_te_init(void);
extern void ospf_mpls_te_term(void);
+extern void ospf_mpls_te_finish(void);
extern struct ospf_mpls_te *get_ospf_mpls_te(void);
extern void ospf_mpls_te_update_if(struct interface *);
extern void ospf_mpls_te_lsa_schedule(struct mpls_te_link *, enum lsa_opcode);
ospf_opaque_type11_lsa_term(ospf);
+ ospf_opaque_finish();
+
ospf_flush_self_originated_lsas_now(ospf);
/* Unregister redistribution */
if (!CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
instance = ospf->instance;
- ospf_opaque_term();
-
ospf_delete(ospf);
if (ospf->name) {