return (IPV4_ADDR_SAME(&srn->adv_router, rid));
}
-/* Functions to free memory space, segment routing */
-static void del_sr_info(void *val)
+/* Functions to remove an SR Link */
+static void del_sr_link(void *val)
{
+ struct sr_link *srl = (struct sr_link *)val;
+
+ del_sid_nhlfe(srl->nhlfe[0]);
+ del_sid_nhlfe(srl->nhlfe[1]);
+ XFREE(MTYPE_OSPF_SR_PARAMS, val);
+ return;
+}
+
+/* Functions to remove an SR Prefix */
+static void del_sr_pref(void *val)
+{
+ struct sr_prefix *srp = (struct sr_prefix *)val;
+
+ del_sid_nhlfe(srp->nhlfe);
XFREE(MTYPE_OSPF_SR_PARAMS, val);
return;
}
/* Default Algorithm, SRGB and MSD */
for (int i = 0; i < ALGORITHM_COUNT; i++)
- OspfSR.algo[i] = SR_ALGORITHM_UNSET;
+ new->algo[i] = SR_ALGORITHM_UNSET;
new->srgb.range_size = 0;
new->srgb.lower_bound = 0;
/* Create Link, Prefix and Range TLVs list */
new->ext_link = list_new();
new->ext_prefix = list_new();
- new->ext_link->del = del_sr_info;
- new->ext_prefix->del = del_sr_info;
+ new->ext_link->del = del_sr_link;
+ new->ext_prefix->del = del_sr_pref;
/* Check if list are correctly created */
if (new->ext_link == NULL || new->ext_prefix == NULL) {
/* Delete Segment Routing node */
static void sr_node_del(struct sr_node *srn)
{
- struct listnode *node;
- struct sr_link *srl;
- struct sr_prefix *srp;
-
/* Sanity Check */
if (srn == NULL)
return;
/* Clean Extended Link */
- if (listcount(srn->ext_link) != 0) {
- for (ALL_LIST_ELEMENTS_RO(srn->ext_link, node, srl)) {
- listnode_delete(srn->ext_link, srl);
- XFREE(MTYPE_OSPF_SR_PARAMS, srl);
- }
- }
- list_delete_original(srn->ext_link);
+ list_delete_and_null(&srn->ext_link);
/* Clean Prefix List */
- if (listcount(srn->ext_prefix) != 0) {
- for (ALL_LIST_ELEMENTS_RO(srn->ext_prefix, node, srp)) {
- listnode_delete(srn->ext_prefix, srp);
- XFREE(MTYPE_OSPF_SR_PARAMS, srp);
- }
- }
- list_delete_original(srn->ext_prefix);
+ list_delete_and_null(&srn->ext_prefix);
XFREE(MTYPE_OSPF_SR_PARAMS, srn);
}
srn = (struct sr_node *)hash_lookup(OspfSR.neighbors,
(void *)&(lsah->adv_router));
- /* Sanity check */
+ /* SR-Node may be NULL if it has been remove previously when
+ * processing Router Information LSA deletion */
if (srn == NULL) {
- zlog_err(
- "SR (ospf_sr_ext_link_lsa_delete): Abort! "
+ zlog_warn(
+ "SR (ospf_sr_ext_link_lsa_delete): Stop! "
"no entry in SRDB for SR Node %s",
inet_ntoa(lsah->adv_router));
return;
break;
/* Remove Segment Link if found */
- if (srl->instance == instance) {
+ if ((srl != NULL) && (srl->instance == instance)) {
del_sid_nhlfe(srl->nhlfe[0]);
del_sid_nhlfe(srl->nhlfe[1]);
listnode_delete(srn->ext_link, srl);
srn = (struct sr_node *)hash_lookup(OspfSR.neighbors,
(void *)&(lsah->adv_router));
- /* Sanity check */
+ /* SR-Node may be NULL if it has been remove previously when
+ * processing Router Information LSA deletion */
if (srn == NULL) {
- zlog_err(
- "SR (ospf_sr_ext_prefix_lsa_delete): Abort! "
+ zlog_warn(
+ "SR (ospf_sr_ext_prefix_lsa_delete): Stop! "
"no entry in SRDB for SR Node %s",
inet_ntoa(lsah->adv_router));
return;
break;
/* Remove Segment Link if found */
- if (srp->instance == instance) {
+ if ((srp != NULL) && (srp->instance == instance)) {
del_sid_nhlfe(srp->nhlfe);
listnode_delete(srn->ext_link, srp);
XFREE(MTYPE_OSPF_SR_PARAMS, srp);