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

Change-Id: I477d27d6e52a8e09744614e5f5aa843dd26331e0
diff --git a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
index aed558b..c1b4a18 100644
--- a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
+++ b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
@@ -415,28 +415,6 @@
             FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
             FlowRule rule;
 
-            selector.matchEthType(Ethernet.TYPE_IPV4);
-            treatment.transition(FlowRule.Type.VLAN);
-
-            rule = new DefaultFlowRule(deviceId, selector.build(), treatment.build(), CONTROLLER_PRIORITY,
-                                       appId, 0, true, FlowRule.Type.VLAN_MPLS);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            selector = DefaultTrafficSelector.builder();
-            treatment = DefaultTrafficTreatment.builder();
-
-            selector.matchEthType(Ethernet.TYPE_ARP);
-            treatment.transition(FlowRule.Type.VLAN);
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), CONTROLLER_PRIORITY,
-                                       appId, 0, true, FlowRule.Type.VLAN_MPLS);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            selector = DefaultTrafficSelector.builder();
-            treatment = DefaultTrafficTreatment.builder();
 
             selector.matchEthType(Ethernet.TYPE_VLAN);
             treatment.transition(FlowRule.Type.VLAN);
@@ -447,18 +425,6 @@
 
             ops = install ? ops.add(rule) : ops.remove(rule);
 
-            //Drop rule
-            selector = DefaultTrafficSelector.builder();
-            treatment = DefaultTrafficTreatment.builder();
-
-            treatment.drop();
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), DROP_PRIORITY, appId,
-                                       0, true, FlowRule.Type.VLAN_MPLS);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
             flowService.apply(ops.build(new FlowRuleOperationsContext() {
                 @Override
                 public void onSuccess(FlowRuleOperations ops) {
@@ -487,7 +453,7 @@
                 treatment = DefaultTrafficTreatment.builder();
 
                 selector.matchVlanId(vid);
-                treatment.popVlan();
+                treatment.stripVlan();
                 treatment.transition(Type.ETHER);
 
                 rule = new DefaultFlowRule(deviceId, selector.build(),
diff --git a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/TunnellingConnectivityManager.java b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/TunnellingConnectivityManager.java
index 51b96cc..270a4da 100644
--- a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/TunnellingConnectivityManager.java
+++ b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/TunnellingConnectivityManager.java
@@ -21,15 +21,11 @@
 import org.onlab.packet.TCP;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketContext;
-import org.onosproject.net.packet.PacketPriority;
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketService;
 import org.onosproject.routing.config.BgpPeer;
@@ -65,26 +61,6 @@
 
     public void start() {
         packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 3);
-
-        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
-
-        // Request packets with BGP port as their TCP source port
-        selector.matchEthType(Ethernet.TYPE_IPV4);
-        selector.matchIPProtocol(IPv4.PROTOCOL_TCP);
-        selector.matchTcpSrc(BGP_PORT);
-
-        packetService.requestPackets(selector.build(), PacketPriority.CONTROL,
-                                     appId, FlowRule.Type.DEFAULT);
-
-        selector = DefaultTrafficSelector.builder();
-
-        // Request packets with BGP port as their TCP destination port
-        selector.matchEthType(Ethernet.TYPE_IPV4);
-        selector.matchIPProtocol(IPv4.PROTOCOL_TCP);
-        selector.matchTcpDst(BGP_PORT);
-
-        packetService.requestPackets(selector.build(), PacketPriority.CONTROL,
-                                     appId, FlowRule.Type.DEFAULT);
     }
 
     public void stop() {
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.
      */
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
index 16960a4..9cfe5d8 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
@@ -268,6 +268,9 @@
             case POP_VLAN:
                 builder.popVlan();
                 break;
+            case STRIP_VLAN:
+                builder.stripVlan();
+                break;
             case SET_TP_DST:
             case SET_TP_SRC:
             case POP_PBB:
@@ -280,7 +283,7 @@
             case SET_NW_TOS:
             case SET_NW_TTL:
             case SET_QUEUE:
-            case STRIP_VLAN:
+
             case ENQUEUE:
             default:
                 log.warn("Action type {} not yet implemented.", act.getType());
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java
index 584f448..39694b4 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java
@@ -207,6 +207,8 @@
         case VLAN_PCP:
             ModVlanPcpInstruction vlanPcp = (ModVlanPcpInstruction) l2m;
             return factory().actions().setVlanPcp(VlanPcp.of(vlanPcp.vlanPcp()));
+        case STRIP_VLAN:
+            return factory().actions().stripVlan();
         default:
             log.warn("Unimplemented action type {}.", l2m.subtype());
             break;
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
index 1a423a9..c8b63b4 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
@@ -319,6 +319,8 @@
                         (PushHeaderInstructions) l2m;
                 return factory().actions().popMpls(EthType.of(popHeaderInstructions
                                                               .ethernetType()));
+            case STRIP_VLAN:
+                return factory().actions().stripVlan();
             case MPLS_LABEL:
                 ModMplsLabelInstruction mplsLabel =
                         (ModMplsLabelInstruction) l2m;