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);
+ }
}
}
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);
+
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);
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);
+
zvrf->lsp_installs++;
}
}
if (!lsp || !lsp->best_nhlfe) // unexpected
return -1;
- UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
- if (!ret)
- SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
return ret;
}
if (!lsp || !lsp->best_nhlfe) // unexpected
return -1;
- UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
-
/* Any NHLFE that was installed but is not selected now needs to
* have its flags updated.
*/
}
ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
- if (!ret)
- SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
return ret;
}
*/
int kernel_del_lsp(zebra_lsp_t *lsp)
{
+ int ret;
+
if (!lsp) // unexpected
return -1;
- if (CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
- netlink_mpls_multipath(RTM_DELROUTE, lsp);
- UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
- }
+ if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED))
+ return -1;
- return 0;
+ ret = netlink_mpls_multipath(RTM_DELROUTE, lsp);
+
+ return ret;
}
int mpls_kernel_init(void)
if (!lsp || !lsp->best_nhlfe) // unexpected
return -1;
- UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
ret = kernel_lsp_cmd(RTM_ADD, lsp);
- if (!ret)
- SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
return ret;
}
if (!lsp || !lsp->best_nhlfe) // unexpected
return -1;
- UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
- UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
ret = kernel_lsp_cmd(RTM_CHANGE, lsp);
- if (!ret)
- SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
return ret;
}
return -1;
ret = kernel_lsp_cmd(RTM_DELETE, lsp);
- if (!ret)
- UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
return ret;
}