This post describes how to run a pre-configured lab topology with Traffic Dictator and Cisco XRd or Arista cEOS. It is a good way to get familiar with Traffic Dictator and Segment Routing.
For more custom configurations, please check Traffic Dictator Documentation.
Pre-requisites
1. Setup Docker and Containerlab as described here: https://containerlab.dev/install/
2. Download and import the container images that you will use.
Cisco XRd: https://containerlab.dev/manual/kinds/xrd/
https://xrdocs.io/virtual-routing/tutorials/2022-08-22-xrd-images-where-can-one-get-them/
Note: a Cisco account and contract are required to download XRd images; or use your creativity to get them elsewhere
Arista cEOS: https://containerlab.dev/manual/kinds/ceos/
cEOS-lab is available for download from Arista website after registration; no contract is required
Very simple lab with Cisco XRd and OSPF
This lab features:
- OSPF topology of just 6 routers, IPv4 only
- 2 Egress Peers with BGP Peer SID
- BGP-LS is used to collect IGP and EPE topology information, BGP SR-TE is used to install policies
- A variety of SR-TE policies with different constraints, endpoint and path types
Topology diagram
Lab configs
Download lab configs from: https://vegvisir.ie/wp-content/uploads/dist/TD_ospf_very_simple.tar.gz
Upload to your containerlab host and extract the archive:
sudo tar -xvf TD_ospf_very_simple.tar.gz
Edit the file “TD_ospf_very_simple.clab.yml” to change your XRd container image name to appropriate release (if it’s not 7.10.2).
Run the lab
sudo containerlab deploy
Wait for several minutes for all nodes to start.
Use the lab
Connect to Traffic Dictator:
sudo docker exec -ti clab-TD_ospf_very_simple-traffic-dictator /bin/bash
From inside container, verify TD is running:
root@TD1:/# systemctl status td ● td.service - Vegvisir Systems Traffic Dictator Loaded: loaded (/etc/systemd/system/td.service; enabled; preset: enabled) Active: active (running) since Tue 2024-06-11 07:49:47 UTC; 11min ago Docs: https://vegvisir.ie/ Main PID: 10653 (traffic_dictato) Tasks: 23 (limit: 10834) Memory: 143.5M CPU: 24.677s CGroup: /system.slice/td.service ├─10653 /bin/bash /usr/local/td/traffic_dictator_start.sh ├─10655 /usr/local/td/td_policy_engine ├─10662 python3 /usr/local/td/traffic_dictator.py ├─10667 python3 /usr/local/td/traffic_dictator.py ├─10678 python3 /usr/local/td/traffic_dictator.py ├─10692 python3 /usr/local/td/traffic_dictator.py ├─10694 python3 /usr/local/td/traffic_dictator.py └─10696 python3 /usr/local/td/traffic_dictator.py
Connect to TDCLI and verify policies:
root@TD1:/# tdcli ### Welcome to the Traffic Dictator CLI! ### TD1#show traffic-eng policy Traffic-eng policy information Status codes: * valid, > active, e - EPE only, s - admin down, m - multi-topology Policy name Headend Endpoint Color/Service loopback Protocol Reserved bandwidth Priority Status/Reason *> R1_ISP2_BLUE_ONLY 1.1.1.1 10.100.9.102 104 SR-TE/direct 100000000 7/7 Active *> R1_NULL_YELLOW_ONLY 1.1.1.1 0.0.0.0 105 SR-TE/direct 100000000 7/7 Active *> R1_R3_YELLOW_ONLY 1.1.1.1 3.3.3.3 103 SR-TE/direct 100000000 7/7 Active *> R1_R5_EXPLICIT 1.1.1.1 5.5.5.5 101 SR-TE/direct 100000000 7/7 Active *> R1_R6_BLUE_ONLY 1.1.1.1 6.6.6.6 102 SR-TE/direct 100000000 7/7 Active
Configure and verify an SR-TE policy
Take for example policy “R1_R6_BLUE_ONLY”:
TD1#show run | sec R1_R6_BLUE_ONLY policy R1_R6_BLUE_ONLY headend 1.1.1.1 topology-id 101 endpoint 6.6.6.6 color 102 binding-sid 15102 priority 7 7 install direct srte 192.168.0.101 ! candidate-path preference 100 affinity-set BLUE_ONLY bandwidth 100 mbps
Verify policy state:
TD1#show traffic-eng policy R1_R6_BLUE_ONLY detail Detailed traffic-eng policy information: Traffic engineering policy "R1_R6_BLUE_ONLY" Valid config, Active Headend 1.1.1.1, topology-id 101, Maximum SID depth: 10 Endpoint 6.6.6.6, color 102 Endpoint type: Node, Topology-id: 101, Protocol: ospf, Router-id: 6.6.6.6 Setup priority: 7, Hold priority: 7 Reserved bandwidth bps: 100000000 Install direct, protocol srte, peer 192.168.0.101 Policy index: 4, SR-TE distinguisher: 16777220 Binding-SID: 15102 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: 3 Topologies: ['101'] Segment lists: [16005, 16006] Policy statistics: Last config update: 2024-06-19 14:16:36,093 Last recalculation: 2024-06-19 14:28:47.452 Policy calculation took 0 miliseconds
BGP route has been created and sent to 192.168.0.101:
TD1#show bgp ipv4 srte detail | grep -B8 R1_R6_BLUE_ONLY BGP routing table entry for [96][16777220][102][6.6.6.6] Paths: 1 available, best #1 Last modified: September 05, 2024 16:33:13 Local, inserted - from - (0.0.0.0) Origin igp, metric 0, localpref -, weight 0, valid, -, best Endpoint 6.6.6.6, Color 102, Distinguisher 16777220 Tunnel encapsulation attribute: SR Policy Policy name: R1_R6_BLUE_ONLY
TD1#show bgp neighbors 192.168.0.101 ipv4 srte advertised-routes | fgrep [96][16777220][102][6.6.6.6] *>+ [96][16777220][102][6.6.6.6] - 0 - 0 i
On Cisco router, verify that the policy has been received and installed:
RP/0/RP0/CPU0:R1#show bgp ipv4 sr-policy [16777220][102][6.6.6.6]/96 Thu Sep 5 16:36:25.065 UTC BGP routing table entry for [16777220][102][6.6.6.6]/96 Versions: Process bRIB/RIB SendTblVer Speaker 5 5 Last Modified: Sep 5 16:33:13.446 for 00:03:11 Paths: (1 available, best #1, not advertised to any peer) Not advertised to any peer Path #1: Received by speaker 0 Not advertised to any peer 65001 192.168.0.1 from 192.168.0.1 (111.111.111.111) Origin IGP, localpref 100, valid, external, best, group-best Received Path ID 0, Local Path ID 1, version 5 Community: no-advertise Tunnel encap attribute type: 15 (SR policy) bsid 15102, preference 100, num of segment-lists 1 segment-list 1, weight 1 segments: {16005} {16006} Candidate path is usable (registered) SR policy state is UP, Allocated bsid 15102
RP/0/RP0/CPU0:R1#show segment-routing traffic-eng policy endpoint ipv4 6.6.6.6 color 102 Thu Sep 5 16:36:52.360 UTC SR-TE policy database --------------------- Color: 102, End-point: 6.6.6.6 Name: srte_c_102_ep_6.6.6.6 Status: Admin: up Operational: up for 00:03:38 (since Sep 5 16:33:14.067) Candidate-paths: Preference: 100 (BGP, RD: 16777220) (active) Requested BSID: 15102 Constraints: Protection Type: protected-preferred Maximum SID Depth: 10 Explicit: segment-list (valid) Weight: 1, Metric Type: TE SID[0]: 16005 [Prefix-SID, 5.5.5.5] SID[1]: 16006 Attributes: Binding SID: 15102 (SRLB) Forward Class: Not Configured Steering labeled-services disabled: no Steering BGP disabled: no IPv6 caps enable: yes Invalidation drop enabled: no Max Install Standby Candidate Paths: 0
Lab with Cisco XRd and IS-IS
Note: this lab also requires an Arista cEOS switch with empty config to faciliate a multi-point connection between R1, R3 and R4.
This lab features:
- IS-IS L2 topology, IPv4 and IPv6
- 5 Egress Peers with BGP Peer SID, IPv4 and IPv6
- Broadcast network with IS-IS pseudonode
- Anycast SID
- A variety of IPv4 and IPv6 SR-TE policies with different constraints, endpoint and path types
- BGP-LS is used to collect IGP and EPE topology information, BGP SR-TE is used to install policies
- BGP SR-TE and PCEP are used to install policies
Topology diagram
Lab configs
Download lab configs from: https://vegvisir.ie/wp-content/uploads/dist/TD_isis_simple.tar.gz
Upload to your containerlab host and extract the archive:
sudo tar -xvf TD_isis_simple.tar.gz
Edit the file “TD_isis_simple.clab.yml” to change your XRd container image name to appropriate release (if it’s not 7.10.2).
Run the lab
sudo containerlab deploy
Wait for several minutes for all nodes to start.
Use the lab
Connect to Traffic Dictator:
sudo docker exec -ti clab-TD_isis_simple-traffic-dictator /bin/bash
From inside container, verify TD is running:
root@TD1:/# systemctl status td ● td.service - Vegvisir Systems Traffic Dictator Loaded: loaded (/etc/systemd/system/td.service; enabled; preset: enabled) Active: active (running) since Tue 2024-06-11 07:49:47 UTC; 11min ago Docs: https://vegvisir.ie/ Main PID: 10653 (traffic_dictato) Tasks: 23 (limit: 10834) Memory: 143.5M CPU: 24.677s CGroup: /system.slice/td.service ├─10653 /bin/bash /usr/local/td/traffic_dictator_start.sh ├─10655 /usr/local/td/td_policy_engine ├─10662 python3 /usr/local/td/traffic_dictator.py ├─10667 python3 /usr/local/td/traffic_dictator.py ├─10678 python3 /usr/local/td/traffic_dictator.py ├─10692 python3 /usr/local/td/traffic_dictator.py ├─10694 python3 /usr/local/td/traffic_dictator.py └─10696 python3 /usr/local/td/traffic_dictator.py
Connect to TDCLI and verify policies:
root@TD1:/# tdcli ### Welcome to the Traffic Dictator CLI! ### TD1#show bgp su BGP summary information Router identifier 111.111.111.111, local AS number 65001 Neighbor V AS MsgRcvd MsgSent InQ OutQ Up/Down State Received NLRI Active AF 192.168.0.101 4 65002 106 15 0 0 0:13:27 Established 164 IPv4-LU, LS 2001:192::101 4 65002 103 35 0 0 0:12:22 Established 164 IPv4-SRTE, IPv6-LU, IPv6-SRTE, LS TD1#show pcep su PCEP summary information Neighbor V Session ID SRP ID MsgRcvd MsgSent InQ OutQ Up/Down State 192.168.0.101 1 1/1 6 92 84 0 0 0:37:31 SessionUp TD1#show traffic-eng policy Traffic-eng policy information Status codes: * valid, > active, r - RSVP-TE, e - EPE only, s - admin down, m - multi-topology Endpoint codes: * active override Policy name Headend Endpoint Color/Service loopback Protocol Reserved bandwidth Priority Status/Reason *> R11_R1_BLUE_OR_ORANGE_IPV4 11.11.11.11 1.1.1.1 3 SR-TE/indirect 100000000 5/5 Active *> R11_R1_BLUE_OR_ORANGE_IPV6 11.11.11.11 2002::1 103 SR-TE/indirect 100000000 5/5 Active *> R1_ISP4_ANY_COLOR_IPV4 1.1.1.1 10.100.19.104 5 SR-TE/direct 100000000 7/7 Active *> R1_ISP4_ANY_COLOR_IPV6 1.1.1.1 2001:100:19::104 105 SR-TE/direct 100000000 7/7 Active *> R1_ISP5_BLUE_ONLY_IPV4 1.1.1.1 10.100.20.105 4 PCEP/direct 100000000 7/7 Active *> R1_ISP5_BLUE_ONLY_IPV6 1.1.1.1 2001:100:20::105 104 SR-TE/direct 100000000 7/7 Active *> R1_NULL_EXCLUDE_YELLOW_AND_ORANGE_IPV4 1.1.1.1 0.0.0.0 7 PCEP/direct 100000000 7/7 Active *> R1_NULL_EXCLUDE_YELLOW_AND_ORANGE_IPV6 1.1.1.1 :: 107 SR-TE/direct 100000000 7/7 Active *> R1_NULL_YELLOW_ONLY_IPV4 1.1.1.1 0.0.0.0 6 SR-TE/direct 100000000 7/7 Active *> R1_NULL_YELLOW_ONLY_IPV6 1.1.1.1 :: 106 SR-TE/direct 100000000 7/7 Active *> R1_R11_BLUE_ONLY_IPV4 1.1.1.1 11.11.11.11 1 SR-TE/direct 100000000 7/7 Active *> R1_R11_BLUE_ONLY_IPV6 1.1.1.1 2002::11 101 SR-TE/direct 100000000 7/7 Active *> R1_R11_EP_LOOSE_IPV4 1.1.1.1 11.11.11.11 9 SR-TE/direct 100000000 4/4 Active *> R1_R11_EP_LOOSE_IPV6 1.1.1.1 2002::11 109 SR-TE/direct 100000000 4/4 Active *> R1_R11_EXCLUDE_SOME_IPV4 1.1.1.1 11.11.11.11 10 SR-TE/direct 100000000 4/4 Active *> R1_R11_EXCLUDE_SOME_IPV6 1.1.1.1 2002::11 110 SR-TE/direct 100000000 4/4 Active *> R1_R11_YELLOW_OR_ORANGE_IPV4 1.1.1.1 11.11.11.11 2 SR-TE/direct 100000000 6/6 Active *> R1_R11_YELLOW_OR_ORANGE_IPV6 1.1.1.1 2002::11 102 SR-TE/direct 100000000 6/6 Active *> R1_R9_EP_STRICT_IPV4 1.1.1.1 9.9.9.9 109 PCEP/direct 100000000 4/4 Active *> R1_R9_EP_STRICT_IPV6 1.1.1.1 2002::9 108 SR-TE/direct 100000000 4/4 Active
Configure and verify an SR-TE policy
Take for example, policy “R1_R11_BLUE_ONLY_IPV4”.
TD1#show run | sec R1_R11_BLUE_ONLY_IPV4 policy R1_R11_BLUE_ONLY_IPV4 headend 1.1.1.1 topology-id 101 endpoint 11.11.11.11 color 1 binding-sid 15001 priority 7 7 install direct srte 2001:192::101 ! candidate-path preference 100 metric igp affinity-set BLUE_ONLY bandwidth 100 mbps
Verify policy state:
TD1#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: 10 Endpoint 11.11.11.11, color 1 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 2001:192::101 Policy index: 10, SR-TE distinguisher: 16777226 Binding-SID: 15001 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: 40 Topologies: ['101'] Segment lists: [16005, 16010, 24013] Policy statistics: Last config update: 2024-09-05 16:48:27,660 Last recalculation: 2024-09-05 16:50:20.473 Policy calculation took 0 miliseconds
BGP route has been created and sent to 2001:192::101:
TD1#show bgp ipv4 srte detail | grep -B8 R1_R11_BLUE_ONLY_IPV4 BGP routing table entry for [96][16777226][1][11.11.11.11] Paths: 1 available, best #1 Last modified: September 05, 2024 16:50:20 Local, inserted - from - (0.0.0.0) Origin igp, metric 0, localpref -, weight 0, valid, -, best Endpoint 11.11.11.11, Color 1, Distinguisher 16777226 Tunnel encapsulation attribute: SR Policy Policy name: R1_R11_BLUE_ONLY_IPV4
TD1#show bgp neighbors 2001:192::101 ipv4 srte advertised-routes | fgrep [96][16777226][1][11.11.11.11] *>+ [96][16777226][1][11.11.11.11] - 0 - 0 i
On Cisco router, verify that the policy has been received and installed:
RP/0/RP0/CPU0:R1#show bgp ipv4 sr-policy [16777226][1][11.11.11.11]/96 Thu Sep 5 16:59:25.260 UTC BGP routing table entry for [16777226][1][11.11.11.11]/96 Versions: Process bRIB/RIB SendTblVer Speaker 12 12 Last Modified: Sep 5 16:50:14.895 for 00:09:10 Paths: (1 available, best #1, not advertised to any peer) Not advertised to any peer Path #1: Received by speaker 0 Not advertised to any peer 65001 2001:192::a8c1:abff:fe54:2578 from 2001:192::1 (111.111.111.111) Origin IGP, localpref 100, valid, external, best, group-best Received Path ID 0, Local Path ID 1, version 12 Community: no-advertise Tunnel encap attribute type: 15 (SR policy) bsid 15001, preference 100, num of segment-lists 1 segment-list 1, weight 1 segments: {16005} {16010} {24013} Candidate path is usable (registered) SR policy state is UP, Allocated bsid 15001
show segment-routing traffic-eng policy endpoint ipv4 11.11.11.11 color 1 Thu Sep 5 16:59:39.420 UTC SR-TE policy database --------------------- Color: 1, End-point: 11.11.11.11 Name: srte_c_1_ep_11.11.11.11 Status: Admin: up Operational: up for 00:09:23 (since Sep 5 16:50:16.217) Candidate-paths: Preference: 100 (BGP, RD: 16777226) (active) Requested BSID: 15001 Constraints: Protection Type: protected-preferred Maximum SID Depth: 10 Explicit: segment-list (valid) Weight: 1, Metric Type: TE SID[0]: 16005 [Prefix-SID, 5.5.5.5] SID[1]: 16010 SID[2]: 24013 Attributes: Binding SID: 15001 (SRLB) Forward Class: Not Configured Steering labeled-services disabled: no Steering BGP disabled: no IPv6 caps enable: yes Invalidation drop enabled: no Max Install Standby Candidate Paths: 0
Configure and verify a PCEP policy
TD1#show run | sec R1_R9_EP_STRICT_IPV4 policy R1_R9_EP_STRICT_IPV4 headend 1.1.1.1 topology-id 101 endpoint 9.9.9.9 color 109 binding-sid 15008 priority 4 4 install direct pcep 192.168.0.101 ! candidate-path preference 100 explicit-path R5_R8_R10 bandwidth 100 mbps
Verify PCEP route status:
TD1#show pcep ipv4 sr-te PCEP SR-TE routing table information Status codes: * acked, > up/active, + - inserted, z - zombie NLRI PLSP-ID Oper status *>+ [96][16777234][109][9.9.9.9] 1 Active (2) *>+ [96][16777220][4][10.100.20.105] 2 Active (2) *>+ [96][16777222][7][0.0.0.0] 3 Active (2)
TD1#show pcep ipv4 sr-te [96][16777234][109][9.9.9.9] PCEP SR-TE routing table information PCEP routing table entry for [96][16777234][109][9.9.9.9] Policy name: R1_R9_EP_STRICT_IPV4 Headend: 1.1.1.1 Endpoint: 9.9.9.9, Color 109 Install peer: 192.168.0.101 Last modified: February 07, 2025 13:40:49 Route acked by PCC, PLSP-ID 1 LSP-ID Oper status 2 Active (2) Metric type igp, metric 40 Binding SID: 15008 Segment list: [16005, 16008, 16009]
On Cisco router, verify that the policy has been received and installed:
RP/0/RP0/CPU0:R1#show segment-routing traffic-eng pcc lsp Fri Feb 7 13:47:27.462 UTC PCC's SR policy database: ------------------------- Symbolic Name: R1_R9_EP_STRICT_IPV4 LSP[0]: Source 1.1.1.1, Destination 9.9.9.9, Tunnel ID 18, LSP ID 2 State: Admin up, Operation active Setup type: SR Binding SID: 15008
Lab with Arista cEOS
This lab features:
- IS-IS L2 topology, IPv4 only
- 5 Egress Peers with BGP-LU originated EPE routes, IPv4 only
- Anycast SID
- A variety of IPv4 SR-TE and LU policies with different constraints, endpoint and path types
- BGP-LS is used to collect IGP topology information, BGP-LU is used to collect EPE topology information, BGP SR-TE and LU are used to install policies
Topology diagram
Note that unlike the XRd lab, in this one TD has BGP-LU sessions with all egress ASBR. This is because EOS doesn’t support Peer SID but instead advertises EPE routes via BGP-LU.
Update 01.08.2024: replaced XRd image used for ISP with FRR image. So this lab now requires only free images.
Lab configs
Download lab configs from: https://vegvisir.ie/wp-content/uploads/dist/TD_isis_eos_simple_frr.tar.gz
Upload to your containerlab host and extract the archive:
sudo tar -xvf TD_isis_eos_simple_frr.tar.gz
Edit the file “TD_isis_eos_simple_frr.clab.yml” to change your cEOS container image name to appropriate release.
Run the lab
sudo containerlab deploy
Wait for several minutes for all nodes to start.
Use the lab
Connect to Traffic Dictator:
sudo docker exec -ti clab-TD_isis_eos_simple-traffic-dictator /bin/bash
From inside container, verify TD is running:
root@TD1:/# systemctl status td ● td.service - Vegvisir Systems Traffic Dictator Loaded: loaded (/etc/systemd/system/td.service; enabled; preset: enabled) Active: active (running) since Tue 2024-06-11 07:49:47 UTC; 11min ago Docs: https://vegvisir.ie/ Main PID: 10653 (traffic_dictato) Tasks: 23 (limit: 10834) Memory: 143.5M CPU: 24.677s CGroup: /system.slice/td.service ├─10653 /bin/bash /usr/local/td/traffic_dictator_start.sh ├─10655 /usr/local/td/td_policy_engine ├─10662 python3 /usr/local/td/traffic_dictator.py ├─10667 python3 /usr/local/td/traffic_dictator.py ├─10678 python3 /usr/local/td/traffic_dictator.py ├─10692 python3 /usr/local/td/traffic_dictator.py ├─10694 python3 /usr/local/td/traffic_dictator.py └─10696 python3 /usr/local/td/traffic_dictator.py
Connect to TDCLI and verify policies:
root@TD1:/# tdcli ### Welcome to the Traffic Dictator CLI! ### TD1#sh bgp su BGP summary information Router identifier 111.111.111.111, local AS number 65001 Neighbor V AS MsgRcvd MsgSent InQ OutQ Up/Down State Received NLRI Active AF 192.168.0.101 4 65002 65 10 0 0 0:00:50 Established 100 IPv4-LU, IPv4-SRTE, LS 192.168.0.102 4 65002 5 3 0 0 0:00:50 Established 1 IPv4-LU 192.168.0.105 4 65002 12 9 0 0 0:07:29 Established 1 IPv4-LU 192.168.0.106 4 65002 5 3 0 0 0:00:50 Established 1 IPv4-LU 192.168.0.111 4 65002 12 15 0 0 0:05:48 Established 2 IPv4-LU
TD1#show traf pol Traffic-eng policy information Status codes: * valid, > active, e - EPE only, s - admin down, m - multi-topology Policy name Headend Endpoint Color/Service loopback Protocol Reserved bandwidth Priority Status/Reason *> R11_R1_BLUE_OR_ORANGE_IPV4 11.11.11.11 1.1.1.1 3 SR-TE/direct 100000000 5/5 Active *> R1_ISP4_ANY_COLOR_IPV4 1.1.1.1 10.100.19.104 5 SR-TE/direct 100000000 7/7 Active e *> R1_ISP4_EPE_ONLY N/A 10.100.19.104 103.11.11.11 LU/direct 100000000 7/7 Active *> R1_ISP5_BLUE_ONLY_IPV4 1.1.1.1 10.100.20.105 102.11.11.11 LU/direct 100000000 7/7 Active *> R1_NULL_EXCLUDE_YELLOW_AND_ORANGE_IPV4 1.1.1.1 0.0.0.0 7 SR-TE/direct 100000000 7/7 Active *> R1_NULL_YELLOW_ONLY_IPV4 1.1.1.1 0.0.0.0 6 SR-TE/direct 100000000 7/7 Active *> R1_R11_BLUE_ONLY_IPV4 1.1.1.1 11.11.11.11 100.11.11.11 LU/direct 100000000 7/7 Active *> R1_R11_EP_LOOSE_IPV4 1.1.1.1 11.11.11.11 9 SR-TE/direct 100000000 4/4 Active *> R1_R11_EXCLUDE_SOME_IPV4 1.1.1.1 11.11.11.11 10 SR-TE/direct 100000000 4/4 Active *> R1_R11_YELLOW_OR_ORANGE_IPV4 1.1.1.1 11.11.11.11 2 SR-TE/direct 100000000 6/6 Active *> R1_R9_EP_STRICT_IPV4 1.1.1.1 9.9.9.9 8 SR-TE/direct 100000000 4/4 Active
Configure and verify an SR-TE policy
Take for example policy “R1_R11_EP_LOOSE_IPV4”:
TD1#show run | sec R1_R11_EP_LOOSE_IPV4 policy R1_R11_EP_LOOSE_IPV4 headend 1.1.1.1 topology-id 101 endpoint 11.11.11.11 color 9 binding-sid 966005 priority 4 4 install direct srte 192.168.0.101 ! candidate-path preference 100 explicit-path R25_LOOSE bandwidth 100 mbps
It has been resolved via anycast SID shared between R2 and R5:
TD1#show traffic-eng policy R1_R11_EP_LOOSE_IPV4 detail Detailed traffic-eng policy information: Traffic engineering policy "R1_R11_EP_LOOSE_IPV4" Valid config, Active Headend 1.1.1.1, topology-id 101, Maximum SID depth: 6 Endpoint 11.11.11.11, color 9 Endpoint type: Node, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00 Setup priority: 4, Hold priority: 4 Reserved bandwidth bps: 100000000 Install direct, protocol srte, peer 192.168.0.101 Policy index: 7, SR-TE distinguisher: 16777223 Binding-SID: 966005 Candidate paths: Candidate-path preference 100 Path config valid Metric: igp Path-option: explicit Explicit path name: R25_LOOSE This path is currently active Calculation results: Aggregate metric: 400 Topologies: ['101'] Segment lists: [900025, 900011] Policy statistics: Last config update: 2024-09-05 17:28:56,025 Last recalculation: 2024-09-05 17:34:59.568 Policy calculation took 1 miliseconds
Verify BGP route created and advertised to peer:
TD1#show bgp ipv4 srte detail | grep -B8 R1_R11_EP_LOOSE_IPV4 BGP routing table entry for [96][16777223][9][11.11.11.11] Paths: 1 available, best #1 Last modified: September 05, 2024 17:35:00 Local, inserted - from - (0.0.0.0) Origin igp, metric 0, localpref -, weight 0, valid, -, best Endpoint 11.11.11.11, Color 9, Distinguisher 16777223 Tunnel encapsulation attribute: SR Policy Policy name: R1_R11_EP_LOOSE_IPV4
TD1#show bgp neighbors 192.168.0.101 ipv4 srte advertised-routes | fgrep [96][16777223][9][11.11.11.11] *>+ [96][16777223][9][11.11.11.11] - 0 - 0 i
Verify SR-TE policy on EOS:
R1#show bgp sr-te endpoint 11.11.11.11 color 9 distinguisher 16777223 BGP routing table information for VRF default Router identifier 1.1.1.1, local AS number 65002 BGP routing table entry for Endpoint: 11.11.11.11, Color: 9, Distinguisher: 16777223 Paths: 1 available 65001 192.168.0.1 from 192.168.0.1 (111.111.111.111) Origin IGP, metric -, localpref 100, weight 0, received 00:01:08 ago, valid, external, best Community: no-advertise Rx SAFI: SR TE Policy
R1#show traffic-engineering segment-routing policy endpoint 11.11.11.11 color 9 Endpoint 11.11.11.11 Color 9, Counters: not available Path group: State: active (for 00:07:41), modified: 00:07:41 ago Protocol: BGP Originator: 111.111.111.111(AS65001) Discriminator: 16777223 Preference: 100 IGP metric: 0 (static) Binding SID: 966005 Explicit null label policy: IPv6 (system default) Segment List: State: Valid, ID: 7, Counters: not available Protected: No, Reason: The top label is not protected Label Stack: [900025 900011], Weight: 1 Resolved Label Stack: [900011], Next hop: 10.100.1.2, Interface: Ethernet1 Resolved Label Stack: [900011], Next hop: 10.100.3.5, Interface: Ethernet3
Configure and verify an LU policy
BGP-LU is an alternative method of policy installtion to routers that don’t support BGP SR-TE. Refer to the relevant documentation section: https://vegvisir.ie/bgp-lu-policies/
Policy “R1_ISP5_BLUE_ONLY_IPV4” has been configured as LU:
TD1#show run | sec R1_ISP5_BLUE_ONLY_IPV4 policy R1_ISP5_BLUE_ONLY_IPV4 headend 1.1.1.1 topology-id 101 endpoint 10.100.20.105 service-loopback 102.11.11.11 binding-sid 15004 priority 7 7 install direct labeled-unicast 192.168.0.101 ! candidate-path preference 100 metric te affinity-set BLUE_ONLY bandwidth 100 mbps
It is also an EPE policy going to ISP5.
Verify:
TD1#show traffic-eng policy R1_ISP5_BLUE_ONLY_IPV4 detail Detailed traffic-eng policy information: Traffic engineering policy "R1_ISP5_BLUE_ONLY_IPV4" Valid config, Active Headend 1.1.1.1, topology-id 101, Maximum SID depth: 6 Endpoint 10.100.20.105, service-loopback 102.11.11.11 Endpoint type: Egress peer, Topology-id: 101, Protocol: isis, Router-id: 0011.0011.0011.00 Setup priority: 7, Hold priority: 7 Reserved bandwidth bps: 100000000 Install direct, protocol labeled-unicast, peer 192.168.0.101 Policy index: 3, SR-TE distinguisher: 16777219 Candidate paths: Candidate-path preference 100 Path config valid Metric: te Path-option: dynamic Affinity-set: BLUE_ONLY Constraint: include-all List: ['BLUE'] Value: 0x1 This path is currently active Calculation results: Aggregate metric: 2000 Topologies: ['101'] Segment lists: [900010, 100003, 100001] BGP-LU next-hop: 10.100.3.5 Policy statistics: Last config update: 2024-09-06 10:40:56,270 Last recalculation: 2024-09-06 10:41:16.650 Policy calculation took 0 miliseconds
Verify the BGP route:
TD1#show bgp ipv4 labeled-unicast [16777219][102.11.11.11/32] BGP-LS routing table information Router identifier 111.111.111.111, local AS number 65001 BGP routing table entry for [16777219][102.11.11.11/32] Label stack: [900010, 100003, 100001] Paths: 1 available, best #1 Last modified: September 06, 2024 10:41:16 Local, inserted - from - (0.0.0.0) Origin igp, metric 0, localpref -, weight 0, valid, -, best
Verify the policy has been received on EOS:
R1#sh bgp ipv4 labeled-unicast 102.11.11.11/32 BGP routing table information for VRF default Router identifier 1.1.1.1, local AS number 65002 BGP routing table entry for 102.11.11.11/32 Paths: 2 available 65001 10.100.3.5 labels [ 900010 100003 100001 ] from 192.168.0.1 (111.111.111.111) Origin IGP, metric 0, localpref 500, IGP metric 0, weight 0, tag 0 Received 00:16:21 ago, valid, external, best Community: no-advertise Local MPLS label: 100005 Rx SAFI: MplsLabel Tunnel RIB eligible
R1#show bgp labeled-unicast tunnel | grep 102.11.11.11/32 5 102.11.11.11/32 10.100.3.5 Ethernet3 [ 900010 100003 100001 ] Yes 0 MED 0 200 0
Configure and verify an EPE-only policy
EPE only policy is useful for pure Egress Peer Engineering applications, where the network does not Segment Routing and does not advertise BGP-LS information to Traffic Dictator. Refer to the relevant documentation section: https://vegvisir.ie/epe-only-policies/
Take for example policy “R1_ISP4_EPE_ONLY”:
TD1#show run | sec R1_ISP4_EPE_ONLY policy R1_ISP4_EPE_ONLY endpoint 10.100.19.104 service-loopback 103.11.11.11 epe-only priority 7 7 install direct labeled-unicast 192.168.0.101 ! candidate-path preference 100 bandwidth 100 mbps
Verify:
TD1#show traffic-eng policy R1_ISP4_EPE_ONLY detail Detailed traffic-eng policy information: Traffic engineering policy "R1_ISP4_EPE_ONLY" Valid config, Active This is an EPE-only policy Endpoint 10.100.19.104, service-loopback 103.11.11.11 Endpoint type: Egress peer, Topology-id: None, Protocol: epe_only, Router-id: 11.11.11.11 Setup priority: 7, Hold priority: 7 Reserved bandwidth bps: 100000000 Install direct, protocol labeled-unicast, peer 192.168.0.101 Policy index: 2, SR-TE distinguisher: 16777218 Candidate paths: Candidate-path preference 100 Path config valid Metric: igp Path-option: dynamic This path is currently active Calculation results: Topologies: None Segment lists: [100000] BGP-LU next-hop: 11.11.11.11 Policy statistics: Last config update: 2024-09-06 10:40:56,270 Last recalculation: 2024-09-06 10:41:16.650 Policy calculation took 0 miliseconds
Unlike a regular BGP-LU policy, Traffic Dictator sets BGP-LU nexthop not to the next router in IGP topology, but to the node IP configured under “traffic-eng nodes”. So the policy headend can recursively resolve that IP over its MPLS control plane. In this lab it’s SR, but can be also LDP, RSVP or BGP-LU.
Verify on EOS:
R1#sh bgp ipv4 labeled-unicast 103.11.11.11/32 BGP routing table information for VRF default Router identifier 1.1.1.1, local AS number 65002 BGP routing table entry for 103.11.11.11/32 Paths: 2 available 65001 11.11.11.11 labels [ 100000 ] from 192.168.0.1 (111.111.111.111) Origin IGP, metric 0, localpref 500, IGP metric 410, weight 0, tag 0 Received 00:21:31 ago, valid, external, best Community: no-advertise Local MPLS label: 100006 Rx SAFI: MplsLabel Tunnel RIB eligible
R1#show bgp labeled-unicast tunnel | grep 103.11.11.11/32 7 103.11.11.11/32 IS-IS SR IPv4 (13) - [ 100000 ] Yes 0 MED 0 200 0
Multi-domain lab with Cisco XRd
This lab features:
- Seamless MPLS network with 3 separate IS-IS instances, both IPv4 and IPv6
- BGP-LU is used for end-to-end connectivity across different IS-IS instances; no redistribution
- 5 Egress Peers with BGP Peer SID, IPv4 and IPv6
- Anycast SID
- A variety of IPv4 and IPv6 SR-TE multi-domain policies with different constraints, endpoint and path types
- BGP-LS is used to collect IGP and EPE topology information, BGP SR-TE is used to install policies
Topology diagram
Lab configs
Download lab configs from: https://vegvisir.ie/wp-content/uploads/dist/TD_isis_3topologies.tar.gz
Upload to your containerlab host and extract the archive:
sudo tar -xvf TD_isis_3topologies.tar.gz
Edit the file “TD_isis_3topologies.clab.yml” to change your XRd container image name to appropriate release (if it’s not 7.10.2).
Run the lab
sudo containerlab deploy
Wait for several minutes for all nodes to start.
Use the lab
Connect to Traffic Dictator:
sudo docker exec -ti clab-TD_isis_3topologies-traffic-dictator /bin/bash
From inside container, verify TD is running:
root@TD1:/# systemctl status td ● td.service - Vegvisir Systems Traffic Dictator Loaded: loaded (/etc/systemd/system/td.service; enabled; preset: enabled) Active: active (running) since Tue 2024-06-11 07:49:47 UTC; 11min ago Docs: https://vegvisir.ie/ Main PID: 10653 (traffic_dictato) Tasks: 23 (limit: 10834) Memory: 143.5M CPU: 24.677s CGroup: /system.slice/td.service ├─10653 /bin/bash /usr/local/td/traffic_dictator_start.sh ├─10655 /usr/local/td/td_policy_engine ├─10662 python3 /usr/local/td/traffic_dictator.py ├─10667 python3 /usr/local/td/traffic_dictator.py ├─10678 python3 /usr/local/td/traffic_dictator.py ├─10692 python3 /usr/local/td/traffic_dictator.py ├─10694 python3 /usr/local/td/traffic_dictator.py └─10696 python3 /usr/local/td/traffic_dictator.py
Connect to TDCLI and verify policies:
root@TD1:/# tdcli ### Welcome to the Traffic Dictator CLI! ### TD1#show traf pol Traffic-eng policy information Status codes: * valid, > active, e - EPE only, s - admin down, m - multi-topology Endpoint codes: * active override Policy name Headend Endpoint Color/Service loopback Protocol Reserved bandwidth Priority Status/Reason m*> R1_ISP3_YELLOW_IPV4 1.1.1.1 10.100.28.103 101 SR-TE/direct 100000000 7/7 Active m*> R1_ISP3_YELLOW_IPV6 1.1.1.1 2001:100:28::103 101 SR-TE/direct 100000000 7/7 Active m*> R1_ISP3_YELLOW_IPV6_MIXED 1.1.1.1 2001:100:28::103 102 SR-TE/direct 100000000 7/7 Active m*> R1_ISP4_BLUE_IPV4 1.1.1.1 10.100.29.104 114 SR-TE/direct 100000000 7/7 Active m*> R1_ISP4_BLUE_IPV6 1.1.1.1 2001:100:29::104 115 SR-TE/direct 100000000 7/7 Active m*> R1_R11_BLUE_IPV4 1.1.1.1 11.11.11.11 100 SR-TE/direct 100000000 5/5 Active m*> R1_R11_BLUE_IPV6 1.1.1.1 2002::11 100 SR-TE/direct 100000000 5/5 Active m*> R1_R15_STRICT_IPV4 1.1.1.1 15.15.15.15 103 SR-TE/direct 100000000 7/7 Active m*> R1_R15_STRICT_IPV6 1.1.1.1 2002::15 103 SR-TE/direct 100000000 7/7 Active m*> R1_R15_STRICT_MIXED 1.1.1.1 15.15.15.15 104 SR-TE/direct 100000000 7/7 Active m*> R1_R16_LOOSE_ANYCAST_IPV4 1.1.1.1 16.16.16.16 111 SR-TE/direct 100000000 7/7 Active m*> R1_R16_LOOSE_ANYCAST_IPV6 1.1.1.1 2002::16 111 SR-TE/direct 100000000 7/7 Active m*> R1_R16_LOOSE_ANYCAST_MIXED 1.1.1.1 16.16.16.16 112 SR-TE/direct 100000000 7/7 Active
Note letter “m” indicating those are multi-topology policies.
Configure and verify a multi-topology policy
Take for example a policy that goes through all 3 IGP domains and uses anycast SID shared between R5 and R6, and another anycast SID shared by R11 and R12.
Configuration:
traffic-eng policies ! policy R1_R16_LOOSE_ANYCAST_IPV4 headend 1.1.1.1 topology-id 101 endpoint 16.16.16.16 color 111 binding-sid 15011 priority 7 7 install direct srte 192.168.0.101 ! candidate-path preference 100 explicit-path ANYCAST_IPV4 metric igp bandwidth 100 mbps ! traffic-eng explicit-paths ! explicit-path ANYCAST_IPV4 index 10 loose 56.56.56.56 index 20 loose 11.11.12.12
56.56.56.56 is an anycast IP shared between R5 and R6; 11.11.12.12 is an anycast IP shared between R11 and R12.
Verify the policy:
TD1#show traffic-eng policy R1_R16_LOOSE_ANYCAST_IPV4 detail Detailed traffic-eng policy information: Traffic engineering policy "R1_R16_LOOSE_ANYCAST_IPV4" Valid config, Active Headend 1.1.1.1, topology-id 101, Maximum SID depth: 10 Endpoint 16.16.16.16, color 111 Endpoint type: Node, Topology-id: 103, Protocol: isis, Router-id: 0016.0016.0016.00 Setup priority: 7, Hold priority: 7 Reserved bandwidth bps: 100000000 Install direct, protocol srte, peer 192.168.0.101 Policy index: 10, SR-TE distinguisher: 16777226 Binding-SID: 15011 Candidate paths: Candidate-path preference 100 Path config valid Metric: igp Path-option: explicit Explicit path name: ANYCAST_IPV4 This path is currently active Calculation results: Aggregate metric: 70 Topologies: ['101', '102', '103'] Segment lists: [16056, 16112, 16016] Policy statistics: Last config update: 2024-09-06 10:26:46,386 Last recalculation: 2024-09-06 10:28:36.840 Policy calculation took 1 miliseconds TD1#
Check the BGP SR-TE route:
TD1#show bgp ipv4 srte detail | grep -B8 R1_R16_LOOSE_ANYCAST_IPV4 BGP routing table entry for [96][16777226][111][16.16.16.16] Paths: 1 available, best #1 Last modified: September 06, 2024 10:28:37 Local, inserted - from - (0.0.0.0) Origin igp, metric 0, localpref -, weight 0, valid, -, best Endpoint 16.16.16.16, Color 111, Distinguisher 16777226 Tunnel encapsulation attribute: SR Policy Policy name: R1_R16_LOOSE_ANYCAST_IPV4
Verify on IOS-XR:
RP/0/RP0/CPU0:R1#show bgp ipv4 sr-policy [16777226][111][16.16.16.16]/96 Fri Sep 6 10:32:33.431 UTC BGP routing table entry for [16777226][111][16.16.16.16]/96 Versions: Process bRIB/RIB SendTblVer Speaker 8 8 Last Modified: Sep 6 10:28:37.191 for 00:03:56 Paths: (1 available, best #1, not advertised to any peer) Not advertised to any peer Path #1: Received by speaker 0 Not advertised to any peer 65001 192.168.0.1 from 192.168.0.1 (111.111.111.111) Origin IGP, localpref 100, valid, external, best, group-best Received Path ID 0, Local Path ID 1, version 8 Community: no-advertise Tunnel encap attribute type: 15 (SR policy) bsid 15011, preference 100, num of segment-lists 1 segment-list 1, weight 1 segments: {16056} {16112} {16016} Candidate path is usable (registered) SR policy state is UP, Allocated bsid 15011
RP/0/RP0/CPU0:R1#show segment-routing traffic-eng policy binding-sid 15011 Fri Sep 6 10:32:48.113 UTC SR-TE policy database --------------------- Color: 111, End-point: 16.16.16.16 Name: srte_c_111_ep_16.16.16.16 Status: Admin: up Operational: up for 00:04:09 (since Sep 6 10:28:38.660) Candidate-paths: Preference: 100 (BGP, RD: 16777226) (active) Requested BSID: 15011 Constraints: Protection Type: protected-preferred Maximum SID Depth: 10 Explicit: segment-list (valid) Weight: 1, Metric Type: TE SID[0]: 16056 [Prefix-SID, 56.56.56.56] SID[1]: 16112 SID[2]: 16016 Attributes: Binding SID: 15011 (SRLB) Forward Class: Not Configured Steering labeled-services disabled: no Steering BGP disabled: no IPv6 caps enable: yes Invalidation drop enabled: no Max Install Standby Candidate Paths: 0
Refer to the documentation about multi-domain policies for more details and examples.
Further information
For more details about Traffic Dictator configuration, refer to https://vegvisir.ie/documentation/
Check out also Traffic Dictator White Paper