summaryrefslogtreecommitdiffstats
path: root/ldpd
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2017-04-21 20:41:14 +0200
committerRenato Westphal <renato@opensourcerouting.org>2017-06-05 17:23:59 +0200
commita8e8b867974cfbc37aeabe34b067f10448690bd2 (patch)
tree888d8270c507432ca1afa78751128c095bf6d77b /ldpd
parentldpd: accept notifications during the session establishment process (diff)
downloadfrr-a8e8b867974cfbc37aeabe34b067f10448690bd2.tar.xz
frr-a8e8b867974cfbc37aeabe34b067f10448690bd2.zip
ldpd: be more conservative with labels
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>
Diffstat (limited to 'ldpd')
-rw-r--r--ldpd/lde_lib.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/ldpd/lde_lib.c b/ldpd/lde_lib.c
index db2682a17..b074bf349 100644
--- a/ldpd/lde_lib.c
+++ b/ldpd/lde_lib.c
@@ -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) {