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>
This commit is contained in:
Renato Westphal 2017-04-21 15:41:14 -03:00
parent 9b2868bc01
commit a8e8b86797

View 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;
/*
* 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 {
uint32_t previous_label;
previous_label = fn->local_label;
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) {