blob: 86f2d02fed9cc22eef98f783f9f4e7a3146e902a [file] [log] [blame]
Troubleshooting Guide
*********************
Overview
========
The **Trellis Troubleshooting Tools (T3)** is an ONOS application intended to
**help you troubleshoot traffic-related problems** in your network by **tracing
installed flows and groups**.
T3 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.
To activate this tool on your ONOS environment, you need to run:
.. code-block:: console
onos> app activate t3
T3 supports tracing of following packet types:
- L2 Unicast
- L2 Broadcast
- L3 Unicast (both IPv4 and IPv6)
- L3 Multicast (both IPv4 and IPv6)
- LLDP and BDDP
- ARP
- DHCP
Network Information Base (NIB)
==============================
T3 analyzes network states that are stored in the NIB.
A NIB is a collection of snapshots captured from various ONOS stores such as flows, groups, links...etc.
The NIB, acting as a cache, allows T3 troubleshooting logic to avoid massive interaction with live ONOS subsystems,
enabling near-runtime or postmortem analysis in a production environment.
There are two methods of loading the network snapshots into the NIB:
(1) from a live running system or (2) from a onos-diagnostics file dump.
Users can choose one load command before troubleshooting commands,
or can run troubleshooting commands alone (then the NIB is automatically loaded via (1)).
t3-load-file
=========================
T3 offers this command to fill the NIB with files that represent snapshots of the network states in a certain time.
t3-load-file Help
------------------------------
.. code-block:: console
onos> t3-load-file --help
DESCRIPTION
onos:t3-load-file
Load the NIB with onos-diagnostics dump files
SYNTAX
onos:t3-load-file [options] rootDir
ARGUMENTS
rootDir
Specify the location of the directory where the previous onos-diagnostics command has extracted its dump files (e.g. /tmp/onos-diags/127.0.0.1)
OPTIONS
--help
Display this help message
-j, --json
Output JSON
t3-load-file Example
---------------------------------
User is expected to run the tool ``onos-diagnostics`` [#onos-diagnostics_src]_ [#onos-diagnostics_man]_
to generate target files first.
.. code-block:: console
user$ onos-diagnostics -xj [IP_ONOS_INSTANCE_1 IP_ONOS_INSTANCE_2 ...]
Collecting diagnostics on [IP_ONOS_INSTANCE_1]...logs netcfg.json devices.json device-drivers.json links.json hosts.json ports.json edge-ports.json flows.json groups.json masters.json routes.json mcast-host-show.json Done.
Collecting diagnostics on [IP_ONOS_INSTANCE_2]...logs netcfg.json devices.json device-drivers.json links.json hosts.json ports.json edge-ports.json flows.json groups.json masters.json routes.json mcast-host-show.json Done.
Then, execute this command with the path of the location where those JSON files are extracted.
User can check the creation time and a summary of the NIB contents.
.. code-block:: console
onos> t3-load-file /tmp/onos-diags/[IP_ONOS_INSTANCE_TARGET]
Load target files in: /tmp/onos-diags/[IP_ONOS_INSTANCE_TARGET]/
FlowNib created 03-06-2020 01:30 from FILE
GroupNib created 03-06-2020 01:30 from FILE
LinkNib created 03-06-2020 01:30 from FILE
HostNib created 03-06-2020 01:30 from FILE
DeviceNib created 03-06-2020 01:30 from FILE
DriverNib created 03-06-2020 01:30 from FILE
MastershipNib created 03-06-2020 01:30 from FILE
EdgePortNib created 03-06-2020 01:30 from FILE
RouteNib created 03-06-2020 01:30 from FILE
NetworkConfigNib created 03-06-2020 01:30 from FILE
MulticastRouteNib created 03-06-2020 01:30 from FILE
Alternatively, it is possible to use ``onos-diagnostics-k8s`` [#onos-diagnostics-k8s_src]_ [#onos-diagnostics_man]_
in Kubernetes enabled environments.
t3-load-snapshot
=============================
T3 offers this command to fill the NIB with snapshots of the network states at the execution time.
t3-load-snapshot Help
----------------------------------
.. code-block:: console
onos> t3-load-snapshot --help
DESCRIPTION
onos:t3-load-snapshot
Load the NIB with the network states stored in the ONOS instance where the T3 is running
SYNTAX
onos:t3-load-snapshot [options]
OPTIONS
--help
Display this help message
-j, --json
Output JSON
t3-load-snapshot Example
-------------------------------------
User can check the creation time and a summary of the NIB contents.
**SNAPSHOT** indicates that the source of the current NIB is the ONOS instance where the T3 is running.
.. code-block:: console
onos> t3-load-snapshot
Load current network states from ONOS stores
FlowNib created 03-06-2020 01:40 from SNAPSHOT
GroupNib created 03-06-2020 01:40 from SNAPSHOT
LinkNib created 03-06-2020 01:40 from SNAPSHOT
HostNib created 03-06-2020 01:40 from SNAPSHOT
DeviceNib created 03-06-2020 01:40 from SNAPSHOT
DriverNib created 03-06-2020 01:40 from SNAPSHOT
MastershipNib created 03-06-2020 01:40 from SNAPSHOT
EdgePortNib created 03-06-2020 01:40 from SNAPSHOT
RouteNib created 03-06-2020 01:40 from SNAPSHOT
NetworkConfigNib created 03-06-2020 01:40 from SNAPSHOT
MulticastRouteNib created 03-06-2020 01:40 from SNAPSHOT
If one of T3 commands below is used before loading the NIB from **SNAPSHOT** or **FILE** (so the NIB is empty),
the command internally executes **t3-load-snapshot** to proceed with auto-filled NIB.
.. code-block:: console
onos> t3-troubleshoot-simple 00:AA:00:00:00:01/None 00:AA:00:00:00:02/None
*** NIB is invalid. Snapshots for the NIB have been auto-filled: ***
Load current network states from ONOS stores
FlowNib created 03-06-2020 01:44 from SNAPSHOT
GroupNib created 03-06-2020 01:44 from SNAPSHOT
LinkNib created 03-06-2020 01:44 from SNAPSHOT
...
Tracing between: 00:AA:00:00:00:01/None and 00:AA:00:00:00:02/None
Tracing Packet: DefaultTrafficSelector{criteria=[IN_PORT:3, ETH_DST:00:00:00:00:02:04, ETH_TYPE:ipv4, VLAN_VID:None, IPV4_SRC:10.0.2.1/32, IPV4_DST:10.0.2.2/32]}
Paths
[of:0000000000000204/3, of:0000000000000204/4]
Result:
Reached required destination Host of:0000000000000204/4
t3-troubleshoot
===============
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.
t3-troubleshoot Help
--------------------
.. code-block:: console
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)
Default Verbosity Level
-----------------------
Let's look at an example.
.. code-block:: console
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
- 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
- VLAN ID ``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 trellis.py [#trellis.py]_, the output will be:
.. code-block:: console
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.
.. code-block:: console
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
.. code-block:: console
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
.. code-block:: console
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:
.. code-block:: console
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
Successful Example
------------------
In this example we trace a packet that should be bridged between two hosts in
the same subnet
.. code-block:: console
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
Failed 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:
.. code-block:: console
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.
Example of Various Packet Types
-------------------------------
These sample commands refer to the Mininet environment found in trellis.py [#trellis.py]_
- L2 Unicast IPv4
.. code-block:: console
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
.. code-block:: console
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
.. code-block:: console
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
.. code-block:: console
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
.. code-block:: console
t3-troubleshoot -sp of:0000000000000204/3 -et ARP
- DHCP
.. code-block:: console
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
.. code-block:: console
t3-troubleshoot -sp of:0000000000000204/3 -et lldp
- BDDP
.. code-block:: console
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.
.. code-block:: console
t3-troubleshoot -sp of:0000000000000204/CONTROLLER -et lldp
- Multicast
T3 is also capable of tracing multicast packets.
.. code-block:: console
t3-troubleshoot -vv -sp of:0000000000000205/9 -et ipv4 -d 224.0.0.1 -dm 01:00:5e:00:00:01
t3-troubleshoot-simple
======================
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.
t3-troubleshoot-simple Help
---------------------------
.. code-block:: console
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
t3-troubleshoot-simple Example
------------------------------
Examples are given for the same trellis.py [#trellis.py]_ script.
- L2 Unicast
Hosts are under the same leaf, only interface configuration is needed.
.. code-block:: console
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.
.. code-block:: console
t3-troubleshoot-simple -et IPV4 00:AA:00:00:00:01/None 00:AA:00:00:00:03/None
t3-troubleshoot-pingall
=======================
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.
t3-troubleshoot-pingall Help
----------------------------
.. code-block:: console
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
t3-troubleshoot-pingall Examples
--------------------------------
- IPv4 hosts
.. code-block:: console
t3-troubleshoot-pingall
- IPv6 hosts
.. code-block:: console
t3-troubleshoot-pingall -et IPV6
t3-troubleshoot-mcast
=====================
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.
t3-troubleshoot-mcast Help
--------------------------
.. code-block:: console
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:
.. code-block:: text
<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.
.. code-block:: console
curl -X GET --header 'Accept: application/json' 'http://localhost:8181/onos/v1/t3/t3/simple/<host_src>/<host_dst>/<eht_type>'
.. code-block:: console
curl -X GET --header 'Accept: application/json' 'http://localhost:8181/onos/v1/t3/t3/simple/<host_src>/<host_dst>/<eht_type>/verbose
Last Resort
===========
In the case where you can't figure out what is going wrong even with help of
T3, you can seek help on Trellis developer mailing list
``trellis-dev@opennetworking.org``.
There are a few things we would like you to attach:
- **Issue description**
- **Environment description**, such as ONOS version, switch model and OF-DPA
version
- **Steps of reproduction**, as detail as possible
- **Diagnostics**.
We have built a tool ``onos-diagnostics`` [#onos-diagnostics_src]_ [#onos-diagnostics_man]_
to help you easily collect and package ONOS diagnostics.
Alternatively, you can use ``onos-diagnostics-k8s`` [#onos-diagnostics-k8s_src]_ [#onos-diagnostics_man]_.
Reference
=========
.. [#onos-diagnostics_src] `<https://github.com/opennetworkinglab/onos/blob/master/tools/package/runtime/bin/onos-diagnostics>`_
.. [#onos-diagnostics_man] `<https://wiki.onosproject.org/display/ONOS/ONOS+Remote+Admin+Tools>`_
.. [#onos-diagnostics-k8s_src] `<https://github.com/opennetworkinglab/onos/blob/master/tools/package/runtime/bin/onos-diagnostics-k8s>`_
.. [#trellis.py] `<https://github.com/opennetworkinglab/routing/blob/master/trellis/trellis.py>`_