flowrules no longer install a timeout but are monitored by onos in order to be expired
Change-Id: Ibd1a5952349d7ccb27c92b4982d04574f31424c0
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultFlowRule.java b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultFlowRule.java
index f705a94..bb4805b 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultFlowRule.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultFlowRule.java
@@ -27,11 +27,12 @@
private final ApplicationId appId;
- private boolean expired;
+ private final int timeout;
public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector,
TrafficTreatment treatment, int priority, FlowRuleState state,
- long life, long packets, long bytes, long flowId, boolean expired) {
+ long life, long packets, long bytes, long flowId, boolean expired,
+ int timeout) {
this.deviceId = deviceId;
this.priority = priority;
this.selector = selector;
@@ -39,26 +40,30 @@
this.state = state;
this.appId = ApplicationId.valueOf((int) (flowId >> 32));
this.id = FlowId.valueOf(flowId);
- this.expired = expired;
this.life = life;
this.packets = packets;
this.bytes = bytes;
this.created = System.currentTimeMillis();
+ this.timeout = timeout;
}
public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector,
- TrafficTreatment treatement, int priority, ApplicationId appId) {
- this(deviceId, selector, treatement, priority, FlowRuleState.CREATED, appId);
+ TrafficTreatment treatement, int priority, ApplicationId appId,
+ int timeout) {
+ this(deviceId, selector, treatement, priority,
+ FlowRuleState.CREATED, appId, timeout);
}
public DefaultFlowRule(FlowRule rule, FlowRuleState state) {
this(rule.deviceId(), rule.selector(), rule.treatment(),
- rule.priority(), state, rule.id(), rule.appId());
+ rule.priority(), state, rule.id(), rule.appId(),
+ rule.timeout());
}
private DefaultFlowRule(DeviceId deviceId,
TrafficSelector selector, TrafficTreatment treatment,
- int priority, FlowRuleState state, ApplicationId appId) {
+ int priority, FlowRuleState state, ApplicationId appId,
+ int timeout) {
this.deviceId = deviceId;
this.priority = priority;
this.selector = selector;
@@ -69,13 +74,16 @@
this.bytes = 0;
this.appId = appId;
+ this.timeout = timeout;
+
this.id = FlowId.valueOf((((long) appId().id()) << 32) | (this.hash() & 0xffffffffL));
this.created = System.currentTimeMillis();
}
private DefaultFlowRule(DeviceId deviceId,
TrafficSelector selector, TrafficTreatment treatment,
- int priority, FlowRuleState state, FlowId flowId, ApplicationId appId) {
+ int priority, FlowRuleState state, FlowId flowId, ApplicationId appId,
+ int timeout) {
this.deviceId = deviceId;
this.priority = priority;
this.selector = selector;
@@ -86,6 +94,7 @@
this.bytes = 0;
this.appId = appId;
this.id = flowId;
+ this.timeout = timeout;
this.created = System.currentTimeMillis();
}
@@ -149,7 +158,7 @@
* @see java.lang.Object#equals(java.lang.Object)
*/
public int hashCode() {
- return Objects.hash(deviceId, id);
+ return Objects.hash(deviceId, selector, priority);
}
public int hash() {
@@ -170,7 +179,10 @@
if (obj instanceof DefaultFlowRule) {
DefaultFlowRule that = (DefaultFlowRule) obj;
return Objects.equals(deviceId, that.deviceId) &&
- Objects.equals(id, that.id);
+ //Objects.equals(id, that.id) &&
+ Objects.equals(priority, that.priority) &&
+ Objects.equals(selector, that.selector);
+
}
return false;
}
@@ -181,16 +193,16 @@
.add("id", id)
.add("deviceId", deviceId)
.add("priority", priority)
- .add("selector", selector)
- .add("treatment", treatment)
+ .add("selector", selector.criteria())
+ .add("treatment", treatment == null ? "N/A" : treatment.instructions())
.add("created", created)
.add("state", state)
.toString();
}
@Override
- public boolean expired() {
- return expired;
+ public int timeout() {
+ return timeout > MAX_TIMEOUT ? MAX_TIMEOUT : this.timeout;
}
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java
index 8f68ea5..d792c7e 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java
@@ -3,8 +3,9 @@
import static org.slf4j.LoggerFactory.getLogger;
import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
import org.onlab.onos.net.PortNumber;
import org.onlab.onos.net.flow.criteria.Criteria;
@@ -16,22 +17,42 @@
public final class DefaultTrafficSelector implements TrafficSelector {
- private final List<Criterion> selector;
+ private final Set<Criterion> selector;
- private DefaultTrafficSelector(List<Criterion> selector) {
- this.selector = Collections.unmodifiableList(selector);
+ private DefaultTrafficSelector(Set<Criterion> selector) {
+ this.selector = Collections.unmodifiableSet(selector);
}
@Override
- public List<Criterion> criteria() {
+ public Set<Criterion> criteria() {
return selector;
}
+ @Override
+ public int hashCode() {
+ return Objects.hash(selector);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof DefaultTrafficSelector) {
+ DefaultTrafficSelector that = (DefaultTrafficSelector) obj;
+ return Objects.equals(selector, that.selector);
+
+ }
+ return false;
+ }
+
+
+
public static class Builder implements TrafficSelector.Builder {
private final Logger log = getLogger(getClass());
- private final List<Criterion> selector = new LinkedList<>();
+ private final Set<Criterion> selector = new HashSet<>();
@Override
public Builder add(Criterion criterion) {
@@ -39,38 +60,47 @@
return this;
}
+ @Override
public Builder matchInport(PortNumber port) {
return add(Criteria.matchInPort(port));
}
+ @Override
public Builder matchEthSrc(MacAddress addr) {
return add(Criteria.matchEthSrc(addr));
}
+ @Override
public Builder matchEthDst(MacAddress addr) {
return add(Criteria.matchEthDst(addr));
}
+ @Override
public Builder matchEthType(short ethType) {
return add(Criteria.matchEthType(ethType));
}
+ @Override
public Builder matchVlanId(VlanId vlanId) {
return add(Criteria.matchVlanId(vlanId));
}
+ @Override
public Builder matchVlanPcp(Byte vlanPcp) {
return add(Criteria.matchVlanPcp(vlanPcp));
}
+ @Override
public Builder matchIPProtocol(Byte proto) {
return add(Criteria.matchIPProtocol(proto));
}
+ @Override
public Builder matchIPSrc(IpPrefix ip) {
return add(Criteria.matchIPSrc(ip));
}
+ @Override
public Builder matchIPDst(IpPrefix ip) {
return add(Criteria.matchIPDst(ip));
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRule.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRule.java
index 2728e21..4d1b3cf 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRule.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRule.java
@@ -9,6 +9,7 @@
*/
public interface FlowRule {
+ static final int MAX_TIMEOUT = 60;
public enum FlowRuleState {
/**
@@ -112,10 +113,9 @@
long bytes();
/**
- * Indicates that this flow has expired at the device.
- *
- * @return true if it has expired, false otherwise
+ * Returns the timeout for this flow requested by an application.
+ * @return integer value of the timeout
*/
- boolean expired();
+ int timeout();
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProvider.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProvider.java
index b2c3d30..c4e2f92 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProvider.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProvider.java
@@ -8,6 +8,8 @@
*/
public interface FlowRuleProvider extends Provider {
+ static final int POLL_INTERVAL = 5;
+
/**
* Instructs the provider to apply the specified flow rules to their
* respective devices.
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProviderService.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProviderService.java
index 01e4372..2076103 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProviderService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProviderService.java
@@ -17,27 +17,6 @@
void flowRemoved(FlowRule flowRule);
/**
- * Signals that a flow rule is missing for some network traffic.
- *
- * @param flowRule information about traffic in need of flow rule(s)
- */
- void flowMissing(FlowRule flowRule);
-
- /**
- * Signals that a flow rule is on the switch but not in the store.
- *
- * @param flowRule the extra flow rule
- */
- void extraneousFlow(FlowRule flowRule);
-
- /**
- * Signals that a flow rule was indeed added.
- *
- * @param flowRule the added flow rule
- */
- void flowAdded(FlowRule flowRule);
-
- /**
* Pushes the collection of flow entries currently applied on the given
* device.
*
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
index 249d1f9..c704c8f 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
@@ -1,6 +1,6 @@
package org.onlab.onos.net.flow;
-import java.util.List;
+import java.util.Set;
import org.onlab.onos.net.PortNumber;
import org.onlab.onos.net.flow.criteria.Criterion;
@@ -18,7 +18,7 @@
*
* @return list of criteria
*/
- List<Criterion> criteria();
+ Set<Criterion> criteria();
/**
* Builder of traffic selector entities.
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
index 758c51c..a819bd3 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
@@ -2,6 +2,8 @@
import static com.google.common.base.MoreObjects.toStringHelper;
+import java.util.Objects;
+
import org.onlab.onos.net.PortNumber;
import org.onlab.onos.net.flow.criteria.Criterion.Type;
import org.onlab.packet.IpPrefix;
@@ -137,6 +139,25 @@
return toStringHelper(type().toString())
.add("port", port).toString();
}
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(port);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof PortCriterion) {
+ PortCriterion that = (PortCriterion) obj;
+ return Objects.equals(port, that.port);
+
+ }
+ return false;
+ }
+
}
@@ -164,6 +185,27 @@
.add("mac", mac).toString();
}
+ @Override
+ public int hashCode() {
+ return Objects.hash(mac, type);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof EthCriterion) {
+ EthCriterion that = (EthCriterion) obj;
+ return Objects.equals(mac, that.mac) &&
+ Objects.equals(type, that.type);
+
+
+ }
+ return false;
+ }
+
+
}
public static final class EthTypeCriterion implements Criterion {
@@ -189,6 +231,25 @@
.add("ethType", Long.toHexString(ethType)).toString();
}
+ @Override
+ public int hashCode() {
+ return Objects.hash(ethType);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof EthTypeCriterion) {
+ EthTypeCriterion that = (EthTypeCriterion) obj;
+ return Objects.equals(ethType, that.ethType);
+
+
+ }
+ return false;
+ }
+
}
@@ -217,6 +278,26 @@
.add("ip", ip).toString();
}
+ @Override
+ public int hashCode() {
+ return Objects.hash(ip, type);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof IPCriterion) {
+ IPCriterion that = (IPCriterion) obj;
+ return Objects.equals(ip, that.ip) &&
+ Objects.equals(type, that.type);
+
+
+ }
+ return false;
+ }
+
}
@@ -243,6 +324,25 @@
.add("protocol", Long.toHexString(proto)).toString();
}
+ @Override
+ public int hashCode() {
+ return Objects.hash(proto);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof IPProtocolCriterion) {
+ IPProtocolCriterion that = (IPProtocolCriterion) obj;
+ return Objects.equals(proto, that.proto);
+
+
+ }
+ return false;
+ }
+
}
@@ -269,6 +369,25 @@
.add("pcp", Long.toHexString(vlanPcp)).toString();
}
+ @Override
+ public int hashCode() {
+ return Objects.hash(vlanPcp);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof VlanPcpCriterion) {
+ VlanPcpCriterion that = (VlanPcpCriterion) obj;
+ return Objects.equals(vlanPcp, that.vlanPcp);
+
+
+ }
+ return false;
+ }
+
}
@@ -296,6 +415,25 @@
.add("id", vlanId).toString();
}
+ @Override
+ public int hashCode() {
+ return Objects.hash(vlanId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof VlanIdCriterion) {
+ VlanIdCriterion that = (VlanIdCriterion) obj;
+ return Objects.equals(vlanId, that.vlanId);
+
+
+ }
+ return false;
+ }
+
}