]> git.puffer.fish Git - mirror/frr.git/commitdiff
doc: Add TI-LFA developer docs
authorGalaxyGorilla <sascha@netdef.org>
Fri, 20 Nov 2020 13:56:33 +0000 (13:56 +0000)
committerGalaxyGorilla <sascha@netdef.org>
Tue, 19 Jan 2021 15:32:13 +0000 (15:32 +0000)
Signed-off-by: GalaxyGorilla <sascha@netdef.org>
doc/developer/ospf-sr.rst
doc/user/ospfd.rst

index efe9b1b12f9aac37394d0cd67c5be4b94011b755..263db9dfb91923b32a8e4cde4a6ad02765440dc3 100644 (file)
@@ -17,6 +17,7 @@ Supported Features
 * Automatic provisioning of MPLS table
 * Equal Cost Multi-Path (ECMP)
 * Static route configuration with label stack up to 32 labels
+* TI-LFA (for P2P interfaces only)
 
 Interoperability
 ----------------
@@ -182,6 +183,71 @@ called. Once check the validity of labels, they are send to ZEBRA layer through
 command for deletion. This is completed by a new labelled route through
 `ZEBRA_ROUTE_ADD` command, respectively `ZEBRA_ROUTE_DELETE` command.
 
+TI-LFA
+^^^^^^
+
+Experimental support for Topology Independent LFA (Loop-Free Alternate), see
+for example 'draft-bashandy-rtgwg-segment-routing-ti-lfa-05'. The related
+files are `ospf_ti_lfa.c/h`.
+
+The current implementation is rather naive and does not support the advanced
+optimizations suggested in e.g. RFC7490 or RFC8102. It focuses on providing
+the essential infrastructure which can also later be used to enhance the
+algorithmic aspects.
+
+Supported features:
+
+* Link and node protection
+* Intra-area support
+* Proper use of Prefix- and Adjacency-SIDs in label stacks
+* Asymmetric weights (using reverse SPF)
+* Non-adjacent P/Q spaces
+* Protection of Prefix-SIDs
+
+If configured for every SPF run the routing table is enriched with additional
+backup paths for every prefix. The corresponding Prefix-SIDs are updated with
+backup paths too within the OSPF SR update task.
+
+Informal High-Level Algorithm Description:
+
+::
+
+  p_spaces = empty_list()
+
+  for every protected_resource (link or node):
+    p_space = generate_p_space(protected_resource)
+    p_space.q_spaces = empty_list()
+
+    for every destination that is affected by the protected_resource:
+      q_space = generate_q_space(destination)
+
+      # The label stack is stored in q_space
+      generate_label_stack(p_space, q_space)
+
+      # The p_space collects all its q_spaces
+      p_spaces.q_spaces.add(q_space)
+
+    p_spaces.add(p_space)
+
+  adjust_routing_table(p_spaces)
+
+Possible Performance Improvements:
+
+* Improve overall datastructures, get away from linked lists for vertices
+* Don't calculate a Q space for every destination, but for a minimum set of
+  backup paths that cover all destinations in the post-convergence SPF. The
+  thinking here is that once a backup path is known that it is also a backup
+  path for all nodes on the path themselves. This can be done by using the
+  leafs of a trimmed minimum spanning tree generated out of the post-
+  convergence SPF tree for that particular P space.
+* For an alternative (maybe better) optimization look at
+  https://tools.ietf.org/html/rfc7490#section-5.2.1.3 which describes using
+  the Q space of the node which is affected by e.g. a link failure. Note that
+  this optimization is topology dependent.
+
+It is highly recommended to read e.g. `Segment Routing I/II` by Filsfils to
+understand the basics of Ti-LFA.
+
 Configuration
 -------------
 
index 9a40f080f95ea9305d985e457df3fc0e98be3b21..ee02a9dae5407fc053df81721d9df78a61aca1f8 100644 (file)
@@ -1245,6 +1245,8 @@ TI-LFA requires a proper Segment Routing configuration.
 
    Configured on the router level. Activates TI-LFA for all interfaces.
 
+   Note that so far only P2P interfaces are supported.
+
 Debugging OSPF
 ==============