Driver bugfix

For OF-DPA
- Set VLAN in L3 unicast and MPLS group (required by spec)
- L3 unicast and MPLS tables do not support immediate action.
  Defer all of them.

For CpqD OF-DPA
- L3 unicast and MPLS tables do not support immediate action.
  Defer all of them.

Change-Id: I4140051d64bc5d01258b7fee2aa1faa7c8963370
diff --git a/drivers/src/main/java/org/onosproject/driver/pipeline/CpqdOFDPA2Pipeline.java b/drivers/src/main/java/org/onosproject/driver/pipeline/CpqdOFDPA2Pipeline.java
index 02522cf..82aa55e 100644
--- a/drivers/src/main/java/org/onosproject/driver/pipeline/CpqdOFDPA2Pipeline.java
+++ b/drivers/src/main/java/org/onosproject/driver/pipeline/CpqdOFDPA2Pipeline.java
@@ -258,7 +258,11 @@
         TrafficTreatment.Builder tb = DefaultTrafficTreatment.builder();
         if (fwd.treatment() != null) {
             for (Instruction i : fwd.treatment().allInstructions()) {
-                tb.add(i);
+                /*
+                 * NOTE: OF-DPA does not support immediate instruction in
+                 * L3 unicast and MPLS table.
+                 */
+                tb.deferred().add(i);
             }
         }
 
diff --git a/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java b/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
index 5f84b43..c2b07cd 100644
--- a/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
+++ b/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
@@ -766,7 +766,11 @@
         boolean popMpls = false;
         if (fwd.treatment() != null) {
             for (Instruction i : fwd.treatment().allInstructions()) {
-                tb.add(i);
+                /*
+                 * NOTE: OF-DPA does not support immediate instruction in
+                 * L3 unicast and MPLS table.
+                 */
+                tb.deferred().add(i);
                 if (i instanceof L2ModificationInstruction &&
                     ((L2ModificationInstruction) i).subtype() == L2SubType.MPLS_POP) {
                         popMpls = true;
@@ -1155,17 +1159,16 @@
             }
         }
 
-        if (vlanid == null) {
-            //use the vlanid associated with the port
-            vlanid = port2Vlan.get(PortNumber.portNumber(portNum));
-        }
-
         if (vlanid == null && meta != null) {
             // use metadata if available
             Criterion vidCriterion = meta.getCriterion(Type.VLAN_VID);
             if (vidCriterion != null) {
                 vlanid = ((VlanIdCriterion) vidCriterion).vlanId();
             }
+            // if vlan is not set, use the vlan in metadata for outerTtb
+            if (vlanid != null && !setVlan) {
+                outerTtb.setVlanId(vlanid);
+            }
         }
 
         if (vlanid == null) {