Initial commit of new Ofdpa3Pipeline

This submission also addresses the following issues
* CORD-84 Restore is_present bit to 1 in set_vlan_vid
* CORD-338 Remove default route workaround

MPLS Termination fix is coming in another patch.

Change-Id: I20c8fdd5604bd6e9254a957012ac619c193ccbc6
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/CpqdOfdpa2Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/CpqdOfdpa2Pipeline.java
index b111e87..a86ab94 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/CpqdOfdpa2Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/CpqdOfdpa2Pipeline.java
@@ -447,10 +447,6 @@
         TrafficSelector.Builder filteredSelector = DefaultTrafficSelector.builder();
         TrafficSelector.Builder complementarySelector = DefaultTrafficSelector.builder();
 
-        /*
-         * NOTE: The switch does not support matching 0.0.0.0/0.
-         * Split it into 0.0.0.0/1 and 128.0.0.0/1
-         */
         if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) {
             IpPrefix ipv4Dst = ((IPCriterion) selector.getCriterion(Criterion.Type.IPV4_DST)).ip();
             if (ipv4Dst.isMulticast()) {
@@ -471,14 +467,11 @@
                 log.debug("processing IPv4 multicast specific forwarding objective {} -> next:{}"
                         + " in dev:{}", fwd.id(), fwd.nextId(), deviceId);
             } else {
-                if (ipv4Dst.prefixLength() > 0) {
-                    filteredSelector.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(ipv4Dst);
+                if (ipv4Dst.prefixLength() == 0) {
+                    // The entire IPV4_DST field is wildcarded intentionally
+                    filteredSelector.matchEthType(Ethernet.TYPE_IPV4);
                 } else {
-                    filteredSelector.matchEthType(Ethernet.TYPE_IPV4)
-                            .matchIPDst(IpPrefix.valueOf("0.0.0.0/1"));
-                    complementarySelector.matchEthType(Ethernet.TYPE_IPV4)
-                            .matchIPDst(IpPrefix.valueOf("128.0.0.0/1"));
-                    defaultRule = true;
+                    filteredSelector.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(ipv4Dst);
                 }
                 forTableId = UNICAST_ROUTING_TABLE;
                 log.debug("processing IPv4 unicast specific forwarding objective {} -> next:{}"
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/CpqdOfdpa3Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/CpqdOfdpa3Pipeline.java
new file mode 100644
index 0000000..dbc3e39
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/CpqdOfdpa3Pipeline.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2016-present 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.pipeline;
+
+import org.onosproject.core.CoreService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.PipelinerContext;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.FlowRuleService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+import org.onosproject.net.group.GroupService;
+
+import java.util.Collection;
+
+/**
+ * Driver for software switch emulation of the OFDPA 3.0 pipeline.
+ * The software switch is the CPqD OF 1.3 switch. Unfortunately the CPqD switch
+ * does not handle vlan tags and mpls labels simultaneously, which requires us
+ * to do some workarounds in the driver. This driver is meant for the use of
+ * the cpqd switch when MPLS is required. As a result this driver works only
+ * on incoming untagged packets.
+ */
+public class CpqdOfdpa3Pipeline extends CpqdOfdpa2Pipeline {
+    @Override
+    public void init(DeviceId deviceId, PipelinerContext context) {
+        this.deviceId = deviceId;
+
+        // Initialize OFDPA group handler
+        groupHandler = new Ofdpa3GroupHandler();
+        groupHandler.init(deviceId, context);
+
+        serviceDirectory = context.directory();
+        coreService = serviceDirectory.get(CoreService.class);
+        flowRuleService = serviceDirectory.get(FlowRuleService.class);
+        groupService = serviceDirectory.get(GroupService.class);
+        flowObjectiveStore = context.store();
+        deviceService = serviceDirectory.get(DeviceService.class);
+
+        driverId = coreService.registerApplication(
+                "org.onosproject.driver.CpqdOfdpa3Pipeline");
+
+        initializePipeline();
+    }
+
+    @Override
+    protected Collection<FlowRule> processEthTypeSpecific(ForwardingObjective fwd) {
+        return processEthTypeSpecificInternal(fwd, true);
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa2GroupHandler.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa2GroupHandler.java
index 03f2996..0098d01 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa2GroupHandler.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa2GroupHandler.java
@@ -299,8 +299,33 @@
      *         error in processing the chain
      */
     protected GroupInfo createL2L3Chain(TrafficTreatment treatment, int nextId,
+                                        ApplicationId appId, boolean mpls,
+                                        TrafficSelector meta) {
+        return createL2L3ChainInternal(treatment, nextId, appId, mpls, meta, true);
+    }
+
+    /**
+     * Internal implementation of createL2L3Chain.
+     * <p>
+     * The is_present bit in set_vlan_vid action is required to be 0 in OFDPA i12.
+     * Since it is non-OF spec, we need an extension treatment for that.
+     * The useSetVlanExtension must be set to false for OFDPA i12.
+     * </p>
+     *
+     * @param treatment that needs to be broken up to create the group chain
+     * @param nextId of the next objective that needs this group chain
+     * @param appId of the application that sent this next objective
+     * @param mpls determines if L3Unicast or MPLSInterface group is created
+     * @param meta metadata passed in by the application as part of the nextObjective
+     * @param useSetVlanExtension use the setVlanVid extension that has is_present bit set to 0.
+     * @return GroupInfo containing the GroupDescription of the
+     *         L2Interface group(inner) and the GroupDescription of the (outer)
+     *         L3Unicast/MPLSInterface group. May return null if there is an
+     *         error in processing the chain
+     */
+    protected GroupInfo createL2L3ChainInternal(TrafficTreatment treatment, int nextId,
                                       ApplicationId appId, boolean mpls,
-                                      TrafficSelector meta) {
+                                      TrafficSelector meta, boolean useSetVlanExtension) {
         // for the l2interface group, get vlan and port info
         // for the outer group, get the src/dst mac, and vlan info
         TrafficTreatment.Builder outerTtb = DefaultTrafficTreatment.builder();
@@ -324,8 +349,12 @@
                         break;
                     case VLAN_ID:
                         vlanid = ((L2ModificationInstruction.ModVlanIdInstruction) l2ins).vlanId();
-                        OfdpaSetVlanVid ofdpaSetVlanVid = new OfdpaSetVlanVid(vlanid);
-                        outerTtb.extension(ofdpaSetVlanVid, deviceId);
+                        if (useSetVlanExtension) {
+                            OfdpaSetVlanVid ofdpaSetVlanVid = new OfdpaSetVlanVid(vlanid);
+                            outerTtb.extension(ofdpaSetVlanVid, deviceId);
+                        } else {
+                            outerTtb.setVlanId(vlanid);
+                        }
                         setVlan = true;
                         break;
                     case VLAN_POP:
@@ -358,8 +387,12 @@
             }
             // if vlan is not set, use the vlan in metadata for outerTtb
             if (vlanid != null && !setVlan) {
-                OfdpaSetVlanVid ofdpaSetVlanVid = new OfdpaSetVlanVid(vlanid);
-                outerTtb.extension(ofdpaSetVlanVid, deviceId);
+                if (useSetVlanExtension) {
+                    OfdpaSetVlanVid ofdpaSetVlanVid = new OfdpaSetVlanVid(vlanid);
+                    outerTtb.extension(ofdpaSetVlanVid, deviceId);
+                } else {
+                    outerTtb.setVlanId(vlanid);
+                }
             }
         }
 
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa2Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa2Pipeline.java
index fc801c5..b9d8d89 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa2Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa2Pipeline.java
@@ -441,16 +441,40 @@
      * Vlan assignment is done by the application.
      * Allows tagged packets into pipeline as per configured port-vlan info.
      *
-     * @param portCriterion   port on device for which this filter is programmed
-     * @param vidCriterion   vlan assigned to port, or NONE for untagged
-     * @param assignedVlan   assigned vlan-id for untagged packets
-     * @param applicationId  for application programming this filter
+     * @param portCriterion       port on device for which this filter is programmed
+     * @param vidCriterion        vlan assigned to port, or NONE for untagged
+     * @param assignedVlan        assigned vlan-id for untagged packets
+     * @param applicationId       for application programming this filter
      * @return list of FlowRule for port-vlan filters
      */
     protected List<FlowRule> processVlanIdFilter(PortCriterion portCriterion,
                                                  VlanIdCriterion vidCriterion,
                                                  VlanId assignedVlan,
                                                  ApplicationId applicationId) {
+        return processVlanIdFilterInternal(portCriterion, vidCriterion, assignedVlan,
+                applicationId, true);
+    }
+
+    /**
+     * Internal implementation of processVlanIdFilter.
+     * <p>
+     * The is_present bit in set_vlan_vid action is required to be 0 in OFDPA i12.
+     * Since it is non-OF spec, we need an extension treatment for that.
+     * The useSetVlanExtension must be set to false for OFDPA i12.
+     * </p>
+     *
+     * @param portCriterion       port on device for which this filter is programmed
+     * @param vidCriterion        vlan assigned to port, or NONE for untagged
+     * @param assignedVlan        assigned vlan-id for untagged packets
+     * @param applicationId       for application programming this filter
+     * @param useSetVlanExtension use the setVlanVid extension that has is_present bit set to 0.
+     * @return list of FlowRule for port-vlan filters
+     */
+    protected List<FlowRule> processVlanIdFilterInternal(PortCriterion portCriterion,
+                                                         VlanIdCriterion vidCriterion,
+                                                         VlanId assignedVlan,
+                                                         ApplicationId applicationId,
+                                                         boolean useSetVlanExtension) {
         List<FlowRule> rules = new ArrayList<>();
         TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
         TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
@@ -463,8 +487,12 @@
             // untagged packets are assigned vlans
             OfdpaMatchVlanVid ofdpaMatchVlanVid = new OfdpaMatchVlanVid(VlanId.NONE);
             selector.extension(ofdpaMatchVlanVid, deviceId);
-            OfdpaSetVlanVid ofdpaSetVlanVid = new OfdpaSetVlanVid(assignedVlan);
-            treatment.extension(ofdpaSetVlanVid, deviceId);
+            if (useSetVlanExtension) {
+                OfdpaSetVlanVid ofdpaSetVlanVid = new OfdpaSetVlanVid(assignedVlan);
+                treatment.extension(ofdpaSetVlanVid, deviceId);
+            } else {
+                treatment.setVlanId(assignedVlan);
+            }
 
             preSelector = DefaultTrafficSelector.builder();
             OfdpaMatchVlanVid preOfdpaMatchVlanVid = new OfdpaMatchVlanVid(assignedVlan);
@@ -796,6 +824,23 @@
      * @return A collection of flow rules, or an empty set
      */
     protected Collection<FlowRule> processEthTypeSpecific(ForwardingObjective fwd) {
+        return processEthTypeSpecificInternal(fwd, false);
+    }
+
+    /**
+     * Internal implementation of processEthTypeSpecific.
+     * <p>
+     * Wildcarded IPv4_DST is not supported in OFDPA i12. Therefore, we break
+     * the rule into 0.0.0.0/1 and 128.0.0.0/1.
+     * The allowDefaultRoute must be set to false for OFDPA i12.
+     * </p>
+     *
+     * @param fwd the forwarding objective
+     * @param allowDefaultRoute allow wildcarded IPv4_DST or not
+     * @return A collection of flow rules, or an empty set
+     */
+    protected Collection<FlowRule> processEthTypeSpecificInternal(ForwardingObjective fwd,
+                                                                  boolean allowDefaultRoute) {
         TrafficSelector selector = fwd.selector();
         EthTypeCriterion ethType =
                 (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
@@ -806,10 +851,6 @@
         TrafficTreatment.Builder tb = DefaultTrafficTreatment.builder();
         TrafficSelector.Builder complementarySelector = DefaultTrafficSelector.builder();
 
-        /*
-         * NOTE: The switch does not support matching 0.0.0.0/0.
-         * Split it into 0.0.0.0/1 and 128.0.0.0/1
-         */
         if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) {
             IpPrefix ipv4Dst = ((IPCriterion) selector.getCriterion(Criterion.Type.IPV4_DST)).ip();
             if (ipv4Dst.isMulticast()) {
@@ -831,14 +872,23 @@
                 log.debug("processing IPv4 multicast specific forwarding objective {} -> next:{}"
                         + " in dev:{}", fwd.id(), fwd.nextId(), deviceId);
             } else {
-                if (ipv4Dst.prefixLength() > 0) {
-                    filteredSelector.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(ipv4Dst);
+                if (ipv4Dst.prefixLength() == 0) {
+                    if (allowDefaultRoute) {
+                        // The entire IPV4_DST field is wildcarded intentionally
+                        filteredSelector.matchEthType(Ethernet.TYPE_IPV4);
+                    } else {
+                        /*
+                         * NOTE: The switch does not support matching 0.0.0.0/0
+                         * Split it into 0.0.0.0/1 and 128.0.0.0/1
+                         */
+                        filteredSelector.matchEthType(Ethernet.TYPE_IPV4)
+                                .matchIPDst(IpPrefix.valueOf("0.0.0.0/1"));
+                        complementarySelector.matchEthType(Ethernet.TYPE_IPV4)
+                                .matchIPDst(IpPrefix.valueOf("128.0.0.0/1"));
+                        defaultRule = true;
+                    }
                 } else {
-                    filteredSelector.matchEthType(Ethernet.TYPE_IPV4)
-                            .matchIPDst(IpPrefix.valueOf("0.0.0.0/1"));
-                    complementarySelector.matchEthType(Ethernet.TYPE_IPV4)
-                            .matchIPDst(IpPrefix.valueOf("128.0.0.0/1"));
-                    defaultRule = true;
+                    filteredSelector.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(ipv4Dst);
                 }
                 forTableId = UNICAST_ROUTING_TABLE;
                 log.debug("processing IPv4 unicast specific forwarding objective {} -> next:{}"
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa3GroupHandler.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa3GroupHandler.java
new file mode 100644
index 0000000..5ba0446
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa3GroupHandler.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2016-present 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.pipeline;
+
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+
+/**
+ * Group handler for OFDPA2 pipeline.
+ */
+public class Ofdpa3GroupHandler extends Ofdpa2GroupHandler {
+    @Override
+    protected GroupInfo createL2L3Chain(TrafficTreatment treatment, int nextId,
+                                        ApplicationId appId, boolean mpls,
+                                        TrafficSelector meta) {
+        return createL2L3ChainInternal(treatment, nextId, appId, mpls, meta, false);
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa3Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa3Pipeline.java
new file mode 100644
index 0000000..68c42e0
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/Ofdpa3Pipeline.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2016-present 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.pipeline;
+
+import org.onlab.packet.VlanId;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.PipelinerContext;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.FlowRuleService;
+import org.onosproject.net.flow.criteria.PortCriterion;
+import org.onosproject.net.flow.criteria.VlanIdCriterion;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+import org.onosproject.net.group.GroupService;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Pipeliner for Broadcom OF-DPA 3.0 TTP.
+ */
+public class Ofdpa3Pipeline extends Ofdpa2Pipeline {
+    @Override
+    public void init(DeviceId deviceId, PipelinerContext context) {
+        this.deviceId = deviceId;
+
+        // Initialize OFDPA group handler
+        groupHandler = new Ofdpa3GroupHandler();
+        groupHandler.init(deviceId, context);
+
+        serviceDirectory = context.directory();
+        coreService = serviceDirectory.get(CoreService.class);
+        flowRuleService = serviceDirectory.get(FlowRuleService.class);
+        groupService = serviceDirectory.get(GroupService.class);
+        flowObjectiveStore = context.store();
+        deviceService = serviceDirectory.get(DeviceService.class);
+
+        driverId = coreService.registerApplication(
+                "org.onosproject.driver.Ofdpa3Pipeline");
+
+        initializePipeline();
+    }
+
+    @Override
+    protected List<FlowRule> processVlanIdFilter(PortCriterion portCriterion,
+                                                 VlanIdCriterion vidCriterion,
+                                                 VlanId assignedVlan,
+                                                 ApplicationId applicationId) {
+        return processVlanIdFilterInternal(portCriterion, vidCriterion, assignedVlan,
+                applicationId, false);
+    }
+
+    @Override
+    protected Collection<FlowRule> processEthTypeSpecific(ForwardingObjective fwd) {
+        return processEthTypeSpecificInternal(fwd, true);
+    }
+}
diff --git a/drivers/default/src/main/resources/onos-drivers.xml b/drivers/default/src/main/resources/onos-drivers.xml
index 3ad2e2b..6a69dda 100644
--- a/drivers/default/src/main/resources/onos-drivers.xml
+++ b/drivers/default/src/main/resources/onos-drivers.xml
@@ -83,6 +83,46 @@
         <behaviour api="org.onosproject.net.behaviour.ExtensionSelectorResolver"
                    impl="org.onosproject.driver.extensions.OfdpaExtensionSelectorInterpreter" />
     </driver>
+    <driver name="ofdpa3" extends="default"
+            manufacturer="Broadcom Corp." hwVersion="OF-DPA 3.0" swVersion="OF-DPA 3.0">
+        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
+                   impl="org.onosproject.driver.pipeline.Ofdpa3Pipeline"/>
+        <behaviour api="org.onosproject.openflow.controller.ExtensionSelectorInterpreter"
+                   impl="org.onosproject.driver.extensions.OfdpaExtensionSelectorInterpreter" />
+        <behaviour api="org.onosproject.net.behaviour.ExtensionSelectorResolver"
+                   impl="org.onosproject.driver.extensions.OfdpaExtensionSelectorInterpreter" />
+    </driver>
+    <!--  Emulation of the ofdpa pipeline using a CPqD OF 1.3 software switch.
+       ~  Use this driver when MPLS functionality is required.
+       ~  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.CpqdOfdpa2Pipeline"/>
+    </driver>
+    <!--  Emulation of the ofdpa pipeline using a CPqD OF 1.3 software switch.
+       ~  Use this driver when VLAN functionality is required.
+       ~  To use this driver, configure ONOS with the dpid of the device.
+      -->
+    <driver name="ofdpa-cpqd-vlan" 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.CpqdOfdpa2VlanPipeline"/>
+    </driver>
+    <!--  Emulation of the ofdpa pipeline using a CPqD OF 1.3 software switch.
+       ~  Use this driver when MPLS functionality is required.
+       ~  To use this driver, configure ONOS with the dpid of the device.
+      -->
+    <driver name="ofdpa3-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.CpqdOfdpa3Pipeline"/>
+    </driver>
+
     <driver name="celestica" extends="default"
             manufacturer="PMC GPON Networks" hwVersion="PAS5211 v2" swVersion="vOLT version 1.5.3.*">
         <behaviour api="org.onosproject.net.behaviour.Pipeliner"
@@ -132,26 +172,6 @@
     <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.
-       ~  Use this driver when MPLS functionality is required.
-       ~  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.CpqdOfdpa2Pipeline"/>
-    </driver>
-    <!--  Emulation of the ofdpa pipeline using a CPqD OF 1.3 software switch.
-       ~  Use this driver when VLAN functionality is required.
-       ~  To use this driver, configure ONOS with the dpid of the device.
-      -->
-    <driver name="ofdpa-cpqd-vlan" 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.CpqdOfdpa2VlanPipeline"/>
-    </driver>
     <driver name="onosfw" extends="ovs"
             manufacturer="" hwVersion="" swVersion="">
         <behaviour api="org.onosproject.net.behaviour.Pipeliner"