Committed by
Gerrit Code Review
[ONOS-4920] Use subnet not network when setting routing rules for routers
Change-Id: I91bdab845071436dda16ba05f2dd7eeca23a111b
Showing
2 changed files
with
76 additions
and
54 deletions
... | @@ -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 { | ... | ... |
-
Please register or login to post a comment