From 2b63430caa350b603a5173cea54e18719202f189 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 16 Nov 2017 12:46:10 -0500 Subject: [PATCH] zebra: Move some LSP flag handling to common code The LSP_FLAG_CHANGED and LSP_FLAG_INSTALLED flags should be handled in the common call function for adding/updating/removing a lsp to/from the kernel. Signed-off-by: Donald Sharp --- zebra/zebra_mpls.c | 20 +++++++++++++++++++- zebra/zebra_mpls_netlink.c | 19 +++++++------------ zebra/zebra_mpls_openbsd.c | 9 --------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index 3765849adf..6e7e521831 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,16 +903,32 @@ 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); + 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++; } } diff --git a/zebra/zebra_mpls_netlink.c b/zebra/zebra_mpls_netlink.c index 887c685498..0abc4959fa 100644 --- a/zebra/zebra_mpls_netlink.c +++ b/zebra/zebra_mpls_netlink.c @@ -36,10 +36,7 @@ int kernel_add_lsp(zebra_lsp_t *lsp) 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; } @@ -64,8 +61,6 @@ int kernel_upd_lsp(zebra_lsp_t *lsp) 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. */ @@ -82,8 +77,6 @@ int kernel_upd_lsp(zebra_lsp_t *lsp) } ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp); - if (!ret) - SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED); return ret; } @@ -93,15 +86,17 @@ int kernel_upd_lsp(zebra_lsp_t *lsp) */ 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) diff --git a/zebra/zebra_mpls_openbsd.c b/zebra/zebra_mpls_openbsd.c index 33f0d49d4d..44f89f0b3b 100644 --- a/zebra/zebra_mpls_openbsd.c +++ b/zebra/zebra_mpls_openbsd.c @@ -299,10 +299,7 @@ int kernel_add_lsp(zebra_lsp_t *lsp) 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; } @@ -314,11 +311,7 @@ int kernel_upd_lsp(zebra_lsp_t *lsp) 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; } @@ -334,8 +327,6 @@ int kernel_del_lsp(zebra_lsp_t *lsp) return -1; ret = kernel_lsp_cmd(RTM_DELETE, lsp); - if (!ret) - UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED); return ret; } -- 2.39.5