summaryrefslogtreecommitdiff
path: root/isisd/isis_lfa.c
AgeCommit message (Collapse)Author
2024-09-27isisd: Fix the PQ space computation error in TI-LFAb29332
When there are pseudo-nodes on the device, during TI-LFA calculation of PQ space, even if this IS vertex is not originally a P/Q node, it might be calculated as a P/Q node due to the presence of pseudo-nodes, causing this IS vertex to become a P/Q node. Signed-off-by: baozhen-H3C <bao.zhen@h3c.com>
2024-08-08isisd: Cleanup leaked hash on shut in circuitDonald Sharp
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-06-27isisd: fix crash when obtaining the next hop to calculate LFA on LAN linkszhou-run
When a neighbor connection is disconnected, it may trigger LSP re-generation as a timer task, but this process may be delayed. As a result, the list of neighbors in area->adjacency_list may be inconsistent with the neighbors in lsp->tlvs->oldstyle_reach/extended_reach. For example, the area->adjacency_list may lack certain neighbors even though they are present in the LSP. When computing SPF, the call to isis_spf_build_adj_list() generates the spftree->sadj_list, which reflects the real neighbors in the area->adjacency_list. However, in the case of LAN links, spftree->sadj_list may include additional pseudo neighbors. The pre-loading of tents through the call to isis_spf_preload_tent involves two steps: 1. isis_spf_process_lsp() is called to generate real neighbor vertices based on the root LSP and pseudo LSP. 2. isis_spf_add_local() is called to add corresponding next hops to the vertex->Adj_N list for the real neighbor vertices. In the case of LAN links, the absence of corresponding real neighbors in the spftree->sadj_list prevents the execution of the second step. Consequently, the vertex->Adj_N list for the real neighbor vertices lacks corresponding next hops. This leads to a null pointer access when isis_lfa_compute() is called to calculate LFA. As for P2P links, since there are no pseudo neighbors, only the second step is executed, which does not create real neighbor vertices and therefore does not encounter this issue. The backtrace is as follows: (gdb) bt #0 0x00007fd065277fe1 in raise () from /lib/x86_64-linux-gnu/libpthread.so.0 #1 0x00007fd065398972 in core_handler (signo=11, siginfo=0x7ffc5c0636b0, context=0x7ffc5c063580) at ../lib/sigevent.c:261 #2 <signal handler called> #3 0x00005564d82f8408 in isis_lfa_compute (area=0x5564d8b143f0, circuit=0x5564d8b21d10, spftree=0x5564d8b06bf0, resource=0x7ffc5c064410) at ../isisd/isis_lfa.c:2134 #4 0x00005564d82f8d78 in isis_spf_run_lfa (area=0x5564d8b143f0, spftree=0x5564d8b06bf0) at ../isisd/isis_lfa.c:2344 #5 0x00005564d8315964 in isis_run_spf_with_protection (area=0x5564d8b143f0, spftree=0x5564d8b06bf0) at ../isisd/isis_spf.c:1827 #6 0x00005564d8315c15 in isis_run_spf_cb (thread=0x7ffc5c064590) at ../isisd/isis_spf.c:1889 #7 0x00007fd0653b1f04 in thread_call (thread=0x7ffc5c064590) at ../lib/thread.c:1990 #8 0x00007fd06534a97b in frr_run (master=0x5564d88103c0) at ../lib/libfrr.c:1198 #9 0x00005564d82e7d5d in main (argc=5, argv=0x7ffc5c0647b8, envp=0x7ffc5c0647e8) at ../isisd/isis_main.c:273 (gdb) f 3 #3 0x00005564d82f8408 in isis_lfa_compute (area=0x5564d8b143f0, circuit=0x5564d8b21d10, spftree=0x5564d8b06bf0, resource=0x7ffc5c064410) at ../isisd/isis_lfa.c:2134 2134 ../isisd/isis_lfa.c: No such file or directory. (gdb) p vadj_primary $1 = (struct isis_vertex_adj *) 0x0 (gdb) p vertex->Adj_N->head $2 = (struct listnode *) 0x0 (gdb) p (struct isis_vertex *)spftree->paths->l.list->head->next->next->next->next->data $8 = (struct isis_vertex *) 0x5564d8b5b240 (gdb) p $8->type $9 = VTYPE_NONPSEUDO_TE_IS (gdb) p $8->N.id $10 = "\000\000\000\000\000\002" (gdb) p $8->Adj_N->count $11 = 0 (gdb) p (struct isis_vertex *)spftree->paths->l.list->head->next->next->next->next->next->data $12 = (struct isis_vertex *) 0x5564d8b73dd0 (gdb) p $12->type $13 = VTYPE_NONPSEUDO_TE_IS (gdb) p $12->N.id $14 = "\000\000\000\000\000\003" (gdb) p $12->Adj_N->count $15 = 0 (gdb) p area->adjacency_list->count $16 = 0 The backtrace provided above pertains to version 8.5.4, but it seems that the same issue exists in the code of the master branch as well. The scenario where a vertex has no next hop is normal. For example, the "clear isis neighbor" command invokes isis_vertex_adj_del() to delete the next hop of a vertex. Upon reviewing all the instances where the vertex->Adj_N list is used, I found that only isis_lfa_compute() lacks a null check. Therefore, I believe that modifying this part will be sufficient. Additionally, the vertex->parents list for IP vertices is guaranteed not to be empty. Test scenario: Setting up LFA for LAN links and executing the "clear isis neighbor" command easily reproduces the issue. Signed-off-by: zhou-run <zhou.run@h3c.com>
2024-04-04isisd: fix mispelling with ISIS_SR_LAN_BACKUPPhilippe Guibert
The ISIS_SR_LAN_BACKUP should be renamed to ISIS_SR_ADJ_BACKUP. Fixes: 26f6acafc369 ("isisd: add support for segment routing") Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2023-04-18isisd: add support of (ti-)lfa to flex-algoLouis Scalbert
Add support of (ti-)lfa to flex-algo Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2023-04-17isisd: update struct isis_spftree with algorithm idHiroki Shirokura
The spftree has a new property called algorithm which is id used to identify the algorithm that separates it in the same IGP network. This is used in Flex-Algo. In other cases than Flex-Algo, the algorithm id is always zero. Signed-off-by: Hiroki Shirokura <hiroki.shirokura@linecorp.com> Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2023-04-11Merge pull request #12698 from Orange-OpenSource/isisdRuss White
Isisd/Lib: Add new printfrr format facility for Intermediate System ID
2023-03-24*: Convert THREAD_XXX macros to EVENT_XXX macrosDonald Sharp
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2023-03-24*: Convert thread_add_XXX functions to event_add_XXXDonald Sharp
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2023-03-24*: Rename `struct thread` to `struct event`Donald Sharp
Effectively a massive search and replace of `struct thread` to `struct event`. Using the term `thread` gives people the thought that this event system is a pthread when it is not Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2023-03-21isisd: Update to the new printfrr ISO formatOlivier Dugeon
This path replaces isisd_format_id, sysid_print, snpa_print, rawlspid_print and isonet_print functions by the new printfrr ISO System ID & Network Address format facilities. It also updates the isisd code to the new iso_address structure defined in lib/iso.h Signed-off-by: Olivier Dugeon <olivier.dugeon@orange.com>
2023-02-09*: auto-convert to SPDX License IDsDavid Lamparter
Done with a combination of regex'ing and banging my head against a wall. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2022-10-24isisd: fix metric calculation of classic lfa backup prefixesLouis Scalbert
The isis-lfa-topo1 topotest shows backup routes with lower metrics than the primary ones. > rt1# show isis route > Area 1: > IS-IS L1 IPv6 routing table: > > Prefix Metric Interface Nexthop Label(s) > ------------------------------------------------------------------------------ > 2001:db8:1000::1/128 0 - - - > 2001:db8:1000::2/128 20 eth-rt2 fe80::d091:eeff:fe09:31cd - > 2001:db8:1000::3/128 20 eth-rt3 fe80::946b:d4ff:fe5b:414b - > 2001:db8:1000::4/128 20 eth-rt4 fe80::5ced:29ff:feed:59c4 - > (...) > > rt1# show isis route backup > Area 1: > IS-IS L1 IPv6 routing table: > > Prefix Metric Interface Nexthop Label(s) > ------------------------------------------------------------------------------ > 2001:db8:1000::2/128 15 eth-rt3 fe80::946b:d4ff:fe5b:414b - > eth-rt5 fe80::847d:feff:fe74:bdde - > eth-rt6 fe80::ac8c:dff:feac:8a8d - > 2001:db8:1000::3/128 15 eth-rt2 fe80::d091:eeff:fe09:31cd - > eth-rt5 fe80::847d:feff:fe74:bdde - > 2001:db8:1000::4/128 45 eth-rt5 fe80::847d:feff:fe74:bdde - > (...) Backup routes metrics are incorrect because they only take into account the path metric but not the prefix metric. Add the prefix metric to the path metric on backup routes. After the patch with a prefix metric of 10: > rt1# show isis route backup > Area 1: > IS-IS L1 IPv6 routing table: > > Area 1: > IS-IS L1 IPv6 routing table: > > Prefix Metric Interface Nexthop Label(s) > ------------------------------------------------------------------------------ > 2001:db8:1000::2/128 25 eth-rt3 fe80::8c6f:8aff:fe10:ad0d - > eth-rt5 fe80::b08e:5cff:fe90:62dd - > eth-rt6 fe80::4810:47ff:fe81:2b9a - > 2001:db8:1000::3/128 25 eth-rt2 fe80::e855:12ff:fe31:5765 - > eth-rt5 fe80::b08e:5cff:fe90:62dd - > 2001:db8:1000::4/128 55 eth-rt5 fe80::b08e:5cff:fe90:62dd - Fixes: e886416f81 ("isisd: add support for classic LFA (RFC 5286)") Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2022-07-21isisd: Convert thread_cancel to THREAD_OFFDonald Sharp
Just convert all uses of thread_cancel to THREAD_OFF Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2022-07-10Revert "isisd: fix metric calculation of classic lfa backup prefixes"Donatas Abraitis
This reverts commit e45958e9cfccd6dfc108a7ef5cb73775e8ef2e68.
2022-05-24isisd: fix metric calculation of classic lfa backup prefixesLouis Scalbert
The isis-lfa-topo1 topotest shows backup routes with lower metrics than the primary ones. > rt1# show isis route > Area 1: > IS-IS L1 IPv6 routing table: > > Prefix Metric Interface Nexthop Label(s) > ------------------------------------------------------------------------------ > 2001:db8:1000::1/128 0 - - - > 2001:db8:1000::2/128 20 eth-rt2 fe80::d091:eeff:fe09:31cd - > 2001:db8:1000::3/128 20 eth-rt3 fe80::946b:d4ff:fe5b:414b - > 2001:db8:1000::4/128 20 eth-rt4 fe80::5ced:29ff:feed:59c4 - > (...) > > rt1# show isis route backup > Area 1: > IS-IS L1 IPv6 routing table: > > Prefix Metric Interface Nexthop Label(s) > ------------------------------------------------------------------------------ > 2001:db8:1000::2/128 15 eth-rt3 fe80::946b:d4ff:fe5b:414b - > eth-rt5 fe80::847d:feff:fe74:bdde - > eth-rt6 fe80::ac8c:dff:feac:8a8d - > 2001:db8:1000::3/128 15 eth-rt2 fe80::d091:eeff:fe09:31cd - > eth-rt5 fe80::847d:feff:fe74:bdde - > 2001:db8:1000::4/128 45 eth-rt5 fe80::847d:feff:fe74:bdde - > (...) Backup routes metrics are incorrect because they only take into account the path metric but not the prefix metric. Add the prefix metric to the path metric on backup routes. After the patch with a prefix metric of 10: > rt1# show isis route backup > Area 1: > IS-IS L1 IPv6 routing table: > > Area 1: > IS-IS L1 IPv6 routing table: > > Prefix Metric Interface Nexthop Label(s) > ------------------------------------------------------------------------------ > 2001:db8:1000::2/128 25 eth-rt3 fe80::8c6f:8aff:fe10:ad0d - > eth-rt5 fe80::b08e:5cff:fe90:62dd - > eth-rt6 fe80::4810:47ff:fe81:2b9a - > 2001:db8:1000::3/128 25 eth-rt2 fe80::e855:12ff:fe31:5765 - > eth-rt5 fe80::b08e:5cff:fe90:62dd - > 2001:db8:1000::4/128 55 eth-rt5 fe80::b08e:5cff:fe90:62dd - Fixes: e886416f81 ("isisd: add support for classic LFA (RFC 5286)") Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2022-05-03*: remove the checking returned value for hash_get()anlan_cs
Firstly, *keep no change* for `hash_get()` with NULL `alloc_func`. Only focus on cases with non-NULL `alloc_func` of `hash_get()`. Since `hash_get()` with non-NULL `alloc_func` parameter shall not fail, just ignore the returned value of it. The returned value must not be NULL. So in this case, remove the unnecessary checking NULL or not for the returned value and add `void` in front of it. Importantly, also *keep no change* for the two cases with non-NULL `alloc_func` - 1) Use `assert(<returned_data> == <searching_data>)` to ensure it is a created node, not a found node. Refer to `isis_vertex_queue_insert()` of isisd, there are many examples of this case in isid. 2) Use `<returned_data> != <searching_data>` to judge it is a found node, then free <searching_data>. Refer to `aspath_intern()` of bgpd, there are many examples of this case in bgpd. Here, <returned_data> is the returned value from `hash_get()`, and <searching_data> is the data, which is to be put into hash table. Signed-off-by: anlan_cs <vic.lan@pica8.com>
2022-04-22isisd: ldp cleaning issue on invalid sptreeFrancois Dumontet
That commit aim is to fix an invalid isis access to sptree when lpd is stopping. isisd is running. lpd and isisd are running. isis is L1 type configured. isis_ldp_rlfa_handle_client_close function try to clear uninitialized spftree. Expected behavior: isisd not crashing and running. isis_ldp_rlfa_handle_client_close not trying to clear spftree that are not initializes due tio the configuration. Fix: test the configured area's type avoiding to deleted an unconfigured sptree. function isis_rlfa_handle_client_close will be aligned on spftree_area_del function Signed-off-by: Francois Dumontet <francois.dumontet@6wind.com>
2022-02-23*: Change thread->func to return void instead of intDonald Sharp
The int return value is never used. Modify the code base to just return a void instead. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2021-11-30isisd: Add support for RFC6119 (IPv6 TE in IS-IS)Olivier Dugeon
- Add advertisement of Global IPv6 address in IIH pdu - Add new CLI to set IPv6 Router ID - Add advertisement of IPv6 Router ID - Correctly advertise IPv6 local and neighbor addresses in Extended IS and MT Reachability TLVs - Correct output of Neighbor IPv6 address in 'show isis database detail' - Manage IPv6 addresses advertisement and corresponiding Adjacency SID when IS-IS is not using Multi-Topology by introducing a new ISIS_MT_DISABLE value for mtid (== 4096 i.e. first reserved flag set to 1) Signed-off-by: Olivier Dugeon <olivier.dugeon@orange.com>
2021-05-03isisd: link protection optional fallback in ti-lfaFredi Raspall
The current implementation of TI-LFA computes link-protecting repair paths (even when node protection is enabled) to have repair paths to all destinations when no node-protecting repair has been found. This may be desired or not. E.g. the link-protecting paths may use the protected node and be, therefore, useless if the node fails. Also, computing link-protecting repairs incurs extra calculations. With this patch, when node protection is enabled, link protecting repair paths are only computed if "link-fallback" is specified in the configuration, on a per interface and IS-IS level. Signed-off-by: Fredi Raspall <fredi@voltanet.io>
2021-05-01isisd: fix memory leak for non-freed spftreesFredi Raspall
When enabling TI-LFA the forward SPF for neighbors adjacent to the PLR is computed. Later, when computing the PQ spaces, the reverse SPF trees for those adjacent neighbors affected by the protected interface are computed. When node protection is enabled, TI-LFA link protection is run immediately afterwards to compute repairs in case no node-protecting backup path exists. In this second run, the existing code tries to compute the reverse SPF tree for the same node, without freeing the SPF tree of the prior run. This patch fixes this by not computing the reverse SPF again, thus avoiding a memory leak and an unnecessary SPF run. Signed-off-by: Fredi Raspall <fredi@voltanet.io>
2021-03-22isisd: kill isis_memory.h, use MTYPE_STATICDavid Lamparter
Convert most DEFINE_MTYPE into the _STATIC variant, and move the remaining non-static ones to appropriate places. Signed-off-by: David Lamparter <equinox@diac24.net>
2021-02-26isisd: handle corner case involving TI-LFA and the SR No-PHP flagRenato Westphal
When the last SID in the TI-LFA repair list is an Adj-SID from the penultimate hop router towards the final hop, the No-PHP flag of the original Prefix-SID must be honored in the repair list itself since the penultimate hop router won't have a chance to process that SID and pop it if necessary. Reported-by: Fredi Raspall <fredi@voltanet.io> Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-02-26isisd: remove assert from the TI-LFA repair list computation algorithmRenato Westphal
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>
2021-01-08isisd: remove two overly verbose LFA debug messagesRenato Westphal
These two debug messages are so verbose to a point they impact performance when testing RLFA/TI-LFA on large-scale networks. Remove them since they aren't really useful. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-01-08isisd: fix logging of uninitialized data in the TI-LFA codeRenato Westphal
Always call vid2string() whenever necessary instead of trying to be too clever and call it only once. The original assumption was that "buf" only needed to be initialized when LFA debugging was enabled, but we also need that buffer when logging one error message. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-01-08isisd: implement Remote LFARenato Westphal
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>
2020-11-24isisd: add the "show isis fast-reroute summary" commandRenato Westphal
Add new "show" command to make it easy to see the protection coverage provided by LFA/rLFA/TI-LFA. Example output: debian# show isis fast-reroute summary Area 1: IS-IS L1 IPv4 Fast ReRoute summary: Protection \ Priority Critical High Medium Low Total -------------------------------------------------------------------------- Classic LFA 0 0 1 3 4 Remote LFA 0 0 0 0 0 Topology Independent LFA 0 0 0 0 0 ECMP 0 0 0 0 0 Unprotected 0 0 2 1 3 Protection coverage 0.00% 0.00% 33.33% 75.00% 54.17% IS-IS L1 IPv6 Fast ReRoute summary: Protection \ Priority Critical High Medium Low Total -------------------------------------------------------------------------- Classic LFA 0 0 1 0 1 Remote LFA 0 0 0 0 0 Topology Independent LFA 0 0 0 0 0 ECMP 0 0 0 0 0 Unprotected 0 0 2 0 2 Protection coverage 0.00% 0.00% 33.33% 0.00% 33.33% Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2020-11-24isisd: add support for classic LFA (RFC 5286)Renato Westphal
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2020-11-24isisd: rename the "debug isis ti-lfa" command to make it more genericRenato Westphal
Rename "debug isis ti-lfa" to "debug isis lfa". Having different debug guards for different kinds of LFA (classic, remote and TI-LFA) doesn't make sense since all LFA solutions share code to certain extent. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2020-11-24isisd: consult locally configured MSD when computing TI-LFA repair pathsRenato Westphal
Do not attempt to install a TI-LFA backup nexthop if its number of labels exceeds the locally configured MSD (Maximum Stack Depth). The idea is to prevent forward-plane installation failures before they happen. The MSD check should also allow the "show isis fast-reroute summary" command (not implemented yet) to display the actual protection coverage provided by TI-LFA, which might not be 100% if the MSD isn't big enough. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2020-10-23isisd: fix the TI-LFA repair paths to preserve the original Prefix-SIDRenato Westphal
When computing backup nexthops for routes that contain a Prefix-SID, the original Prefix-SID label should be present at the end of backup label stacks (after the repair labels). This commit fixes that oversight in the original TI-LFA code. The SPF unit tests and TI-LFA topotes were also updated accordingly. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2020-10-23isisd: refactor handling of SR Prefix-SIDsRenato Westphal
Embed Prefix-SID information inside SPF data structures so that Prefix-SIDs can be installed together with their associated routes at the end of the SPF algorithm. This is different from the current implementation where Prefix-SIDs are parsed and processed separately, which is vastly suboptimal. Advantages of the new code: * No need to parse the LSPDB an additional time to detect and process SR-related changes; * Routes are installed with their Prefix-SID labels in the same ZAPI message. This can prevent packet dropping for a few milliseconds after each SPF run if there are BGP-labeled routes (e.g. L3VPN) that recurse on IGP labeled routes; * Much easier to support Anycast-SIDs, as the SPF code will naturally figure out the best nexthops and use only them (that can't be done in any reasonable way if the Prefix-SID Sub-TVLs are processed separately); * Less code to maintain and reduced memory footprint; The "show isis segment-routing prefix-sids" command was removed as it doesn't make sense anymore now that "show isis route" exists. Prefix-SIDs are a property of routes, so what was done was to extend the "show isis route" command with a new "prefix-sid" option that changes the output table to show the Prefix-SID information associated to each route. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2020-10-23isisd: create routes for local destinationsRenato Westphal
This is preparatory change for the upcoming SR Prefix-SID refactoring. Since Prefix-SID information will be stored inside IS-IS routes (instead of being maintained separately), it will be necessary to have local routes in order to store local Prefix-SID information. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2020-10-14isisd: implement TI-LFA protection for Adj-SIDsRenato Westphal
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2020-10-14isisd: add support for Topology Independent LFA (TI-LFA)Renato Westphal
TI-LFA is a modern fast-reroute (FRR) solution that leverages Segment Routing to pre-compute backup nexthops for all destinations in the network, helping to reduce traffic restoration times whenever a failure occurs. The backup nexthops are expected to be installed in the FIB so that they can be activated as soon as a failure is detected, making sub-50ms recovery possible (assuming an hierarchical FIB). TI-LFA is a huge step forward compared to prior IP-FRR solutions, like classic LFA and Remote LFA, as it guarantees 100% coverage for all destinations. This is possible thanks to the source routing capabilities of SR, which allows the backup nexthops to steer traffic around the failures (using as many SIDs as necessary). In addition to that, the repair paths always follow the post-convergence SPF tree, which prevents transient congestions and suboptimal routing from happening. Deploying TI-LFA is very simple as it only requires a single configuration command for each interface that needs to be protected (both link protection and node protection are available). In addition to IPv4 and IPv6 routes, SR Prefix-SIDs and Adj-SIDs are also protected by the backup nexthops computed by the TI-LFA algorithms. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>