Summary
Traffic Dictator version 1.7 has been released on 28.07.2025. This article describes changes in the new version.
New features
Link, node and SRLG disjoint options
TD version 1.4 introduced disjoint groups as an easy way to achieve path diversity without any extra config such as affinity or explicit path. This has now been extended to support link, node and SRLG constraints.
New config model:
traffic-eng policies
policy <name>
!
candidate-path preference <0-4294967295>
disjoint-group <1-65535> [link|node|srlg|srlg-node]
Note: CLI will no longer accept the old config style “disjoint-group <>”; however, it will still be accepted via API and when reading startup-config and replaced with “disjoint-group <> link”.
Shared risk link group (SRLG) constraint also includes link constraint, so it’s more strict. Therefore, “srlg-node” is the strictest possible constraint; policies within the same group cannot use same link, node or SRLG.
Link constraint example
In this topology, 3 policies are configured with the same disjoint group with link constraint, so they all use strictly different links to reach from R1 to R11.
Config:
traffic-eng policies
!
policy R1_R11_disjoint1
headend 1.1.1.1 topology-id 101
endpoint 11.11.11.11 color 101
install direct srte 192.168.0.101
!
candidate-path preference 100
disjoint-group 100 link
!
policy R1_R11_disjoint2
headend 1.1.1.1 topology-id 101
endpoint 11.11.11.11 color 102
install direct srte 192.168.0.101
!
candidate-path preference 100
disjoint-group 100 link
!
policy R1_R11_disjoint3
headend 1.1.1.1 topology-id 101
endpoint 11.11.11.11 color 103
install direct srte 192.168.0.101
!
candidate-path preference 100
disjoint-group 100 link
Outputs:
TD#show traffic-eng policy detail
Detailed traffic-eng policy information:
Traffic engineering policy "R1_R11_disjoint1"
Valid config, Active
Headend 1.1.1.1, topology-id 101, Maximum SID depth: 15
Endpoint 11.11.11.11, color 101
Endpoint type: Node, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00
Setup priority: 7, Hold priority: 7
Reserved bandwidth bps: 0
Install direct, protocol srte, peer 192.168.0.101
Policy index: 23, SR-TE distinguisher: 16777239
Candidate paths:
Candidate-path preference 100
Path config valid
Metric: igp
Disjoint-group: 100
Link disjoint: True
Node disjoint: False
SRLG disjoint: False
Path-option: dynamic
This path is currently active
Calculation results:
Aggregate metric: 40
Topologies: ['101']
Segment lists:
[16004, 16007, 16011]
Policy statistics:
Last config update: 2025-07-27 15:54:21,252
Last recalculation: 2025-07-27 15:54:21.560
Policy calculation took 1 miliseconds
Traffic engineering policy "R1_R11_disjoint2"
Valid config, Active
Headend 1.1.1.1, topology-id 101, Maximum SID depth: 15
Endpoint 11.11.11.11, color 102
Endpoint type: Node, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00
Setup priority: 7, Hold priority: 7
Reserved bandwidth bps: 0
Install direct, protocol srte, peer 192.168.0.101
Policy index: 24, SR-TE distinguisher: 16777240
Candidate paths:
Candidate-path preference 100
Path config valid
Metric: igp
Disjoint-group: 100
Link disjoint: True
Node disjoint: False
SRLG disjoint: False
Path-option: dynamic
This path is currently active
Calculation results:
Aggregate metric: 40
Topologies: ['101']
Segment lists:
[16005, 16010, 24005]
Policy statistics:
Last config update: 2025-07-27 15:53:59,106
Last recalculation: 2025-07-27 15:54:21.558
Policy calculation took 1 miliseconds
Traffic engineering policy "R1_R11_disjoint3"
Valid config, Active
Headend 1.1.1.1, topology-id 101, Maximum SID depth: 15
Endpoint 11.11.11.11, color 103
Endpoint type: Node, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00
Setup priority: 7, Hold priority: 7
Reserved bandwidth bps: 0
Install direct, protocol srte, peer 192.168.0.101
Policy index: 25, SR-TE distinguisher: 16777241
Candidate paths:
Candidate-path preference 100
Path config valid
Metric: igp
Disjoint-group: 100
Link disjoint: True
Node disjoint: False
SRLG disjoint: False
Path-option: dynamic
This path is currently active
Calculation results:
Aggregate metric: 50
Topologies: ['101']
Segment lists:
[16002, 16010, 24007]
Policy statistics:
Last config update: 2025-07-27 15:54:01,109
Last recalculation: 2025-07-27 15:54:21.561
Policy calculation took 1 miliseconds
Node constraint example
Config:
traffic-eng policies
!
policy R1_R11_disjoint1
headend 1.1.1.1 topology-id 101
endpoint 11.11.11.11 color 101
install direct srte 192.168.0.101
!
candidate-path preference 100
disjoint-group 200 node
!
policy R1_R11_disjoint2
headend 1.1.1.1 topology-id 101
endpoint 11.11.11.11 color 102
install direct srte 192.168.0.101
!
candidate-path preference 100
disjoint-group 200 node
Outputs:
TD#show traffic-eng policy detail
Detailed traffic-eng policy information:
Traffic engineering policy "R1_R11_disjoint1"
Valid config, Active
Headend 1.1.1.1, topology-id 101, Maximum SID depth: 15
Endpoint 11.11.11.11, color 101
Endpoint type: Node, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00
Setup priority: 7, Hold priority: 7
Reserved bandwidth bps: 0
Install direct, protocol srte, peer 192.168.0.101
Policy index: 23, SR-TE distinguisher: 16777239
Candidate paths:
Candidate-path preference 100
Path config valid
Metric: igp
Disjoint-group: 200
Link disjoint: False
Node disjoint: True
SRLG disjoint: False
Path-option: dynamic
This path is currently active
Calculation results:
Aggregate metric: 40
Topologies: ['101']
Segment lists:
[16004, 16007, 16011]
Policy statistics:
Last config update: 2025-07-27 16:05:15,443
Last recalculation: 2025-07-27 16:05:15.749
Policy calculation took 1 miliseconds
Traffic engineering policy "R1_R11_disjoint2"
Valid config, Active
Headend 1.1.1.1, topology-id 101, Maximum SID depth: 15
Endpoint 11.11.11.11, color 102
Endpoint type: Node, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00
Setup priority: 7, Hold priority: 7
Reserved bandwidth bps: 0
Install direct, protocol srte, peer 192.168.0.101
Policy index: 24, SR-TE distinguisher: 16777240
Candidate paths:
Candidate-path preference 100
Path config valid
Metric: igp
Disjoint-group: 200
Link disjoint: False
Node disjoint: True
SRLG disjoint: False
Path-option: dynamic
This path is currently active
Calculation results:
Aggregate metric: 40
Topologies: ['101']
Segment lists:
[16005, 16010, 24005]
Policy statistics:
Last config update: 2025-07-27 16:05:15,443
Last recalculation: 2025-07-27 16:05:15.748
Policy calculation took 1 miliseconds
SRLG constraint example
Red links are configured with the same SRLG. Verify that the SRLG attribute has been received via BGP-LS:
TD#show bgp link-state [E][L2][I101][N[c65002][b101][s0010.0010.0010.00]][R[c65002][b101][s0011.0011.0011.00]][L[i10.100.14.10][n10.100.14.11]] detail
BGP-LS routing table information
Router identifier 111.111.111.111, local AS number 65001
Prefix codes: E link, V node, T IP reacheable route, S SRv6 SID, u/U unknown,
I Identifier, N local node, R remote node, L link, P prefix, S SID,
L1/L2 ISIS level-1/level-2, O OSPF, D direct, S static/peer-node,
a area-ID, l link-ID, t topology-ID, s ISO-ID,
c confed-ID/ASN, b bgp-identifier, r router-ID, s SID,
i if-address, n nbr-address, o OSPF Route-type, p IP-prefix,
d designated router address
BGP routing table entry for [E][L2][I101][N[c65002][b101][s0010.0010.0010.00]][R[c65002][b101][s0011.0011.0011.00]][L[i10.100.14.10][n10.100.14.11]]
NLRI Type: link
Protocol: ISIS L2
Identifier: 101
Local Node Descriptor:
AS Number: 65002
BGP Identifier: 101
ISO Node ID: 0010.0010.0010.00
Remote Node Descriptor:
AS Number: 65002
BGP Identifier: 101
ISO Node ID: 0011.0011.0011.00
Link Descriptor:
Local Interface Address IPv4: 10.100.14.10
Neighbor Interface Address IPv4: 10.100.14.11
Paths: 1 available, best #1
Last modified: July 27, 2025 16:28:53
65002
192.168.0.101 from 192.168.0.101 (1.1.1.1)
Origin igp, metric 0, localpref 100, weight 0, valid, external, best
Link-state: Admin-group: 0x0, Max-link-bw: 1000000000,
Max-reservable-bw: 10000000000,
Unreserved-bw: [10000000000, 10000000000, 10000000000, 10000000000, 10000000000, 10000000000, 10000000000, 10000000000],
TE default metric: 500, IGP metric: 10, SRLG: [100],
ADJ-SID: 24005, 24013
Config:
traffic-eng policies
!
policy R1_R11_disjoint1
headend 1.1.1.1 topology-id 101
endpoint 11.11.11.11 color 101
install direct srte 192.168.0.101
!
candidate-path preference 100
disjoint-group 300 srlg
!
policy R1_R11_disjoint2
headend 1.1.1.1 topology-id 101
endpoint 11.11.11.11 color 102
install direct srte 192.168.0.101
!
candidate-path preference 100
disjoint-group 300 srlg
Outputs:
TD#show traffic-eng policy detail
Detailed traffic-eng policy information:
Traffic engineering policy "R1_R11_disjoint1"
Valid config, Active
Headend 1.1.1.1, topology-id 101, Maximum SID depth: 15
Endpoint 11.11.11.11, color 101
Endpoint type: Node, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00
Setup priority: 7, Hold priority: 7
Reserved bandwidth bps: 0
Install direct, protocol srte, peer 192.168.0.101
Policy index: 20, SR-TE distinguisher: 16777236
Candidate paths:
Candidate-path preference 100
Path config valid
Metric: igp
Disjoint-group: 300
Link disjoint: True
Node disjoint: False
SRLG disjoint: True
Path-option: dynamic
This path is currently active
Calculation results:
Aggregate metric: 50
Topologies: ['101']
Segment lists:
[16004, 16007, 16010, 24007]
Policy statistics:
Last config update: 2025-07-27 16:14:03,845
Last recalculation: 2025-07-27 16:14:04.859
Policy calculation took 1 miliseconds
Traffic engineering policy "R1_R11_disjoint2"
Valid config, Active
Headend 1.1.1.1, topology-id 101, Maximum SID depth: 15
Endpoint 11.11.11.11, color 102
Endpoint type: Node, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00
Setup priority: 7, Hold priority: 7
Reserved bandwidth bps: 0
Install direct, protocol srte, peer 192.168.0.101
Policy index: 21, SR-TE distinguisher: 16777237
Candidate paths:
Candidate-path preference 100
Path config valid
Metric: igp
Disjoint-group: 300
Link disjoint: True
Node disjoint: False
SRLG disjoint: True
Path-option: dynamic
This path is currently active
Calculation results:
Aggregate metric: 40
Topologies: ['101']
Segment lists:
[16005, 16010, 24005]
Policy statistics:
Last config update: 2025-07-27 16:14:03,849
Last recalculation: 2025-07-27 16:14:04.858
Policy calculation took 1 miliseconds
Hop-count metric
Previously, IGP and TE metric types were supported. Now this has been extended to support hop-count, so that the shortest path will be with the lowest hop count (assuming it also meets other constraints). For conossieurs of RIPv2.
Config model:
traffic-eng policies
policy <name>
!
candidate-path preference <0-4294967295>
metric [igp|te|hop-count]
PCEP multipath
TD now can advertise multiple segment lists in PCEP. No additional configuration is required.
Multiple segment lists are advertised using path attribute object, as per [draft-ietf-pce-multipath]. This attribute is advertised when both conditions are met:
- Multipath capability is negotiated with PCEP neighbor
- SR-TE policy requires multiple segment lists
Check that the multipath capability is negotiated:
TD#show pcep neighbors
PCEP neighbor is 192.168.0.101, port 52019
PCEP version 1
Last read 0:00:01, last write 0:00:01
Hold time is 120, keepalive interval is 30 seconds
Configured hold time is 120, keepalive interval is 30 seconds
Hold timer is active, time left 0:01:54
Keepalive timer is active, time left 0:00:10
Connect timer is inactive
Idle hold timer is inactive
PCEP state is SessionUp, up for 0:00:06
PCEP init-delay timer is 0 seconds
Number of transitions to SessionUp: 1
Last state was KeepWait
Local session ID: 0, remote session ID: 153
Current SRP ID: 4
Negotiated capabilities:
sr-policy, multipath
Sent Rcvd
Opens: 1 1
Keepalives: 1 1
PCRequests: 0 0
PCReplies: 0 0
Notifications: 0 0
Errors: 0 0
Closes: 0 0
PMRequests: 0 0
PMReplies: 0 0
PCReports: 0 5
PCUpdates: 3 0
PCInitiates: 0 0
StartTLS: 0 0
Total messages: 5 7
NLRI statistics:
Sent Rcvd
IPv4 SR-TE: 3 0
IPv6 SR-TE: 0 0
IPv4 RSVP-TE: 0 0
Local IP is 192.168.0.1
TTL is 255
Verify PCEP route on TD:
TD#show pcep ipv4 sr-te [16777232][2][11.11.11.11] detail
PCEP SR-TE routing table information
PCEP routing table entry for [16777232][2][11.11.11.11]
Policy name: R1_R11_YELLOW_OR_ORANGE_IPV4
Headend: 1.1.1.1
Endpoint: 11.11.11.11, Color 2
Install peer: 192.168.0.101
Last modified: July 20, 2025 16:05:48
Route acked by PCC, PLSP-ID 26
Route is delegated to this PCE
LSP-ID Oper status
0 Active (2)
Metric type igp, metric 40
Segment lists:
[16002, 16011]
[4118, 16007, 16011]
[4112, 16011]
Verify SR-TE policy on a Juniper router that supports multipath:
admin@R1# run show spring-traffic-engineering lsp name R1_R11_YELLOW_OR_ORANGE_IPV4 detail
E = Entropy-label Capability
Name: R1_R11_YELLOW_OR_ORANGE_IPV4
Tunnel-source: Path computation element protocol(PCEP)
Tunnel Forward Type: SRMPLS
To: 11.11.11.11-2
State: Up
Path Status: NA
Outgoing interface: NA
Delegation compute constraints info:
Actual-Bandwidth from PCUpdate: 0
Bandwidth-Requested from PCUpdate: 0
Setup-Priority: 0
Reservation-Priority: 0
Auto-translate status: Disabled Auto-translate result: N/A
BFD status: N/A BFD name: N/A
BFD remote-discriminator: N/A
Segment ID : 129
ERO Valid: true
SR-ERO hop count: 2
Hop 1 (Loose):
NAI: IPv4 Node ID, Node address: 2.2.2.2
SID type: 20-bit label, Value: 16002
Hop 2 (Loose):
NAI: IPv4 Node ID, Node address: 11.11.11.11
SID type: 20-bit label, Value: 16011
BFD status: N/A BFD name: N/A
BFD remote-discriminator: N/A
Segment ID : 1
ERO Valid: true
SR-ERO hop count: 3
Hop 1 (Strict):
NAI: IPv4 Adjacency ID, 10.100.2.1 -> 0.0.0.0
SID type: 20-bit label, Value: 4118
Hop 2 (Loose):
NAI: IPv4 Node ID, Node address: 7.7.7.7
SID type: 20-bit label, Value: 16007
Hop 3 (Loose):
NAI: IPv4 Node ID, Node address: 11.11.11.11
SID type: 20-bit label, Value: 16011
BFD status: N/A BFD name: N/A
BFD remote-discriminator: N/A
Segment ID : 2
ERO Valid: true
SR-ERO hop count: 2
Hop 1 (Strict):
NAI: IPv4 Adjacency ID, 10.100.2.1 -> 0.0.0.0
SID type: 20-bit label, Value: 4112
Hop 2 (Loose):
NAI: IPv4 Node ID, Node address: 11.11.11.11
SID type: 20-bit label, Value: 16011
Total displayed LSPs: 1 (Up: 1, Down: 0, Initializing: 0)
If a policy requires multiple segment lists, but the multipath capability is not negotiated with peer, TD will show warning:
TD#show pcep ipv4 sr-te [16777232][2][11.11.11.11] detail
PCEP SR-TE routing table information
PCEP routing table entry for [16777232][2][11.11.11.11]
Policy name: R1_R11_YELLOW_OR_ORANGE_IPV4
Headend: 1.1.1.1
Endpoint: 11.11.11.11, Color 2
Install peer: 192.168.0.101
Last modified: July 20, 2025 16:05:48
Route acked by PCC, PLSP-ID 29
Route is delegated to this PCE
LSP-ID Oper status
0 Active (2)
Metric type igp, metric 40
*Warning: Multipath capability not negotiated with peer, only first path advertised
Segment lists:
[16002, 16011]
[4118, 16007, 16011]
[4112, 16011]
Support for global adj SID
Usually, in SR-MPLS, prefix SID are advertised as global SID (i.e. routers advertise globally unique index, which then we add to SRGB to calculate MPLS label); and adjacency SID are local (i.e. they are locally significant and are advertised as an MPLS label from router’s dynamic range).
However, there are also global adjacency SID, which is globally significant, is advertised as index, but points to an adjacency. Global adj SID behaviour in SR-MPLS is similar to End.X behaviour in SRv6.
Consider the following topology:
To steer traffic from R1 to R11 using only BLUE links, TD calculated segment list [Node R5, Node R10, Adj R11]:
TD#show traffic-eng policy R1_R11_BLUE_ONLY_IPV4 detail
Detailed traffic-eng policy information:
Traffic engineering policy "R1_R11_BLUE_ONLY_IPV4"
Valid config, Active
Headend 1.1.1.1, topology-id 101, Maximum SID depth: 6
Endpoint 11.11.11.11, color 1101
Endpoint type: Node, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00
Setup priority: 7, Hold priority: 7
Reserved bandwidth bps: 100000000
Install direct, protocol srte, peer 192.168.0.101
Policy index: 6, SR-TE distinguisher: 16777222
Binding-SID: 966055
Candidate paths:
Candidate-path preference 100
Path config valid
Metric: igp
Path-option: dynamic
Affinity-set: BLUE_ONLY
Constraint: include-all
List: ['BLUE']
Value: 0x1
This path is currently active
Calculation results:
Aggregate metric: 400
Topologies: ['101']
Segment lists:
[900005, 900010, 100002]
Policy statistics:
Last config update: 2025-07-28 08:54:19,046
Last recalculation: 2025-07-28 08:54:19.262
Policy calculation took 0 miliseconds
Since R5 is directly connected to R1, node SID of R5 is only used for nexthop resolution and not in dataplane.
If R10 advertises a global adj SID for it’s BLUE link towards R11, this label stack can be simplified to [Node R5, G-Adj SID R11], or just only one label (R10 global adj SID to R11) in dataplane:
Configure adj SID on R10 (Arista EOS supports global adj SID):
R10(config-if-Et4)#adjacency-segment ipv4 p2p multiple index 10111 global
Now check the output on TD:
TD#show traffic-eng policy R1_R11_BLUE_ONLY_IPV4 detail
Detailed traffic-eng policy information:
Traffic engineering policy "R1_R11_BLUE_ONLY_IPV4"
Valid config, Active
Headend 1.1.1.1, topology-id 101, Maximum SID depth: 6
Endpoint 11.11.11.11, color 1101
Endpoint type: Node, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00
Setup priority: 7, Hold priority: 7
Reserved bandwidth bps: 100000000
Install direct, protocol srte, peer 192.168.0.101
Policy index: 6, SR-TE distinguisher: 16777222
Binding-SID: 966055
Candidate paths:
Candidate-path preference 100
Path config valid
Metric: igp
Path-option: dynamic
Affinity-set: BLUE_ONLY
Constraint: include-all
List: ['BLUE']
Value: 0x1
This path is currently active
Calculation results:
Aggregate metric: 400
Topologies: ['101']
Segment lists:
[900005, 910111]
Policy statistics:
Last config update: 2025-07-28 08:54:19,046
Last recalculation: 2025-07-28 09:05:05.225
Policy calculation took 0 miliseconds
TD segment list generation algorithm recognized that for this policy, it is possible to optimize the label stack using global adj SID, and since a global adj SID is available, TD applied the optimization. TD will prefer global adj SID to a combination of node+adj SID, but in other cases, TD will use the usual (local) adj SID.
Bug fixes and improvements
- TD version 1.5 introduced policy debugging but it didn’t print many outputs due to kafka-rust crate limitations. This is now resolved and many more debugs are printed.
- Priority config for policies is now optional. If not configured, TD assumes setup and hold priority to be 7 (lowest value). Priority takes effect during bandwidth reservations, and for disjoint groups (lower priority policy is calculated first).
- Default ports for HTTP API have been changed from 80 and 443 to 8080 and 8443, for HTTP and HTTPS API respectively (this affects only when starting TD without any config, so the default config applies).
- Change flags in LSP object to 0x0 for LSP deletion (bug #60). Different flags confused some PCC implementations, so changed this for better compatibility.
- When deleting all LSP by PCInit with PLSP-ID 0, an empty ERO is sent (bug #61). There was no check and SR ERO object was sent anyway, even when it had no elements. This confused some PCC implementations, so fixed for better compatibility.
- PCUpdate sent for PCEP routes not delegated to us (bug #63). In some cases it was possible, which confused some PCC. Added more checks to make sure PCUpdate is sent only for delegated LSP.
- Log file is rotated early and some threads keep writing in the old file (bug #64). This is due to a race condition in python logging; switched to use ConcurrentRotatingFileHandler.
Download
You can pull the latest TD version from Docker Hub:
sudo docker pull vegvisirsystems/td:latest
Alternatively, download the new version of Traffic Dictator from the Downloads page.




