Implementation of new Flow Subsystem:
The subsystem no longer returns futures for tracking completion of work.
Notifications are explicitely returned via a call back mechanism. Also, the
subsystem is now asynchronous.
Change-Id: I1a4cef931c24820f9ae9ed9a5398f163f05dfbc9
more flowservice improvements
Change-Id: I5c9c1b6be4b2ebfa523b64f6f52e7634b7d3e05f
more flowservice impl
Change-Id: I05f6774460effb53ced8c36844bcda2f8f6c096f
Manager to store functional (at least i believe it)
Change-Id: I09b04989bd1004c98fe0bafed4c76714b9155d53
flow subsystem functional: need to fix unit tests
Change-Id: I1667f25b91320f625a03e5e1d5e92823184d9de0
flow subsystem functional
Change-Id: I429b3335c16d4fc16f5d55f233dd37c4d1d6111d
finished refactor of flow subsystem
Change-Id: I1899abc6ff6a974a2018d936cc555049c70a6804
fix for null flow provider to use new api
Change-Id: If2fd9bd5baf74d9c61c5c8085cef8bc2d204cbdc
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
index 04ff897..8f2b5f4 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
@@ -35,6 +35,7 @@
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
import org.onosproject.openflow.controller.Dpid;
+import org.projectfloodlight.openflow.protocol.OFFlowMod;
import org.projectfloodlight.openflow.protocol.OFFlowRemoved;
import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry;
import org.projectfloodlight.openflow.protocol.OFInstructionType;
@@ -74,13 +75,16 @@
private final OFFlowStatsEntry stat;
private final OFFlowRemoved removed;
+ private final OFFlowMod flowMod;
private final Match match;
private final List<OFAction> actions;
private final Dpid dpid;
- private final boolean addedRule;
+ public enum FlowType { STAT, REMOVED, MOD }
+
+ private final FlowType type;
public FlowEntryBuilder(Dpid dpid, OFFlowStatsEntry entry) {
@@ -89,7 +93,8 @@
this.actions = getActions(entry);
this.dpid = dpid;
this.removed = null;
- this.addedRule = true;
+ this.flowMod = null;
+ this.type = FlowType.STAT;
}
public FlowEntryBuilder(Dpid dpid, OFFlowRemoved removed) {
@@ -99,26 +104,48 @@
this.dpid = dpid;
this.actions = null;
this.stat = null;
- this.addedRule = false;
+ this.flowMod = null;
+ this.type = FlowType.REMOVED;
}
- public FlowEntry build() {
- if (addedRule) {
- FlowRule rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)),
- buildSelector(), buildTreatment(), stat.getPriority(),
- stat.getCookie().getValue(), stat.getIdleTimeout(), false);
- return new DefaultFlowEntry(rule, FlowEntryState.ADDED,
- stat.getDurationSec(), stat.getPacketCount().getValue(),
- stat.getByteCount().getValue());
+ public FlowEntryBuilder(Dpid dpid, OFFlowMod fm) {
+ this.match = fm.getMatch();
+ this.dpid = dpid;
+ this.actions = fm.getActions();
+ this.type = FlowType.MOD;
+ this.flowMod = fm;
+ this.stat = null;
+ this.removed = null;
+ }
- } else {
- FlowRule rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)),
- buildSelector(), null, removed.getPriority(),
- removed.getCookie().getValue(), removed.getIdleTimeout(), false);
- return new DefaultFlowEntry(rule, FlowEntryState.REMOVED, removed.getDurationSec(),
- removed.getPacketCount().getValue(), removed.getByteCount().getValue());
+ public FlowEntry build(FlowEntryState... state) {
+ FlowRule rule;
+ switch (this.type) {
+ case STAT:
+ rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)),
+ buildSelector(), buildTreatment(), stat.getPriority(),
+ stat.getCookie().getValue(), stat.getIdleTimeout(), false);
+ return new DefaultFlowEntry(rule, FlowEntryState.ADDED,
+ stat.getDurationSec(), stat.getPacketCount().getValue(),
+ stat.getByteCount().getValue());
+ case REMOVED:
+ rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)),
+ buildSelector(), null, removed.getPriority(),
+ removed.getCookie().getValue(), removed.getIdleTimeout(), false);
+ return new DefaultFlowEntry(rule, FlowEntryState.REMOVED, removed.getDurationSec(),
+ removed.getPacketCount().getValue(), removed.getByteCount().getValue());
+ case MOD:
+ FlowEntryState flowState = state.length > 0 ? state[0] : FlowEntryState.FAILED;
+ rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)),
+ buildSelector(), buildTreatment(), flowMod.getPriority(),
+ flowMod.getCookie().getValue(), flowMod.getIdleTimeout(), false);
+ return new DefaultFlowEntry(rule, flowState, 0, 0, 0);
+ default:
+ log.error("Unknown flow type : {}", this.type);
+ return null;
}
+
}
private List<OFAction> getActions(OFFlowStatsEntry entry) {