Using vlan extension in ofdpa for versatile objectives
Change-Id: I11f35eccd0c103df02ffddb3060fffd5bc13c44f
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
index 111a6c6..c82f9e2 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
@@ -632,10 +632,9 @@
*/
private Collection<FlowRule> processVersatile(ForwardingObjective fwd) {
log.info("Processing versatile forwarding objective");
- TrafficSelector selector = fwd.selector();
EthTypeCriterion ethType =
- (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
+ (EthTypeCriterion) fwd.selector().getCriterion(Criterion.Type.ETH_TYPE);
if (ethType == null) {
log.error("Versatile forwarding objective must include ethType");
fail(fwd, ObjectiveError.BADPARAMS);
@@ -647,6 +646,23 @@
return Collections.emptySet();
}
+ TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
+ fwd.selector().criteria().forEach(criterion -> {
+ if (criterion instanceof VlanIdCriterion) {
+ VlanId vlanId = ((VlanIdCriterion) criterion).vlanId();
+ // ensure that match does not include vlan = NONE as OF-DPA does not
+ // match untagged packets this way in the ACL table.
+ if (vlanId.equals(VlanId.NONE)) {
+ return;
+ }
+ OfdpaMatchVlanVid ofdpaMatchVlanVid =
+ new OfdpaMatchVlanVid(vlanId);
+ sbuilder.extension(ofdpaMatchVlanVid, deviceId);
+ } else {
+ sbuilder.add(criterion);
+ }
+ });
+
// XXX driver does not currently do type checking as per Tables 65-67 in
// OFDPA 2.0 spec. The only allowed treatment is a punt to the controller.
TrafficTreatment.Builder ttBuilder = DefaultTrafficTreatment.builder();
@@ -679,22 +695,12 @@
}
ttBuilder.deferred().group(group.id());
}
- // ensure that match does not include vlan = NONE as OF-DPA does not
- // match untagged packets this way in the ACL table.
- TrafficSelector.Builder selBuilder = DefaultTrafficSelector.builder();
- for (Criterion criterion : fwd.selector().criteria()) {
- if (criterion instanceof VlanIdCriterion &&
- ((VlanIdCriterion) criterion).vlanId() == VlanId.NONE) {
- continue;
- }
- selBuilder.add(criterion);
- }
FlowRule.Builder ruleBuilder = DefaultFlowRule.builder()
.fromApp(fwd.appId())
.withPriority(fwd.priority())
.forDevice(deviceId)
- .withSelector(selBuilder.build())
+ .withSelector(sbuilder.build())
.withTreatment(ttBuilder.build())
.makePermanent()
.forTable(ACL_TABLE);