Interworking & Migration¶
Most networks don't start from zero. Migrating from MPLS or SR-MPLS to SRv6 requires a clear strategy for coexistence during the transition. This page covers the common migration paths and interworking mechanisms.
Migration Strategies¶
Option 1: Greenfield (Clean Start)¶
New network built entirely on SRv6, no MPLS legacy.
Who chose this: Iliad (Italy), Rakuten Mobile (Japan), Telecom District (Mexico) — all started as new operators and deployed SRv6-only networks from day one.
Pros: Simplest architecture, no interworking complexity Cons: Only possible for new networks
Option 2: Parallel Overlay (Ship-in-the-Night)¶
Run SRv6 and MPLS as two separate planes on the same physical infrastructure:
┌─────────────────────────────────┐
│ Physical Network │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ MPLS │ │ SRv6 │ │
│ │ Plane │ │ Plane │ │
│ │ (legacy) │ │ (new) │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────┘
- Deploy SRv6 alongside existing MPLS
- Migrate services one by one from MPLS to SRv6
- Decommission MPLS when all services are migrated
Pros: Low risk, gradual migration, rollback possible Cons: Dual-stack complexity during transition
Option 3: SR-MPLS → SRv6 uSID (Incremental)¶
If you already have SR-MPLS, the migration to SRv6 is simpler because both share the SR architecture:
- Phase 1: Deploy SR-MPLS (replace LDP/RSVP with segment routing)
- Phase 2: Upgrade nodes to support SRv6 uSID
- Phase 3: Enable SRv6 on upgraded nodes, use interworking for non-upgraded
- Phase 4: Complete migration, disable SR-MPLS
Option 4: Direct MPLS → SRv6 (Skip SR-MPLS)¶
Some operators skip SR-MPLS entirely and go directly from traditional MPLS to SRv6 uSID. This avoids a double migration but requires more careful planning.
Who chose this: According to their public announcement, Telefonica VIVO went directly to SRv6 uSID to avoid double migration costs.
Interworking Mechanisms¶
SR-MPLS ↔ SRv6 Gateway¶
A gateway node translates between SR-MPLS and SRv6 at the domain boundary:
graph LR
subgraph SR-MPLS Domain
A[PE1] -->|MPLS Labels| B[P1]
end
B -->|SR-MPLS| GW[Gateway Node]
subgraph SRv6 Domain
GW -->|SRv6 SIDs| C[P2]
C --> D[PE2]
end What the Gateway Does¶
- SR-MPLS → SRv6: Receives MPLS packet, pops labels, encapsulates with SRv6 SRH
- SRv6 → SR-MPLS: Receives SRv6 packet, decapsulates, pushes MPLS labels
BGP Multi-Domain¶
BGP can signal both SR-MPLS and SRv6 SIDs for the same VPN prefix, allowing the gateway to perform the translation:
Binding SID (BSID) for Cross-Domain¶
A Binding SID represents an entire SR Policy as a single SID. This enables stitching across domains:
Domain A (SR-MPLS): PE1 → BSID=24999 → Gateway
Domain B (SRv6): Gateway → fcbb:bb01:0002::DT4 → PE2
The BSID at the gateway maps to the SRv6 segment list in Domain B.
VPN Service Interworking¶
For L3VPN and EVPN services spanning both domains:
| Service | SR-MPLS Side | Gateway | SRv6 Side |
|---|---|---|---|
| L3VPN | VPN label + SR-MPLS transport | Label↔SID translation | End.DT4/DT6 SID |
| EVPN | EVPN label + SR-MPLS transport | Label↔SID translation | End.DX2/DT2 SID |
| TE | SR-MPLS label stack | BSID stitching | SRv6 SR Policy |
MTU Considerations During Migration¶
SRv6 encapsulation adds overhead. During migration, you may have mixed MTU requirements:
| Encapsulation | Overhead |
|---|---|
| SR-MPLS (3 labels) | 12 bytes |
| SRv6 (no SRH, uSID in DA) | 40 bytes (IPv6 header) |
| SRv6 (with SRH, 1 SID) | 64 bytes |
| SRv6 (with SRH, 3 SIDs) | 96 bytes |
| SRv6 uSID (6 hops in 1 container) | 40 bytes |
uSID reduces the MTU problem
SRv6 uSID compression means that for up to 6 hops, the overhead is just the 40-byte outer IPv6 header (no SRH needed). This makes SRv6 uSID comparable to or better than a 3-label MPLS stack.
Recommendation: Ensure all links in the SRv6 domain support at least 9100 bytes MTU (jumbo frames) to accommodate SRv6 encapsulation without fragmenting inner packets with a 1500-byte MTU.
Gateway Implementation Details¶
The gateway node is the linchpin of any SR-MPLS/SRv6 interworking deployment. It must maintain forwarding state for both data planes and perform real-time header translation at line rate.
Packet Walk: SR-MPLS to SRv6¶
The following diagram shows the step-by-step transformation of a packet crossing from an SR-MPLS domain into an SRv6 domain through a gateway node.
Ingress (SR-MPLS side) Egress (SRv6 side)
═══════════════════════ ═════════════════════
┌─────────────────────┐ ┌─────────────────────────────┐
│ Transport Label: 16002│ │ IPv6 Header │
│ Transport Label: 16005│ │ SA: fcbb:bb01:0100:: │
│ VPN Label: 24001 │ │ DA: fcbb:bb01:0002::DT4 │
│ ──────────────────── │ │ ─────────────────────────── │
│ Inner IPv4 Packet │ │ Inner IPv4 Packet │
│ 10.0.0.0/24 │ │ 10.0.0.0/24 │
└─────────────────────┘ └─────────────────────────────┘
│ ▲
│ Step 1: Receive MPLS packet │
│ Step 2: Pop all MPLS labels │
│ Step 3: VPN label 24001 → lookup SRv6 SID │
│ Step 4: Encapsulate with IPv6 + optional SRH │
│ Step 5: Forward into SRv6 domain │
└──────────────────────────────────────────────────┘
Step-by-step breakdown:
| Step | Action | Details |
|---|---|---|
| 1 | Receive MPLS packet | Gateway receives a packet with a stack of MPLS labels: transport labels (imposed by the SR-MPLS ingress PE) on top, followed by the VPN service label at the bottom of the stack |
| 2 | Pop MPLS labels | The transport labels have already been popped by penultimate-hop-popping (PHP) or are terminated at the gateway. The gateway pops the remaining VPN label |
| 3 | Look up VPN label mapping | The VPN label (e.g., 24001) is used to look up the corresponding SRv6 SID. This mapping is learned via BGP, where the remote PE advertised both an MPLS label and an SRv6 SID for the same VPN prefix |
| 4 | Encapsulate with SRv6 | The gateway builds an outer IPv6 header. The destination address is set to the SRv6 End function SID (e.g., End.DT4 for L3VPN decapsulation). If intermediate SRv6 segments are needed, a Segment Routing Header (SRH) is inserted |
| 5 | Forward into SRv6 domain | The packet is forwarded as a native IPv6 packet into the SRv6 domain based on the outer IPv6 destination address |
Packet Walk: SRv6 to SR-MPLS (Reverse Direction)¶
The reverse direction mirrors the process:
Ingress (SRv6 side) Egress (SR-MPLS side)
═══════════════════ ═════════════════════
┌─────────────────────────────┐ ┌─────────────────────┐
│ IPv6 Header │ │ Transport Label: 16007│
│ DA: fcbb:bb01:0100::E │ │ VPN Label: 24050 │
│ SRH (optional) │ │ ──────────────────── │
│ ─────────────────────────── │ │ Inner IPv4 Packet │
│ Inner IPv4 Packet │ │ 172.16.0.0/24 │
└─────────────────────────────┘ └─────────────────────┘
│ ▲
│ Step 1: Receive SRv6 packet at gateway SID │
│ Step 2: Decapsulate (remove IPv6 + SRH) │
│ Step 3: Look up destination → find MPLS labels │
│ Step 4: Push VPN label + transport labels │
│ Step 5: Forward into SR-MPLS domain │
└──────────────────────────────────────────────────┘
Gateway SID Function
The gateway advertises a dedicated SID (e.g., an End or End.X function) that serves as the entry point from the SRv6 domain. When the gateway processes this SID, it knows to perform the cross-domain translation.
BGP Signaling at the Gateway¶
The gateway learns both MPLS labels and SRv6 SIDs for the same prefix through BGP multi-protocol extensions. A dual-stack PE (or the gateway itself acting as a route-reflector client) receives BGP VPN updates carrying both types of reachability information.
BGP VPNv4 Update from PE2 (SRv6-capable):
Route Distinguisher: 65000:100
Prefix: 10.0.0.0/24
Next-Hop: fcbb:bb01:0002::
Extended Community: RT 65000:100
├── Prefix-SID Attribute:
│ SRv6 SID: fcbb:bb01:0002::DT4
│ SID Structure: (block=32, node=16, function=16, arg=0)
└── MPLS Label: 24001 (for SR-MPLS peers)
BGP VPNv4 Update from PE1 (SR-MPLS-only):
Route Distinguisher: 65000:100
Prefix: 172.16.0.0/24
Next-Hop: 10.255.0.1
Extended Community: RT 65000:100
└── MPLS Label: 24050
The gateway maintains a cross-reference table that maps each VPN prefix to both its MPLS label and its SRv6 SID, enabling bidirectional translation:
| VPN Prefix | MPLS Label | SRv6 SID | Origin PE |
|---|---|---|---|
| 10.0.0.0/24 | 24001 | fcbb:bb01:0002::DT4 | PE2 (SRv6) |
| 172.16.0.0/24 | 24050 | -- | PE1 (SR-MPLS) |
| 192.168.1.0/24 | 24070 | fcbb:bb01:0003::DT4 | PE3 (dual-stack) |
Gateway Scalability
The gateway must maintain state for every VPN prefix that crosses the domain boundary. In large networks, this can reach hundreds of thousands of entries. Proper capacity planning and route filtering at domain boundaries are essential.
Binding SID Deep Dive¶
The Binding SID (BSID) is one of the most powerful abstractions in the SR architecture, defined in RFC 9256 (SR Policy Architecture). It is essential for multi-domain migration.
What Is a Binding SID?¶
A BSID is a single SID (either an MPLS label or an SRv6 SID) that represents an entire SR Policy -- including all its segment lists, weighted paths, and constraints. When a packet is steered onto a BSID, the node that owns the BSID expands it into the full segment list of the associated policy.
Without BSID:
Ingress PE must know the FULL path across all domains:
[16001, 16002, 16005, fcbb:bb01:0002::1, fcbb:bb01:0003::DT4]
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SR-MPLS segments SRv6 segments
With BSID:
Ingress PE only needs to know:
[16001, 16002, 24999]
^^^^^
BSID at gateway — represents the entire SRv6 path
Why BSID Is Critical for Migration¶
BSID provides domain isolation: neither domain needs to understand the other's SID format, addressing scheme, or internal topology.
| Benefit | Explanation |
|---|---|
| Abstraction | SR-MPLS domain sees a simple MPLS label (the BSID), not SRv6 SIDs |
| Scalability | Ingress PE segment list stays short regardless of end-to-end path length |
| Flexibility | The SRv6 path behind the BSID can change without affecting the SR-MPLS domain |
| Incremental migration | New SRv6 segments can be added behind the BSID without touching the SR-MPLS domain configuration |
BSID Stitching Across Domains¶
In a multi-domain network, each domain boundary has a gateway that owns a BSID. Traffic is stitched from one domain to the next by chaining BSIDs:
graph LR
PE1[PE1<br/>SR-MPLS] -->|"Label stack: [16002, BSID-A]"| GW1[Gateway 1<br/>BSID-A = 24999]
GW1 -->|"SRv6: [fcbb:bb01:0005::1, BSID-B]"| GW2[Gateway 2<br/>BSID-B = fcbb:bb02:0001::PE]
GW2 -->|"Final SRv6 SID list"| PE2[PE2<br/>SRv6] - PE1 pushes
[16002, BSID-A(24999)]-- transport to Gateway 1, then the BSID - Gateway 1 receives the packet, matches BSID-A (24999), and expands it into the SRv6 segment list for Domain B:
[fcbb:bb01:0005::1, BSID-B] - Gateway 2 receives the packet, matches BSID-B, and expands it into the final SRv6 segments to reach PE2
BSID Allocation: Static vs Dynamic¶
| Allocation Method | Description | Use Case |
|---|---|---|
| Static | Operator manually assigns a specific label or SID as the BSID for each SR Policy | Production networks where predictable values are needed for troubleshooting, policy enforcement, and cross-domain contracts |
| Dynamic | The headend or gateway automatically allocates a BSID from a reserved range when the SR Policy is instantiated | Lab environments, automated deployments, or when BSIDs are only consumed locally |
Best Practice for Migration
Use static BSID allocation at domain boundaries during migration. This ensures that cross-domain stitching configurations remain stable even when SR Policies are re-optimized or the gateway restarts.
Worked Example: SR-MPLS Traffic Hitting a BSID¶
Consider traffic from an SR-MPLS domain that needs to reach 10.0.0.0/24 behind PE2 in the SRv6 domain:
1. PE1 (SR-MPLS) receives customer traffic for 10.0.0.0/24
2. BGP next-hop resolves to Gateway via SR-MPLS transport
3. PE1 pushes label stack:
┌──────────────────────────┐
│ Transport: 16005 (to GW) │
│ BSID: 24999 │ ← represents SRv6 SR Policy to PE2
│ ======================== │
│ Customer IPv4 packet │
└──────────────────────────┘
4. Packet arrives at Gateway, transport label already popped (PHP)
5. Gateway processes BSID 24999 → expands into SRv6 SR Policy:
┌─────────────────────────────────────┐
│ IPv6 SA: fcbb:bb01:0100:: │
│ IPv6 DA: fcbb:bb01:0005::1 │ ← first SRv6 segment
│ SRH: [fcbb:bb01:0002::DT4] │ ← remaining segments
│ =================================== │
│ Customer IPv4 packet │
└─────────────────────────────────────┘
6. Packet traverses SRv6 domain using standard SRv6 forwarding
7. PE2 processes End.DT4 → decapsulates and delivers to VRF
Control Plane Coexistence¶
During migration, the control plane must advertise reachability information for both SR-MPLS and SRv6 simultaneously. This section covers how IS-IS and BGP handle dual data-plane coexistence.
IS-IS with Dual SR Data Planes¶
IS-IS can advertise both SR-MPLS Prefix-SIDs and SRv6 Locators in the same IGP instance. There is no need to run separate IS-IS instances for each data plane.
IS-IS LSP from Node R5 (dual-stack capable):
├── TLV 135 (IPv4 Reachability):
│ Prefix: 10.255.0.5/32
│ Sub-TLV: Prefix-SID = 16005 (MPLS label = SRGB base + 5)
│
└── TLV 236 (IPv6 Reachability):
Prefix: fcbb:bb01:0005::/48
Sub-TLV: SRv6 Locator
Algorithm: 0
SRv6 End SID: fcbb:bb01:0005::1
| IS-IS TLV | Purpose | Data Plane |
|---|---|---|
| TLV 135 + Prefix-SID sub-TLV | Advertise MPLS Prefix-SID for an IPv4 node address | SR-MPLS |
| TLV 236 + SRv6 Locator sub-TLV | Advertise SRv6 locator and associated End SIDs | SRv6 |
| TLV 22 + Adj-SID sub-TLV | Advertise per-adjacency MPLS SID | SR-MPLS |
| TLV 22 + SRv6 End.X SID sub-TLV | Advertise per-adjacency SRv6 SID | SRv6 |
Single IGP Instance
A key advantage of SR is that both data planes share the same IS-IS topology database. You do not need separate IGP instances or processes. A single IS-IS instance computes SPF once and installs both MPLS and SRv6 forwarding entries as appropriate.
BGP Multi-Protocol: Dual SID Signaling¶
BGP VPNv4/VPNv6 and EVPN routes can carry both MPLS labels and SRv6 SIDs simultaneously, enabling the gateway to choose the appropriate encapsulation based on the egress domain.
BGP VPNv4 Update (dual-stack PE advertising both):
├── NLRI: RD:65000:100 10.0.0.0/24
├── Next-Hop: 10.255.0.2 (IPv4) / fcbb:bb01:0002:: (IPv6)
├── Extended Communities:
│ Route Target: 65000:100
├── MPLS Label: 24001
└── SRv6-VPN SID TLV:
SRv6 SID: fcbb:bb01:0002::DT4
SID Behavior: End.DT4 (63)
SID Structure: BL=32, NL=16, FL=16, AL=0
Preference and Fallback Logic¶
When a node has both SR-MPLS and SRv6 paths available for the same destination, a preference mechanism determines which is used:
| Priority | Criteria | Typical Configuration |
|---|---|---|
| 1 | Explicit SR Policy | If an SR Policy (with candidate path) steers traffic for the prefix, it takes precedence regardless of data plane |
| 2 | BGP color extended community | Color-based steering can select an SRv6 or SR-MPLS SR Policy |
| 3 | Address family preference | Operator-configured preference: some deployments prefer SRv6 when available, falling back to SR-MPLS |
| 4 | IGP metric / best path | Standard BGP best-path selection when no explicit steering is configured |
Fallback Strategy During Migration
Configure SR-MPLS as the primary transport during early migration phases and SRv6 as the backup. As confidence grows, reverse the preference. This allows instant rollback by simply changing the preference knob without removing any configuration.
! Example: IOS XR preference configuration concept
router bgp 65000
address-family vpnv4 unicast
! Prefer SRv6 transport when available
transport prefer srv6
! Fall back to SR-MPLS if SRv6 path is unavailable
transport fallback sr-mpls
SID Allocation Planning¶
A well-designed SID allocation plan is critical for a successful SRv6 deployment. Poor planning leads to renumbering, operational complexity, and scaling limitations.
Choosing Your SID Block¶
Per RFC 9602, the recommended SRv6 SID block ranges are:
| Block | Purpose | Notes |
|---|---|---|
5f00::/16 | IANA-registered SRv6 SID block | Globally routable, for use across organizational boundaries (RFC 9602) |
fc00::/7 (ULA space) | Private/internal use | Commonly used in enterprise and SP networks that do not need global SRv6 reachability |
fcbb:bbXX::/32 | Common convention in Cisco deployments | De facto standard in many production SRv6 networks |
Avoid Using Global Unicast (2000::/3) for SIDs
While technically possible, using globally routable IPv6 space for SRv6 SIDs creates confusion between transit IPv6 traffic and SRv6-encapsulated traffic. Use the dedicated 5f00::/16 block or ULA space instead.
Locator Structure¶
The SRv6 locator is structured as follows per RFC 8986 and RFC 9800:
|<---------- Locator ---------->|<-- Function -->|<- Argument ->|
|<-- Block -->|<---- Node ----->| | |
| B bits | N bits | F bits | A bits |
| | | | |
fcbb:bb01 : 0005 : 0001 : 0000
(32 bits) (16 bits) (16 bits) (variable)
| Field | Typical Length | Purpose |
|---|---|---|
| Block | 32-48 bits | Identifies the SRv6 domain. All nodes in the same domain share this prefix |
| Node | 16-24 bits | Uniquely identifies a node within the domain |
| Function | 16 bits | Identifies the behavior (End, End.DT4, End.DX2, etc.) on the node |
| Argument | 0-variable bits | Optional parameters for the function (e.g., flow entropy) |
uSID Considerations¶
For uSID (micro-SID) deployments as defined in RFC 9800, the structure changes significantly:
Standard SRv6 SID (128-bit):
|<--- Locator (48-bit) --->|<- Function (16-bit) ->|<- Args (64-bit) ->|
fcbb:bb01:0005 :0001 :0000:0000:0000
uSID Container (128-bit, carrying up to 6 micro-SIDs):
|<- Block (32-bit) ->|<----- 6 x 16-bit uSIDs ------>|
fcbb:bb01 :0005:0007:0003:0002:0000:0000
^^^^ ^^^^ ^^^^ ^^^^
uSID1 uSID2 uSID3 uSID4 (2 slots empty = end)
| Parameter | Standard SRv6 | uSID |
|---|---|---|
| Block length | 32-48 bits | 32 bits (fixed) |
| Per-node SID size | 128 bits | 16 bits |
| SIDs per container | 1 | Up to 6 |
| SRH needed (up to 6 hops) | Yes | No |
| Overhead (up to 6 hops) | 40 + 24 x N bytes | 40 bytes (IPv6 header only) |
Numbering Plan Example: Medium Network (100 Nodes)¶
The following allocation plan covers a medium-size service provider with 100 nodes across 4 regions:
SRv6 Block: fcbb:bb01::/32 (uSID block)
Region allocation (bits 33-40 = region ID):
Region 1 (Core): fcbb:bb01:01XX::/40 (nodes 0x0100 - 0x01FF)
Region 2 (East): fcbb:bb01:02XX::/40 (nodes 0x0200 - 0x02FF)
Region 3 (West): fcbb:bb01:03XX::/40 (nodes 0x0300 - 0x03FF)
Region 4 (Data Center): fcbb:bb01:04XX::/40 (nodes 0x0400 - 0x04FF)
Per-node function allocation (16-bit function space):
0x0001 End (node SID)
0x0002 End.X (adjacency SID, link 1)
0x0003 End.X (adjacency SID, link 2)
0x0010-001F End.DT4 (L3VPN v4, up to 16 VRFs)
0x0020-002F End.DT6 (L3VPN v6, up to 16 VRFs)
0x0030-003F End.DT2U (EVPN unicast)
0x0040-004F End.DT2M (EVPN multicast)
0x0050-005F Flex-Algo End SIDs (Algo 128-143)
0xFE00-FEFF Reserved for BSID (static)
0xFF00-FFFF Reserved for future use
Example node assignments (Region 1 -- Core):
| Node | Hostname | Locator | End SID | End.DT4 (VRF CUST-A) |
|---|---|---|---|---|
| 1 | core-rtr-01 | fcbb:bb01:0101::/48 | fcbb:bb01:0101::1 | fcbb:bb01:0101::10 |
| 2 | core-rtr-02 | fcbb:bb01:0102::/48 | fcbb:bb01:0102::1 | fcbb:bb01:0102::10 |
| 3 | core-gw-01 | fcbb:bb01:0103::/48 | fcbb:bb01:0103::1 | fcbb:bb01:0103::10 |
Common Mistakes to Avoid¶
SID Allocation Pitfalls
1. Overlapping locators: If two nodes are assigned overlapping locator prefixes, SRv6 forwarding will be ambiguous. Every locator must be unique in the IGP domain.
2. Insufficient function space: Allocating only 8 bits for the function field limits you to 256 functions per node. For nodes hosting many VRFs or EVPN instances, 16 bits (65,536 functions) is strongly recommended.
3. Forgetting uSID alignment: uSID requires the block to be exactly 32 bits and each micro-SID to be 16 bits. Choosing a 48-bit block breaks uSID compatibility.
4. No room for growth: Allocate at least 2x the currently needed address space per region to accommodate future growth without renumbering.
5. Mixing SID blocks across domains: Each SRv6 domain should use a distinct block. This simplifies filtering, policy enforcement, and troubleshooting.
Migration Phases (Detailed)¶
This section expands the high-level migration options into a structured, phased approach with specific actions, verification steps, and rollback plans for each phase.
Phase 0: Assessment and Planning¶
Objective: Understand the current state and design the target architecture.
| Activity | Details |
|---|---|
| Inventory current MPLS services | Catalog all L3VPN, L2VPN/EVPN, TE tunnels, and multicast services. Document the number of VRFs, pseudowires, and RSVP-TE tunnels per node |
| Identify SRv6-capable hardware | Audit all router platforms and line cards. Check vendor documentation for SRv6 and uSID support. Flag nodes requiring hardware upgrades |
| Design SID allocation scheme | Follow the SID Allocation Planning section above. Define block, locator structure, and per-node function assignments |
| Plan gateway placement | Identify domain boundary nodes that will serve as SR-MPLS/SRv6 gateways. Ensure these have sufficient memory and forwarding capacity |
| Define success criteria | Establish KPIs: convergence time, packet loss during cutover, service availability targets |
Verification: Review the plan with network operations, get sign-off from stakeholders.
Rollback: N/A -- this phase is planning only.
Phase 1: Parallel Deployment (SRv6 Underlay)¶
Objective: Enable SRv6 on the network alongside MPLS. No production traffic uses SRv6 yet.
Actions:
1. Enable IPv6 on all core links (if not already enabled)
2. Advertise SRv6 locators in IS-IS (TLV 236)
3. Continue advertising SR-MPLS Prefix-SIDs (TLV 135)
4. Configure SRv6 End SIDs on upgraded nodes
5. Do NOT configure any SRv6 VPN services yet
Verification checklist:
- All upgraded nodes advertise their SRv6 locator in IS-IS
-
show segment-routing srv6 sidshows allocated SIDs on each node - SRv6 locators are reachable via IPv6 ping from all nodes in the domain
- SR-MPLS forwarding is completely unaffected -- verify with traffic counters
- IS-IS adjacencies are stable, no SPF churn
Rollback: Remove SRv6 locator advertisements from IS-IS. Remove SRv6 SID configuration from nodes. This has zero impact on production MPLS traffic since no services use SRv6 yet.
Phase 2: Service Migration¶
Objective: Migrate VPN services from SR-MPLS to SRv6 transport, starting with non-critical services.
Migration order (recommended):
1. Internal/management VPNs (lowest risk)
2. Non-revenue L3VPN customers (test accounts, lab VPNs)
3. Standard L3VPN customers (one at a time)
4. EVPN services
5. TE-dependent services (last, most complex)
For each service migration:
| Step | Action |
|---|---|
| 1 | Configure the SRv6 VPN SID (e.g., End.DT4) on the PE nodes for the target VRF |
| 2 | Advertise the SRv6 SID in BGP VPN updates alongside the existing MPLS label |
| 3 | On the remote PE, verify that both MPLS and SRv6 paths are received |
| 4 | Change the transport preference to SRv6 for this VRF |
| 5 | Monitor traffic counters -- confirm traffic shifts to SRv6 encapsulation |
| 6 | After soak period (24-72 hours), remove the MPLS label advertisement for this VRF |
Verification:
-
show bgp vpnv4 unicast vrf CUST-Ashows SRv6 SID in the best path - Traffic counters on SRv6 interfaces are incrementing
- Customer-facing SLAs are met (latency, jitter, packet loss)
- No MPLS-encapsulated traffic for the migrated VRF remains
Rollback: Revert the transport preference to SR-MPLS. Since both MPLS labels and SRv6 SIDs are advertised during the transition, traffic immediately falls back to MPLS. This is a sub-second switchover if using BGP next-hop tracking.
Phase 3: Optimization¶
Objective: Enable advanced SRv6 features and optimize the network.
| Activity | Benefit |
|---|---|
| Enable uSID | Reduce encapsulation overhead from 40-96 bytes to 40 bytes for up to 6 hops |
| Deploy Flex-Algo | Create topology-independent algorithms for low-latency, disjoint, or constrained paths |
| Enable SRv6 TE Policies | Replace remaining RSVP-TE tunnels with SRv6 SR Policies (using BSIDs) |
| Optimize MTU | With uSID deployed, re-evaluate MTU requirements. Many paths may no longer need jumbo frames |
| Remove redundant SR-MPLS config | On fully migrated nodes, remove Prefix-SID configuration, SRGB allocation, and SR-MPLS policies |
Verification:
- uSID forwarding works: packets traverse multiple hops with a single 128-bit container SID
- Flex-Algo paths are computed and installed correctly
- No RSVP-TE tunnels remain in the forwarding table
- End-to-end service validation passes for all VPN customers
Rollback: Each optimization can be rolled back independently. For example, disabling Flex-Algo only affects traffic using those algorithms; default algo 0 traffic is unaffected.
Phase 4: MPLS Decommission¶
Objective: Remove all MPLS forwarding state from the network.
Point of No Return
Phase 4 is the most impactful. Ensure all services have been operating on SRv6 for a sufficient soak period (minimum 2-4 weeks recommended) before proceeding.
Decommission order:
1. Remove LDP configuration (if any LDP sessions remain)
2. Remove RSVP-TE configuration
3. Remove SR-MPLS Prefix-SID advertisements from IS-IS
4. Remove SRGB/SRLB configuration
5. Disable MPLS forwarding on interfaces
6. Clean up any MPLS-specific ACLs, QoS policies, OAM
Verification:
-
show mpls forwarding-tableis empty on all nodes - No LDP or RSVP-TE sessions exist
- IS-IS no longer carries any SR-MPLS Prefix-SID TLVs
- All services continue to operate over SRv6
- Monitoring confirms zero MPLS-encapsulated packets on any link
Rollback: Re-enable SR-MPLS Prefix-SIDs in IS-IS and MPLS forwarding on interfaces. Since BGP VPN routes can carry MPLS labels again once advertised, services can be reverted to MPLS transport. However, this rollback requires careful re-configuration, which is why a thorough soak period before Phase 4 is essential.
Brownfield Coexistence Patterns¶
Pattern 1: Core-First Migration¶
Upgrade core/backbone routers to SRv6 first, keep edge on SR-MPLS:
Pattern 2: Edge-First Migration¶
Upgrade edge/PE routers first, keep core on SR-MPLS:
Pattern 3: Region-by-Region¶
Migrate one region at a time:
Further Reading¶
- SRv6 vs SR-MPLS - Detailed comparison
- uSID / SRv6 Compression - How uSID reduces overhead
- Performance & Scaling - MTU impact analysis
- Real-World Deployments - Migration stories
References¶
- RFC 8402 - Segment Routing Architecture - Defines the SR architecture covering both SR-MPLS and SRv6 data planes
- RFC 9256 - SR Policy Architecture - Defines Binding SID and multi-domain SR Policy stitching
- RFC 9602 - Segment Routing over IPv6 (SRv6) Segment Identifiers in the IPv6 Addressing Architecture - IANA allocation of the 5f00::/16 SRv6 SID block
- RFC 9800 - Segment Routing over IPv6 with Micro-Segments - Defines the uSID (micro-SID) architecture for compressed SRv6
- RFC 8986 - SRv6 Network Programming - Defines SRv6 SID structure, behaviors (End, End.DT4, End.DX2, etc.)
- draft-ietf-spring-srv6-interop - SRv6 interoperability considerations