]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: Fix route replace flags
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 29 Nov 2017 16:54:27 +0000 (11:54 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 29 Nov 2017 18:01:01 +0000 (13:01 -0500)
When doing a route replace, on openbsd we were not
marking the old lsp as no longer installed, while
on linux we were.  Move the abstraction up a layer.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
zebra/zebra_mpls.c
zebra/zebra_mpls_netlink.c

index 57d29050c95c99c14dc793a9eff0bcfc30a36c41..4c6fb002dca301b069760dc228df4a3020164423 100644 (file)
@@ -909,10 +909,33 @@ static wq_item_status lsp_process(struct work_queue *wq, void *data)
 
                        zvrf->lsp_removals++;
                } else if (CHECK_FLAG(lsp->flags, LSP_FLAG_CHANGED)) {
+                       zebra_nhlfe_t *nhlfe;
+                       struct nexthop *nexthop;
 
                        UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
                        UNSET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);
 
+                       /*
+                        * Any NHLFE that was installed but is not
+                        * selected now needs to have its flags updated.
+                        */
+                       for (nhlfe = lsp->nhlfe_list;
+                            nhlfe; nhlfe = nhlfe->next) {
+                               nexthop = nhlfe->nexthop;
+                               if (!nexthop)
+                                       continue;
+
+                               if (CHECK_FLAG(nhlfe->flags,
+                                              NHLFE_FLAG_INSTALLED) &&
+                                   !CHECK_FLAG(nhlfe->flags,
+                                               NHLFE_FLAG_SELECTED)) {
+                                       UNSET_FLAG(nhlfe->flags,
+                                                  NHLFE_FLAG_INSTALLED);
+                                       UNSET_FLAG(nexthop->flags,
+                                                  NEXTHOP_FLAG_FIB);
+                               }
+                       }
+
                        kernel_upd_lsp(lsp);
 
                        zvrf->lsp_installs++;
index 64b1a7c0ac3de15cebacab8345cff909b0d4c2c9..3c8d25189e98312ff90953e5c757949f1487b7f4 100644 (file)
@@ -60,29 +60,12 @@ void kernel_add_lsp(zebra_lsp_t *lsp)
 void kernel_upd_lsp(zebra_lsp_t *lsp)
 {
        int ret;
-       zebra_nhlfe_t *nhlfe;
-       struct nexthop *nexthop;
 
        if (!lsp || !lsp->best_nhlfe) { // unexpected
                kernel_lsp_pass_fail(lsp, SOUTHBOUND_INSTALL_FAILURE);
                return;
        }
 
-       /* Any NHLFE that was installed but is not selected now needs to
-        * have its flags updated.
-        */
-       for (nhlfe = lsp->nhlfe_list; nhlfe; nhlfe = nhlfe->next) {
-               nexthop = nhlfe->nexthop;
-               if (!nexthop)
-                       continue;
-
-               if (CHECK_FLAG(nhlfe->flags, NHLFE_FLAG_INSTALLED) &&
-                   !CHECK_FLAG(nhlfe->flags, NHLFE_FLAG_SELECTED)) {
-                       UNSET_FLAG(nhlfe->flags, NHLFE_FLAG_INSTALLED);
-                       UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
-               }
-       }
-
        ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
 
        kernel_lsp_pass_fail(lsp,