]> git.proxmox.com Git - mirror_frr.git/commit
isisd: implement Remote LFA
authorRenato Westphal <renato@opensourcerouting.org>
Thu, 26 Nov 2020 02:39:09 +0000 (23:39 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Sat, 9 Jan 2021 01:22:11 +0000 (22:22 -0300)
commit16fe8cffa1f73b6af767867742435b08217eef9d
treeb68b7a46b537fda13bbd6260f7dd142be5d64a86
parent381200be9d2698fefc33258dd23163877b02fbca
isisd: implement Remote LFA

Remote LFA (RFC 7490) is an extension to the base LFA mechanism
that uses dynamically determined tunnels to extend the IP-FRR
protection coverage.

RLFA is similar to TI-LFA in that it computes a post-convergence
SPT (with the protected interface pruned from the network topology)
and the P/Q spaces based on that SPT. There are a few differences
however:
* RLFAs can push at most one label, so the P/Q spaces need to
  intersect otherwise the destination can't be protected (the
  protection coverage is topology dependent).
* isisd needs to interface with ldpd to obtain the labels it needs to
  create a tunnel to the PQ node. That interaction needs to be done
  asynchronously to prevent blocking the daemon for too long. With
  TI-LFA all required labels are already available in the LSPDB.

RLFA and TI-LFA have more similarities than differences though,
and thanks to that both features share a lot of code.

Limitations:
* Only RLFA link protection is implemented. The algorithm used
  to find node-protecting RLFAs (RFC 8102) is too CPU intensive and
  doesn't always work. Most vendors implement RLFA link protection
  only.
* RFC 7490 says it should be a local matter whether the repair path
  selection policy favors LFA repairs over RLFA repairs. It might be
  desirable, for instance, to prefer RLFAs that satisfy the downstream
  condition over LFAs that don't. In this implementation, however,
  RLFAs are only computed for destinations that can't be protected
  by local LFAs.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
16 files changed:
isisd/isis_circuit.h
isisd/isis_lfa.c
isisd/isis_lfa.h
isisd/isis_main.c
isisd/isis_memory.c
isisd/isis_memory.h
isisd/isis_nb_config.c
isisd/isis_route.c
isisd/isis_route.h
isisd/isis_spf.c
isisd/isis_spf.h
isisd/isis_spf_private.h
isisd/isis_zebra.c
isisd/isis_zebra.h
isisd/isisd.c
isisd/isisd.h