Interfaces for passing port information from OF switch drivers to DeviceProviders.

Change-Id: I14039f5999c930a211c30138caf81c0513d398e2
Reference: ONOS-1911
diff --git a/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowOpticalSwitch.java b/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowOpticalSwitch.java
new file mode 100644
index 0000000..271e183
--- /dev/null
+++ b/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowOpticalSwitch.java
@@ -0,0 +1,8 @@
+package org.onosproject.openflow.controller;
+
+/**
+ * A marker interface for optical switches, which require the ability to pass
+ * port information to a Device provider.
+ */
+public interface OpenFlowOpticalSwitch extends OpenFlowSwitch, WithTypedPorts {
+}
diff --git a/openflow/api/src/main/java/org/onosproject/openflow/controller/PortDescPropertyType.java b/openflow/api/src/main/java/org/onosproject/openflow/controller/PortDescPropertyType.java
new file mode 100644
index 0000000..b5d4743
--- /dev/null
+++ b/openflow/api/src/main/java/org/onosproject/openflow/controller/PortDescPropertyType.java
@@ -0,0 +1,24 @@
+package org.onosproject.openflow.controller;
+
+/**
+ * Port description property types (OFPPDPT enums) in OF 1.3 <.
+ */
+public enum PortDescPropertyType {
+    ETHERNET(0),            /* Ethernet port */
+    OPTICAL(1),             /* Optical port */
+    OPTICAL_TRANSPORT(2),   /* OF1.3 Optical transport extension */
+    PIPELINE_INPUT(2),      /* Ingress pipeline */
+    PIPELINE_OUTPUT(3),     /* Egress pipeline */
+    RECIRCULATE(4),         /* Recirculation */
+    EXPERIMENTER(0xffff);   /* Experimenter-implemented */
+
+    private final int value;
+
+    PortDescPropertyType(int v) {
+        value = v;
+    }
+
+    public int valueOf() {
+        return value;
+    }
+}
diff --git a/openflow/api/src/main/java/org/onosproject/openflow/controller/WithTypedPorts.java b/openflow/api/src/main/java/org/onosproject/openflow/controller/WithTypedPorts.java
new file mode 100644
index 0000000..b78124b
--- /dev/null
+++ b/openflow/api/src/main/java/org/onosproject/openflow/controller/WithTypedPorts.java
@@ -0,0 +1,30 @@
+package org.onosproject.openflow.controller;
+
+import java.util.List;
+import java.util.Set;
+
+import org.projectfloodlight.openflow.protocol.OFObject;
+
+/**
+ * An interface implemented by OpenFlow devices that enables providers to
+ * retrieve ports based on port property.
+ */
+public interface WithTypedPorts {
+
+    /**
+     * Return a list of interfaces (ports) of the type associated with this
+     * OpenFlow switch.
+     *
+     * @param type The port description property type of requested ports
+     * @return A potentially empty list of ports.
+     */
+    List<? extends OFObject> getPortsOf(PortDescPropertyType type);
+
+    /**
+     * Returns the port property types supported by the driver implementing this
+     * interface.
+     *
+     * @return A set of port property types
+     */
+    Set<PortDescPropertyType> getPortTypes();
+}