summaryrefslogtreecommitdiff
path: root/zebra/zebra_mpls.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/zebra_mpls.c')
-rw-r--r--zebra/zebra_mpls.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c
index 3765849adf..320176ba3a 100644
--- a/zebra/zebra_mpls.c
+++ b/zebra/zebra_mpls.c
@@ -846,8 +846,10 @@ static void lsp_uninstall_from_kernel(struct hash_backet *backet, void *ctxt)
if (CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
ret = kernel_del_lsp(lsp);
- if (!ret)
+ if (!ret) {
+ UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
clear_nhlfe_installed(lsp);
+ }
}
}
@@ -901,23 +903,45 @@ static wq_item_status lsp_process(struct work_queue *wq, void *data)
if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
/* Not already installed */
if (newbest) {
+
+ UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
ret = kernel_add_lsp(lsp);
+
+ if (!ret)
+ SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
+ else
+ clear_nhlfe_installed(lsp);
+
zvrf->lsp_installs++;
}
} else {
/* Installed, may need an update and/or delete. */
if (!newbest) {
+
ret = kernel_del_lsp(lsp);
+
+ if (!ret) {
+ UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
+ clear_nhlfe_installed(lsp);
+ }
+
zvrf->lsp_removals++;
} else if (CHECK_FLAG(lsp->flags, LSP_FLAG_CHANGED)) {
+
+ UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
+ UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
+
ret = kernel_upd_lsp(lsp);
+
+ if (!ret)
+ SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
+ else
+ clear_nhlfe_installed(lsp);
+
zvrf->lsp_installs++;
}
}
- if (!ret)
- clear_nhlfe_installed(lsp);
-
return WQ_SUCCESS;
}