Fix SONA to support vlan network mode.

Change-Id: Ib280ae4a41be1bfb86f1efc34011651a7390437b
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
index e2e9327..1c7b2ec 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
@@ -655,20 +655,31 @@
                 throw new IllegalStateException(error);
         }
 
-        treatment = DefaultTrafficTreatment.builder()
-                .extension(buildExtension(
-                        deviceService,
-                        osNode.intgBridge(),
-                        sourceNatGateway.dataIp().getIp4Address()),
-                        osNode.intgBridge())
-                .setOutput(osNode.tunnelPortNum())
-                .build();
+        TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+
+        switch (networkType) {
+            case VXLAN:
+                tBuilder.extension(buildExtension(
+                                deviceService,
+                                osNode.intgBridge(),
+                                sourceNatGateway.dataIp().getIp4Address()),
+                                osNode.intgBridge())
+                        .setOutput(osNode.tunnelPortNum());
+                break;
+
+            case VLAN:
+                tBuilder.setOutput(osNode.vlanPortNum());
+                break;
+
+            default:
+                break;
+        }
 
         osFlowRuleService.setRule(
                 appId,
                 osNode.intgBridge(),
                 sBuilder.build(),
-                treatment,
+                tBuilder.build(),
                 PRIORITY_EXTERNAL_ROUTING_RULE,
                 ROUTING_TABLE,
                 install);
@@ -705,35 +716,48 @@
     private void setRulesToGatewayWithDstIp(OpenstackNode osNode, OpenstackNode sourceNatGateway,
                                             String segmentId, IpAddress dstIp,
                                             NetworkMode networkMode, boolean install) {
-        TrafficSelector selector;
-        if (networkMode.equals(NetworkMode.VXLAN)) {
-            selector = DefaultTrafficSelector.builder()
-                    .matchEthType(Ethernet.TYPE_IPV4)
-                    .matchTunnelId(Long.valueOf(segmentId))
-                    .matchIPDst(dstIp.getIp4Address().toIpPrefix())
-                    .build();
-        } else {
-            selector = DefaultTrafficSelector.builder()
-                    .matchEthType(Ethernet.TYPE_IPV4)
-                    .matchVlanId(VlanId.vlanId(segmentId))
-                    .matchIPDst(dstIp.getIp4Address().toIpPrefix())
-                    .build();
+        TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
+                .matchEthType(Ethernet.TYPE_IPV4)
+                .matchIPDst(dstIp.getIp4Address().toIpPrefix());
+
+        switch (networkMode) {
+            case VXLAN:
+                sBuilder.matchTunnelId(Long.valueOf(segmentId));
+                break;
+
+            case VLAN:
+                sBuilder.matchVlanId(VlanId.vlanId(segmentId));
+                break;
+
+            default:
+                break;
         }
 
-        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                .extension(buildExtension(
+        TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+
+        switch (networkMode) {
+            case VXLAN:
+                tBuilder.extension(buildExtension(
                         deviceService,
                         osNode.intgBridge(),
                         sourceNatGateway.dataIp().getIp4Address()),
                         osNode.intgBridge())
-                .setOutput(osNode.tunnelPortNum())
-                .build();
+                        .setOutput(osNode.tunnelPortNum());
+                break;
+
+            case VLAN:
+                tBuilder.setOutput(osNode.vlanPortNum());
+                break;
+
+            default:
+                break;
+        }
 
         osFlowRuleService.setRule(
                 appId,
                 osNode.intgBridge(),
-                selector,
-                treatment,
+                sBuilder.build(),
+                tBuilder.build(),
                 PRIORITY_SWITCHING_RULE,
                 ROUTING_TABLE,
                 install);
@@ -805,16 +829,16 @@
                                       NetworkType networkType, boolean install) {
         TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
                 .matchEthType(Ethernet.TYPE_IPV4)
-                .matchIPSrc(srcSubnet);
+                .matchIPSrc(srcSubnet)
+                .matchEthDst(Constants.DEFAULT_GATEWAY_MAC);
+
 
         switch (networkType) {
             case VXLAN:
-                sBuilder.matchTunnelId(Long.parseLong(segmentId))
-                        .matchEthDst(Constants.DEFAULT_GATEWAY_MAC);
+                sBuilder.matchTunnelId(Long.parseLong(segmentId));
                 break;
             case VLAN:
-                sBuilder.matchVlanId(VlanId.vlanId(segmentId))
-                        .matchEthDst(osNodeService.node(deviceId).vlanPortMac());
+                sBuilder.matchVlanId(VlanId.vlanId(segmentId));
                 break;
             default:
                 final String error = String.format("%s %s",
@@ -823,8 +847,7 @@
                 throw new IllegalStateException(error);
         }
 
-        TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
-                .setEthDst(Constants.DEFAULT_GATEWAY_MAC);
+        TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
 
         if (networkType.equals(NetworkType.VLAN)) {
             tBuilder.popVlan();
@@ -1047,26 +1070,32 @@
             if (osNetworkAdminService.network(instPort.networkId()).getNetworkType() == NetworkType.FLAT) {
                 return;
             }
-            osNodeService.completeNodes(GATEWAY)
-                    .forEach(gwNode -> setRulesForSnatIngressRule(
-                            gwNode.intgBridge(),
-                            Long.parseLong(osNetworkAdminService
-                                    .network(instPort.networkId()).getProviderSegID()),
-                            IpPrefix.valueOf(instPort.ipAddress(), 32),
-                            instPort.deviceId(), true));
+
+            if (useStatefulSnat) {
+                osNodeService.completeNodes(GATEWAY)
+                        .forEach(gwNode -> setRulesForSnatIngressRule(
+                                gwNode.intgBridge(),
+                                Long.parseLong(osNetworkAdminService
+                                        .network(instPort.networkId()).getProviderSegID()),
+                                IpPrefix.valueOf(instPort.ipAddress(), 32),
+                                instPort.deviceId(), true));
+            }
         }
 
         private void instPortRemoved(InstancePort instPort) {
             if (osNetworkAdminService.network(instPort.networkId()).getNetworkType() == NetworkType.FLAT) {
                 return;
             }
-            osNodeService.completeNodes(GATEWAY)
-                    .forEach(gwNode -> setRulesForSnatIngressRule(
-                            gwNode.intgBridge(),
-                            Long.parseLong(osNetworkAdminService
-                                    .network(instPort.networkId()).getProviderSegID()),
-                            IpPrefix.valueOf(instPort.ipAddress(), 32),
-                            instPort.deviceId(), false));
+
+            if (useStatefulSnat) {
+                osNodeService.completeNodes(GATEWAY)
+                        .forEach(gwNode -> setRulesForSnatIngressRule(
+                                gwNode.intgBridge(),
+                                Long.parseLong(osNetworkAdminService
+                                        .network(instPort.networkId()).getProviderSegID()),
+                                IpPrefix.valueOf(instPort.ipAddress(), 32),
+                                instPort.deviceId(), false));
+            }
         }
     }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
index b109d2c..4657c18 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
@@ -337,8 +337,7 @@
                 break;
             case VLAN:
                 tBuilder.pushVlan()
-                        .setVlanId(VlanId.vlanId(segmentId))
-                        .setEthSrc(DEFAULT_GATEWAY_MAC);
+                        .setVlanId(VlanId.vlanId(segmentId));
                 break;
             default:
                 final String error = String.format("%s %s",
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 6fabacd..4fb03a2 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
@@ -369,8 +369,9 @@
                         remoteNode.vlanIntf() != null)
                 .forEach(remoteNode -> {
                     TrafficTreatment treatmentToRemote = DefaultTrafficTreatment.builder()
-                                    .setOutput(remoteNode.vlanPortNum())
-                                    .build();
+                            .setEthDst(instPort.macAddress())
+                            .setOutput(remoteNode.vlanPortNum())
+                            .build();
 
                     osFlowRuleService.setRule(
                             appId,