| Internet-Draft | SRv6 Failover with GRASP | March 2026 |
| Du, et al. | Expires 2 September 2026 | [Page] |
This document specifies an autonomic fast failover mechanism for SRv6 networks using a bounce-back strategy. It uses GRASP to distribute failover protection information, enabling data plane fast reroute without control plane reconvergence.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 2 September 2026.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
Segment Routing over IPv6 (SRv6) [RFC8986] provides a flexible source routing paradigm that enables explicit path specification for traffic engineering and service chaining. This flexibility, however, comes with a trade-off: when any node or link along an explicitly specified SRv6 path fails, the entire path is disrupted. Traditional recovery mechanisms rely on control plane reconvergence, which typically takes seconds to complete.¶
Existing fast protection mechanisms such as Topology-Independent Loop-Free Alternate (TI-LFA) provide local protection for IGP segments. However, as noted in [RFC9256] Section 9, TI-LFA has inherent limitations:¶
This document introduces a bounce-back strategy to address these gaps. The strategy provides dual protection across the time dimension:¶
The mechanism uses GRASP [RFC8990] to autonomically distribute failover protection information during path setup. The ACP [RFC8994] and BRSKI [RFC8995] provide the security foundation.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This document uses the terminology defined in [RFC7575] and [RFC8986].¶
The bounce-back failover mechanism operates in two distinct phases: control plane setup using GRASP, and data plane failover execution.¶
Each node on the primary path is assigned one of two roles:¶
An Anchor Node (role=0) has a valid backup path and can re-encapsulate traffic. When receiving bounced-back traffic, it MUST strip the original SRv6 encapsulation, re-encapsulate with its pre-installed backup segment list, and forward toward the backup path next-hop.¶
A Bouncer Node (role=1) does NOT have a valid backup path. When detecting downstream failure or receiving bounced-back traffic, it MUST forward upstream without modification.¶
A valid backup path MUST satisfy: Reachability, Disjointness (MUST NOT traverse any primary path link between Anchor and destination), First-hop Difference, and SRv6 Expressibility.¶
+----+ +----+ +----+
| b1 |-----| b2 |-----| b3 |
+----+ +----+ +----+
/ \
+----+ +----+ +----+ +----+ +----+ +----+
| h1 |-----| n1 |-----| n2 |-----| n3 |-----| n4 |-----| h2 |
+----+ +----+ +----+ +----+ +----+ +----+
Anchor Anchor Bouncer Bouncer
\ /
+----+ +----+
| b4 |-----| b5 |
+----+ +----+
Primary Path: h1 -> n1 -> n2 -> n3 -> n4 -> h2
Node Roles:
n1: Anchor (backup: n1 -> b1 -> b2 -> b3 -> h2)
n2: Anchor (backup: n2 -> b4 -> b5 -> h2)
n3: Bouncer (no backup path)
n4: Bouncer (no backup path)
Backup Path Validity:
A valid backup MUST NOT traverse any primary path link
downstream of the Anchor. For n2: backup via b4 -> b5 -> h2
is valid (avoids n2-n3, n3-n4, n4-h2 links)
Before failure, protection information must be distributed to all path nodes via GRASP, including node role, upstream/downstream neighbor addresses, flow identifier, and backup segment list (for Anchors).¶
Failure detection is performed locally using link-layer detection, BFD, or hardware port monitoring. To achieve sub-50ms failover, hardware-assisted detection SHOULD be used.¶
When failure occurs: (1) Node detects downstream interface failure, (2) Immediately redirects traffic upstream, (3) Upstream nodes identify bounced traffic by arrival interface and flow-id, (4) Bouncer forwards upstream; Anchor re-encapsulates and forwards on backup path.¶
The objective name is "SRv6-Failover" conforming to [RFC8990]. Format in CDDL [RFC8610]:¶
objective = ["SRv6-Failover", objective-flags, loop-count, ?objective-value] objective-name = "SRv6-Failover" objective-flags = uint .bits objective-flag loop-count = 0..255 objective-value = srv6-failover-value
srv6-failover-value = [flow-info, primary-path-info, *node-protection-info] flow-info = [flow-id, source-address, destination-address, lifetime] flow-id = uint source-address = bytes .size 16 destination-address = bytes .size 16 lifetime = uint primary-path-info = [primary-segment-list, *anchor-backup-entry] primary-segment-list = [*srv6-sid] srv6-sid = bytes .size 16 anchor-backup-entry = [anchor-address, backup-segment-list] node-protection-info = [node-address, node-role, upstream-neighbor, downstream-neighbor, ?backup-info] node-role = &(anchor: 0, bouncer: 1) backup-info = [backup-segment-list, backup-next-hop]
For the following topology and primary path:¶
+----+ +----+ +----+
| b1 |-----| b2 |-----| b3 |
+----+ +----+ +----+
/ \
+----+ +----+ +----+ +----+ +----+ +----+
| h1 |-----| n1 |-----| n2 |-----| n3 |-----| n4 |-----| h2 |
+----+ +----+ +----+ +----+ +----+ +----+
Anchor Anchor Bouncer Bouncer
\ /
+----+ +----+
| b4 |-----| b5 |
+----+ +----+
Primary Path: h1 -> n1 -> n2 -> n3 -> n4 -> h2
Flow Identifier: 0x0000a
The GRASP objective value would contain:¶
srv6-failover-value = [
; flow-info
[0x0000a, h1-address, h2-address, 3600000],
; primary-path-info
[
[n1-sid, n2-sid, n3-sid, n4-sid, h2-sid], ; primary segment list
[n1-address, [b1-sid, b2-sid, b3-sid, h2-sid]], ; n1's backup
[n2-address, [b4-sid, b5-sid, h2-sid]] ; n2's backup
],
; node-protection-info for n1 (Anchor)
[n1-address, 0, h1-address, n2-address,
[[b1-sid, b2-sid, b3-sid, h2-sid], b1-address]],
; node-protection-info for n2 (Anchor)
[n2-address, 0, n1-address, n3-address,
[[b4-sid, b5-sid, h2-sid], b4-address]],
; node-protection-info for n3 (Bouncer)
[n3-address, 1, n2-address, n4-address],
; node-protection-info for n4 (Bouncer)
[n4-address, 1, n3-address, h2-address]
]
The FPM ASA on the Path Initiator discovers path nodes via GRASP Discovery, then sends Request messages with node-protection-info. Path Responders resolve addresses, install forwarding state, and respond with Negotiation End (ACCEPT).¶
+------------------+ +------------------+
| FPM ASA | | FPM ASA |
| Path Initiator | | Path Responder |
+--------+---------+ +--------+---------+
| |
| M_DISCOVERY (SRv6-Failover) |
|---------------------------------------->|
| |
| M_RESPONSE (locator) |
|<----------------------------------------|
| |
| M_REQ_NEG (node-protection-info) |
|---------------------------------------->|
| |
| M_END (O_ACCEPT) |
|<----------------------------------------|
| |
Nodes MUST distinguish Normal Traffic (from upstream) and Bounced Traffic (from downstream) based on arrival interface and flow identifier. Anchor nodes re-encapsulate; Bouncer nodes forward upstream.¶
+----+ +----+ +----+
| b1 |-----| b2 |-----| b3 |
+----+ +----+ +----+
/ \
+----+ +----+ +----+ +----+ +----+ +----+
| h1 |-----| n1 |-----| n2 |-----| n3 |-----| n4 |-----| h2 |
+----+ +----+ +----+ +----+ +----+ +----+
Anchor Anchor Bouncer Bouncer
\ /
+----+ +----+
| b4 |-----| b5 |
+----+ +----+
Primary Path: h1 -> n1 -> n2 -> n3 -> n4 -> h2
Flow Identifier: 0x0000a
Protection Configuration:
n1: Anchor, upstream=h1, downstream=n2
backup=[b1-sid, b2-sid, b3-sid, h2-sid], next-hop=b1
n2: Anchor, upstream=n1, downstream=n3
backup=[b4-sid, b5-sid, h2-sid], next-hop=b4
n3: Bouncer, upstream=n2, downstream=n4
n4: Bouncer, upstream=n3, downstream=h2
When the n3-n4 link fails:¶
If b4-b5 link also fails, n2 bounces traffic to n1, which re-encapsulates via its backup path n1 -> b1 -> b2 -> b3 -> h2 (cascading bounce-back).¶
Flow identifier is preserved across domain boundaries. Each domain computes its own node roles for its portion of the path.¶
OpenFlow implementations MAY use: in_port, eth_type, ipv6_dst, ipv6_label match fields; fast-failover groups with watch_port.¶
P4 implementations MAY use: ingress metadata, tables keyed by (ingress_port, flow_label, ipv6_dst), link status registers.¶
To achieve sub-50ms failover: use hardware-based detection, implement bounce-back in hardware, pre-install forwarding state.¶
This mechanism inherits security considerations of [RFC8990] and [RFC8986].¶
IANA is requested to add "SRv6-Failover" to the "GRASP Objective Names" registry. Reference: [this document]¶
This appendix provides the complete CDDL definition for the SRv6-Failover GRASP objective:¶
; SRv6-Failover GRASP Objective CDDL Definition srv6-failover-objective = [ "SRv6-Failover", objective-flags, loop-count, ?srv6-failover-value ] objective-flags = uint loop-count = 0..255 srv6-failover-value = [ flow-info, primary-path-info, *node-protection-info ] flow-info = [ flow-id: uint, source-address: ipv6-address, destination-address: ipv6-address, lifetime: uint ] ipv6-address = bytes .size 16 primary-path-info = [ primary-segment-list: [*srv6-sid], *anchor-backup-entry ] srv6-sid = bytes .size 16 anchor-backup-entry = [ anchor-address: ipv6-address, backup-segment-list: [*srv6-sid] ] node-protection-info = [ node-address: ipv6-address, node-role: 0..1, upstream-neighbor: ipv6-address, downstream-neighbor: ipv6-address, ?backup-info ] backup-info = [ backup-segment-list: [*srv6-sid], backup-next-hop: ipv6-address ]
The authors thank the contributors of the ANIMA working group for their valuable feedback on autonomic networking mechanisms.¶