Overview
The Trellis Troubleshooting Tools is an ONOS application intended to help you troubleshoot traffic-related problems in your network.
The T3 tool works both on simulated OVS-based topologies but also on real HW, basing it's internal decisions on the driver assigned to the device.
T3 also currently supports dual links between leaf and spine and properly handles the difference between deferred and immediate rules.
Dual Homed hosts are also supported in T3.
Supported packet types
T3 supports, both IPv4 and Ipv6
- L3 Unicast
- L2 Unicast
- L2 Broadcast
- L3 Multicast
- LLDP and BDDP
- ARP
- DHCP
Activation and use
To activate this tool on your ONOS environment you need to
onos> app activate org.onosproject.t3
Command Line Interface
Troubleshoot CLI command
As of right now the tools provides a CLI command (troubleshoot). As arguments to the CLI command you have to pass arguments describing the packet you want to trace through the network.
Command Help
onos> t3-troubleshoot --help DESCRIPTION onos:troubleshoot troubleshoots flows and groups between source and destination SYNTAX onos:troubleshoot [options] OPTIONS -sm, --srcMac Source MAC -j, --json Output JSON --help Display this help message -v, --verbose Outputs complete path -ipp, --ipProto IP Proto -s, --srcIp Source IP -dm, --dstMac Destination MAC -ml, --mplsLabel Mpls label of incoming packet -vv, --veryverbose Outputs flows and groups for every device -udps, --udpSrc UDP Source -mb, --mplsBos MPLS BOS -et, --ethType ETH Type (defaults to ipv4) -sp, --srcPort Source Port -dtp, --dstTcpPort destination TCP Port -udpd, --udpDst UDP Destination -stp, --srcTcpPort Source TCP Port -d, --dstIp Destination IP -vid, --vlanId Vlan of incoming packet (defaults to None)
Plain Verbosity Level
Let's look at an example.
onos> t3-troubleshoot -s 10.0.2.1 -sp of:0000000000000204/3 -sm 00:AA:00:00:00:01 -et IPV4 -d 10.0.3.1 -dm 00:00:00:00:02:04 -vid None
with this command we are asking the t3 tool to trace a packet with a Source IP of 10.0.2.1/32 input port of:0000000000000204/3 source MAC 00:AA:00:00:00:01 ethType Ipv4 Source TCP Port 12345 Destination IP 10.0.3.1/32 destination MAC 00:AA:00:00:00:01, Destination TCP Port 80 and VlanId None.
This command has a verbosity level of 0 and will output just the paths that the packet might take inside the network. In the example deployment taken from here https://github.com/opennetworkinglab/routing/blob/master/trellis/trellis.py the output will be:
Tracing packet: [IN_PORT:3, ETH_DST:00:00:00:00:02:04, ETH_SRC:00:AA:00:00:00:01, ETH_TYPE:ipv4, VLAN_VID:None, IPV4_SRC:10.0.2.1/32, IPV4_DST:10.0.3.1/32, TCP_SRC:12345, TCP_DST:80, MPLS_BOS:true] Paths [of:0000000000000204/3, of:0000000000000204/2, of:0000000000000227/1, of:0000000000000227/2, of:0000000000000205/2, of:0000000000000205/3] [of:0000000000000204/3, of:0000000000000204/1, of:0000000000000226/1, of:0000000000000226/2, of:0000000000000205/1, of:0000000000000205/3] Result: Reached required destination Host Reached required destination Host
Middle Verbosity Level
There are also two other verbosity levels.
onos> t3-troubleshoot -v -s 10.0.2.1 -sp of:0000000000000204/3 -sm 00:AA:00:00:00:01 -et IPV4 -d 10.0.3.1 -dm 00:00:00:00:02:04 -vid None
prints flows selectors and groupId that are met along the path
Tracing packet: [IN_PORT:3, ETH_DST:00:00:00:00:02:04, ETH_SRC:00:AA:00:00:00:01, ETH_TYPE:ipv4, VLAN_VID:None, IPV4_SRC:10.0.2.1/32, IPV4_DST:10.0.3.1/32, TCP_SRC:12345, TCP_DST:80, MPLS_BOS:true] Path [of:0000000000000204/3, of:0000000000000204/2, of:0000000000000227/1, of:0000000000000227/2, of:0000000000000205/2, of:0000000000000205/3] Device of:0000000000000204 Input from of:0000000000000204/3 Flows flowId=a20000bd57cb49, selector=[] flowId=900000d4173ff7, selector=[IN_PORT:3, VLAN_VID:None] flowId=9000004b3d1965, selector=[IN_PORT:3, ETH_DST:00:00:00:00:02:04, ETH_TYPE:ipv4, VLAN_VID:20] flowId=900000499769f5, selector=[ETH_TYPE:ipv4, IPV4_DST:10.0.3.0/24] flowId=a2000038b487e7, selector=[] Groups groupId=GroupId{id=0x70000010} groupId=GroupId{id=0x9200000d} groupId=GroupId{id=0x9000000c} groupId=GroupId{id=0xffe0002} groupId=GroupId{id=0x9200000f} groupId=GroupId{id=0x9000000e} groupId=GroupId{id=0xffe0001} Output through of:0000000000000204/2 Device of:0000000000000227 Input from of:0000000000000227/1 Flows flowId=a200005577bcd6, selector=[] flowId=900000498457b2, selector=[IN_PORT:1, VLAN_VID:None] flowId=900000f87746c9, selector=[IN_PORT:1, ETH_DST:00:00:00:00:02:27, ETH_TYPE:mpls_unicast, VLAN_VID:4094] flowId=a200005bfd6ed7, selector=[] flowId=9000009f3d554f, selector=[ETH_TYPE:mpls_unicast, MPLS_LABEL:205, MPLS_BOS:true] flowId=a20000e601fc35, selector=[] Groups groupId=GroupId{id=0x70000017} groupId=GroupId{id=0x20000016} groupId=GroupId{id=0xffe0002} Output through of:0000000000000227/2 Device of:0000000000000205 Input from of:0000000000000205/2 Flows flowId=a200008d542817, selector=[] flowId=900000be3179a0, selector=[IN_PORT:1, VLAN_VID:None] flowId=900000766be164, selector=[IN_PORT:1, ETH_DST:00:00:00:00:02:05, ETH_TYPE:ipv4, VLAN_VID:4094] flowId=900000ec1d5779, selector=[ETH_TYPE:ipv4, IPV4_DST:10.0.3.1/32] flowId=a2000042d8e6b5, selector=[] Groups groupId=GroupId{id=0x2000002a} groupId=GroupId{id=0x1e0003} groupId=GroupId{id=0x2000002a} groupId=GroupId{id=0x1e0003} Output through of:0000000000000205/3 Path [of:0000000000000204/3, of:0000000000000204/1, of:0000000000000226/1, of:0000000000000226/2, of:0000000000000205/1, of:0000000000000205/3] Device of:0000000000000204 Input from of:0000000000000204/3 Flows flowId=a20000bd57cb49, selector=[] flowId=900000d4173ff7, selector=[IN_PORT:3, VLAN_VID:None] flowId=9000004b3d1965, selector=[IN_PORT:3, ETH_DST:00:00:00:00:02:04, ETH_TYPE:ipv4, VLAN_VID:20] flowId=900000499769f5, selector=[ETH_TYPE:ipv4, IPV4_DST:10.0.3.0/24] flowId=a2000038b487e7, selector=[] Groups groupId=GroupId{id=0x70000010} groupId=GroupId{id=0x9200000d} groupId=GroupId{id=0x9000000c} groupId=GroupId{id=0xffe0002} groupId=GroupId{id=0x9200000f} groupId=GroupId{id=0x9000000e} groupId=GroupId{id=0xffe0001} Output through of:0000000000000204/1 Device of:0000000000000226 Input from of:0000000000000226/1 Flows flowId=a20000e9b27d24, selector=[] flowId=9000004bd76105, selector=[IN_PORT:1, VLAN_VID:None] flowId=90000069f274d1, selector=[IN_PORT:1, ETH_DST:00:00:00:00:02:26, ETH_TYPE:mpls_unicast, VLAN_VID:4094] flowId=a200000ec7529e, selector=[] flowId=90000050f9a350, selector=[ETH_TYPE:mpls_unicast, MPLS_LABEL:205, MPLS_BOS:true] flowId=a20000b15cada6, selector=[] Groups groupId=GroupId{id=0x7000000b} groupId=GroupId{id=0x20000009} groupId=GroupId{id=0xffe0002} Output through of:0000000000000226/2 Device of:0000000000000205 Input from of:0000000000000205/1 Flows flowId=a200008d542817, selector=[] flowId=900000be3179a0, selector=[IN_PORT:1, VLAN_VID:None] flowId=900000766be164, selector=[IN_PORT:1, ETH_DST:00:00:00:00:02:05, ETH_TYPE:ipv4, VLAN_VID:4094] flowId=900000ec1d5779, selector=[ETH_TYPE:ipv4, IPV4_DST:10.0.3.1/32] flowId=a2000042d8e6b5, selector=[] Groups groupId=GroupId{id=0x2000002a} groupId=GroupId{id=0x1e0003} groupId=GroupId{id=0x2000002a} groupId=GroupId{id=0x1e0003} Output through of:0000000000000205/3 Result: Reached required destination Host Reached required destination Host
High Verbosity Level
The most verbose output you can get is
onos> t3-troubleshoot -vv -s 10.0.2.1 -sp of:0000000000000204/3 -sm 00:AA:00:00:00:01 -et IPV4 -d 10.0.3.1 -dm 00:00:00:00:02:04 -vid None
This verbosity level prints all the flows and groups that are met along the path
Tracing packet: [IN_PORT:3, ETH_DST:00:00:00:00:02:04, ETH_SRC:00:AA:00:00:00:01, ETH_TYPE:ipv4, VLAN_VID:None, IPV4_SRC:10.0.2.1/32, IPV4_DST:10.0.3.1/32, TCP_SRC:12345, TCP_DST:80, MPLS_BOS:true] Path [of:0000000000000204/3, of:0000000000000204/2, of:0000000000000227/1, of:0000000000000227/2, of:0000000000000205/2, of:0000000000000205/3] Device of:0000000000000204 Input from of:0000000000000204/3 Flows ADDED, bytes=733506, packets=8691, table=0, priority=0, selector=[], treatment=[transition=TABLE:10] ADDED, bytes=11110, packets=61, table=10, priority=32768, selector=[IN_PORT:3, VLAN_VID:None], treatment=[immediate=[VLAN_PUSH:vlan, VLAN_ID:20], transition=TABLE:20] ADDED, bytes=8698, packets=29, table=20, priority=32768, selector=[IN_PORT:3, ETH_DST:00:00:00:00:02:04, ETH_TYPE:ipv4, VLAN_VID:20], treatment=[transition=TABLE:30] ADDED, bytes=16612, packets=50, table=30, priority=48010, selector=[ETH_TYPE:ipv4, IPV4_DST:10.0.3.0/24], treatment=[deferred=[GROUP:0x70000010], transition=TABLE:60] ADDED, bytes=34400, packets=112, table=60, priority=0, selector=[], treatment=[immediate=[NOACTION]] Groups id=0x70000010, state=ADDED, type=SELECT, bytes=16906, packets=53, appId=org.onosproject.segmentrouting, referenceCount=3 id=0x70000010, bucket=1, bytes=490, packets=5, actions=[GROUP:0x9200000d] id=0x70000010, bucket=2, bytes=16416, packets=48, actions=[GROUP:0x9200000f] id=0x9200000d, state=ADDED, type=INDIRECT, bytes=490, packets=5, appId=org.onosproject.segmentrouting, referenceCount=0 id=0x9200000d, bucket=1, bytes=490, packets=5, actions=[VLAN_POP, MPLS_PUSH:mpls_unicast, MPLS_LABEL:205, GROUP:0x9000000c, VLAN_PUSH:vlan, VLAN_ID:4095] id=0x9000000c, state=ADDED, type=INDIRECT, bytes=490, packets=5, appId=org.onosproject.segmentrouting, referenceCount=0 id=0x9000000c, bucket=1, bytes=490, packets=5, actions=[ETH_DST:00:00:00:00:02:27, ETH_SRC:00:00:00:00:02:04, VLAN_ID:4094, GROUP:0xffe0002] id=0xffe0002, state=ADDED, type=INDIRECT, bytes=726, packets=7, appId=org.onosproject.segmentrouting, referenceCount=0 id=0xffe0002, bucket=1, bytes=726, packets=7, actions=[VLAN_POP, OUTPUT:2] id=0x9200000f, state=ADDED, type=INDIRECT, bytes=16416, packets=48, appId=org.onosproject.segmentrouting, referenceCount=0 id=0x9200000f, bucket=1, bytes=16416, packets=48, actions=[VLAN_POP, MPLS_PUSH:mpls_unicast, MPLS_LABEL:205, GROUP:0x9000000e, VLAN_PUSH:vlan, VLAN_ID:4095] id=0x9000000e, state=ADDED, type=INDIRECT, bytes=16416, packets=48, appId=org.onosproject.segmentrouting, referenceCount=0 id=0x9000000e, bucket=1, bytes=16416, packets=48, actions=[ETH_DST:00:00:00:00:02:26, ETH_SRC:00:00:00:00:02:04, VLAN_ID:4094, GROUP:0xffe0001] id=0xffe0001, state=ADDED, type=INDIRECT, bytes=16416, packets=48, appId=org.onosproject.segmentrouting, referenceCount=0 id=0xffe0001, bucket=1, bytes=16416, packets=48, actions=[VLAN_POP, OUTPUT:1] Output through of:0000000000000204/2 Device of:0000000000000227 Input from of:0000000000000227/1 Flows ADDED, bytes=702318, packets=8511, table=0, priority=0, selector=[], treatment=[transition=TABLE:10] ADDED, bytes=343130, packets=4234, table=10, priority=32768, selector=[IN_PORT:1, VLAN_VID:None], treatment=[immediate=[VLAN_PUSH:vlan, VLAN_ID:4094], transition=TABLE:20] ADDED, bytes=754, packets=7, table=20, priority=32768, selector=[IN_PORT:1, ETH_DST:00:00:00:00:02:27, ETH_TYPE:mpls_unicast, VLAN_VID:4094], treatment=[transition=TABLE:23] ADDED, bytes=17566, packets=57, table=23, priority=0, selector=[], treatment=[transition=TABLE:24] ADDED, bytes=510, packets=5, table=24, priority=100, selector=[ETH_TYPE:mpls_unicast, MPLS_LABEL:205, MPLS_BOS:true], treatment=[deferred=[MPLS_POP:ipv4, DEC_TTL, GROUP:0x70000017], transition=TABLE:60] ADDED, bytes=17566, packets=57, table=60, priority=0, selector=[], treatment=[immediate=[NOACTION]] Groups id=0x70000017, state=ADDED, type=SELECT, bytes=754, packets=7, appId=org.onosproject.segmentrouting, referenceCount=2 id=0x70000017, bucket=1, bytes=754, packets=7, actions=[GROUP:0x20000016] id=0x20000016, state=ADDED, type=INDIRECT, bytes=754, packets=7, appId=org.onosproject.segmentrouting, referenceCount=0 id=0x20000016, bucket=1, bytes=754, packets=7, actions=[ETH_DST:00:00:00:00:02:05, ETH_SRC:00:00:00:00:02:27, VLAN_ID:4094, GROUP:0xffe0002] id=0xffe0002, state=ADDED, type=INDIRECT, bytes=754, packets=7, appId=org.onosproject.segmentrouting, referenceCount=0 id=0xffe0002, bucket=1, bytes=754, packets=7, actions=[VLAN_POP, OUTPUT:2] Output through of:0000000000000227/2 Device of:0000000000000205 Input from of:0000000000000205/2 Flows ADDED, bytes=2105886, packets=24084, table=0, priority=0, selector=[], treatment=[transition=TABLE:10] ADDED, bytes=358792, packets=4275, table=10, priority=32768, selector=[IN_PORT:1, VLAN_VID:None], treatment=[immediate=[VLAN_PUSH:vlan, VLAN_ID:4094], transition=TABLE:20] ADDED, bytes=16416, packets=48, table=20, priority=32768, selector=[IN_PORT:1, ETH_DST:00:00:00:00:02:05, ETH_TYPE:ipv4, VLAN_VID:4094], treatment=[transition=TABLE:30] ADDED, bytes=196, packets=2, table=30, priority=64010, selector=[ETH_TYPE:ipv4, IPV4_DST:10.0.3.1/32], treatment=[deferred=[GROUP:0x2000002a], transition=TABLE:60] ADDED, bytes=1370884, packets=15163, table=60, priority=0, selector=[], treatment=[immediate=[NOACTION]] Groups id=0x2000002a, state=ADDED, type=INDIRECT, bytes=196, packets=2, appId=org.onosproject.segmentrouting, referenceCount=1 id=0x2000002a, bucket=1, bytes=196, packets=2, actions=[ETH_DST:00:AA:00:00:00:03, ETH_SRC:00:00:00:00:02:05, VLAN_ID:30, GROUP:0x1e0003] id=0x1e0003, state=ADDED, type=INDIRECT, bytes=12960, packets=126, appId=org.onosproject.segmentrouting, referenceCount=1 id=0x1e0003, bucket=1, bytes=12960, packets=126, actions=[VLAN_POP, OUTPUT:3] id=0x2000002a, state=ADDED, type=INDIRECT, bytes=196, packets=2, appId=org.onosproject.segmentrouting, referenceCount=1 id=0x2000002a, bucket=1, bytes=196, packets=2, actions=[ETH_DST:00:AA:00:00:00:03, ETH_SRC:00:00:00:00:02:05, VLAN_ID:30, GROUP:0x1e0003] id=0x1e0003, state=ADDED, type=INDIRECT, bytes=12960, packets=126, appId=org.onosproject.segmentrouting, referenceCount=1 id=0x1e0003, bucket=1, bytes=12960, packets=126, actions=[VLAN_POP, OUTPUT:3] Output through of:0000000000000205/3 Path [of:0000000000000204/3, of:0000000000000204/1, of:0000000000000226/1, of:0000000000000226/2, of:0000000000000205/1, of:0000000000000205/3] Device of:0000000000000204 Input from of:0000000000000204/3 Flows ADDED, bytes=733506, packets=8691, table=0, priority=0, selector=[], treatment=[transition=TABLE:10] ADDED, bytes=11110, packets=61, table=10, priority=32768, selector=[IN_PORT:3, VLAN_VID:None], treatment=[immediate=[VLAN_PUSH:vlan, VLAN_ID:20], transition=TABLE:20] ADDED, bytes=8698, packets=29, table=20, priority=32768, selector=[IN_PORT:3, ETH_DST:00:00:00:00:02:04, ETH_TYPE:ipv4, VLAN_VID:20], treatment=[transition=TABLE:30] ADDED, bytes=16612, packets=50, table=30, priority=48010, selector=[ETH_TYPE:ipv4, IPV4_DST:10.0.3.0/24], treatment=[deferred=[GROUP:0x70000010], transition=TABLE:60] ADDED, bytes=34400, packets=112, table=60, priority=0, selector=[], treatment=[immediate=[NOACTION]] Groups id=0x70000010, state=ADDED, type=SELECT, bytes=16906, packets=53, appId=org.onosproject.segmentrouting, referenceCount=3 id=0x70000010, bucket=1, bytes=490, packets=5, actions=[GROUP:0x9200000d] id=0x70000010, bucket=2, bytes=16416, packets=48, actions=[GROUP:0x9200000f] id=0x9200000d, state=ADDED, type=INDIRECT, bytes=490, packets=5, appId=org.onosproject.segmentrouting, referenceCount=0 id=0x9200000d, bucket=1, bytes=490, packets=5, actions=[VLAN_POP, MPLS_PUSH:mpls_unicast, MPLS_LABEL:205, GROUP:0x9000000c, VLAN_PUSH:vlan, VLAN_ID:4095] id=0x9000000c, state=ADDED, type=INDIRECT, bytes=490, packets=5, appId=org.onosproject.segmentrouting, referenceCount=0 id=0x9000000c, bucket=1, bytes=490, packets=5, actions=[ETH_DST:00:00:00:00:02:27, ETH_SRC:00:00:00:00:02:04, VLAN_ID:4094, GROUP:0xffe0002] id=0xffe0002, state=ADDED, type=INDIRECT, bytes=726, packets=7, appId=org.onosproject.segmentrouting, referenceCount=0 id=0xffe0002, bucket=1, bytes=726, packets=7, actions=[VLAN_POP, OUTPUT:2] id=0x9200000f, state=ADDED, type=INDIRECT, bytes=16416, packets=48, appId=org.onosproject.segmentrouting, referenceCount=0 id=0x9200000f, bucket=1, bytes=16416, packets=48, actions=[VLAN_POP, MPLS_PUSH:mpls_unicast, MPLS_LABEL:205, GROUP:0x9000000e, VLAN_PUSH:vlan, VLAN_ID:4095] id=0x9000000e, state=ADDED, type=INDIRECT, bytes=16416, packets=48, appId=org.onosproject.segmentrouting, referenceCount=0 id=0x9000000e, bucket=1, bytes=16416, packets=48, actions=[ETH_DST:00:00:00:00:02:26, ETH_SRC:00:00:00:00:02:04, VLAN_ID:4094, GROUP:0xffe0001] id=0xffe0001, state=ADDED, type=INDIRECT, bytes=16416, packets=48, appId=org.onosproject.segmentrouting, referenceCount=0 id=0xffe0001, bucket=1, bytes=16416, packets=48, actions=[VLAN_POP, OUTPUT:1] Output through of:0000000000000204/1 Device of:0000000000000226 Input from of:0000000000000226/1 Flows ADDED, bytes=701910, packets=8507, table=0, priority=0, selector=[], treatment=[transition=TABLE:10] ADDED, bytes=358984, packets=4275, table=10, priority=32768, selector=[IN_PORT:1, VLAN_VID:None], treatment=[immediate=[VLAN_PUSH:vlan, VLAN_ID:4094], transition=TABLE:20] ADDED, bytes=16608, packets=48, table=20, priority=32768, selector=[IN_PORT:1, ETH_DST:00:00:00:00:02:26, ETH_TYPE:mpls_unicast, VLAN_VID:4094], treatment=[transition=TABLE:23] ADDED, bytes=17158, packets=53, table=23, priority=0, selector=[], treatment=[transition=TABLE:24] ADDED, bytes=16608, packets=48, table=24, priority=100, selector=[ETH_TYPE:mpls_unicast, MPLS_LABEL:205, MPLS_BOS:true], treatment=[deferred=[MPLS_POP:ipv4, DEC_TTL, GROUP:0x7000000b], transition=TABLE:60] ADDED, bytes=17158, packets=53, table=60, priority=0, selector=[], treatment=[immediate=[NOACTION]] Groups id=0x7000000b, state=ADDED, type=SELECT, bytes=16608, packets=48, appId=org.onosproject.segmentrouting, referenceCount=2 id=0x7000000b, bucket=1, bytes=16608, packets=48, actions=[GROUP:0x20000009] id=0x20000009, state=ADDED, type=INDIRECT, bytes=16608, packets=48, appId=org.onosproject.segmentrouting, referenceCount=0 id=0x20000009, bucket=1, bytes=16608, packets=48, actions=[ETH_DST:00:00:00:00:02:05, ETH_SRC:00:00:00:00:02:26, VLAN_ID:4094, GROUP:0xffe0002] id=0xffe0002, state=ADDED, type=INDIRECT, bytes=16608, packets=48, appId=org.onosproject.segmentrouting, referenceCount=0 id=0xffe0002, bucket=1, bytes=16608, packets=48, actions=[VLAN_POP, OUTPUT:2] Output through of:0000000000000226/2 Device of:0000000000000205 Input from of:0000000000000205/1 Flows ADDED, bytes=2105886, packets=24084, table=0, priority=0, selector=[], treatment=[transition=TABLE:10] ADDED, bytes=358792, packets=4275, table=10, priority=32768, selector=[IN_PORT:1, VLAN_VID:None], treatment=[immediate=[VLAN_PUSH:vlan, VLAN_ID:4094], transition=TABLE:20] ADDED, bytes=16416, packets=48, table=20, priority=32768, selector=[IN_PORT:1, ETH_DST:00:00:00:00:02:05, ETH_TYPE:ipv4, VLAN_VID:4094], treatment=[transition=TABLE:30] ADDED, bytes=196, packets=2, table=30, priority=64010, selector=[ETH_TYPE:ipv4, IPV4_DST:10.0.3.1/32], treatment=[deferred=[GROUP:0x2000002a], transition=TABLE:60] ADDED, bytes=1370884, packets=15163, table=60, priority=0, selector=[], treatment=[immediate=[NOACTION]] Groups id=0x2000002a, state=ADDED, type=INDIRECT, bytes=196, packets=2, appId=org.onosproject.segmentrouting, referenceCount=1 id=0x2000002a, bucket=1, bytes=196, packets=2, actions=[ETH_DST:00:AA:00:00:00:03, ETH_SRC:00:00:00:00:02:05, VLAN_ID:30, GROUP:0x1e0003] id=0x1e0003, state=ADDED, type=INDIRECT, bytes=12960, packets=126, appId=org.onosproject.segmentrouting, referenceCount=1 id=0x1e0003, bucket=1, bytes=12960, packets=126, actions=[VLAN_POP, OUTPUT:3] id=0x2000002a, state=ADDED, type=INDIRECT, bytes=196, packets=2, appId=org.onosproject.segmentrouting, referenceCount=1 id=0x2000002a, bucket=1, bytes=196, packets=2, actions=[ETH_DST:00:AA:00:00:00:03, ETH_SRC:00:00:00:00:02:05, VLAN_ID:30, GROUP:0x1e0003] id=0x1e0003, state=ADDED, type=INDIRECT, bytes=12960, packets=126, appId=org.onosproject.segmentrouting, referenceCount=1 id=0x1e0003, bucket=1, bytes=12960, packets=126, actions=[VLAN_POP, OUTPUT:3] Output through of:0000000000000205/3 Result: Reached required destination Host Reached required destination Host
Bridging example
In this example we trace a packet that should be bridged between two hosts in the same subnet
onos> t3-troubleshoot -s 10.0.2.1 -sp of:0000000000000204/3 -sm 00:AA:00:00:00:01 -et IPV4 -d 10.0.3.1 -dm 00:AA:00:00:00:02 -vid None Tracing packet: [IN_PORT:3, ETH_DST:00:AA:00:00:00:02, ETH_SRC:00:AA:00:00:00:01, ETH_TYPE:ipv4, VLAN_VID:None, IPV4_SRC:10.0.2.1/32, IPV4_DST:10.0.2.2/32, TCP_SRC:12345, TCP_DST:80, MPLS_BOS:true] Paths [of:0000000000000204/3, of:0000000000000204/4] Result: Reached required destination Host
Failure Detection Example
Obviously failures can happen along one of the paths that the packet can take.
In our sample we removed a flow in of:0000000000000226 thus disabling that possible path for our initial packet. The output of our trace would then look something like
onos> t3-troubleshoot -s 10.0.2.1 -sp of:0000000000000204/3 -sm 00:AA:00:00:00:01 -et IPV4 -d 10.0.3.1 -dm 00:00:00:00:02:04 -vid None Tracing packet: [IN_PORT:3, ETH_DST:00:00:00:00:02:04, ETH_SRC:00:AA:00:00:00:01, ETH_TYPE:ipv4, VLAN_VID:None, IPV4_SRC:10.0.2.1/32, IPV4_DST:10.0.3.1/32, TCP_SRC:12345, TCP_DST:80, MPLS_BOS:true] Paths [of:0000000000000204/3, of:0000000000000204/2, of:0000000000000227/1, of:0000000000000227/2, of:0000000000000205/2, of:0000000000000205/3] [of:0000000000000204/3, of:0000000000000204/1, of:0000000000000226/1] Result: Reached required destination Host No output out of device of:0000000000000226 Packet is dropped
Notice that on the second path that was previously going through of:0000000000000226 now the packet is dropped due to the rule we removed.
Command Line Samples
These sample commands refer to the mininet environment found here:
https://github.com/opennetworkinglab/routing/blob/master/trellis/trellis.py
L2 Unicast IPv4
t3-troubleshoot -s 10.0.2.1 -sp of:0000000000000204/3 -sm 00:AA:00:00:00:01 -d 10.0.2.2 -dm 00:AA:00:00:00:02
L2 Unicast IPv6
t3-troubleshoot -vv -s 2000::301 -sp of:0000000000000205/5 -sm 00:BB:00:00:00:03 -d 2000::302 -dm 00:BB:00:00:00:04 -et ipv6
L3 Unicast IPv4
t3-troubleshoot -s 10.0.2.1 -sp of:0000000000000204/3 -sm 00:AA:00:00:00:01 -d 10.0.3.1 -dm 00:00:00:00:02:04
L3 Unicast IPv6
t3-troubleshoot -vv -s 2000::301 -sp of:0000000000000205/5 -sm 00:BB:00:00:00:03 -d 2000::202 -dm 00:00:00:00:02:05 -et ipv6
ARP
t3-troubleshoot -sp of:0000000000000204/3 -et ARP
DHCP
t3-troubleshoot -vv -s 10.0.2.1 -sp of:0000000000000204/3 -sm 00:AA:00:00:00:01 -d 10.0.3.253 -dm 00:00:00:00:02:04 -ipp 17 -udps 67 -udpd 67
LLDP
t3-troubleshoot -sp of:0000000000000204/3 -et lldp
BDDP
t3-troubleshoot -sp of:0000000000000204/3 -et bddp
LLDP from CONTROLLER
T3 is also capable of tracing packets coming in from the CONTROLLER. We use the same input port with the possibility to give CONTROLLER as logical port number. This is a mere convenience to carry the information inside T3 and do the proper flooding to all the ports of the given device. This case is not treated like all the rest and the input port here is a logical entity that has no match on any physical element on the device.
t3-troubleshoot -sp of:0000000000000204/CONTROLLER -et lldp
Multicast
T3 is also capable of tracing multicast packets.
t3-troubleshoot -vv -sp of:0000000000000205/9 -et ipv4 -d 224.0.0.1 -dm 01:00:5e:00:00:01
Troubleshoot Simple CLI command
T3 also offers a simplified version of the command to be able to ping between two given hosts without having to specify all the information. This commands bases itself on top of some configuration present in ONOS through netcfg, namely the VLAN interface configuration and the segment routing leaf router MAC for L3 Unicast. If that is not present the user needs to input this information manually recurring to the the previously shown command. Same verbosity levels and output as the troubleshoot command are possible.
onos> t3-troubleshoot-simple --help DESCRIPTION onos:troubleshoot-simple Given two hosts troubleshoots flows and groups between them, in case of segment routing SYNTAX onos:troubleshoot-simple [options] one two ARGUMENTS one One host ID two Another host ID OPTIONS -vv, --veryverbose Outputs flows and groups for every device -j, --json Output JSON --help Display this help message -et, --ethType ETH Type (defaults to ipv4) -v, --verbose Outputs complete path
Troubleshoot Simple CLI examples
Examples are given for the same trellis.py script.
L2 Unicast
Hosts are under the same leaf, only interface configuration is needed.
t3-troubleshoot-simple -v -et IPV4 00:AA:00:00:00:01/None 00:AA:00:00:00:02/None
L3 Multicast
Hosts are under different leafs, also segment routing configuration config is needed for the leaf's routerMac.
t3-troubleshoot-simple -et IPV4 00:AA:00:00:00:01/None 00:AA:00:00:00:03/None
Troubleshoot PingAll CLI command
T3 also offers a ping-all command to be able to test ping between any given hosts of an EthType. This commands bases itself on top of the simplified Host to Host command. It has two verbosity levels, one just with Host and Destination with the result message of the Trace and one that shows also the packet and the paths.
onos> t3-troubleshoot-pingall --help DESCRIPTION onos:t3-troubleshoot-pingall Traces a ping between all hosts in the system of a given ETH type SYNTAX onos:t3-troubleshoot-pingall [options] OPTIONS -j, --json Output JSON --help Display this help message -et, --ethType ETH Type (defaults to ipv4) -v, --verbose Outputs trace for each host to host combination
Troubleshoot PingAll examples
IPv4 hosts
t3-troubleshoot-pingall
IPv6 hosts
t3-troubleshoot-pingall -et IPV6
Troubleshoot MCast CLI command
T3 also offers a mcast command queries the system for all the multicast routes given a certain vlanId. It prints all the traces given a certain group, source and source connect point. It has two "standard" verbosity levels.
onos> t3-troubleshoot-mcast --help DESCRIPTION onos:t3-troubleshoot-mcast Traces all the mcast routes present in the system SYNTAX onos:t3-troubleshoot-mcast [options] OPTIONS -j, --json Output JSON --help Display this help message -vv, --veryverbose Outputs details of every trace -vid, --vlanId Vlan of incoming packet (defaults to None) -v, --verbose Outputs trace for each host to host combination
REST API
T3 now also offers a way to execute the troubleshoot through REST API endpoints.
You can find the description and test the API at the ONOS docs endpoint here:
<ONOS_IP>:8181/onos/v1/docs/#/t3
The rest API offered are a non verbose and a verbose version of the troubleshoot simple command. It bases itself on top of some configuration present in ONOS through netcfg, namely the VLAN interface configuration and the segment routing leaf router MAC for L3 Unicast. The use need to specify just the Source Host, the destination host and the ETH type.
curl -X GET --header 'Accept: application/json' 'http://localhost:8181/onos/v1/t3/t3/simple/<host_src>/<host_dst>/<eht_type>'
curl -X GET --header 'Accept: application/json' 'http://localhost:8181/onos/v1/t3/t3/simple/<host_src>/<host_dst>/<eht_type>/verbose'