Fixes ARP-related flow rules in VLAN case.

Change-Id: I1103ab8984789e62136f0e4c079f6532875ce660
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
index a2d0013..06265bd 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
@@ -22,6 +22,7 @@
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cfg.ConfigProperty;
@@ -315,26 +316,32 @@
                 return;
             }
 
-            TrafficSelector selector = DefaultTrafficSelector.builder()
-                    .matchEthType(EthType.EtherType.ARP.ethType().toShort())
-                    .matchArpOp(ARP.OP_REQUEST)
-                    .matchArpTpa(Ip4Address.valueOf(gateway))
-                    .build();
+            TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+            TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
 
-            TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                    .setArpOp(ARP.OP_REPLY)
+            NetworkType type = NetworkType.valueOf(osNetworkService.networkType(osSubnet.getNetworkId()));
+
+            if (type.equals(NetworkType.VLAN)) {
+                sBuilder.matchVlanId(VlanId.vlanId(osNetworkService.segmentId(osSubnet.getNetworkId())));
+                tBuilder.popVlan();
+            }
+
+            sBuilder.matchEthType(EthType.EtherType.ARP.ethType().toShort())
+                    .matchArpOp(ARP.OP_REQUEST)
+                    .matchArpTpa(Ip4Address.valueOf(gateway));
+
+            tBuilder.setArpOp(ARP.OP_REPLY)
                     .setArpSha(MacAddress.valueOf(gatewayMac))
                     .setArpSpa(Ip4Address.valueOf(gateway))
-                    .setOutput(PortNumber.IN_PORT)
-                    .build();
+                    .setOutput(PortNumber.IN_PORT);
 
             if (osNode == null) {
                 osNodeService.completeNodes(COMPUTE).forEach(n ->
                         osFlowRuleService.setRule(
                                 appId,
                                 n.intgBridge(),
-                                selector,
-                                treatment,
+                                sBuilder.build(),
+                                tBuilder.build(),
                                 PRIORITY_ARP_GATEWAY_RULE,
                                 ARP_TABLE,
                                 install
@@ -344,8 +351,8 @@
                 osFlowRuleService.setRule(
                         appId,
                         osNode.intgBridge(),
-                        selector,
-                        treatment,
+                        sBuilder.build(),
+                        tBuilder.build(),
                         PRIORITY_ARP_GATEWAY_RULE,
                         ARP_TABLE,
                         install
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
index 14fd5da..196c07d 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
@@ -540,17 +540,21 @@
                 .matchInPort(instPort.portNumber())
                 .build();
 
-        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+        TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
                 .pushVlan()
-                .setVlanId(getVlanId(instPort))
-                .transition(ACL_TABLE)
-                .build();
+                .setVlanId(getVlanId(instPort));
+
+        if (ethType == Ethernet.TYPE_ARP) {
+            tBuilder.transition(ARP_TABLE);
+        } else if (ethType == Ethernet.TYPE_IPV4) {
+            tBuilder.transition(ACL_TABLE);
+        }
 
         osFlowRuleService.setRule(
                 appId,
                 instPort.deviceId(),
                 selector,
-                treatment,
+                tBuilder.build(),
                 PRIORITY_TUNNEL_TAG_RULE,
                 VTAG_TABLE,
                 install);