ONOS-2708
Add implementation of getting ovsdb ports or bridges in the ovsdb node.

Change-Id: If31af08ccb90a29bc800a79f332dae2bc497b105
diff --git a/drivers/src/main/java/org/onosproject/driver/ovsdb/OvsdbBridgeConfig.java b/drivers/src/main/java/org/onosproject/driver/ovsdb/OvsdbBridgeConfig.java
index 54f95a6..30c7526 100644
--- a/drivers/src/main/java/org/onosproject/driver/ovsdb/OvsdbBridgeConfig.java
+++ b/drivers/src/main/java/org/onosproject/driver/ovsdb/OvsdbBridgeConfig.java
@@ -1,136 +1,152 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.driver.ovsdb;
-
-import java.util.Collection;
-import java.util.Set;
-
-import org.onlab.packet.IpAddress;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.behaviour.BridgeConfig;
-import org.onosproject.net.behaviour.BridgeDescription;
-import org.onosproject.net.behaviour.BridgeName;
-import org.onosproject.net.behaviour.DefaultBridgeDescription;
-import org.onosproject.net.device.DefaultPortDescription;
-import org.onosproject.net.device.PortDescription;
-import org.onosproject.net.driver.AbstractHandlerBehaviour;
-import org.onosproject.net.driver.DriverHandler;
-import org.onosproject.ovsdb.controller.OvsdbBridge;
-import org.onosproject.ovsdb.controller.OvsdbClientService;
-import org.onosproject.ovsdb.controller.OvsdbController;
-import org.onosproject.ovsdb.controller.OvsdbNodeId;
-import org.onosproject.ovsdb.controller.OvsdbPort;
-
-import com.google.common.collect.Sets;
-
-/**
- * The implementation of BridageConfig.
- */
-public class OvsdbBridgeConfig extends AbstractHandlerBehaviour
-        implements BridgeConfig {
-
-    @Override
-    public void addBridge(BridgeName bridgeName) {
-        DriverHandler handler = handler();
-        OvsdbClientService ovsdbNode = getOvsdbNode(handler);
-        ovsdbNode.createBridge(bridgeName.name());
-    }
-
-    @Override
-    public void deleteBridge(BridgeName bridgeName) {
-        DriverHandler handler = handler();
-        OvsdbClientService ovsdbNode = getOvsdbNode(handler);
-        ovsdbNode.dropBridge(bridgeName.name());
-    }
-
-    @Override
-    public Collection<BridgeDescription> getBridges() {
-        DriverHandler handler = handler();
-        DeviceId deviceId = handler.data().deviceId();
-        OvsdbClientService ovsdbNode = getOvsdbNode(handler);
-        Set<OvsdbBridge> ovsdbSet = ovsdbNode.getBridges();
-        Collection<BridgeDescription> bridges = Sets.newHashSet();
-        ovsdbSet.forEach(o -> {
-            BridgeName bridgeName = BridgeName.bridgeName(o.bridgeName()
-                    .toString());
-            DeviceId ownDeviceId = DeviceId.deviceId(o.datapathId().toString());
-            BridgeDescription description = new DefaultBridgeDescription(
-                                                                         bridgeName,
-                                                                         deviceId,
-                                                                         ownDeviceId);
-            bridges.add(description);
-        });
-        return bridges;
-    }
-
-    @Override
-    public void addPort(PortDescription port) {
-        DriverHandler handler = handler();
-        OvsdbClientService ovsdbNode = getOvsdbNode(handler);
-        Set<OvsdbBridge> ovsdbSet = ovsdbNode.getBridges();
-        if (ovsdbSet != null && ovsdbSet.size() > 0) {
-            OvsdbBridge bridge = ovsdbSet.iterator().next();
-            ovsdbNode.createPort(bridge.bridgeName().toString(), port
-                    .portNumber().toString());
-        }
-    }
-
-    @Override
-    public void deletePort(PortDescription port) {
-        DriverHandler handler = handler();
-        OvsdbClientService ovsdbNode = getOvsdbNode(handler);
-        Set<OvsdbBridge> ovsdbSet = ovsdbNode.getBridges();
-        if (ovsdbSet != null && ovsdbSet.size() > 0) {
-            OvsdbBridge bridge = ovsdbSet.iterator().next();
-            ovsdbNode.dropPort(bridge.bridgeName().toString(), port
-                    .portNumber().toString());
-        }
-    }
-
-    @Override
-    public Collection<PortDescription> getPorts() {
-        DriverHandler handler = handler();
-        OvsdbClientService ovsdbNode = getOvsdbNode(handler);
-        Set<OvsdbPort> ovsdbSet = ovsdbNode.getPorts();
-        Collection<PortDescription> ports = Sets.newHashSet();
-        ovsdbSet.forEach(o -> {
-            PortNumber port = PortNumber.portNumber(o.portNumber().value());
-            PortDescription description = new DefaultPortDescription(port, true);
-            ports.add(description);
-        });
-        return ports;
-    }
-
-    // OvsdbNodeId(IP:port) is used in the adaptor while DeviceId(ovsdb:IP:port)
-    // is used in the core. So DeviceId need be changed to OvsdbNodeId.
-    private OvsdbNodeId changeDeviceIdToNodeId(DeviceId deviceId) {
-        int lastColon = deviceId.toString().lastIndexOf(":");
-        int fistColon = deviceId.toString().indexOf(":");
-        String ip = deviceId.toString().substring(fistColon + 1, lastColon);
-        String port = deviceId.toString().substring(lastColon + 1);
-        IpAddress ipAddress = IpAddress.valueOf(ip);
-        long portL = Long.valueOf(port).longValue();
-        return new OvsdbNodeId(ipAddress, portL);
-    }
-
-    private OvsdbClientService getOvsdbNode(DriverHandler handler) {
-        OvsdbController ovsController = handler.get(OvsdbController.class);
-        DeviceId deviceId = handler.data().deviceId();
-        OvsdbNodeId nodeId = changeDeviceIdToNodeId(deviceId);
-        return ovsController.getOvsdbClient(nodeId);
-    }
-}
+/*

+ * Copyright 2015 Open Networking Laboratory

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *     http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+package org.onosproject.driver.ovsdb;

+

+import java.util.Collection;

+import java.util.Collections;

+import java.util.HashSet;

+import java.util.Set;

+

+import org.onlab.packet.IpAddress;

+import org.onosproject.net.DeviceId;

+import org.onosproject.net.PortNumber;

+import org.onosproject.net.behaviour.BridgeConfig;

+import org.onosproject.net.behaviour.BridgeDescription;

+import org.onosproject.net.behaviour.BridgeName;

+import org.onosproject.net.behaviour.DefaultBridgeDescription;

+import org.onosproject.net.device.DefaultPortDescription;

+import org.onosproject.net.device.PortDescription;

+import org.onosproject.net.driver.AbstractHandlerBehaviour;

+import org.onosproject.net.driver.DriverHandler;

+import org.onosproject.ovsdb.controller.OvsdbBridge;

+import org.onosproject.ovsdb.controller.OvsdbClientService;

+import org.onosproject.ovsdb.controller.OvsdbController;

+import org.onosproject.ovsdb.controller.OvsdbNodeId;

+import org.onosproject.ovsdb.controller.OvsdbPort;

+

+import com.google.common.collect.Sets;

+

+/**

+ * The implementation of BridageConfig.

+ */

+public class OvsdbBridgeConfig extends AbstractHandlerBehaviour

+        implements BridgeConfig {

+

+    @Override

+    public void addBridge(BridgeName bridgeName) {

+        DriverHandler handler = handler();

+        OvsdbClientService clientService = getOvsdbClientService(handler);

+        clientService.createBridge(bridgeName.name());

+    }

+

+    @Override

+    public void deleteBridge(BridgeName bridgeName) {

+        DriverHandler handler = handler();

+        OvsdbClientService clientService = getOvsdbClientService(handler);

+        clientService.dropBridge(bridgeName.name());

+    }

+

+    @Override

+    public Collection<BridgeDescription> getBridges() {

+        DriverHandler handler = handler();

+        DeviceId deviceId = handler.data().deviceId();

+        OvsdbClientService clientService = getOvsdbClientService(handler);

+        Set<OvsdbBridge> ovsdbSet = clientService.getBridges();

+        Collection<BridgeDescription> bridges = Sets.newHashSet();

+        ovsdbSet.forEach(o -> {

+            BridgeName bridgeName = BridgeName

+                    .bridgeName(o.bridgeName().value());

+            DeviceId ownDeviceId = DeviceId.deviceId("of:" + o.datapathId().value());

+            BridgeDescription description = new DefaultBridgeDescription(bridgeName,

+                                                                         deviceId,

+                                                                         ownDeviceId);

+            bridges.add(description);

+        });

+        return bridges == null ? Collections.emptySet() : bridges;

+    }

+

+    @Override

+    public void addPort(PortDescription port) {

+        DriverHandler handler = handler();

+        OvsdbClientService clientService = getOvsdbClientService(handler);

+        Set<OvsdbBridge> ovsdbSet = clientService.getBridges();

+        if (ovsdbSet != null && ovsdbSet.size() > 0) {

+            OvsdbBridge bridge = ovsdbSet.iterator().next();

+            clientService.createPort(bridge.bridgeName().toString(), port

+                    .portNumber().toString());

+        }

+    }

+

+    @Override

+    public void deletePort(PortDescription port) {

+        DriverHandler handler = handler();

+        OvsdbClientService clientService = getOvsdbClientService(handler);

+        Set<OvsdbBridge> ovsdbSet = clientService.getBridges();

+        if (ovsdbSet != null && ovsdbSet.size() > 0) {

+            OvsdbBridge bridge = ovsdbSet.iterator().next();

+            clientService.dropPort(bridge.bridgeName().toString(), port

+                    .portNumber().toString());

+        }

+    }

+

+    @Override

+    public Collection<PortDescription> getPorts() {

+        DriverHandler handler = handler();

+        OvsdbClientService clientService = getOvsdbClientService(handler);

+        Set<OvsdbPort> ovsdbSet = clientService.getPorts();

+        Collection<PortDescription> ports = Sets.newHashSet();

+        ovsdbSet.forEach(o -> {

+            PortNumber port = PortNumber.portNumber(o.portNumber().value());

+            PortDescription description = new DefaultPortDescription(port, true);

+            ports.add(description);

+        });

+        return ports;

+    }

+

+    // OvsdbNodeId(IP:port) is used in the adaptor while DeviceId(ovsdb:IP:port)

+    // is used in the core. So DeviceId need be changed to OvsdbNodeId.

+    private OvsdbNodeId changeDeviceIdToNodeId(DeviceId deviceId) {

+        int lastColon = deviceId.toString().lastIndexOf(":");

+        int fistColon = deviceId.toString().indexOf(":");

+        String ip = deviceId.toString().substring(fistColon + 1, lastColon);

+        String port = deviceId.toString().substring(lastColon + 1);

+        IpAddress ipAddress = IpAddress.valueOf(ip);

+        long portL = Long.valueOf(port).longValue();

+        return new OvsdbNodeId(ipAddress, portL);

+    }

+

+    // Used for getting OvsdbClientService.

+    private OvsdbClientService getOvsdbClientService(DriverHandler handler) {

+        OvsdbController ovsController = handler.get(OvsdbController.class);

+        DeviceId deviceId = handler.data().deviceId();

+        OvsdbNodeId nodeId = changeDeviceIdToNodeId(deviceId);

+        return ovsController.getOvsdbClient(nodeId);

+    }

+

+    @Override

+    public Set<PortNumber> getPortNumbers() {

+        Set<PortNumber> ports = new HashSet<>();

+        DriverHandler handler = handler();

+        OvsdbClientService clientService = getOvsdbClientService(handler);

+        Set<OvsdbPort> ovsdbSet = clientService.getPorts();

+        ovsdbSet.forEach(o -> {

+            PortNumber port = PortNumber.portNumber(o.portNumber().value(),

+                                                    o.portName().value());

+            ports.add(port);

+        });

+        return ports;

+    }

+}

diff --git a/drivers/src/main/resources/onos-drivers.xml b/drivers/src/main/resources/onos-drivers.xml
index 0b4ab43..91741ce 100644
--- a/drivers/src/main/resources/onos-drivers.xml
+++ b/drivers/src/main/resources/onos-drivers.xml
@@ -1,119 +1,119 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015 Open Networking Laboratory
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<drivers>
-    <driver name="default"
-            manufacturer="ON.Lab" hwVersion="0.0.1" swVersion="0.0.1">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.DefaultSingleTablePipeline"/>
-        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"
-                   impl="org.onosproject.driver.handshaker.DefaultSwitchHandshaker"/>
-    </driver>
-    <driver name="ovs" extends="default"
-            manufacturer="Nicira, Inc\." hwVersion="Open vSwitch" swVersion="2\..*">
-        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"
-                   impl="org.onosproject.driver.handshaker.NiciraSwitchHandshaker"/>
-        <behaviour api="org.onosproject.net.behaviour.TunnelConfig"
-                   impl="org.onosproject.driver.ovsdb.OvsdbTunnelConfig"/>
-        <behaviour api="org.onosproject.net.behaviour.BridgeConfig"
-                   impl="org.onosproject.driver.ovsdb.OvsdbBridgeConfig"/>
-    </driver>
-    <driver name="ovs-corsa" extends="ovs"
-            manufacturer="Corsa" hwVersion="emulation" swVersion="0.0.0">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.OVSCorsaPipeline"/>
-    </driver>
-    <driver name="spring-open-cpqd" extends="default"
-            manufacturer="Stanford University, Ericsson Research and CPqD Research" 
-            hwVersion="OpenFlow 1.3 Reference Userspace Switch" swVersion=".*">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.SpringOpenTTP"/>
-    </driver>
-    <driver name="spring-open" extends="default"
-            manufacturer="Dell " hwVersion="OpenFlow switch HW ver. 1.0" 
-            swVersion="OpenFlow switch SW ver. 1.0 and 1.3">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.SpringOpenTTPDell"/>
-    </driver>
-    <driver name="linc-oe" extends="default"
-            manufacturer="FlowForwarding.org" hwVersion="Unknown" 
-            swVersion="LINC-OE OpenFlow Software Switch 1.1">
-        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"
-                   impl="org.onosproject.driver.handshaker.OFOpticalSwitchImplLINC13"/>
-    </driver>
-    <driver name="corsa"
-            manufacturer="Corsa" hwVersion="Corsa Element" swVersion="2.3.1">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.CorsaPipeline"/>
-        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"
-                   impl="org.onosproject.driver.handshaker.CorsaSwitchHandshaker"/>
-    </driver>
-    <driver name="ofdpa" extends="default"
-            manufacturer="Broadcom Corp." hwVersion="OF-DPA.*" swVersion="OF-DPA.*">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.OFDPA1Pipeline"/>
-    </driver>
-    <driver name="pmc-olt" extends="default"
-            manufacturer="Big Switch Networks" hwVersion="ivs 0.5" swVersion="ivs 0.5">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.OLTPipeline"/>
-    </driver>
-    <driver name="g.fast" extends="default"
-            manufacturer="TEST1" hwVersion="TEST2" swVersion="TEST3">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.OLTPipeline"/>
-    </driver>
-    <!--  The SoftRouter driver is meant to be used by any software/NPU based
-       ~  switch that wishes to implement a simple 2-table router. To use this
-       ~  driver, configure ONOS with the dpid of the device, or extend the
-       ~  driver declaration with the manufacturer/hwVersion/swVersion of the
-       ~  device (see 'noviflow' example).
-      -->
-    <driver name="softrouter" extends="default"
-            manufacturer="Various" hwVersion="various" swVersion="0.0.0">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.SoftRouterPipeline"/>
-    </driver>
-    <driver name="centec-V350" extends="default"
-            manufacturer=".*Centec.*" hwVersion=".*" swVersion="3.1.*">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.CentecV350Pipeline"/>
-    </driver>
-    <driver name="pica" extends="default"
-            manufacturer="Pica8, Inc." hwVersion=".*" swVersion="PicOS 2.6">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.PicaPipeline"/>
-    </driver>
-    <driver name="noviflow" extends="softrouter"
-            manufacturer="NoviFlow Inc" hwVersion="NS.*" swVersion="NW.*">
-    </driver>
-    <!--  Emulation of the ofdpa pipeline using a CPqD OF 1.3 software switch.
-       ~  To use this driver, configure ONOS with the dpid of the device.
-      -->
-    <driver name="ofdpa-cpqd" extends="default"
-            manufacturer="ONF"
-            hwVersion="OF1.3 Software Switch from CPqD" swVersion="for Group Chaining">
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.driver.pipeline.CpqdOFDPA1Pipeline"/>
-    </driver>
-    <driver name="calient" extends="default"
-            manufacturer="calient inc" hwVersion="calient hardware"
-            swVersion="ocs switch">
-        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"
-                   impl="org.onosproject.driver.handshaker.CalientFiberSwitchHandshaker"/>
-    </driver>
-</drivers>
-
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+  ~ Copyright 2015 Open Networking Laboratory

+  ~

+  ~ Licensed under the Apache License, Version 2.0 (the "License");

+  ~ you may not use this file except in compliance with the License.

+  ~ You may obtain a copy of the License at

+  ~

+  ~     http://www.apache.org/licenses/LICENSE-2.0

+  ~

+  ~ Unless required by applicable law or agreed to in writing, software

+  ~ distributed under the License is distributed on an "AS IS" BASIS,

+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+  ~ See the License for the specific language governing permissions and

+  ~ limitations under the License.

+  -->

+<drivers>

+    <driver name="default"

+            manufacturer="ON.Lab" hwVersion="0.0.1" swVersion="0.0.1">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.OpenVSwitchPipeline"/>

+        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"

+                   impl="org.onosproject.driver.handshaker.DefaultSwitchHandshaker"/>

+                   <behaviour api="org.onosproject.net.behaviour.TunnelConfig"

+                   impl="org.onosproject.driver.ovsdb.OvsdbTunnelConfig"/>

+                   <behaviour api="org.onosproject.net.behaviour.BridgeConfig"

+                   impl="org.onosproject.driver.ovsdb.OvsdbBridgeConfig"/>

+    </driver>

+    <driver name="ovs" extends="default"

+            manufacturer="Nicira, Inc\." hwVersion="Open vSwitch" swVersion="2\..*">

+        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"

+                   impl="org.onosproject.driver.handshaker.NiciraSwitchHandshaker"/>

+    </driver>

+    <driver name="ovs-corsa" extends="ovs"

+            manufacturer="Corsa" hwVersion="emulation" swVersion="0.0.0">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.OVSCorsaPipeline"/>

+    </driver>

+    <driver name="spring-open-cpqd" extends="default"

+            manufacturer="Stanford University, Ericsson Research and CPqD Research" 

+            hwVersion="OpenFlow 1.3 Reference Userspace Switch" swVersion=".*">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.SpringOpenTTP"/>

+    </driver>

+    <driver name="spring-open" extends="default"

+            manufacturer="Dell " hwVersion="OpenFlow switch HW ver. 1.0" 

+            swVersion="OpenFlow switch SW ver. 1.0 and 1.3">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.SpringOpenTTPDell"/>

+    </driver>

+    <driver name="linc-oe" extends="default"

+            manufacturer="FlowForwarding.org" hwVersion="Unknown" 

+            swVersion="LINC-OE OpenFlow Software Switch 1.1">

+        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"

+                   impl="org.onosproject.driver.handshaker.OFOpticalSwitchImplLINC13"/>

+    </driver>

+    <driver name="corsa"

+            manufacturer="Corsa" hwVersion="Corsa Element" swVersion="2.3.1">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.CorsaPipeline"/>

+        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"

+                   impl="org.onosproject.driver.handshaker.CorsaSwitchHandshaker"/>

+    </driver>

+    <driver name="ofdpa" extends="default"

+            manufacturer="Broadcom Corp." hwVersion="OF-DPA.*" swVersion="OF-DPA.*">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.OFDPA1Pipeline"/>

+    </driver>

+    <driver name="pmc-olt" extends="default"

+            manufacturer="Big Switch Networks" hwVersion="ivs 0.5" swVersion="ivs 0.5">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.OLTPipeline"/>

+    </driver>

+    <driver name="g.fast" extends="default"

+            manufacturer="TEST1" hwVersion="TEST2" swVersion="TEST3">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.OLTPipeline"/>

+    </driver>

+    <!--  The SoftRouter driver is meant to be used by any software/NPU based

+       ~  switch that wishes to implement a simple 2-table router. To use this

+       ~  driver, configure ONOS with the dpid of the device, or extend the

+       ~  driver declaration with the manufacturer/hwVersion/swVersion of the

+       ~  device (see 'noviflow' example).

+      -->

+    <driver name="softrouter" extends="default"

+            manufacturer="Various" hwVersion="various" swVersion="0.0.0">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.SoftRouterPipeline"/>

+    </driver>

+    <driver name="centec-V350" extends="default"

+            manufacturer=".*Centec.*" hwVersion=".*" swVersion="3.1.*">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.CentecV350Pipeline"/>

+    </driver>

+    <driver name="pica" extends="default"

+            manufacturer="Pica8, Inc." hwVersion=".*" swVersion="PicOS 2.6">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.PicaPipeline"/>

+    </driver>

+    <driver name="noviflow" extends="softrouter"

+            manufacturer="NoviFlow Inc" hwVersion="NS.*" swVersion="NW.*">

+    </driver>

+    <!--  Emulation of the ofdpa pipeline using a CPqD OF 1.3 software switch.

+       ~  To use this driver, configure ONOS with the dpid of the device.

+      -->

+    <driver name="ofdpa-cpqd" extends="default"

+            manufacturer="ONF"

+            hwVersion="OF1.3 Software Switch from CPqD" swVersion="for Group Chaining">

+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"

+                   impl="org.onosproject.driver.pipeline.CpqdOFDPA1Pipeline"/>

+    </driver>

+    <driver name="calient" extends="default"

+            manufacturer="calient inc" hwVersion="calient hardware"

+            swVersion="ocs switch">

+        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"

+                   impl="org.onosproject.driver.handshaker.CalientFiberSwitchHandshaker"/>

+    </driver>

+</drivers>

+