Saurav Das
Committed by Yuta HIGUCHI

Using vlan extension in ofdpa for versatile objectives

Change-Id: I11f35eccd0c103df02ffddb3060fffd5bc13c44f
...@@ -632,10 +632,9 @@ public class OFDPA2Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -632,10 +632,9 @@ public class OFDPA2Pipeline extends AbstractHandlerBehaviour implements Pipeline
632 */ 632 */
633 private Collection<FlowRule> processVersatile(ForwardingObjective fwd) { 633 private Collection<FlowRule> processVersatile(ForwardingObjective fwd) {
634 log.info("Processing versatile forwarding objective"); 634 log.info("Processing versatile forwarding objective");
635 - TrafficSelector selector = fwd.selector();
636 635
637 EthTypeCriterion ethType = 636 EthTypeCriterion ethType =
638 - (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); 637 + (EthTypeCriterion) fwd.selector().getCriterion(Criterion.Type.ETH_TYPE);
639 if (ethType == null) { 638 if (ethType == null) {
640 log.error("Versatile forwarding objective must include ethType"); 639 log.error("Versatile forwarding objective must include ethType");
641 fail(fwd, ObjectiveError.BADPARAMS); 640 fail(fwd, ObjectiveError.BADPARAMS);
...@@ -647,6 +646,23 @@ public class OFDPA2Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -647,6 +646,23 @@ public class OFDPA2Pipeline extends AbstractHandlerBehaviour implements Pipeline
647 return Collections.emptySet(); 646 return Collections.emptySet();
648 } 647 }
649 648
649 + TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
650 + fwd.selector().criteria().forEach(criterion -> {
651 + if (criterion instanceof VlanIdCriterion) {
652 + VlanId vlanId = ((VlanIdCriterion) criterion).vlanId();
653 + // ensure that match does not include vlan = NONE as OF-DPA does not
654 + // match untagged packets this way in the ACL table.
655 + if (vlanId.equals(VlanId.NONE)) {
656 + return;
657 + }
658 + OfdpaMatchVlanVid ofdpaMatchVlanVid =
659 + new OfdpaMatchVlanVid(vlanId);
660 + sbuilder.extension(ofdpaMatchVlanVid, deviceId);
661 + } else {
662 + sbuilder.add(criterion);
663 + }
664 + });
665 +
650 // XXX driver does not currently do type checking as per Tables 65-67 in 666 // XXX driver does not currently do type checking as per Tables 65-67 in
651 // OFDPA 2.0 spec. The only allowed treatment is a punt to the controller. 667 // OFDPA 2.0 spec. The only allowed treatment is a punt to the controller.
652 TrafficTreatment.Builder ttBuilder = DefaultTrafficTreatment.builder(); 668 TrafficTreatment.Builder ttBuilder = DefaultTrafficTreatment.builder();
...@@ -679,22 +695,12 @@ public class OFDPA2Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -679,22 +695,12 @@ public class OFDPA2Pipeline extends AbstractHandlerBehaviour implements Pipeline
679 } 695 }
680 ttBuilder.deferred().group(group.id()); 696 ttBuilder.deferred().group(group.id());
681 } 697 }
682 - // ensure that match does not include vlan = NONE as OF-DPA does not
683 - // match untagged packets this way in the ACL table.
684 - TrafficSelector.Builder selBuilder = DefaultTrafficSelector.builder();
685 - for (Criterion criterion : fwd.selector().criteria()) {
686 - if (criterion instanceof VlanIdCriterion &&
687 - ((VlanIdCriterion) criterion).vlanId() == VlanId.NONE) {
688 - continue;
689 - }
690 - selBuilder.add(criterion);
691 - }
692 698
693 FlowRule.Builder ruleBuilder = DefaultFlowRule.builder() 699 FlowRule.Builder ruleBuilder = DefaultFlowRule.builder()
694 .fromApp(fwd.appId()) 700 .fromApp(fwd.appId())
695 .withPriority(fwd.priority()) 701 .withPriority(fwd.priority())
696 .forDevice(deviceId) 702 .forDevice(deviceId)
697 - .withSelector(selBuilder.build()) 703 + .withSelector(sbuilder.build())
698 .withTreatment(ttBuilder.build()) 704 .withTreatment(ttBuilder.build())
699 .makePermanent() 705 .makePermanent()
700 .forTable(ACL_TABLE); 706 .forTable(ACL_TABLE);
......