T3 Handling lldp and Bddp

Change-Id: Iecbe22bbbaa6d4719092be97385f70828d628b8c
(cherry picked from commit e30f33e3eb8b0250894c856bb0a0e260fcd349cd)
diff --git a/apps/t3/src/main/java/org/onosproject/t3/cli/TroubleshootTraceCommand.java b/apps/t3/src/main/java/org/onosproject/t3/cli/TroubleshootTraceCommand.java
index 587c748..ae68d93 100644
--- a/apps/t3/src/main/java/org/onosproject/t3/cli/TroubleshootTraceCommand.java
+++ b/apps/t3/src/main/java/org/onosproject/t3/cli/TroubleshootTraceCommand.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.t3.cli;
 
+import com.google.common.base.Preconditions;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.onlab.packet.IpAddress;
@@ -25,6 +26,8 @@
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
@@ -53,6 +56,8 @@
     private static final String GROUP_BUCKET_FORMAT =
             "       id=0x%s, bucket=%s, bytes=%s, packets=%s, actions=%s";
 
+    private static final String CONTROLLER = "CONTROLLER";
+
     @Option(name = "-v", aliases = "--verbose", description = "Outputs complete path")
     private boolean verbosity1 = false;
 
@@ -80,7 +85,7 @@
     @Option(name = "-dm", aliases = "--dstMac", description = "Destination MAC")
     String dstMac = null;
 
-    @Option(name = "-dtp", aliases = "dstTcpPort", description = "destination TCP Port")
+    @Option(name = "-dtp", aliases = "--dstTcpPort", description = "destination TCP Port")
     String dstTcpPort = null;
 
     @Option(name = "-vid", aliases = "--vlanId", description = "Vlan of incoming packet", valueToShowInHelp = "None")
@@ -104,7 +109,17 @@
     @Override
     protected void execute() {
         TroubleshootService service = get(TroubleshootService.class);
-        ConnectPoint cp = ConnectPoint.deviceConnectPoint(srcPort);
+        String[] cpInfo = srcPort.split("/");
+        Preconditions.checkArgument(cpInfo.length == 2, "wrong format of source port");
+        ConnectPoint cp;
+        //Uses input port as a convenience to carry the Controller port, proper flood behaviour is handled in the
+        // troubleshoot manager.
+        if (cpInfo[1].equalsIgnoreCase(CONTROLLER)) {
+            cp = new ConnectPoint(DeviceId.deviceId(cpInfo[0]), PortNumber.CONTROLLER);
+        } else {
+            cp = ConnectPoint.deviceConnectPoint(srcPort);
+        }
+
         EtherType type = EtherType.valueOf(ethType.toUpperCase());
 
         //Input Port must be specified
@@ -176,7 +191,6 @@
 
         //Build the trace
         StaticPacketTrace trace = service.trace(packet, cp);
-
         //Print based on verbosity
         if (verbosity1) {
             printTrace(trace, false);
@@ -196,17 +210,27 @@
         paths.forEach(path -> {
             print("Path %s", path);
             ConnectPoint previous = null;
-            for (ConnectPoint connectPoint : path) {
-                if (previous == null || !previous.deviceId().equals(connectPoint.deviceId())) {
-                    print("Device %s", connectPoint.deviceId());
-                    print("Input from %s", connectPoint);
-                    printFlows(trace, verbose, connectPoint);
-                } else {
-                    printGroups(trace, verbose, connectPoint);
-                    print("Output through %s", connectPoint);
-                    print("");
+            if (path.size() == 1) {
+                ConnectPoint connectPoint = path.get(0);
+                print("Device %s", connectPoint.deviceId());
+                print("Input from %s", connectPoint);
+                printFlows(trace, verbose, connectPoint);
+                printGroups(trace, verbose, connectPoint);
+                print("Output through %s", connectPoint);
+                print("");
+            } else {
+                for (ConnectPoint connectPoint : path) {
+                    if (previous == null || !previous.deviceId().equals(connectPoint.deviceId())) {
+                        print("Device %s", connectPoint.deviceId());
+                        print("Input from %s", connectPoint);
+                        printFlows(trace, verbose, connectPoint);
+                    } else {
+                        printGroups(trace, verbose, connectPoint);
+                        print("Output through %s", connectPoint);
+                        print("");
+                    }
+                    previous = connectPoint;
                 }
-                previous = connectPoint;
             }
             print("---------------------------------------------------------------\n");
         });