isisd: remove assert from the TI-LFA repair list computation algorithm

In some cases it's possible that the TI-LFA algorithms will try to
compute a SID repair list more than once for the same backup nexthop
[1]. This of course shouldn't be allowed, as a backup nexthop can't
have multiple label stacks. When that happens, we should just ignore
the new repair list if one is already applied, instead of asserting
and crashing the daemon.

[1] One scenario this can happen is when there's ECMP involving
different P-nodes in the PQ-space intersection.

Reported-by: Fredi Raspall <fredi@voltanet.io>
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
This commit is contained in:
Renato Westphal 2021-02-26 13:37:12 -03:00
parent f691f2ebbd
commit 5dd20c560e
1 changed files with 7 additions and 1 deletions

View File

@ -541,10 +541,16 @@ static int tilfa_repair_list_apply(struct isis_spftree *spftree,
struct isis_spf_adj *sadj = vadj->sadj;
struct mpls_label_stack *label_stack;
/*
* Don't try to apply the repair list if one was already applied
* before (can't have ECMP past the P-node).
*/
if (vadj->label_stack)
continue;
if (!isis_vertex_adj_exists(spftree, vertex_pnode, sadj))
continue;
assert(!vadj->label_stack);
label_stack = tilfa_compute_label_stack(spftree->lspdb, sadj,
repair_list);
if (!label_stack) {