ONOS-4374 Enable installing flows with hard_timeout
Change-Id: I4e60e93aad44c7e8f8913fa4dd3ed5a2565d7034
diff --git a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
index a61b150..74524ac 100644
--- a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
@@ -313,8 +313,10 @@
extends AbstractProviderService<FlowRuleProvider>
implements FlowRuleProviderService {
+ final Map<FlowEntry, Long> firstSeen = Maps.newConcurrentMap();
final Map<FlowEntry, Long> lastSeen = Maps.newConcurrentMap();
+
protected InternalFlowRuleProviderService(FlowRuleProvider provider) {
super(provider);
}
@@ -324,11 +326,15 @@
checkNotNull(flowEntry, FLOW_RULE_NULL);
checkValidity();
lastSeen.remove(flowEntry);
+ firstSeen.remove(flowEntry);
FlowEntry stored = store.getFlowEntry(flowEntry);
if (stored == null) {
log.debug("Rule already evicted from store: {}", flowEntry);
return;
}
+ if (flowEntry.reason() == FlowEntry.FlowRemoveReason.HARD_TIMEOUT) {
+ ((DefaultFlowEntry) stored).setState(FlowEntry.FlowEntryState.REMOVED);
+ }
Device device = deviceService.getDevice(flowEntry.deviceId());
FlowRuleProvider frp = getProvider(device.providerId());
FlowRuleEvent event = null;
@@ -422,6 +428,21 @@
final long timeout = storedRule.timeout() * 1000;
final long currentTime = System.currentTimeMillis();
+
+ // Checking flow with hardTimeout
+ if (storedRule.hardTimeout() != 0) {
+ if (!firstSeen.containsKey(storedRule)) {
+ // First time rule adding
+ firstSeen.put(storedRule, currentTime);
+ } else {
+ Long first = firstSeen.get(storedRule);
+ final long hardTimeout = storedRule.hardTimeout() * 1000;
+ if ((currentTime - first) > hardTimeout) {
+ return false;
+ }
+ }
+ }
+
if (storedRule.packets() != swRule.packets()) {
lastSeen.put(storedRule, currentTime);
return true;