]> git.puffer.fish Git - mirror/frr.git/commitdiff
ldpd: be more conservative with labels
authorRenato Westphal <renato@opensourcerouting.org>
Fri, 21 Apr 2017 18:41:14 +0000 (15:41 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Mon, 5 Jun 2017 15:23:59 +0000 (12:23 -0300)
On unstable networks, routes can be lost and relearned very often. If
we deallocate the input label every time a route is lost and allocate
a new one when the route is relearned, a lot of changes are made in vain.

This patch introduces a logic in which labels are preserved for at least
five minutes before being deallocated by the LIB garbage collector. This
is consistent with what other implementations do.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
ldpd/lde_lib.c

index db2682a173698a65c357ee0d6e37779e9965cdd3..b074bf34981a0b7f8e08630d16518e0a59e97b03 100644 (file)
@@ -383,20 +383,23 @@ lde_kernel_update(struct fec *fec)
        if (LIST_EMPTY(&fn->nexthops)) {
                RB_FOREACH(ln, nbr_tree, &lde_nbrs)
                        lde_send_labelwithdraw(ln, fn, NULL, NULL);
-               fn->local_label = NO_LABEL;
                fn->data = NULL;
-       } else {
-               uint32_t         previous_label;
 
-               previous_label = fn->local_label;
+               /*
+                * Do not deallocate the local label now, do that only in the
+                * LIB garbage collector. This will prevent ldpd from changing
+                * the input label of some prefixes too often when running on
+                * an unstable network. Also, restart the garbage collector
+                * timer so that labels are deallocated only when the network
+                * is stabilized.
+                */
+               lde_gc_start_timer();
+       } else {
                fn->local_label = lde_update_label(fn);
-
-               if (fn->local_label != NO_LABEL &&
-                   fn->local_label != previous_label) {
+               if (fn->local_label != NO_LABEL && RB_EMPTY(&fn->upstream))
                        /* FEC.1: perform lsr label distribution procedure */
                        RB_FOREACH(ln, nbr_tree, &lde_nbrs)
                                lde_send_labelmapping(ln, fn, 1);
-               }
        }
 
        LIST_FOREACH(fnh, &fn->nexthops, entry) {