An SR-TE controller for open routers.
A router chooses the best path from where it stands, and for almost everything you carry that is the right answer. Three decisions need a view of the whole network instead: reserving capacity along a path, keeping two services off the same links, and choosing which peering a service leaves by. Traffic Dictator, from Vegvísir Systems, computes those against the live topology and installs the paths on IP Infusion’s open routers running OcNOS.
What your routers already do, and what a controller adds.
OcNOS routers already do a great deal on their own, with ECMP, TI-LFA local protection and Flex-Algo planes built inside the IGP. A controller adds only the decisions that need a view of the whole network. The tag on each card says which half delivers it.
Stop one failure from causing the next
TI-LFA precomputes a local repair path, so the router switches onto it without waiting for the network to reconverge. The controller spreads that reroute across links with spare capacity, so the first failure does not cause a second.
OcNOS + controllerPut latency-sensitive traffic on a short path
Flex-Algo builds a low-delay plane inside the IGP. Trading, media and mobile fronthaul follow it, while everything else keeps taking the cheapest route.
OcNOS on its ownReserve capacity for a service you sold
The policy carries a bandwidth figure. The controller checks for free capacity before it installs the path, and holds the policy back if a link is already full.
OcNOS + controllerUse the links you are already paying for
ECMP already fills your equal-cost links. The controller places services on the unequal-cost ones, turning idle capacity into capacity you can sell.
OcNOS + controllerKeep the backup off the links the primary uses
A disjoint group makes separation part of the policy, so a protecting path never shares a link with the one it protects.
OcNOS + controllerHow a constraint you type becomes a label the router pushes.
In this design only two protocols cross between the two halves, and because both are standard, either half can be replaced on its own.
A segment list is an ordered set of labels. Each label names a router or a peering, and the head-end router pushes them onto the packet so that it visits them in order. A policy is a head-end, an endpoint, and the constraints that shape the list between them.

It ships as a complete router, because IP Infusion integrates, validates and supports the hardware and OcNOS together, so responsibility for the hardware and the software together sits with one vendor.
- Runs the network. IS-IS with segment routing extensions, so labels, ECMP and TI-LFA fast reroute all run in the routers themselves.
- Acts as the head-end. Installs the policy it is given, pushes the segment list, and reports the operational state back.
- Labels the exits. Allocates a BGP Peer SID for each external peering, so the controller can name that peering in a segment list.
It ships as a Docker container, on a server, in an existing virtualization environment, or on a router able to host containers, with an HTTP API for automation.
- Builds the graph. Node, Link and Prefix information arrives over BGP-LS and becomes a live topology with the segment IDs attached.
- Holds the constraints. Explicit hops, link affinities, bandwidth, disjoint groups and egress peers are all expressed as constraints on a policy.
- Computes and installs. Works out the segment list, pushes it to the head-end, then updates it when the topology moves.
OcNOS can perform distributed traffic steering using IGP mechanisms such as Flex-Algo, while an external PCE or controller can compute explicit SR policies using network-wide constraints. Bandwidth is the constraint that needs a single view: segment routing gets its scale by not signalling reservations hop by hop, so the running total of what every policy has claimed is held centrally instead. You set that figure per policy, and it does not resize itself from measured traffic today. RSVP-TE takes the other approach and signals a reservation at every hop.
Four steps take you from switching segment routing on to a policy running in the network.
The first two are one-off setup on the routers. The last two are what you repeat for every policy you create.
Turn on segment routing
IS-IS carries the segment routing extensions on every router, together with the traffic engineering extensions, so link bandwidth and admin groups are advertised as well. The labels come from segment routing itself.
Export the topology to the controller
One router redistributes the link-state database into BGP-LS with distribute bgp-ls and peers with the controller.
Define the policy and its constraints
A policy names a head-end, an endpoint and the constraints it has to meet. The controller computes the path against the live topology and returns a segment list, which is the list of labels the head-end will push onto the packet.
Install it, then keep it current
The controller sends the policy over PCEP, and the head-end reports back that it is up and forwarding on it. If the topology changes later, the same policy is updated in place rather than rebuilt.
How each constraint changes the path the controller returns.
Select a constraint below to see the path and the labels it produces. Every segment list and metric shown here is output recorded in the joint lab.
Swipe the diagram sideways to follow the path
Five constraints and the path each one returns
- Stay on the blue links, a link affinity constraint
- Path R3 to R4. Segment list 16004. Aggregate metric 10, one hop. Every link on the path must carry the BLUE tag, and the direct R3 to R4 link does, so one node segment is enough. Policy
R3_R4_BLUE,affinity-set BLUE_ONLY. - Stay on the yellow links, a link affinity constraint
- Path R3 to R2 to R4. Segment list 16002, 16004. Aggregate metric 20, two hops. The YELLOW tag is required on every link, so the direct link is out and the controller routes through R2, with no metric changed anywhere in the network. Policy
R3_R4_YELLOW,affinity-set YELLOW_ONLY. - Reserve 40 Gbps, a bandwidth constraint
- Path R3 to R2 to R4. Segment list 16002, 16004. Aggregate metric 20, with 40 Gbps held. The same path with capacity attached: the controller checked both links could carry 40 Gbps before installing anything and recorded the reservation in its own ledger. Policy
R3_R4_YELLOW,bandwidth 40 gbps. - Pick the exit peer, egress peer engineering
- Path R3 to R2 to AS 101. Segment list 16002, 25600. Aggregate metric 10, one hop plus the exit. 25600 is the BGP Peer SID that R2 allocated for its peering with AS 101, so the segment list ends by naming an exit. Policy
R3_R2_EPE. - That exit, on blue links, affinity plus egress peer engineering
- Path R3 to R1 to R2 to AS 101. Segment list 16001, 16002, 25600. Aggregate metric 20, two hops plus the exit. Both constraints at once: the exit is still AS 101, and the path to it must stay on BLUE links, so the controller goes the long way through R1. Policy
R3_R2_EPE_BLUE,affinity-set BLUE_ONLY.
Every segment list, metric and policy name here comes from the joint IP Infusion and Vegvísir application note. Each is shown there as live output from show traffic-eng policy <name> detail on the controller. Traffic Dictator syntax is documented at vegvisir.ie/documentation.
The ingress router can choose which peering the packet leaves through.
Traffic engineering usually stops at your own border, whereas egress peer engineering extends one hop beyond it, so the ingress router chooses which peering the packet leaves through. Where transit costs more than peering, that choice reduces cost.
A worked example of the mechanism, not a lab measurement.
Four routers each push 30 Gbps toward one destination, balanced across two private peerings of 100 Gbps that are preferred because they cost less than transit. One of those peerings then fails.
With standard BGP the whole 120 Gbps lands on the surviving peering, and every service crossing it degrades at once.
A bandwidth constraint makes the controller admit only what the peering can carry, so three policies land on the survivor and the fourth takes its second candidate path over transit.
The result is a small amount of transit spend, while everything else on the peering keeps running.
Every peering is given its own label
egress-engineering on the border router allocates a BGP Peer SID for that peering and advertises it, so the controller can put an exit at the bottom of a segment list.
Link affinity applies right up to the border
A BGP Peer SID carries no link attributes, so you assign an affinity and a bandwidth to the egress peer on the controller and it matches them against the advertised SID.
Use the closest exit that has spare capacity
A policy with a null endpoint asks for the nearest suitable exit, so the controller picks the qualifying exit closest to the head-end and traffic leaves before crossing your backbone.
Controller capability, outside the joint validation: null endpoints need colour steering, and the joint lab used service loopback steering throughout.
A failed peering is visible in the policy state
When the neighbour goes down the peer SID is withdrawn and the egress policy fails, and that failure is reported in the policy state.
What the joint lab exercised, and what it returned.
IP Infusion and Vegvísir Systems built the design together and published it. The table below lists each capability exercised, together with the result each test produced.
| Capability | How it was driven | Result |
|---|---|---|
| Topology export | IS-IS level-2 database redistributed into BGP-LS on one router | R3 exported 34 pieces of link-state information: 5 nodes, 10 links, 19 prefixes. The controller's own table showed them received. |
| Explicit path | Strict hops named in the policy, plus a 2 Gbps reservation | Segment list [16001, 16002, 16005] installed. |
| Bandwidth constraint | A bandwidth figure carried on the candidate path | A 2 Gbps reservation on the explicit-path policy was checked at computation time and recorded in the controller database, visible as reduced unreserved bandwidth on every link of the path. The affinity policies used the same mechanism at 40 Gbps. |
| Link affinity | Two policies between the same pair of routers, one per admin group | BLUE produced [16004] at metric 10, YELLOW produced [16002, 16004] at metric 20. Same endpoints, different paths, no metric changes anywhere. |
| Service mapping | Two L3VPN customers on separate service loopbacks | Each VRF resolved over its own policy. A ping in VRF101 was captured on the transit router and carried the expected transport and VPN labels. |
| Path diversity | Two policies placed in the same disjoint group | The two policies always took different links, with no affinities and no explicit paths configured at all. |
| ECMP and anycast SID | A shared prefix SID advertised by two routers with the node flag cleared | Two segment lists collapsed into one, which saves forwarding table space. |
| Egress peer engineering | A BGP Peer SID allocated for an external peering and steered to | Segment list [16002, 25600], where the last label is the peering rather than a router. Adding an affinity produced [16001, 16002, 25600]. |
| Controller failover | Primary controller stopped with policies delegated to it | The router redelegated every policy to the second controller. No state was synchronised between the two. |
| Total controller loss | All controllers stopped | Policies withdrawn, the service routes resolved over IS-IS segment routing, next hop unchanged. The replacement entries were installed and active when the table was read. |
The validation ran on one platform. The tested architecture is standard IS-IS, BGP-LS and PCEP, so the design travels, and platform and release support should be confirmed against the hardware compatibility list and the feature matrix for the box you have in mind.
What happens when a controller is lost, and when all of them are.
Traffic continues to flow in both cases. If one controller is lost, the routers move their policies to another one, and if all of them are lost, the services fall back to the shortest path the IGP was already computing.
If one controller is lost, the routers redelegate the policies themselves
Each policy is delegated to the controller that created it, and when that controller stops answering, the router redelegates it to another. Because the mechanism runs in the router rather than between the controllers, the controllers never share state, so adding a third one costs nothing in state synchronisation.
If every controller is lost, everything resolves over IS-IS again
The policies are withdrawn and the service routes resolve over IS-IS segment routing instead. The BGP next hop stays the same.
P> 172.16.101.4/32 out-label 3 out-intf cd1 nexthop 10.100.3.2
P> 172.16.102.4/32 out-label 3 out-intf cd0 nexthop 10.100.6.4
P is an SR Policy entry. Two services, two different engineered paths. Columns condensed from the full show mpls forwarding-table output.
B> 172.16.101.4/32 out-label 24962 out-intf cd0 nexthop 4.4.4.4
B> 172.16.102.4/32 out-label 24963 out-intf cd0 nexthop 4.4.4.4
B is a BGP entry resolved by IS-IS segment routing. The BGP next hop of the VPN routes is unchanged. What changes is how it resolves, over IS-IS segment routing instead of over a policy, which is why the outgoing label and interface differ. Both entries were 16 seconds old when the table was read. Columns condensed from the full output.
On the router side the configuration is ordinary IS-IS and BGP, with a single PCEP block added.
These are excerpts from the joint validation, with comments added. Because Traffic Dictator uses an industry-standard CLI, the controller configuration is as readable as the router configuration, so one engineer can work across both halves.
PCEP Validated pairing
It is stateful, so the controller knows whether the router installed the policy and is forwarding on it, and it needs one session per head-end. This is the option the joint validation used.
BGP SR-TE Fewest sessions
Policies are carried as BGP routes, so they ride your existing route reflectors instead of needing a session to every head-end. On a large network that is the difference between a handful of sessions and hundreds of them.
! feed the IS-IS link-state database into BGP
router isis 1
distribute bgp-ls
!
router bgp 65002
bgp router-id 3.3.3.3
neighbor 192.168.123.1 remote-as 65001
!
address-family link-state link-state
neighbor 192.168.123.1 activate
exit-address-family
What each line does
distribute bgp-lsis the whole export: IS-IS hands its database to BGP.- The controller is just another BGP neighbour, in its own autonomous system.
link-stateaddress family carries topology. Three kinds of information cross it: Node, with system IDs and the segment routing global block; Link, with metric, bandwidth, admin group and adjacency SID; and Prefix, with prefixes and their SIDs.- Only one router needs this configuration, because it re-advertises the link-state database that the whole IS-IS level has already given it.
Excerpted from the joint application note, IP Infusion and Vegvísir Systems, August 2025. Verify current syntax at documentation.ipinfusion.com.
pce configuration 1
capability
segment-routing pcep
pce instantiation
exit-capability
!
update-source 192.168.123.3
peer-address ipv4 192.168.123.1
What each line does
segment-routing pceptells the controller this router can be given segment lists rather than RSVP tunnels.pce instantiationis the permission that lets the controller create policies as well as update them, so a policy can start life on the controller rather than on the router.- The session then reports its capabilities to the controller: stateful PCE, LSP instantiation and SR PCE capability all come up as supported.
Excerpted from the joint application note, IP Infusion and Vegvísir Systems, August 2025. Verify current syntax at documentation.ipinfusion.com.
! ---- on R3: name the link groups once, then tag interfaces ----
admin-group BLUE 0
admin-group YELLOW 1
!
interface cd0
admin-group BLUE
!
interface cd1
admin-group YELLOW
!
! ---- on the border router R2, which holds the external peering ----
router bgp 65002
bgp router-id 2.2.2.2
neighbor 192.168.123.2 remote-as 101
!
egress-engineering
neighbor 192.168.123.2 peer-node
exit-egress-engineering
What each line does
admin-groupbinds a name to a bit position. Tag an interface and the IGP advertises it, so the controller sees the tag with no extra session.- You choose the names. They are BLUE and YELLOW here, but in a real network they usually describe the asset, such as a leased circuit, a subsea path or a low-latency ring.
egress-engineeringandpeer-nodetogether allocate the BGP Peer SID for that peering. Without it, a policy has no way to name that exit. Note that the two blocks in this panel are configured on different routers.- The border router advertises the peer SID in BGP-LS, either straight to the controller or to the router that already holds the controller session, which re-advertises it. Either way it is one more BGP-LS neighbour statement.
Excerpted from the joint application note, IP Infusion and Vegvísir Systems, August 2025. Verify current syntax at documentation.ipinfusion.com.
traffic-eng affinities
affinity-map
name BLUE bit-position 0
name YELLOW bit-position 1
!
affinity-set YELLOW_ONLY
constraint include-all
name YELLOW
!
traffic-eng policies
!
policy R3_R4_YELLOW
headend 3.3.3.3 topology-id 1
endpoint 4.4.4.4 service-loopback 172.16.101.4
priority 7 7
install direct pcep 192.168.123.3
!
candidate-path preference 200
affinity-set YELLOW_ONLY
bandwidth 40 gbps
What each line does
- The affinity map gives both halves the same names for the same bits. Bit 1 is called YELLOW on the router and on the controller, so the two agree without a translation layer.
constraint include-allmeans every link on the path must carry the tag.endpointandservice-loopbacktogether attach a service. Each service gets its own loopback as a next hop, so two services between the same pair of routers can take different paths.priority 7 7sets the setup and hold priority. It is what decides who gives up bandwidth when a more important policy needs it.candidate-path preference 200is the primary attempt, and adding a path at a lower preference describes the fallback inside the same policy.
Excerpted from the joint application note, IP Infusion and Vegvísir Systems, August 2025. Traffic Dictator documentation is published at vegvisir.ie.
Traffic engineering, answered
What is an SR-TE controller?
Do I need a controller to run segment routing?
Is Traffic Dictator mandatory, or can we use a different controller?
Who supplies and supports each half of this solution?
Do I have to replace my existing routers to add an SR-TE controller?
Can we migrate from RSVP-TE without rebuilding our services?
Can the bandwidth reservation follow measured traffic?
Is SRv6 traffic engineering supported in this design?
Want the lab in full?
A short, technical download that goes further than this page: the segment routing application note.
Segment Routing Application Note
Quick form. Your PDF opens in a new tab immediately after submit.
✓ Opening your PDF in a new tab…
If it didn't open, use the link below.
Take it to a proof of concept.
Vegvísir Systems publishes Traffic Dictator for evaluation and proof of concept work without a licence, limited to 100 policies, and OcNOS is available as a virtual machine. Tell us what you want to steer and we will scope it on the right pair, then size the production build.
Would you like us to reach out?
Leave your details and an IP Infusion engineer will walk through what traffic engineering would look like on your network. We will only be in touch if you would like us to be.