]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: Add back in lsp replace semantics.
authorDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 23 Oct 2017 14:27:22 +0000 (10:27 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 27 Oct 2017 14:41:07 +0000 (10:41 -0400)
When we have a update, we need to use replace
semantics with the kernel.

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

index 8b8d018d03e54cb5db4823a1242a608204993b23..887c6854987533b5b682d9b113ff7d2d44a75e9f 100644 (file)
@@ -58,17 +58,29 @@ int kernel_add_lsp(zebra_lsp_t *lsp)
 int kernel_upd_lsp(zebra_lsp_t *lsp)
 {
        int ret;
+       zebra_nhlfe_t *nhlfe;
+       struct nexthop *nexthop;
 
        if (!lsp || !lsp->best_nhlfe) // unexpected
                return -1;
 
        UNSET_FLAG(lsp->flags, LSP_FLAG_CHANGED);
 
-       /* First issue a DEL and clear the installed flag. */
-       netlink_mpls_multipath(RTM_DELROUTE, lsp);
-       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);
+               }
+       }
 
-       /* Then issue an ADD. */
        ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
        if (!ret)
                SET_FLAG(lsp->flags, LSP_FLAG_INSTALLED);