Fix SONA to support vlan network mode.
Change-Id: Ib280ae4a41be1bfb86f1efc34011651a7390437b
(cherry picked from commit c64b4c612e59f1a8aab0e3c0994f853e00eedb07)
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,