Daniel Park
Committed by Gerrit Code Review

[ONOS-5134] VM cannot access to another VM with floating IP

Change-Id: I300d410994361de505558bfcdeb732a8a6c14b91
...@@ -62,7 +62,8 @@ public final class Constants { ...@@ -62,7 +62,8 @@ public final class Constants {
62 62
63 public static final int GATEWAY_ICMP_PRIORITY = 43000; 63 public static final int GATEWAY_ICMP_PRIORITY = 43000;
64 public static final int ROUTING_RULE_PRIORITY = 25000; 64 public static final int ROUTING_RULE_PRIORITY = 25000;
65 - public static final int FLOATING_RULE_PRIORITY = 42000; 65 + public static final int FLOATING_RULE_FOR_TRAFFIC_FROM_VM_PRIORITY = 42000;
66 + public static final int FLOATING_RULE_PRIORITY = 41000;
66 public static final int PNAT_RULE_PRIORITY = 26000; 67 public static final int PNAT_RULE_PRIORITY = 26000;
67 public static final int PNAT_TIMEOUT = 120; 68 public static final int PNAT_TIMEOUT = 120;
68 } 69 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -30,6 +30,7 @@ import org.onosproject.core.ApplicationId; ...@@ -30,6 +30,7 @@ import org.onosproject.core.ApplicationId;
30 import org.onosproject.core.CoreService; 30 import org.onosproject.core.CoreService;
31 import org.onosproject.net.DeviceId; 31 import org.onosproject.net.DeviceId;
32 import org.onosproject.net.Host; 32 import org.onosproject.net.Host;
33 +import org.onosproject.net.PortNumber;
33 import org.onosproject.net.device.DeviceService; 34 import org.onosproject.net.device.DeviceService;
34 import org.onosproject.net.flow.DefaultTrafficSelector; 35 import org.onosproject.net.flow.DefaultTrafficSelector;
35 import org.onosproject.net.flow.DefaultTrafficTreatment; 36 import org.onosproject.net.flow.DefaultTrafficTreatment;
...@@ -231,6 +232,11 @@ public class OpenstackFloatingIpManager extends AbstractVmHandler implements Ope ...@@ -231,6 +232,11 @@ public class OpenstackFloatingIpManager extends AbstractVmHandler implements Ope
231 .matchIPDst(floatingIp.toIpPrefix()); 232 .matchIPDst(floatingIp.toIpPrefix());
232 233
233 gatewayService.getGatewayDeviceIds().stream().forEach(deviceId -> { 234 gatewayService.getGatewayDeviceIds().stream().forEach(deviceId -> {
235 + TrafficSelector.Builder sForTrafficFromVmBuilder = DefaultTrafficSelector.builder()
236 + .matchEthType(Ethernet.TYPE_IPV4)
237 + .matchIPDst(floatingIp.toIpPrefix())
238 + .matchInPort(nodeService.tunnelPort(deviceId).get());
239 +
234 RulePopulatorUtil.removeRule( 240 RulePopulatorUtil.removeRule(
235 flowObjectiveService, 241 flowObjectiveService,
236 appId, 242 appId,
...@@ -246,6 +252,14 @@ public class OpenstackFloatingIpManager extends AbstractVmHandler implements Ope ...@@ -246,6 +252,14 @@ public class OpenstackFloatingIpManager extends AbstractVmHandler implements Ope
246 sIncomingBuilder.build(), 252 sIncomingBuilder.build(),
247 ForwardingObjective.Flag.VERSATILE, 253 ForwardingObjective.Flag.VERSATILE,
248 FLOATING_RULE_PRIORITY); 254 FLOATING_RULE_PRIORITY);
255 +
256 + RulePopulatorUtil.removeRule(
257 + flowObjectiveService,
258 + appId,
259 + deviceId,
260 + sForTrafficFromVmBuilder.build(),
261 + ForwardingObjective.Flag.VERSATILE,
262 + FLOATING_RULE_FOR_TRAFFIC_FROM_VM_PRIORITY);
249 }); 263 });
250 } 264 }
251 265
...@@ -259,13 +273,13 @@ public class OpenstackFloatingIpManager extends AbstractVmHandler implements Ope ...@@ -259,13 +273,13 @@ public class OpenstackFloatingIpManager extends AbstractVmHandler implements Ope
259 return; 273 return;
260 } 274 }
261 275
262 - TrafficSelector selector = DefaultTrafficSelector.builder() 276 + TrafficSelector selectorForTrafficFromExternal = DefaultTrafficSelector.builder()
263 .matchEthType(Ethernet.TYPE_IPV4) 277 .matchEthType(Ethernet.TYPE_IPV4)
264 .matchIPDst(floatingIp.toIpPrefix()) 278 .matchIPDst(floatingIp.toIpPrefix())
265 .build(); 279 .build();
266 280
267 gatewayService.getGatewayDeviceIds().stream().forEach(gnodeId -> { 281 gatewayService.getGatewayDeviceIds().stream().forEach(gnodeId -> {
268 - TrafficTreatment treatment = DefaultTrafficTreatment.builder() 282 + TrafficTreatment treatmentForTrafficFromExternal = DefaultTrafficTreatment.builder()
269 .setEthSrc(Constants.DEFAULT_GATEWAY_MAC) 283 .setEthSrc(Constants.DEFAULT_GATEWAY_MAC)
270 .setEthDst(associatedVm.mac()) 284 .setEthDst(associatedVm.mac())
271 .setIpDst(associatedVm.ipAddresses().stream().findFirst().get()) 285 .setIpDst(associatedVm.ipAddresses().stream().findFirst().get())
...@@ -275,15 +289,43 @@ public class OpenstackFloatingIpManager extends AbstractVmHandler implements Ope ...@@ -275,15 +289,43 @@ public class OpenstackFloatingIpManager extends AbstractVmHandler implements Ope
275 .setOutput(nodeService.tunnelPort(gnodeId).get()) 289 .setOutput(nodeService.tunnelPort(gnodeId).get())
276 .build(); 290 .build();
277 291
278 - ForwardingObjective fo = DefaultForwardingObjective.builder() 292 + ForwardingObjective forwardingObjectiveForTrafficFromExternal = DefaultForwardingObjective.builder()
279 - .withSelector(selector) 293 + .withSelector(selectorForTrafficFromExternal)
280 - .withTreatment(treatment) 294 + .withTreatment(treatmentForTrafficFromExternal)
281 .withFlag(ForwardingObjective.Flag.VERSATILE) 295 .withFlag(ForwardingObjective.Flag.VERSATILE)
282 .withPriority(FLOATING_RULE_PRIORITY) 296 .withPriority(FLOATING_RULE_PRIORITY)
283 .fromApp(appId) 297 .fromApp(appId)
284 .add(); 298 .add();
285 299
286 - flowObjectiveService.forward(gnodeId, fo); 300 + flowObjectiveService.forward(gnodeId, forwardingObjectiveForTrafficFromExternal);
301 +
302 +
303 + TrafficSelector selectorForTrafficFromVm = DefaultTrafficSelector.builder()
304 + .matchEthType(Ethernet.TYPE_IPV4)
305 + .matchIPDst(floatingIp.toIpPrefix())
306 + .matchInPort(nodeService.tunnelPort(gnodeId).get())
307 + .build();
308 +
309 + TrafficTreatment treatmentForTrafficFromVm = DefaultTrafficTreatment.builder()
310 + .setEthSrc(Constants.DEFAULT_GATEWAY_MAC)
311 + .setEthDst(associatedVm.mac())
312 + .setIpDst(associatedVm.ipAddresses().stream().findFirst().get())
313 + .setTunnelId(Long.valueOf(associatedVm.annotations().value(VXLAN_ID)))
314 + .extension(buildExtension(deviceService, gnodeId, dataIp.get().getIp4Address()),
315 + gnodeId)
316 + .setOutput(PortNumber.IN_PORT)
317 + .build();
318 +
319 + ForwardingObjective forwardingObjectiveForTrafficFromVm = DefaultForwardingObjective.builder()
320 + .withSelector(selectorForTrafficFromVm)
321 + .withTreatment(treatmentForTrafficFromVm)
322 + .withFlag(ForwardingObjective.Flag.VERSATILE)
323 + .withPriority(FLOATING_RULE_FOR_TRAFFIC_FROM_VM_PRIORITY)
324 + .fromApp(appId)
325 + .add();
326 +
327 + flowObjectiveService.forward(gnodeId, forwardingObjectiveForTrafficFromVm);
328 +
287 }); 329 });
288 } 330 }
289 331
......