Bug fixes for the centec and noviflow pipelines.
Change-Id: Id0531e54060ff8e2a2321f6c49c8c16e32be45f8
Showing
5 changed files
with
33 additions
and
8 deletions
| ... | @@ -437,6 +437,7 @@ public class FlowRuleManager | ... | @@ -437,6 +437,7 @@ public class FlowRuleManager |
| 437 | for (FlowEntry rule : storedRules) { | 437 | for (FlowEntry rule : storedRules) { |
| 438 | try { | 438 | try { |
| 439 | // there are rules in the store that aren't on the switch | 439 | // there are rules in the store that aren't on the switch |
| 440 | + log.debug("Adding rule in store, but not on switch {}", rule); | ||
| 440 | flowMissing(rule); | 441 | flowMissing(rule); |
| 441 | } catch (Exception e) { | 442 | } catch (Exception e) { |
| 442 | log.debug("Can't add missing flow rule {}", e.getMessage()); | 443 | log.debug("Can't add missing flow rule {}", e.getMessage()); | ... | ... |
| ... | @@ -329,6 +329,7 @@ public final class KryoNamespaces { | ... | @@ -329,6 +329,7 @@ public final class KryoNamespaces { |
| 329 | L2ModificationInstruction.PushHeaderInstructions.class, | 329 | L2ModificationInstruction.PushHeaderInstructions.class, |
| 330 | L2ModificationInstruction.ModVlanIdInstruction.class, | 330 | L2ModificationInstruction.ModVlanIdInstruction.class, |
| 331 | L2ModificationInstruction.ModVlanPcpInstruction.class, | 331 | L2ModificationInstruction.ModVlanPcpInstruction.class, |
| 332 | + L2ModificationInstruction.PopVlanInstruction.class, | ||
| 332 | L2ModificationInstruction.ModMplsLabelInstruction.class, | 333 | L2ModificationInstruction.ModMplsLabelInstruction.class, |
| 333 | L2ModificationInstruction.ModMplsTtlInstruction.class, | 334 | L2ModificationInstruction.ModMplsTtlInstruction.class, |
| 334 | L3ModificationInstruction.class, | 335 | L3ModificationInstruction.class, | ... | ... |
| ... | @@ -14,6 +14,7 @@ import org.onlab.util.KryoNamespace; | ... | @@ -14,6 +14,7 @@ import org.onlab.util.KryoNamespace; |
| 14 | import org.onosproject.core.ApplicationId; | 14 | import org.onosproject.core.ApplicationId; |
| 15 | import org.onosproject.core.CoreService; | 15 | import org.onosproject.core.CoreService; |
| 16 | import org.onosproject.net.DeviceId; | 16 | import org.onosproject.net.DeviceId; |
| 17 | +import org.onosproject.net.PortNumber; | ||
| 17 | import org.onosproject.net.behaviour.NextGroup; | 18 | import org.onosproject.net.behaviour.NextGroup; |
| 18 | import org.onosproject.net.behaviour.Pipeliner; | 19 | import org.onosproject.net.behaviour.Pipeliner; |
| 19 | import org.onosproject.net.behaviour.PipelinerContext; | 20 | import org.onosproject.net.behaviour.PipelinerContext; |
| ... | @@ -78,7 +79,7 @@ public class CentecV350Pipeline extends AbstractHandlerBehaviour implements Pipe | ... | @@ -78,7 +79,7 @@ public class CentecV350Pipeline extends AbstractHandlerBehaviour implements Pipe |
| 78 | protected static final int ROUTE_TABLE = 3; | 79 | protected static final int ROUTE_TABLE = 3; |
| 79 | 80 | ||
| 80 | private static final long DEFAULT_METADATA = 100; | 81 | private static final long DEFAULT_METADATA = 100; |
| 81 | - private static final long DEFAULT_METADATA_MASK = 0xff; | 82 | + private static final long DEFAULT_METADATA_MASK = 0xffffffffffffffffL; |
| 82 | 83 | ||
| 83 | // Priority used in PORT_VLAN Table, the only priority accepted is PORT_VLAN_TABLE_PRIORITY. | 84 | // Priority used in PORT_VLAN Table, the only priority accepted is PORT_VLAN_TABLE_PRIORITY. |
| 84 | // The packet passed PORT+VLAN check will goto FILTER Table. | 85 | // The packet passed PORT+VLAN check will goto FILTER Table. |
| ... | @@ -424,8 +425,22 @@ public class CentecV350Pipeline extends AbstractHandlerBehaviour implements Pipe | ... | @@ -424,8 +425,22 @@ public class CentecV350Pipeline extends AbstractHandlerBehaviour implements Pipe |
| 424 | .forTable(PORT_VLAN_TABLE).build(); | 425 | .forTable(PORT_VLAN_TABLE).build(); |
| 425 | ops = install ? ops.add(rule) : ops.remove(rule); | 426 | ops = install ? ops.add(rule) : ops.remove(rule); |
| 426 | } else if (c.type() == Criterion.Type.IPV4_DST) { | 427 | } else if (c.type() == Criterion.Type.IPV4_DST) { |
| 427 | - // TODO: not needed now? Why not? | 428 | + IPCriterion ipaddr = (IPCriterion) c; |
| 428 | - fail(filt, ObjectiveError.UNSUPPORTED); | 429 | + log.debug("adding IP filtering rules in FILTER table: {}", ipaddr.ip()); |
| 430 | + TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); | ||
| 431 | + TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); | ||
| 432 | + selector.matchEthType(Ethernet.TYPE_IPV4); | ||
| 433 | + selector.matchIPDst(ipaddr.ip()); // router IPs to the controller | ||
| 434 | + treatment.setOutput(PortNumber.CONTROLLER); | ||
| 435 | + FlowRule rule = DefaultFlowRule.builder() | ||
| 436 | + .forDevice(deviceId) | ||
| 437 | + .withSelector(selector.build()) | ||
| 438 | + .withTreatment(treatment.build()) | ||
| 439 | + .withPriority(FILTER_TABLE_CONTROLLER_PRIORITY) | ||
| 440 | + .fromApp(applicationId) | ||
| 441 | + .makePermanent() | ||
| 442 | + .forTable(FILTER_TABLE).build(); | ||
| 443 | + ops = install ? ops.add(rule) : ops.remove(rule); | ||
| 429 | } else { | 444 | } else { |
| 430 | log.warn("Driver does not currently process filtering condition" | 445 | log.warn("Driver does not currently process filtering condition" |
| 431 | + " of type: {}", c.type()); | 446 | + " of type: {}", c.type()); | ... | ... |
| ... | @@ -260,7 +260,8 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe | ... | @@ -260,7 +260,8 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe |
| 260 | selector.matchVlanId(v.vlanId()); | 260 | selector.matchVlanId(v.vlanId()); |
| 261 | selector.matchEthDst(e.mac()); | 261 | selector.matchEthDst(e.mac()); |
| 262 | selector.matchEthType(Ethernet.TYPE_IPV4); | 262 | selector.matchEthType(Ethernet.TYPE_IPV4); |
| 263 | - treatment.transition(FIB_TABLE); | 263 | + treatment.popVlan(); |
| 264 | + treatment.transition(FIB_TABLE); // all other IPs to the FIB table | ||
| 264 | FlowRule rule = DefaultFlowRule.builder() | 265 | FlowRule rule = DefaultFlowRule.builder() |
| 265 | .forDevice(deviceId) | 266 | .forDevice(deviceId) |
| 266 | .withSelector(selector.build()) | 267 | .withSelector(selector.build()) |
| ... | @@ -272,11 +273,14 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe | ... | @@ -272,11 +273,14 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe |
| 272 | ops = ops.add(rule); | 273 | ops = ops.add(rule); |
| 273 | 274 | ||
| 274 | for (IPCriterion ipaddr : ips) { | 275 | for (IPCriterion ipaddr : ips) { |
| 275 | - log.debug("adding IP filtering rules in FIB table: {}", ipaddr.ip()); | 276 | + log.debug("adding IP filtering rules in FILTER table: {}", ipaddr.ip()); |
| 276 | selector = DefaultTrafficSelector.builder(); | 277 | selector = DefaultTrafficSelector.builder(); |
| 277 | treatment = DefaultTrafficTreatment.builder(); | 278 | treatment = DefaultTrafficTreatment.builder(); |
| 279 | + selector.matchInPort(p.port()); | ||
| 280 | + selector.matchVlanId(v.vlanId()); | ||
| 281 | + selector.matchEthDst(e.mac()); | ||
| 278 | selector.matchEthType(Ethernet.TYPE_IPV4); | 282 | selector.matchEthType(Ethernet.TYPE_IPV4); |
| 279 | - selector.matchIPDst(ipaddr.ip()); | 283 | + selector.matchIPDst(ipaddr.ip()); // router IPs to the controller |
| 280 | treatment.setOutput(PortNumber.CONTROLLER); | 284 | treatment.setOutput(PortNumber.CONTROLLER); |
| 281 | rule = DefaultFlowRule.builder() | 285 | rule = DefaultFlowRule.builder() |
| 282 | .forDevice(deviceId) | 286 | .forDevice(deviceId) |
| ... | @@ -285,7 +289,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe | ... | @@ -285,7 +289,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe |
| 285 | .withPriority(HIGHEST_PRIORITY) | 289 | .withPriority(HIGHEST_PRIORITY) |
| 286 | .fromApp(applicationId) | 290 | .fromApp(applicationId) |
| 287 | .makePermanent() | 291 | .makePermanent() |
| 288 | - .forTable(FIB_TABLE).build(); | 292 | + .forTable(FILTER_TABLE).build(); |
| 289 | ops = ops.add(rule); | 293 | ops = ops.add(rule); |
| 290 | } | 294 | } |
| 291 | 295 | ||
| ... | @@ -474,8 +478,9 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe | ... | @@ -474,8 +478,9 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe |
| 474 | */ | 478 | */ |
| 475 | private void processSimpleNextObjective(NextObjective nextObj) { | 479 | private void processSimpleNextObjective(NextObjective nextObj) { |
| 476 | // Simple next objective has a single treatment (not a collection) | 480 | // Simple next objective has a single treatment (not a collection) |
| 481 | + TrafficTreatment treatment = nextObj.next().iterator().next(); | ||
| 477 | flowObjectiveStore.putNextGroup(nextObj.id(), | 482 | flowObjectiveStore.putNextGroup(nextObj.id(), |
| 478 | - new DummyGroup(nextObj.next().iterator().next())); | 483 | + new DummyGroup(treatment)); |
| 479 | } | 484 | } |
| 480 | 485 | ||
| 481 | private class Filter { | 486 | private class Filter { | ... | ... |
| ... | @@ -82,5 +82,8 @@ | ... | @@ -82,5 +82,8 @@ |
| 82 | <behaviour api="org.onosproject.net.behaviour.Pipeliner" | 82 | <behaviour api="org.onosproject.net.behaviour.Pipeliner" |
| 83 | impl="org.onosproject.driver.pipeline.PicaPipeline"/> | 83 | impl="org.onosproject.driver.pipeline.PicaPipeline"/> |
| 84 | </driver> | 84 | </driver> |
| 85 | + <driver name="noviflow" extends="softrouter" | ||
| 86 | + manufacturer="NoviFlow Inc" hwVersion="NS1132" swVersion="NW250.4.4"> | ||
| 87 | + </driver> | ||
| 85 | </drivers> | 88 | </drivers> |
| 86 | 89 | ... | ... |
-
Please register or login to post a comment