Committed by
Jonathan Hart
[ONOS-4426] [ONOS-4511] [ONOS-4502] Upgrade Vtn Module when access same network segment.
Change-Id: I3afe6b36a44f0eedd642eeadfc23fc3233e7621e
Showing
2 changed files
with
49 additions
and
17 deletions
| ... | @@ -23,9 +23,12 @@ import java.util.Objects; | ... | @@ -23,9 +23,12 @@ import java.util.Objects; |
| 23 | 23 | ||
| 24 | import org.onlab.osgi.ServiceDirectory; | 24 | import org.onlab.osgi.ServiceDirectory; |
| 25 | import org.onlab.packet.EthType.EtherType; | 25 | import org.onlab.packet.EthType.EtherType; |
| 26 | +import org.onlab.packet.IpAddress; | ||
| 27 | +import org.onlab.packet.IpPrefix; | ||
| 26 | import org.onosproject.core.ApplicationId; | 28 | import org.onosproject.core.ApplicationId; |
| 27 | import org.onosproject.core.CoreService; | 29 | import org.onosproject.core.CoreService; |
| 28 | import org.onosproject.net.DeviceId; | 30 | import org.onosproject.net.DeviceId; |
| 31 | +import org.onosproject.net.PortNumber; | ||
| 29 | import org.onosproject.net.behaviour.Pipeliner; | 32 | import org.onosproject.net.behaviour.Pipeliner; |
| 30 | import org.onosproject.net.behaviour.PipelinerContext; | 33 | import org.onosproject.net.behaviour.PipelinerContext; |
| 31 | import org.onosproject.net.device.DeviceService; | 34 | import org.onosproject.net.device.DeviceService; |
| ... | @@ -40,6 +43,8 @@ import org.onosproject.net.flow.TrafficSelector; | ... | @@ -40,6 +43,8 @@ import org.onosproject.net.flow.TrafficSelector; |
| 40 | import org.onosproject.net.flow.TrafficTreatment; | 43 | import org.onosproject.net.flow.TrafficTreatment; |
| 41 | import org.onosproject.net.flow.criteria.Criteria; | 44 | import org.onosproject.net.flow.criteria.Criteria; |
| 42 | import org.onosproject.net.flow.criteria.Criterion.Type; | 45 | import org.onosproject.net.flow.criteria.Criterion.Type; |
| 46 | +import org.onosproject.net.flow.criteria.IPCriterion; | ||
| 47 | +import org.onosproject.net.flow.instructions.Instructions; | ||
| 43 | import org.onosproject.net.flowobjective.FilteringObjective; | 48 | import org.onosproject.net.flowobjective.FilteringObjective; |
| 44 | import org.onosproject.net.flowobjective.FlowObjectiveStore; | 49 | import org.onosproject.net.flowobjective.FlowObjectiveStore; |
| 45 | import org.onosproject.net.flowobjective.ForwardingObjective; | 50 | import org.onosproject.net.flowobjective.ForwardingObjective; |
| ... | @@ -71,6 +76,7 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline | ... | @@ -71,6 +76,7 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline |
| 71 | private static final int SNAT_TABLE = 40; | 76 | private static final int SNAT_TABLE = 40; |
| 72 | private static final int MAC_TABLE = 50; | 77 | private static final int MAC_TABLE = 50; |
| 73 | private static final int TABLE_MISS_PRIORITY = 0; | 78 | private static final int TABLE_MISS_PRIORITY = 0; |
| 79 | + private static final String USERDATA_IP = "169.254.169.254"; | ||
| 74 | 80 | ||
| 75 | @Override | 81 | @Override |
| 76 | public void init(DeviceId deviceId, PipelinerContext context) { | 82 | public void init(DeviceId deviceId, PipelinerContext context) { |
| ... | @@ -213,7 +219,7 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline | ... | @@ -213,7 +219,7 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline |
| 213 | TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); | 219 | TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); |
| 214 | 220 | ||
| 215 | treatment.transition(MAC_TABLE); | 221 | treatment.transition(MAC_TABLE); |
| 216 | - | 222 | + treatment.add(Instructions.createOutput(PortNumber.CONTROLLER)); |
| 217 | FlowRule rule; | 223 | FlowRule rule; |
| 218 | rule = DefaultFlowRule.builder().forDevice(deviceId) | 224 | rule = DefaultFlowRule.builder().forDevice(deviceId) |
| 219 | .withSelector(selector.build()) | 225 | .withSelector(selector.build()) |
| ... | @@ -290,8 +296,9 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline | ... | @@ -290,8 +296,9 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline |
| 290 | Integer transition = null; | 296 | Integer transition = null; |
| 291 | Integer forTable = null; | 297 | Integer forTable = null; |
| 292 | // MAC table flow rules | 298 | // MAC table flow rules |
| 293 | - if (selector.getCriterion(Type.TUNNEL_ID) != null && selector | 299 | + if (selector.getCriterion(Type.TUNNEL_ID) != null |
| 294 | - .getCriterion(Type.ETH_DST) != null) { | 300 | + && (selector.getCriterion(Type.ETH_DST) != null |
| 301 | + || selector.getCriterion(Type.ETH_SRC) != null)) { | ||
| 295 | forTable = MAC_TABLE; | 302 | forTable = MAC_TABLE; |
| 296 | return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); | 303 | return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); |
| 297 | } | 304 | } |
| ... | @@ -306,6 +313,10 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline | ... | @@ -306,6 +313,10 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline |
| 306 | transition = MAC_TABLE; | 313 | transition = MAC_TABLE; |
| 307 | } else if (selector.getCriterion(Type.IPV4_DST) != null) { | 314 | } else if (selector.getCriterion(Type.IPV4_DST) != null) { |
| 308 | transition = DNAT_TABLE; | 315 | transition = DNAT_TABLE; |
| 316 | + } else if (selector.getCriterion(Type.ETH_TYPE) != null | ||
| 317 | + && selector.getCriterion(Type.ETH_TYPE).equals(Criteria | ||
| 318 | + .matchEthType(EtherType.ARP.ethType().toShort()))) { | ||
| 319 | + transition = ARP_TABLE; | ||
| 309 | } | 320 | } |
| 310 | return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); | 321 | return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); |
| 311 | } | 322 | } |
| ... | @@ -315,6 +326,10 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline | ... | @@ -315,6 +326,10 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline |
| 315 | .matchEthType(EtherType.ARP.ethType().toShort()))) { | 326 | .matchEthType(EtherType.ARP.ethType().toShort()))) { |
| 316 | // CLASSIFIER table arp flow rules | 327 | // CLASSIFIER table arp flow rules |
| 317 | if (selector.getCriterion(Type.TUNNEL_ID) == null) { | 328 | if (selector.getCriterion(Type.TUNNEL_ID) == null) { |
| 329 | + if (selector.getCriterion(Type.ARP_OP) != null) { | ||
| 330 | + forTable = CLASSIFIER_TABLE; | ||
| 331 | + return reassemblyFlowRule(ruleBuilder, tb, null, forTable); | ||
| 332 | + } | ||
| 318 | transition = ARP_TABLE; | 333 | transition = ARP_TABLE; |
| 319 | forTable = CLASSIFIER_TABLE; | 334 | forTable = CLASSIFIER_TABLE; |
| 320 | return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); | 335 | return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); |
| ... | @@ -322,6 +337,13 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline | ... | @@ -322,6 +337,13 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline |
| 322 | forTable = ARP_TABLE; | 337 | forTable = ARP_TABLE; |
| 323 | return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); | 338 | return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); |
| 324 | } | 339 | } |
| 340 | + // SNAT table flow rules | ||
| 341 | + if (selector.getCriterion(Type.TUNNEL_ID) != null | ||
| 342 | + && selector.getCriterion(Type.IPV4_SRC) != null) { | ||
| 343 | + transition = MAC_TABLE; | ||
| 344 | + forTable = SNAT_TABLE; | ||
| 345 | + return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); | ||
| 346 | + } | ||
| 325 | // L3FWD table flow rules | 347 | // L3FWD table flow rules |
| 326 | if (selector.getCriterion(Type.TUNNEL_ID) != null | 348 | if (selector.getCriterion(Type.TUNNEL_ID) != null |
| 327 | && selector.getCriterion(Type.IPV4_DST) != null) { | 349 | && selector.getCriterion(Type.IPV4_DST) != null) { |
| ... | @@ -331,17 +353,18 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline | ... | @@ -331,17 +353,18 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline |
| 331 | } | 353 | } |
| 332 | // DNAT table flow rules | 354 | // DNAT table flow rules |
| 333 | if (selector.getCriterion(Type.IPV4_DST) != null) { | 355 | if (selector.getCriterion(Type.IPV4_DST) != null) { |
| 356 | + IPCriterion ipCriterion = (IPCriterion) selector.getCriterion(Type.IPV4_DST); | ||
| 357 | + IpPrefix ipPrefix = ipCriterion.ip(); | ||
| 358 | + // specific CLASSIFIER table flow rules for userdata | ||
| 359 | + if (ipPrefix.address().equals(IpAddress.valueOf(USERDATA_IP))) { | ||
| 360 | + forTable = CLASSIFIER_TABLE; | ||
| 361 | + transition = MAC_TABLE; | ||
| 362 | + return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); | ||
| 363 | + } | ||
| 334 | transition = L3FWD_TABLE; | 364 | transition = L3FWD_TABLE; |
| 335 | forTable = DNAT_TABLE; | 365 | forTable = DNAT_TABLE; |
| 336 | return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); | 366 | return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); |
| 337 | } | 367 | } |
| 338 | - // SNAT table flow rules | ||
| 339 | - if (selector.getCriterion(Type.TUNNEL_ID) != null | ||
| 340 | - && selector.getCriterion(Type.IPV4_SRC) != null) { | ||
| 341 | - transition = MAC_TABLE; | ||
| 342 | - forTable = SNAT_TABLE; | ||
| 343 | - return reassemblyFlowRule(ruleBuilder, tb, transition, forTable); | ||
| 344 | - } | ||
| 345 | return Collections.singletonList(ruleBuilder.build()); | 368 | return Collections.singletonList(ruleBuilder.build()); |
| 346 | } | 369 | } |
| 347 | 370 | ||
| ... | @@ -371,4 +394,4 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline | ... | @@ -371,4 +394,4 @@ public class OpenVSwitchPipeline extends DefaultSingleTablePipeline |
| 371 | private void pass(Objective obj) { | 394 | private void pass(Objective obj) { |
| 372 | obj.context().ifPresent(context -> context.onSuccess(obj)); | 395 | obj.context().ifPresent(context -> context.onSuccess(obj)); |
| 373 | } | 396 | } |
| 374 | -} | 397 | +} |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -461,6 +461,10 @@ public class DefaultOvsdbClient | ... | @@ -461,6 +461,10 @@ public class DefaultOvsdbClient |
| 461 | return; | 461 | return; |
| 462 | } | 462 | } |
| 463 | 463 | ||
| 464 | + Map<String, String> options = new HashMap<>(); | ||
| 465 | + options.put("disable-in-band", "true"); | ||
| 466 | + bridge.setOtherConfig(options); | ||
| 467 | + | ||
| 464 | String bridgeUuid = getBridgeUuid(bridgeName); | 468 | String bridgeUuid = getBridgeUuid(bridgeName); |
| 465 | if (bridgeUuid == null) { | 469 | if (bridgeUuid == null) { |
| 466 | log.debug("Create a new bridge"); | 470 | log.debug("Create a new bridge"); |
| ... | @@ -525,16 +529,18 @@ public class DefaultOvsdbClient | ... | @@ -525,16 +529,18 @@ public class DefaultOvsdbClient |
| 525 | return; | 529 | return; |
| 526 | } | 530 | } |
| 527 | 531 | ||
| 532 | + Map<String, String> options = new HashMap<>(); | ||
| 533 | + options.put("disable-in-band", "true"); | ||
| 534 | + if (dpid != null) { | ||
| 535 | + options.put("datapath-id", dpid); | ||
| 536 | + } | ||
| 537 | + bridge.setOtherConfig(options); | ||
| 538 | + | ||
| 528 | String bridgeUuid = getBridgeUuid(bridgeName); | 539 | String bridgeUuid = getBridgeUuid(bridgeName); |
| 529 | if (bridgeUuid == null) { | 540 | if (bridgeUuid == null) { |
| 530 | log.debug("Create a new bridge"); | 541 | log.debug("Create a new bridge"); |
| 531 | 542 | ||
| 532 | bridge.setName(bridgeName); | 543 | bridge.setName(bridgeName); |
| 533 | - if (dpid != null) { | ||
| 534 | - Map<String, String> options = new HashMap<>(); | ||
| 535 | - options.put("datapath-id", dpid); | ||
| 536 | - bridge.setOtherConfig(options); | ||
| 537 | - } | ||
| 538 | bridgeUuid = insertConfig(OvsdbConstant.BRIDGE, "_uuid", | 544 | bridgeUuid = insertConfig(OvsdbConstant.BRIDGE, "_uuid", |
| 539 | OvsdbConstant.DATABASENAME, "bridges", | 545 | OvsdbConstant.DATABASENAME, "bridges", |
| 540 | ovsUuid, bridge.getRow()); | 546 | ovsUuid, bridge.getRow()); |
| ... | @@ -586,7 +592,10 @@ public class DefaultOvsdbClient | ... | @@ -586,7 +592,10 @@ public class DefaultOvsdbClient |
| 586 | bridge.setProtocols(protocols); | 592 | bridge.setProtocols(protocols); |
| 587 | 593 | ||
| 588 | Map<String, String> options = new HashMap<>(); | 594 | Map<String, String> options = new HashMap<>(); |
| 589 | - options.put("datapath-id", dpid); | 595 | + options.put("disable-in-band", "true"); |
| 596 | + if (dpid != null) { | ||
| 597 | + options.put("datapath-id", dpid); | ||
| 598 | + } | ||
| 590 | bridge.setOtherConfig(options); | 599 | bridge.setOtherConfig(options); |
| 591 | 600 | ||
| 592 | String bridgeUuid = getBridgeUuid(bridgeName); | 601 | String bridgeUuid = getBridgeUuid(bridgeName); | ... | ... |
-
Please register or login to post a comment