Saurav Das

Improvements for the ofdpa driver.

New driver for ofdpa emulation with cpqd switch.

Change-Id: I5221069e07abe57538d4e988cdb7190b50c595f7
1 +package org.onosproject.driver.pipeline;
2 +
3 +import static org.slf4j.LoggerFactory.getLogger;
4 +
5 +import org.onosproject.net.flow.DefaultFlowRule;
6 +import org.onosproject.net.flow.DefaultTrafficSelector;
7 +import org.onosproject.net.flow.DefaultTrafficTreatment;
8 +import org.onosproject.net.flow.FlowRule;
9 +import org.onosproject.net.flow.FlowRuleOperations;
10 +import org.onosproject.net.flow.FlowRuleOperationsContext;
11 +import org.onosproject.net.flow.TrafficSelector;
12 +import org.onosproject.net.flow.TrafficTreatment;
13 +import org.slf4j.Logger;
14 +
15 +
16 +/**
17 + * Driver for software switch emulation of the OFDPA 1.0 pipeline.
18 + * The software switch is the CPqD OF 1.3 switch.
19 + */
20 +public class CpqdOFDPA1Pipeline extends OFDPA1Pipeline {
21 +
22 + private final Logger log = getLogger(getClass());
23 +
24 + @Override
25 + protected void initializePipeline() {
26 + processPortTable();
27 + //processVlanTable();
28 + processTmacTable();
29 + processIpTable();
30 + //processMcastTable();
31 + processBridgingTable();
32 + //processAclTable();
33 + //processGroupTable();
34 + }
35 +
36 + @Override
37 + protected void processPortTable() {
38 + FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
39 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
40 + TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
41 + treatment.transition(VLAN_TABLE);
42 + FlowRule tmisse = DefaultFlowRule.builder()
43 + .forDevice(deviceId)
44 + .withSelector(selector.build())
45 + .withTreatment(treatment.build())
46 + .withPriority(LOWEST_PRIORITY)
47 + .fromApp(driverId)
48 + .makePermanent()
49 + .forTable(PORT_TABLE).build();
50 + ops = ops.add(tmisse);
51 +
52 + flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
53 + @Override
54 + public void onSuccess(FlowRuleOperations ops) {
55 + log.info("Initialized port table");
56 + }
57 +
58 + @Override
59 + public void onError(FlowRuleOperations ops) {
60 + log.info("Failed to initialize port table");
61 + }
62 + }));
63 + }
64 +
65 + @Override
66 + protected void processTmacTable() {
67 + //table miss entry
68 + FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
69 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
70 + TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
71 + selector = DefaultTrafficSelector.builder();
72 + treatment = DefaultTrafficTreatment.builder();
73 + treatment.transition(BRIDGING_TABLE);
74 + FlowRule rule = DefaultFlowRule.builder()
75 + .forDevice(deviceId)
76 + .withSelector(selector.build())
77 + .withTreatment(treatment.build())
78 + .withPriority(LOWEST_PRIORITY)
79 + .fromApp(driverId)
80 + .makePermanent()
81 + .forTable(TMAC_TABLE).build();
82 + ops = ops.add(rule);
83 + flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
84 + @Override
85 + public void onSuccess(FlowRuleOperations ops) {
86 + log.info("Initialized tmac table");
87 + }
88 +
89 + @Override
90 + public void onError(FlowRuleOperations ops) {
91 + log.info("Failed to initialize tmac table");
92 + }
93 + }));
94 + }
95 +
96 + @Override
97 + protected void processIpTable() {
98 + //table miss entry
99 + FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
100 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
101 + TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
102 + selector = DefaultTrafficSelector.builder();
103 + treatment = DefaultTrafficTreatment.builder();
104 + treatment.transition(ACL_TABLE);
105 + FlowRule rule = DefaultFlowRule.builder()
106 + .forDevice(deviceId)
107 + .withSelector(selector.build())
108 + .withTreatment(treatment.build())
109 + .withPriority(LOWEST_PRIORITY)
110 + .fromApp(driverId)
111 + .makePermanent()
112 + .forTable(UNICAST_ROUTING_TABLE).build();
113 + ops = ops.add(rule);
114 + flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
115 + @Override
116 + public void onSuccess(FlowRuleOperations ops) {
117 + log.info("Initialized IP table");
118 + }
119 +
120 + @Override
121 + public void onError(FlowRuleOperations ops) {
122 + log.info("Failed to initialize unicast IP table");
123 + }
124 + }));
125 + }
126 +
127 + private void processBridgingTable() {
128 + //table miss entry
129 + FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
130 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
131 + TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
132 + selector = DefaultTrafficSelector.builder();
133 + treatment = DefaultTrafficTreatment.builder();
134 + treatment.transition(ACL_TABLE);
135 + FlowRule rule = DefaultFlowRule.builder()
136 + .forDevice(deviceId)
137 + .withSelector(selector.build())
138 + .withTreatment(treatment.build())
139 + .withPriority(LOWEST_PRIORITY)
140 + .fromApp(driverId)
141 + .makePermanent()
142 + .forTable(BRIDGING_TABLE).build();
143 + ops = ops.add(rule);
144 + flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
145 + @Override
146 + public void onSuccess(FlowRuleOperations ops) {
147 + log.info("Initialized Bridging table");
148 + }
149 +
150 + @Override
151 + public void onError(FlowRuleOperations ops) {
152 + log.info("Failed to initialize Bridging table");
153 + }
154 + }));
155 +
156 + }
157 +
158 +}
...@@ -105,7 +105,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -105,7 +105,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline
105 105
106 private static final int HIGHEST_PRIORITY = 0xffff; 106 private static final int HIGHEST_PRIORITY = 0xffff;
107 private static final int DEFAULT_PRIORITY = 0x8000; 107 private static final int DEFAULT_PRIORITY = 0x8000;
108 - private static final int LOWEST_PRIORITY = 0x0; 108 + protected static final int LOWEST_PRIORITY = 0x0;
109 109
110 /* 110 /*
111 * Group keys are normally generated by using the next Objective id. In the 111 * Group keys are normally generated by using the next Objective id. In the
...@@ -130,12 +130,12 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -130,12 +130,12 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline
130 130
131 private final Logger log = getLogger(getClass()); 131 private final Logger log = getLogger(getClass());
132 private ServiceDirectory serviceDirectory; 132 private ServiceDirectory serviceDirectory;
133 - private FlowRuleService flowRuleService; 133 + protected FlowRuleService flowRuleService;
134 private CoreService coreService; 134 private CoreService coreService;
135 private GroupService groupService; 135 private GroupService groupService;
136 private FlowObjectiveStore flowObjectiveStore; 136 private FlowObjectiveStore flowObjectiveStore;
137 - private DeviceId deviceId; 137 + protected DeviceId deviceId;
138 - private ApplicationId driverId; 138 + protected ApplicationId driverId;
139 139
140 private KryoNamespace appKryo = new KryoNamespace.Builder() 140 private KryoNamespace appKryo = new KryoNamespace.Builder()
141 .register(KryoNamespaces.API) 141 .register(KryoNamespaces.API)
...@@ -610,7 +610,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -610,7 +610,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline
610 } 610 }
611 611
612 612
613 - private void initializePipeline() { 613 + protected void initializePipeline() {
614 processPortTable(); 614 processPortTable();
615 processVlanTable(); 615 processVlanTable();
616 processTmacTable(); 616 processTmacTable();
...@@ -621,7 +621,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -621,7 +621,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline
621 //processGroupTable(); 621 //processGroupTable();
622 } 622 }
623 623
624 - private void processPortTable() { 624 + protected void processPortTable() {
625 //XXX is table miss entry enough or do we need to do the maskable in-port 0? 625 //XXX is table miss entry enough or do we need to do the maskable in-port 0?
626 FlowRuleOperations.Builder ops = FlowRuleOperations.builder(); 626 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
627 TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); 627 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
...@@ -653,56 +653,12 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -653,56 +653,12 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline
653 } 653 }
654 654
655 private void processVlanTable() { 655 private void processVlanTable() {
656 - // make these up for now - should really be filtering rules
657 - /*FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
658 - TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
659 - TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
660 - selector.matchInPort(PortNumber.portNumber(10));
661 - selector.matchVlanId(VlanId.vlanId((short) 100));
662 - treatment.transition(TMAC_TABLE);
663 - FlowRule rule = DefaultFlowRule.builder()
664 - .forDevice(deviceId)
665 - .withSelector(selector.build())
666 - .withTreatment(treatment.build())
667 - .withPriority(DEFAULT_PRIORITY)
668 - .fromApp(appId)
669 - .makePermanent()
670 - .forTable(VLAN_TABLE).build();
671 - ops = ops.add(rule);
672 - flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
673 - @Override
674 - public void onSuccess(FlowRuleOperations ops) {
675 - log.info("Initialized vlan table");
676 - }
677 -
678 - @Override
679 - public void onError(FlowRuleOperations ops) {
680 - log.info("Failed to initialize vlan table");
681 - }
682 - }));*/
683 -
684 // Table miss entry is not required as ofdpa default is to drop 656 // Table miss entry is not required as ofdpa default is to drop
685 // In OF terms, the absence of a t.m.e. also implies drop 657 // In OF terms, the absence of a t.m.e. also implies drop
686 } 658 }
687 659
688 660
689 - private void processTmacTable() { 661 + protected void processTmacTable() {
690 - // this is made up as well -- should be a filtering rule
691 - /*selector.matchInPort(PortNumber.portNumber(10));
692 - selector.matchVlanId(VlanId.vlanId((short) 100));
693 - selector.matchEthType(Ethernet.TYPE_IPV4);
694 - selector.matchEthDst(MacAddress.valueOf("00:00:00:ba:ba:00"));
695 - treatment.transition(UNICAST_ROUTING_TABLE);
696 - FlowRule rule = DefaultFlowRule.builder()
697 - .forDevice(deviceId)
698 - .withSelector(selector.build())
699 - .withTreatment(treatment.build())
700 - .withPriority(DEFAULT_PRIORITY)
701 - .fromApp(appId)
702 - .makePermanent()
703 - .forTable(TMAC_TABLE).build();
704 - ops = ops.add(rule);*/
705 -
706 //table miss entry 662 //table miss entry
707 FlowRuleOperations.Builder ops = FlowRuleOperations.builder(); 663 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
708 TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); 664 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
...@@ -732,7 +688,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -732,7 +688,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline
732 }));*/ 688 }));*/
733 } 689 }
734 690
735 - private void processIpTable() { 691 + protected void processIpTable() {
736 //table miss entry 692 //table miss entry
737 FlowRuleOperations.Builder ops = FlowRuleOperations.builder(); 693 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
738 TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); 694 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
...@@ -762,72 +718,16 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -762,72 +718,16 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline
762 }));*/ 718 }));*/
763 } 719 }
764 720
765 - @SuppressWarnings("unused")
766 - private void processGroupTable() {
767 - // Creating a dummy L2 group as per OFDPA requirements
768 - /* TrafficTreatment treatment = DefaultTrafficTreatment.builder()
769 - .setOutput(PortNumber.portNumber(10))
770 - .build();
771 - NextObjective nextObjective = DefaultNextObjective.builder()
772 - .addTreatment(treatment)
773 - .fromApp(appId)
774 - .withId(678) // dummy next objective id
775 - .withType(NextObjective.Type.SIMPLE)
776 - .add();
777 - Integer l2groupId = 0x0064000a;
778 - GroupBucket bucket =
779 - DefaultGroupBucket.createIndirectGroupBucket(treatment);
780 - final GroupKey key = new DefaultGroupKey(appKryo.serialize(678));
781 - GroupDescription groupDescriptionl2
782 - = new DefaultGroupDescription(deviceId,
783 - GroupDescription.Type.INDIRECT,
784 - new GroupBuckets(Collections
785 - .singletonList(bucket)),
786 - key,
787 - l2groupId,
788 - appId);
789 - groupService.addGroup(groupDescriptionl2);*/
790 - //pendingNextObjectives.put(key, nextObjective);
791 -
792 - }
793 -
794 - @SuppressWarnings("unused")
795 - private void tryGroupChain() {
796 - //Create a dummy L3 group as per OFDPA requirements
797 - /*TrafficTreatment treatment2 = DefaultTrafficTreatment.builder()
798 - .setEthDst(MacAddress.valueOf("00:00:00:aa:aa:aa"))
799 - .setEthSrc(MacAddress.valueOf("00:00:00:dd:dd:dd"))
800 - .setVlanId(VlanId.vlanId((short) 100))
801 - .group(new DefaultGroupId(0x0064000a))
802 - .build();
803 - NextObjective nextObjective2 = DefaultNextObjective.builder()
804 - .addTreatment(treatment2)
805 - .fromApp(appId)
806 - .withId(67800) // another dummy next objective id
807 - .withType(NextObjective.Type.SIMPLE)
808 - .add();
809 - Integer l3groupId = 0x2000000a;
810 - GroupBucket bucket2 = DefaultGroupBucket.createIndirectGroupBucket(treatment2);
811 - final GroupKey key2 = new DefaultGroupKey(appKryo.serialize(67800));
812 - GroupDescription groupDescriptionl3
813 - = new DefaultGroupDescription(deviceId,
814 - GroupDescription.Type.INDIRECT,
815 - new GroupBuckets(Collections
816 - .singletonList(bucket2)),
817 - key2,
818 - l3groupId,
819 - appId);
820 - groupService.addGroup(groupDescriptionl3);
821 - pendingNextObjectives.put(key2, nextObjective2);
822 - */
823 - }
824 -
825 private class GroupChecker implements Runnable { 721 private class GroupChecker implements Runnable {
826 @Override 722 @Override
827 public void run() { 723 public void run() {
828 Set<GroupKey> keys = pendingGroups.keySet().stream() 724 Set<GroupKey> keys = pendingGroups.keySet().stream()
829 .filter(key -> groupService.getGroup(deviceId, key) != null) 725 .filter(key -> groupService.getGroup(deviceId, key) != null)
830 .collect(Collectors.toSet()); 726 .collect(Collectors.toSet());
727 + Set<GroupKey> otherkeys = pendingNextObjectives.asMap().keySet().stream()
728 + .filter(otherkey -> groupService.getGroup(deviceId, otherkey) != null)
729 + .collect(Collectors.toSet());
730 + keys.addAll(otherkeys);
831 731
832 keys.stream().forEach(key -> { 732 keys.stream().forEach(key -> {
833 //first check for group chain 733 //first check for group chain
...@@ -856,7 +756,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline ...@@ -856,7 +756,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline
856 private class InnerGroupListener implements GroupListener { 756 private class InnerGroupListener implements GroupListener {
857 @Override 757 @Override
858 public void event(GroupEvent event) { 758 public void event(GroupEvent event) {
859 - log.info("received group event of type {}", event.type()); 759 + log.debug("received group event of type {}", event.type());
860 if (event.type() == GroupEvent.Type.GROUP_ADDED) { 760 if (event.type() == GroupEvent.Type.GROUP_ADDED) {
861 GroupKey key = event.subject().appCookie(); 761 GroupKey key = event.subject().appCookie();
862 // first check for group chain 762 // first check for group chain
......
...@@ -63,9 +63,10 @@ ...@@ -63,9 +63,10 @@
63 impl="org.onosproject.driver.pipeline.OFDPA1Pipeline"/> 63 impl="org.onosproject.driver.pipeline.OFDPA1Pipeline"/>
64 </driver> 64 </driver>
65 <!-- The SoftRouter driver is meant to be used by any software/NPU based 65 <!-- The SoftRouter driver is meant to be used by any software/NPU based
66 - ~ switch that wishes to implement a simple 2-table router. ONOS needs to 66 + ~ switch that wishes to implement a simple 2-table router. To use this
67 - ~ be configured with the dpid of such a device to attach this driver 67 + ~ driver, configure ONOS with the dpid of the device, or extend the
68 - ~ to the device. 68 + ~ driver declaration with the manufacturer/hwVersion/swVersion of the
69 + ~ device (see 'noviflow' example).
69 --> 70 -->
70 <driver name="softrouter" extends="default" 71 <driver name="softrouter" extends="default"
71 manufacturer="Various" hwVersion="various" swVersion="0.0.0"> 72 manufacturer="Various" hwVersion="various" swVersion="0.0.0">
...@@ -85,5 +86,14 @@ ...@@ -85,5 +86,14 @@
85 <driver name="noviflow" extends="softrouter" 86 <driver name="noviflow" extends="softrouter"
86 manufacturer="NoviFlow Inc" hwVersion="NS1132" swVersion="NW250.4.4"> 87 manufacturer="NoviFlow Inc" hwVersion="NS1132" swVersion="NW250.4.4">
87 </driver> 88 </driver>
89 + <!-- Emulation of the ofdpa pipeline using a CPqD OF 1.3 software switch.
90 + ~ To use this driver, configure ONOS with the dpid of the device.
91 + -->
92 + <driver name="ofdpa-cpqd" extends="default"
93 + manufacturer="ONF"
94 + hwVersion="OF1.3 Software Switch from CPqD" swVersion="for Group Chaining">
95 + <behaviour api="org.onosproject.net.behaviour.Pipeliner"
96 + impl="org.onosproject.driver.pipeline.CpqdOFDPA1Pipeline"/>
97 + </driver>
88 </drivers> 98 </drivers>
89 99
......