[SDFAB-295] Inconsistent format of port number in host location

This patch updates fabric.p4 interpreter. Additionally, fixes also
the HostProbingProvider by adding a translation step also there.

Change-Id: I8d1f0f8b6827453e5bdc240ea902960f92ed7e14
diff --git a/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/FabricInterpreter.java b/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/FabricInterpreter.java
index 1a7b2ba..9f848ed 100644
--- a/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/FabricInterpreter.java
+++ b/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/FabricInterpreter.java
@@ -290,6 +290,9 @@
             ImmutableByteSequence portByteSequence = packetMetadata.get().value();
             short s = portByteSequence.asReadOnlyBuffer().getShort();
             ConnectPoint receivedFrom = new ConnectPoint(deviceId, PortNumber.portNumber(s));
+            if (!receivedFrom.port().hasName()) {
+                receivedFrom = translateSwitchPort(receivedFrom);
+            }
             ByteBuffer rawData = ByteBuffer.wrap(packetIn.data().asArray());
             return new DefaultInboundPacket(receivedFrom, ethPkt, rawData);
         } else {
@@ -311,4 +314,19 @@
         }
         return capabilities.cpuPort();
     }
+
+    /* Connect point generated using sb metadata does not have port name
+       we use the device service as translation service */
+    private ConnectPoint translateSwitchPort(ConnectPoint connectPoint) {
+        final DeviceService deviceService = handler().get(DeviceService.class);
+        if (deviceService == null) {
+            log.warn("Unable to translate switch port due to DeviceService not available");
+            return connectPoint;
+        }
+        Port devicePort = deviceService.getPort(connectPoint);
+        if (devicePort != null) {
+            return new ConnectPoint(connectPoint.deviceId(), devicePort.number());
+        }
+        return connectPoint;
+    }
 }
diff --git a/providers/hostprobing/src/main/java/org/onosproject/provider/hostprobing/impl/DefaultHostProbingProvider.java b/providers/hostprobing/src/main/java/org/onosproject/provider/hostprobing/impl/DefaultHostProbingProvider.java
index 522ed20..079489e 100644
--- a/providers/hostprobing/src/main/java/org/onosproject/provider/hostprobing/impl/DefaultHostProbingProvider.java
+++ b/providers/hostprobing/src/main/java/org/onosproject/provider/hostprobing/impl/DefaultHostProbingProvider.java
@@ -29,6 +29,8 @@
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Host;
 import org.onosproject.net.HostLocation;
+import org.onosproject.net.Port;
+import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.host.HostProbe;
@@ -84,6 +86,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private MastershipService mastershipService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    private DeviceService deviceService;
+
     private HostProviderService providerService;
     private HostProbingProviderService hostProbingProviderService;
     private ExecutorService packetHandler;
@@ -170,16 +175,23 @@
                 case PROBE_FAIL:
                     // Remove this location if this is a verify probe.
                     if (hostProbe.mode() == ProbeMode.VERIFY) {
+                        ConnectPoint oldConnectPoint = hostProbe.connectPoint();
+                        if (!oldConnectPoint.port().hasName()) {
+                            oldConnectPoint = translateSwitchPort(oldConnectPoint);
+                        }
                         providerService.removeLocationFromHost(hostProbe.id(),
-                                new HostLocation(hostProbe.connectPoint(), 0L));
+                                new HostLocation(oldConnectPoint, 0L));
                     }
                     break;
                 case PROBE_COMPLETED:
                     // Add this location if this is a discover probe.
                     if (hostProbe.mode() == ProbeMode.DISCOVER) {
-                        HostLocation newLocation = new HostLocation(hostProbe.connectPoint(),
-                                System.currentTimeMillis());
-                        providerService.addLocationToHost(hostProbe.id(), newLocation);
+                        ConnectPoint newConnectPoint = hostProbe.connectPoint();
+                        if (!newConnectPoint.port().hasName()) {
+                            newConnectPoint = translateSwitchPort(newConnectPoint);
+                        }
+                        providerService.addLocationToHost(hostProbe.id(),
+                                new HostLocation(newConnectPoint, System.currentTimeMillis()));
                     }
                     break;
                 default:
@@ -247,4 +259,14 @@
                 treatment, ByteBuffer.wrap(probe.serialize()));
         packetService.emit(outboundPacket);
     }
+
+    /* Connect point generated from netcfg may not have port name
+       we use the device service as translation service */
+    private ConnectPoint translateSwitchPort(ConnectPoint connectPoint) {
+        Port devicePort = deviceService.getPort(connectPoint);
+        if (devicePort != null) {
+            return new ConnectPoint(connectPoint.deviceId(), devicePort.number());
+        }
+        return connectPoint;
+    }
 }