fix corsa pipeline divergence : need to differentiate between write and apply instructions.

Change-Id: I477d27d6e52a8e09744614e5f5aa843dd26331e0
diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
index f20d6cc..75f7f7f 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
@@ -189,6 +189,10 @@
             return add(Instructions.modVlanPcp(pcp));
         }
 
+        public Builder stripVlan() {
+            return add(Instructions.stripVlanId());
+        }
+
         @Override
         public Builder setIpSrc(IpAddress addr) {
             return add(Instructions.modL3Src(addr));
diff --git a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
index 9926751..1d2f7f4 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
@@ -106,6 +106,12 @@
         public Builder setVlanPcp(Byte pcp);
 
         /**
+         * Strips the vlan tag if there is one.
+         * @return a treatment builder
+         */
+        public Builder stripVlan();
+
+        /**
          * Sets the src l3 address.
          *
          * @param addr an ip
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
index 7c3c24e..afbae7d 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
@@ -130,6 +130,14 @@
     }
 
     /**
+     * Strips the VLAN tag if one is present.
+     * @return a L2 modification
+     */
+    public static L2ModificationInstruction stripVlanId() {
+        return new StripVlanInstruction();
+    }
+
+    /**
      * Creates a MPLS label modification.
      * @param mplsLabel to set.
      * @return a L2 Modification
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java
index 4702266..2a93b45 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java
@@ -53,6 +53,11 @@
         VLAN_PCP,
 
         /**
+         * Strips the vlan.
+         */
+        STRIP_VLAN,
+
+        /**
          * MPLS Label modification.
          */
         MPLS_LABEL,
@@ -273,6 +278,33 @@
         }
     }
 
+    public static final class StripVlanInstruction extends L2ModificationInstruction {
+
+        @Override
+        public L2SubType subtype() {
+            return L2SubType.STRIP_VLAN;
+        }
+
+        @Override
+        public String toString() {
+            return subtype().toString();
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(type(), subtype());
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+
+            return false;
+        }
+    }
+
     /**
      * Represents a VLAN POP modification instruction.
      */