lsp_free(lsp_table, plsp);
}
+static void lsp_free_nhlfe(struct zebra_lsp *lsp)
+{
+ struct zebra_nhlfe *nhlfe;
+
+ while ((nhlfe = nhlfe_list_first(&lsp->nhlfe_list))) {
+ nhlfe_list_del(&lsp->nhlfe_list, nhlfe);
+ nhlfe_free(nhlfe);
+ }
+
+ while ((nhlfe = nhlfe_list_first(&lsp->backup_nhlfe_list))) {
+ nhlfe_list_del(&lsp->backup_nhlfe_list, nhlfe);
+ nhlfe_free(nhlfe);
+ }
+}
+
/*
* Dtor for an LSP: remove from ile hash, release any internal allocations,
* free LSP object.
static void lsp_free(struct hash *lsp_table, struct zebra_lsp **plsp)
{
struct zebra_lsp *lsp;
- struct zebra_nhlfe *nhlfe;
if (plsp == NULL || *plsp == NULL)
return;
zlog_debug("Free LSP in-label %u flags 0x%x",
lsp->ile.in_label, lsp->flags);
- /* Free nhlfes, if any. */
- frr_each_safe(nhlfe_list, &lsp->nhlfe_list, nhlfe)
- nhlfe_del(nhlfe);
-
- /* Free backup nhlfes, if any. */
- frr_each_safe(nhlfe_list, &lsp->backup_nhlfe_list, nhlfe)
- nhlfe_del(nhlfe);
+ lsp_free_nhlfe(lsp);
hash_release(lsp_table, &lsp->ile);
XFREE(MTYPE_LSP, lsp);
*/
if (nhlfe_list_first(&lsp->nhlfe_list) == NULL) {
lsp = hash_release(slsp_table, &tmp_ile);
+ lsp_free_nhlfe(lsp);
XFREE(MTYPE_LSP, lsp);
}
{
struct zebra_lsp *lsp = p;
+ lsp_free_nhlfe(lsp);
+
XFREE(MTYPE_LSP, lsp);
}