sangho
Committed by Gerrit Code Review

[ONOS-4920] Use subnet not network when setting routing rules for routers

Change-Id: I91bdab845071436dda16ba05f2dd7eeca23a111b
...@@ -58,7 +58,7 @@ public final class Constants { ...@@ -58,7 +58,7 @@ public final class Constants {
58 public static final int SWITCHING_RULE_PRIORITY = 30000; 58 public static final int SWITCHING_RULE_PRIORITY = 30000;
59 public static final int TUNNELTAG_RULE_PRIORITY = 30000; 59 public static final int TUNNELTAG_RULE_PRIORITY = 30000;
60 public static final int ACL_RULE_PRIORITY = 30000; 60 public static final int ACL_RULE_PRIORITY = 30000;
61 - 61 + public static final int EW_ROUTING_RULE_PRIORITY = 28000;
62 public static final int ROUTING_RULE_PRIORITY = 25000; 62 public static final int ROUTING_RULE_PRIORITY = 25000;
63 public static final int FLOATING_RULE_PRIORITY = 42000; 63 public static final int FLOATING_RULE_PRIORITY = 42000;
64 public static final int PNAT_RULE_PRIORITY = 26000; 64 public static final int PNAT_RULE_PRIORITY = 26000;
......
...@@ -24,6 +24,7 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; ...@@ -24,6 +24,7 @@ import org.apache.felix.scr.annotations.ReferenceCardinality;
24 import org.apache.felix.scr.annotations.Service; 24 import org.apache.felix.scr.annotations.Service;
25 import org.onlab.packet.Ethernet; 25 import org.onlab.packet.Ethernet;
26 import org.onlab.packet.Ip4Address; 26 import org.onlab.packet.Ip4Address;
27 +import org.onlab.packet.IpPrefix;
27 import org.onlab.packet.MacAddress; 28 import org.onlab.packet.MacAddress;
28 import org.onlab.util.Tools; 29 import org.onlab.util.Tools;
29 import org.onosproject.core.ApplicationId; 30 import org.onosproject.core.ApplicationId;
...@@ -58,6 +59,8 @@ import org.onosproject.scalablegateway.api.ScalableGatewayService; ...@@ -58,6 +59,8 @@ import org.onosproject.scalablegateway.api.ScalableGatewayService;
58 import org.slf4j.Logger; 59 import org.slf4j.Logger;
59 import org.slf4j.LoggerFactory; 60 import org.slf4j.LoggerFactory;
60 61
62 +import java.util.HashMap;
63 +import java.util.Map;
61 import java.util.Objects; 64 import java.util.Objects;
62 import java.util.Optional; 65 import java.util.Optional;
63 import java.util.Set; 66 import java.util.Set;
...@@ -121,7 +124,10 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -121,7 +124,10 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
121 openstackService.ports().stream() 124 openstackService.ports().stream()
122 .filter(osPort -> osPort.deviceOwner().equals(DEVICE_OWNER_ROUTER_INTERFACE) && 125 .filter(osPort -> osPort.deviceOwner().equals(DEVICE_OWNER_ROUTER_INTERFACE) &&
123 osPort.deviceId().equals(osRouter.id())) 126 osPort.deviceId().equals(osRouter.id()))
124 - .forEach(osPort -> setExternalConnection(osRouter, osPort.networkId())); 127 + .forEach(osPort -> {
128 + String subnetId = osPort.fixedIps().keySet().stream().findFirst().get();
129 + setExternalConnection(osRouter, subnetId);
130 + });
125 131
126 log.info("Connected external gateway {} to router {}", 132 log.info("Connected external gateway {} to router {}",
127 osRouter.gatewayExternalInfo().externalFixedIps(), 133 osRouter.gatewayExternalInfo().externalFixedIps(),
...@@ -153,7 +159,8 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -153,7 +159,8 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
153 159
154 setRoutes(osRouter, Optional.empty()); 160 setRoutes(osRouter, Optional.empty());
155 if (osRouter.gatewayExternalInfo().externalFixedIps().size() > 0) { 161 if (osRouter.gatewayExternalInfo().externalFixedIps().size() > 0) {
156 - setExternalConnection(osRouter, osPort.networkId()); 162 + String subnetId = osPort.fixedIps().keySet().stream().findFirst().get();
163 + setExternalConnection(osRouter, subnetId);
157 } 164 }
158 log.info("Connected {} to router {}", osPort.fixedIps(), osRouter.name()); 165 log.info("Connected {} to router {}", osPort.fixedIps(), osRouter.name());
159 } 166 }
...@@ -169,22 +176,22 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -169,22 +176,22 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
169 OpenstackSubnet osSubnet = openstackService.subnet(routerIface.subnetId()); 176 OpenstackSubnet osSubnet = openstackService.subnet(routerIface.subnetId());
170 OpenstackNetwork osNet = openstackService.network(osSubnet.networkId()); 177 OpenstackNetwork osNet = openstackService.network(osSubnet.networkId());
171 178
172 - unsetRoutes(osRouter, osNet); 179 + unsetRoutes(osRouter, osSubnet);
173 if (osRouter.gatewayExternalInfo().externalFixedIps().size() > 0) { 180 if (osRouter.gatewayExternalInfo().externalFixedIps().size() > 0) {
174 unsetExternalConnection(osRouter, osNet.id()); 181 unsetExternalConnection(osRouter, osNet.id());
175 } 182 }
176 log.info("Disconnected {} from router {}", osSubnet.cidr(), osRouter.name()); 183 log.info("Disconnected {} from router {}", osSubnet.cidr(), osRouter.name());
177 } 184 }
178 185
179 - private void setExternalConnection(OpenstackRouter osRouter, String osNetId) { 186 + private void setExternalConnection(OpenstackRouter osRouter, String osSubNetId) {
180 if (!osRouter.gatewayExternalInfo().isEnablePnat()) { 187 if (!osRouter.gatewayExternalInfo().isEnablePnat()) {
181 log.debug("Source NAT is disabled"); 188 log.debug("Source NAT is disabled");
182 return; 189 return;
183 } 190 }
184 191
185 - // FIXME router interface is subnet specific, not network 192 + OpenstackSubnet osSubNet = openstackService.subnet(osSubNetId);
186 - OpenstackNetwork osNet = openstackService.network(osNetId); 193 + OpenstackNetwork osNet = openstackService.network(osSubNet.networkId());
187 - populateExternalRules(osNet); 194 + populateExternalRules(osNet, osSubNet);
188 } 195 }
189 196
190 private void unsetExternalConnection(OpenstackRouter osRouter, String osNetId) { 197 private void unsetExternalConnection(OpenstackRouter osRouter, String osNetId) {
...@@ -199,40 +206,39 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -199,40 +206,39 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
199 } 206 }
200 207
201 private void setRoutes(OpenstackRouter osRouter, Optional<Host> host) { 208 private void setRoutes(OpenstackRouter osRouter, Optional<Host> host) {
202 - Set<OpenstackNetwork> routableNets = routableNetworks(osRouter.id()); 209 + Set<OpenstackSubnet> routableSubNets = routableSubNets(osRouter.id());
203 - if (routableNets.size() < 2) { 210 + if (routableSubNets.size() < 2) {
204 // no other subnet interface is connected to this router, do nothing 211 // no other subnet interface is connected to this router, do nothing
205 return; 212 return;
206 } 213 }
207 214
208 - // FIXME router interface is subnet specific, not network 215 + Set<String> routableSubNetIds = routableSubNets.stream()
209 - Set<String> routableNetIds = routableNets.stream() 216 + .map(OpenstackSubnet::id)
210 - .map(OpenstackNetwork::id)
211 .collect(Collectors.toSet()); 217 .collect(Collectors.toSet());
212 218
219 +
213 Set<Host> hosts = host.isPresent() ? ImmutableSet.of(host.get()) : 220 Set<Host> hosts = host.isPresent() ? ImmutableSet.of(host.get()) :
214 Tools.stream(hostService.getHosts()) 221 Tools.stream(hostService.getHosts())
215 - .filter(h -> routableNetIds.contains(h.annotations().value(NETWORK_ID))) 222 + .filter(h -> routableSubNetIds.contains(h.annotations().value(SUBNET_ID)))
216 .collect(Collectors.toSet()); 223 .collect(Collectors.toSet());
217 224
218 - hosts.forEach(h -> populateRoutingRules(h, routableNets)); 225 + hosts.forEach(h -> populateRoutingRules(h, routableSubNets));
219 } 226 }
220 227
221 - private void unsetRoutes(OpenstackRouter osRouter, OpenstackNetwork osNet) { 228 + private void unsetRoutes(OpenstackRouter osRouter, OpenstackSubnet osSubNet) {
222 - // FIXME router interface is subnet specific, not network 229 + Set<OpenstackSubnet> routableSubNets = routableSubNets(osRouter.id());
223 - Set<OpenstackNetwork> routableNets = routableNetworks(osRouter.id());
224 Tools.stream(hostService.getHosts()) 230 Tools.stream(hostService.getHosts())
225 .filter(h -> Objects.equals( 231 .filter(h -> Objects.equals(
226 - h.annotations().value(NETWORK_ID), osNet.id())) 232 + h.annotations().value(NETWORK_ID), osSubNet.id()))
227 - .forEach(h -> removeRoutingRules(h, routableNets)); 233 + .forEach(h -> removeRoutingRules(h, routableSubNets));
228 234
229 - routableNets.forEach(n -> { 235 + routableSubNets.forEach(n -> {
230 Tools.stream(hostService.getHosts()) 236 Tools.stream(hostService.getHosts())
231 .filter(h -> Objects.equals( 237 .filter(h -> Objects.equals(
232 - h.annotations().value(NETWORK_ID), 238 + h.annotations().value(SUBNET_ID),
233 n.id())) 239 n.id()))
234 - .forEach(h -> removeRoutingRules(h, ImmutableSet.of(osNet))); 240 + .forEach(h -> removeRoutingRules(h, ImmutableSet.of(osSubNet)));
235 - log.debug("Removed between {} to {}", n.name(), osNet.name()); 241 + log.debug("Removed between {} to {}", n.name(), osSubNet.name());
236 }); 242 });
237 } 243 }
238 244
...@@ -249,18 +255,17 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -249,18 +255,17 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
249 .findAny(); 255 .findAny();
250 } 256 }
251 257
252 - private Set<OpenstackNetwork> routableNetworks(String osRouterId) { 258 + private Set<OpenstackSubnet> routableSubNets(String osRouterId) {
253 - // FIXME router interface is subnet specific, not network
254 return openstackService.ports().stream() 259 return openstackService.ports().stream()
255 .filter(p -> p.deviceOwner().equals(DEVICE_OWNER_ROUTER_INTERFACE) && 260 .filter(p -> p.deviceOwner().equals(DEVICE_OWNER_ROUTER_INTERFACE) &&
256 p.deviceId().equals(osRouterId)) 261 p.deviceId().equals(osRouterId))
257 - .map(p -> openstackService.network(p.networkId())) 262 + .map(p -> openstackService.subnet(p.fixedIps().keySet().stream().findFirst().get()))
258 .collect(Collectors.toSet()); 263 .collect(Collectors.toSet());
259 } 264 }
260 265
261 - private void populateExternalRules(OpenstackNetwork osNet) { 266 + private void populateExternalRules(OpenstackNetwork osNet, OpenstackSubnet osSubNet) {
262 - populateCnodeToGateway(Long.valueOf(osNet.segmentId())); 267 + populateCnodeToGateway(Long.valueOf(osNet.segmentId()), osSubNet.cidr());
263 - populateGatewayToController(Long.valueOf(osNet.segmentId())); 268 + populateGatewayToController(Long.valueOf(osNet.segmentId()), osSubNet.cidr());
264 } 269 }
265 270
266 private void removeExternalRules(OpenstackNetwork osNet) { 271 private void removeExternalRules(OpenstackNetwork osNet) {
...@@ -284,9 +289,9 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -284,9 +289,9 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
284 }); 289 });
285 } 290 }
286 291
287 - private void populateRoutingRules(Host host, Set<OpenstackNetwork> osNets) { 292 + private void populateRoutingRules(Host host, Set<OpenstackSubnet> osSubNets) {
288 - String osNetId = host.annotations().value(NETWORK_ID); 293 + String osSubNetId = host.annotations().value(SUBNET_ID);
289 - if (osNetId == null) { 294 + if (osSubNetId == null) {
290 return; 295 return;
291 } 296 }
292 297
...@@ -297,37 +302,46 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -297,37 +302,46 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
297 return; 302 return;
298 } 303 }
299 304
305 + Map<String, String> vniMap = new HashMap<>();
306 + openstackService.networks().stream().forEach(n -> vniMap.put(n.id(), n.segmentId()));
307 +
300 // TODO improve pipeline, do we have to install access rules between networks 308 // TODO improve pipeline, do we have to install access rules between networks
301 // for every single VMs? 309 // for every single VMs?
302 - osNets.stream().filter(osNet -> !osNet.id().equals(osNetId)).forEach(osNet -> { 310 + osSubNets.stream().filter(osSubNet -> !osSubNet.id().equals(osSubNetId)).forEach(osSubNet -> {
303 populateRoutingRulestoSameNode( 311 populateRoutingRulestoSameNode(
304 host.ipAddresses().stream().findFirst().get().getIp4Address(), 312 host.ipAddresses().stream().findFirst().get().getIp4Address(),
305 host.mac(), 313 host.mac(),
306 localPort, localDevice, 314 localPort, localDevice,
307 - Long.valueOf(osNet.segmentId())); 315 + Long.valueOf(vniMap.get(osSubNet.networkId())),
316 + osSubNet.cidr());
308 317
309 nodeService.completeNodes().stream() 318 nodeService.completeNodes().stream()
310 .filter(node -> node.type().equals(COMPUTE)) 319 .filter(node -> node.type().equals(COMPUTE))
311 .filter(node -> !node.intBridge().equals(localDevice)) 320 .filter(node -> !node.intBridge().equals(localDevice))
312 .forEach(node -> populateRoutingRulestoDifferentNode( 321 .forEach(node -> populateRoutingRulestoDifferentNode(
313 host.ipAddresses().stream().findFirst().get().getIp4Address(), 322 host.ipAddresses().stream().findFirst().get().getIp4Address(),
314 - Long.valueOf(osNet.segmentId()), 323 + Long.valueOf(vniMap.get(osSubNet.networkId())),
315 node.intBridge(), 324 node.intBridge(),
316 - nodeService.dataIp(localDevice).get().getIp4Address())); 325 + nodeService.dataIp(localDevice).get().getIp4Address(),
326 + osSubNet.cidr()));
317 }); 327 });
318 } 328 }
319 329
320 - private void removeRoutingRules(Host host, Set<OpenstackNetwork> osNets) { 330 + private void removeRoutingRules(Host host, Set<OpenstackSubnet> osSubNets) {
321 - String osNetId = host.annotations().value(NETWORK_ID); 331 + String osSubNetId = host.annotations().value(SUBNET_ID);
322 - if (osNetId == null) { 332 + if (osSubNetId == null) {
323 return; 333 return;
324 } 334 }
325 335
326 - osNets.stream().filter(osNet -> !osNet.id().equals(osNetId)).forEach(osNet -> { 336 + Map<String, String> vniMap = new HashMap<>();
337 + openstackService.networks().stream().forEach(n -> vniMap.put(n.id(), n.segmentId()));
338 +
339 + osSubNets.stream().filter(osSubNet -> !osSubNet.id().equals(osSubNetId)).forEach(osSubNet -> {
327 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder(); 340 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
328 sBuilder.matchEthType(Ethernet.TYPE_IPV4) 341 sBuilder.matchEthType(Ethernet.TYPE_IPV4)
329 .matchIPDst(host.ipAddresses().stream().findFirst().get().toIpPrefix()) 342 .matchIPDst(host.ipAddresses().stream().findFirst().get().toIpPrefix())
330 - .matchTunnelId(Long.valueOf(osNet.segmentId())); 343 + .matchIPSrc(IpPrefix.valueOf(osSubNet.cidr()))
344 + .matchTunnelId(Long.valueOf(vniMap.get(osSubNet.networkId())));
331 345
332 nodeService.completeNodes().stream() 346 nodeService.completeNodes().stream()
333 .filter(node -> node.type().equals(COMPUTE)) 347 .filter(node -> node.type().equals(COMPUTE))
...@@ -339,15 +353,16 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -339,15 +353,16 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
339 ForwardingObjective.Flag.SPECIFIC, 353 ForwardingObjective.Flag.SPECIFIC,
340 ROUTING_RULE_PRIORITY)); 354 ROUTING_RULE_PRIORITY));
341 }); 355 });
342 - log.debug("Removed routing rule from {} to {}", host, osNets); 356 + log.debug("Removed routing rule from {} to {}", host, osSubNets);
343 } 357 }
344 358
345 - private void populateGatewayToController(long vni) { 359 + private void populateGatewayToController(long vni, String subNetCidr) {
346 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder(); 360 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
347 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder(); 361 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
348 362
349 sBuilder.matchEthType(Ethernet.TYPE_IPV4) 363 sBuilder.matchEthType(Ethernet.TYPE_IPV4)
350 .matchTunnelId(vni) 364 .matchTunnelId(vni)
365 + .matchIPSrc(IpPrefix.valueOf(subNetCidr))
351 .matchEthDst(Constants.DEFAULT_GATEWAY_MAC); 366 .matchEthDst(Constants.DEFAULT_GATEWAY_MAC);
352 tBuilder.setOutput(PortNumber.CONTROLLER); 367 tBuilder.setOutput(PortNumber.CONTROLLER);
353 368
...@@ -362,21 +377,22 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -362,21 +377,22 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
362 gatewayService.getGatewayDeviceIds().forEach(deviceId -> flowObjectiveService.forward(deviceId, fo)); 377 gatewayService.getGatewayDeviceIds().forEach(deviceId -> flowObjectiveService.forward(deviceId, fo));
363 } 378 }
364 379
365 - private void populateCnodeToGateway(long vni) { 380 + private void populateCnodeToGateway(long vni, String subnetCidr) {
366 nodeService.completeNodes().stream() 381 nodeService.completeNodes().stream()
367 .filter(node -> node.type().equals(COMPUTE)) 382 .filter(node -> node.type().equals(COMPUTE))
368 .forEach(node -> populateRuleToGateway( 383 .forEach(node -> populateRuleToGateway(
369 node.intBridge(), 384 node.intBridge(),
370 gatewayService.getGatewayGroupId(node.intBridge()), 385 gatewayService.getGatewayGroupId(node.intBridge()),
371 - vni)); 386 + vni, subnetCidr));
372 } 387 }
373 388
374 - private void populateRuleToGateway(DeviceId deviceId, GroupId groupId, long vni) { 389 + private void populateRuleToGateway(DeviceId deviceId, GroupId groupId, long vni, String cidr) {
375 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder(); 390 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
376 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder(); 391 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
377 392
378 sBuilder.matchEthType(Ethernet.TYPE_IPV4) 393 sBuilder.matchEthType(Ethernet.TYPE_IPV4)
379 .matchTunnelId(vni) 394 .matchTunnelId(vni)
395 + .matchIPSrc(IpPrefix.valueOf(cidr))
380 .matchEthDst(Constants.DEFAULT_GATEWAY_MAC); 396 .matchEthDst(Constants.DEFAULT_GATEWAY_MAC);
381 397
382 tBuilder.group(groupId); 398 tBuilder.group(groupId);
...@@ -392,12 +408,14 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -392,12 +408,14 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
392 } 408 }
393 409
394 private void populateRoutingRulestoDifferentNode(Ip4Address vmIp, long vni, 410 private void populateRoutingRulestoDifferentNode(Ip4Address vmIp, long vni,
395 - DeviceId deviceId, Ip4Address hostIp) { 411 + DeviceId deviceId, Ip4Address hostIp,
412 + String cidr) {
396 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder(); 413 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
397 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder(); 414 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
398 415
399 sBuilder.matchEthType(Ethernet.TYPE_IPV4) 416 sBuilder.matchEthType(Ethernet.TYPE_IPV4)
400 .matchTunnelId(vni) 417 .matchTunnelId(vni)
418 + .matchIPSrc(IpPrefix.valueOf(cidr))
401 .matchIPDst(vmIp.toIpPrefix()); 419 .matchIPDst(vmIp.toIpPrefix());
402 tBuilder.extension(buildExtension(deviceService, deviceId, hostIp), deviceId) 420 tBuilder.extension(buildExtension(deviceService, deviceId, hostIp), deviceId)
403 .setOutput(nodeService.tunnelPort(deviceId).get()); 421 .setOutput(nodeService.tunnelPort(deviceId).get());
...@@ -405,7 +423,7 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -405,7 +423,7 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
405 ForwardingObjective fo = DefaultForwardingObjective.builder() 423 ForwardingObjective fo = DefaultForwardingObjective.builder()
406 .withSelector(sBuilder.build()) 424 .withSelector(sBuilder.build())
407 .withTreatment(tBuilder.build()) 425 .withTreatment(tBuilder.build())
408 - .withPriority(ROUTING_RULE_PRIORITY) 426 + .withPriority(EW_ROUTING_RULE_PRIORITY)
409 .withFlag(ForwardingObjective.Flag.SPECIFIC) 427 .withFlag(ForwardingObjective.Flag.SPECIFIC)
410 .fromApp(appId) 428 .fromApp(appId)
411 .add(); 429 .add();
...@@ -414,12 +432,15 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -414,12 +432,15 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
414 } 432 }
415 433
416 private void populateRoutingRulestoSameNode(Ip4Address vmIp, MacAddress vmMac, 434 private void populateRoutingRulestoSameNode(Ip4Address vmIp, MacAddress vmMac,
417 - PortNumber port, DeviceId deviceId, long vni) { 435 + PortNumber port, DeviceId deviceId, long vni,
436 + String cidr) {
418 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder(); 437 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
419 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder(); 438 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
420 439
440 + // FIXME: we need to check the VNI of the dest IP also just in case...
421 sBuilder.matchEthType(Ethernet.TYPE_IPV4) 441 sBuilder.matchEthType(Ethernet.TYPE_IPV4)
422 .matchIPDst(vmIp.toIpPrefix()) 442 .matchIPDst(vmIp.toIpPrefix())
443 + .matchIPSrc(IpPrefix.valueOf(cidr))
423 .matchTunnelId(vni); 444 .matchTunnelId(vni);
424 445
425 tBuilder.setEthDst(vmMac) 446 tBuilder.setEthDst(vmMac)
...@@ -428,7 +449,7 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -428,7 +449,7 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
428 ForwardingObjective fo = DefaultForwardingObjective.builder() 449 ForwardingObjective fo = DefaultForwardingObjective.builder()
429 .withSelector(sBuilder.build()) 450 .withSelector(sBuilder.build())
430 .withTreatment(tBuilder.build()) 451 .withTreatment(tBuilder.build())
431 - .withPriority(ROUTING_RULE_PRIORITY) 452 + .withPriority(EW_ROUTING_RULE_PRIORITY)
432 .withFlag(ForwardingObjective.Flag.SPECIFIC) 453 .withFlag(ForwardingObjective.Flag.SPECIFIC)
433 .fromApp(appId) 454 .fromApp(appId)
434 .add(); 455 .add();
...@@ -443,7 +464,8 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -443,7 +464,8 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
443 OpenstackRouter osRouter = openstackRouter(osPort.deviceId()); 464 OpenstackRouter osRouter = openstackRouter(osPort.deviceId());
444 setRoutes(osRouter, Optional.empty()); 465 setRoutes(osRouter, Optional.empty());
445 if (osRouter.gatewayExternalInfo().externalFixedIps().size() > 0) { 466 if (osRouter.gatewayExternalInfo().externalFixedIps().size() > 0) {
446 - setExternalConnection(osRouter, osPort.networkId()); 467 + String subnetId = osPort.fixedIps().keySet().stream().findFirst().get();
468 + setExternalConnection(osRouter, subnetId);
447 } 469 }
448 })); 470 }));
449 } 471 }
...@@ -467,8 +489,8 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst ...@@ -467,8 +489,8 @@ public class OpenstackRoutingManager extends AbstractVmHandler implements Openst
467 if (!routerIface.isPresent()) { 489 if (!routerIface.isPresent()) {
468 return; 490 return;
469 } 491 }
470 - Set<OpenstackNetwork> routableNets = routableNetworks(routerIface.get().deviceId()); 492 + Set<OpenstackSubnet> routableSubNets = routableSubNets(routerIface.get().deviceId());
471 - eventExecutor.execute(() -> removeRoutingRules(host, routableNets)); 493 + eventExecutor.execute(() -> removeRoutingRules(host, routableSubNets));
472 } 494 }
473 495
474 private class InternalNodeListener implements OpenstackNodeListener { 496 private class InternalNodeListener implements OpenstackNodeListener {
......