[ONOS-7627] Support the creation of sr-iov port type for LiquidIO smart NIC

Change-Id: I6d55d1dfd26ec6ed0b9df9fdeea31749b0c49b7c
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
index 14ee117..538a5fd 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
@@ -64,6 +64,7 @@
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
+import static org.onosproject.openstacknetworking.api.Constants.PORT_NAME_PREFIX_MAP;
 import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_CREATE_TIME;
 import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_NETWORK_ID;
 import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_PORT_ID;
@@ -75,6 +76,7 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final String PORT_NAME_PREFIX_VM = "tap";
+    private static final String PORT_NAME_PREFIX_CAVIUM = "enp";
     private static final String ERR_ADD_HOST = "Failed to add host: ";
     private static final String ANNOTATION_SEGMENT_ID = "segId";
     private static final String SONA_HOST_SCHEME = "sona";
@@ -229,11 +231,16 @@
             String portName = port.annotations().value(PORT_NAME);
 
             return !Strings.isNullOrEmpty(portName) &&
-                    portName.startsWith(PORT_NAME_PREFIX_VM);
+                    (portName.startsWith(PORT_NAME_PREFIX_VM) || isDirectPort(portName));
+        }
+
+        private boolean isDirectPort(String portName) {
+            return PORT_NAME_PREFIX_MAP.values().stream().filter(p -> portName.startsWith(p)).findAny().isPresent();
         }
 
         @Override
         public void event(DeviceEvent event) {
+            log.info("Device event occurred with type {}", event.type());
             switch (event.type()) {
                 case PORT_UPDATED:
                     if (!event.port().isEnabled()) {
@@ -335,6 +342,19 @@
                         processPortAdded(port);
                     });
 
+            PORT_NAME_PREFIX_MAP.values().forEach(portNamePrefix -> {
+                deviceService.getPorts(osNode.intgBridge()).stream()
+                        .filter(port -> port.annotations().value(PORT_NAME)
+                                .startsWith(portNamePrefix) &&
+                                port.isEnabled())
+                        .forEach(port -> {
+                            log.debug("Instance port {} is detected from {}",
+                                    port.annotations().value(portNamePrefix),
+                                    osNode.hostname());
+                            processPortAdded(port);
+                        });
+            });
+
             Tools.stream(hostService.getHosts())
                     .filter(host -> deviceService.getPort(
                             host.location().deviceId(),