Committed by
Gerrit Code Review
ONOS-4374 Enable installing flows with hard_timeout
Change-Id: I4e60e93aad44c7e8f8913fa4dd3ed5a2565d7034
Showing
9 changed files
with
204 additions
and
4 deletions
| ... | @@ -46,6 +46,8 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -46,6 +46,8 @@ public class DefaultFlowRule implements FlowRule { |
| 46 | 46 | ||
| 47 | private final int timeout; | 47 | private final int timeout; |
| 48 | private final boolean permanent; | 48 | private final boolean permanent; |
| 49 | + private final int hardTimeout; | ||
| 50 | + private final FlowRemoveReason reason; | ||
| 49 | private final GroupId groupId; | 51 | private final GroupId groupId; |
| 50 | 52 | ||
| 51 | private final Integer tableId; | 53 | private final Integer tableId; |
| ... | @@ -60,6 +62,8 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -60,6 +62,8 @@ public class DefaultFlowRule implements FlowRule { |
| 60 | this.groupId = rule.groupId(); | 62 | this.groupId = rule.groupId(); |
| 61 | this.id = rule.id(); | 63 | this.id = rule.id(); |
| 62 | this.timeout = rule.timeout(); | 64 | this.timeout = rule.timeout(); |
| 65 | + this.hardTimeout = rule.hardTimeout(); | ||
| 66 | + this.reason = rule.reason(); | ||
| 63 | this.permanent = rule.isPermanent(); | 67 | this.permanent = rule.isPermanent(); |
| 64 | this.created = System.currentTimeMillis(); | 68 | this.created = System.currentTimeMillis(); |
| 65 | this.tableId = rule.tableId(); | 69 | this.tableId = rule.tableId(); |
| ... | @@ -68,8 +72,8 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -68,8 +72,8 @@ public class DefaultFlowRule implements FlowRule { |
| 68 | 72 | ||
| 69 | private DefaultFlowRule(DeviceId deviceId, TrafficSelector selector, | 73 | private DefaultFlowRule(DeviceId deviceId, TrafficSelector selector, |
| 70 | TrafficTreatment treatment, Integer priority, | 74 | TrafficTreatment treatment, Integer priority, |
| 71 | - FlowId flowId, Boolean permanent, Integer timeout, | 75 | + FlowId flowId, Boolean permanent, Integer timeout, Integer hardTimeout, |
| 72 | - Integer tableId) { | 76 | + FlowRemoveReason reason, Integer tableId) { |
| 73 | 77 | ||
| 74 | this.deviceId = deviceId; | 78 | this.deviceId = deviceId; |
| 75 | this.selector = selector; | 79 | this.selector = selector; |
| ... | @@ -79,6 +83,8 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -79,6 +83,8 @@ public class DefaultFlowRule implements FlowRule { |
| 79 | this.id = flowId; | 83 | this.id = flowId; |
| 80 | this.permanent = permanent; | 84 | this.permanent = permanent; |
| 81 | this.timeout = timeout; | 85 | this.timeout = timeout; |
| 86 | + this.hardTimeout = hardTimeout; | ||
| 87 | + this.reason = reason; | ||
| 82 | this.tableId = tableId; | 88 | this.tableId = tableId; |
| 83 | this.created = System.currentTimeMillis(); | 89 | this.created = System.currentTimeMillis(); |
| 84 | 90 | ||
| ... | @@ -88,6 +94,8 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -88,6 +94,8 @@ public class DefaultFlowRule implements FlowRule { |
| 88 | this.payLoad = null; | 94 | this.payLoad = null; |
| 89 | } | 95 | } |
| 90 | 96 | ||
| 97 | + | ||
| 98 | + | ||
| 91 | /** | 99 | /** |
| 92 | * Support for the third party flow rule. Creates a flow rule of flow table. | 100 | * Support for the third party flow rule. Creates a flow rule of flow table. |
| 93 | * | 101 | * |
| ... | @@ -105,6 +113,28 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -105,6 +113,28 @@ public class DefaultFlowRule implements FlowRule { |
| 105 | TrafficTreatment treatment, int priority, | 113 | TrafficTreatment treatment, int priority, |
| 106 | ApplicationId appId, int timeout, boolean permanent, | 114 | ApplicationId appId, int timeout, boolean permanent, |
| 107 | FlowRuleExtPayLoad payLoad) { | 115 | FlowRuleExtPayLoad payLoad) { |
| 116 | + this(deviceId, selector, treatment, priority, appId, timeout, 0, permanent, payLoad); | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + | ||
| 120 | + /** | ||
| 121 | + * Support for the third party flow rule. Creates a flow rule of flow table. | ||
| 122 | + * | ||
| 123 | + * @param deviceId the identity of the device where this rule applies | ||
| 124 | + * @param selector the traffic selector that identifies what traffic this | ||
| 125 | + * rule | ||
| 126 | + * @param treatment the traffic treatment that applies to selected traffic | ||
| 127 | + * @param priority the flow rule priority given in natural order | ||
| 128 | + * @param appId the application id of this flow | ||
| 129 | + * @param timeout the timeout for this flow requested by an application | ||
| 130 | + * @param hardTimeout the hard timeout located switch's flow table for this flow requested by an application | ||
| 131 | + * @param permanent whether the flow is permanent i.e. does not time out | ||
| 132 | + * @param payLoad 3rd-party origin private flow | ||
| 133 | + */ | ||
| 134 | + public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector, | ||
| 135 | + TrafficTreatment treatment, int priority, | ||
| 136 | + ApplicationId appId, int timeout, int hardTimeout, boolean permanent, | ||
| 137 | + FlowRuleExtPayLoad payLoad) { | ||
| 108 | 138 | ||
| 109 | checkArgument(priority >= MIN_PRIORITY, "Priority cannot be less than " + | 139 | checkArgument(priority >= MIN_PRIORITY, "Priority cannot be less than " + |
| 110 | MIN_PRIORITY); | 140 | MIN_PRIORITY); |
| ... | @@ -118,6 +148,8 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -118,6 +148,8 @@ public class DefaultFlowRule implements FlowRule { |
| 118 | this.appId = appId.id(); | 148 | this.appId = appId.id(); |
| 119 | this.groupId = new DefaultGroupId(0); | 149 | this.groupId = new DefaultGroupId(0); |
| 120 | this.timeout = timeout; | 150 | this.timeout = timeout; |
| 151 | + this.reason = FlowRemoveReason.NO_REASON; | ||
| 152 | + this.hardTimeout = hardTimeout; | ||
| 121 | this.permanent = permanent; | 153 | this.permanent = permanent; |
| 122 | this.tableId = 0; | 154 | this.tableId = 0; |
| 123 | this.created = System.currentTimeMillis(); | 155 | this.created = System.currentTimeMillis(); |
| ... | @@ -152,6 +184,30 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -152,6 +184,30 @@ public class DefaultFlowRule implements FlowRule { |
| 152 | TrafficTreatment treatment, int priority, | 184 | TrafficTreatment treatment, int priority, |
| 153 | ApplicationId appId, GroupId groupId, int timeout, | 185 | ApplicationId appId, GroupId groupId, int timeout, |
| 154 | boolean permanent, FlowRuleExtPayLoad payLoad) { | 186 | boolean permanent, FlowRuleExtPayLoad payLoad) { |
| 187 | + this(deviceId, selector, treatment, priority, appId, groupId, timeout, 0, permanent, payLoad); | ||
| 188 | + } | ||
| 189 | + | ||
| 190 | + /** | ||
| 191 | + * Support for the third party flow rule. Creates a flow rule of group | ||
| 192 | + * table. | ||
| 193 | + * | ||
| 194 | + * @param deviceId the identity of the device where this rule applies | ||
| 195 | + * @param selector the traffic selector that identifies what traffic this | ||
| 196 | + * rule | ||
| 197 | + * @param treatment the traffic treatment that applies to selected traffic | ||
| 198 | + * @param priority the flow rule priority given in natural order | ||
| 199 | + * @param appId the application id of this flow | ||
| 200 | + * @param groupId the group id of this flow | ||
| 201 | + * @param timeout the timeout for this flow requested by an application | ||
| 202 | + * @param hardTimeout the hard timeout located switch's flow table for this flow requested by an application | ||
| 203 | + * @param permanent whether the flow is permanent i.e. does not time out | ||
| 204 | + * @param payLoad 3rd-party origin private flow | ||
| 205 | + * | ||
| 206 | + */ | ||
| 207 | + public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector, | ||
| 208 | + TrafficTreatment treatment, int priority, | ||
| 209 | + ApplicationId appId, GroupId groupId, int timeout, int hardTimeout, | ||
| 210 | + boolean permanent, FlowRuleExtPayLoad payLoad) { | ||
| 155 | 211 | ||
| 156 | checkArgument(priority >= MIN_PRIORITY, "Priority cannot be less than " + | 212 | checkArgument(priority >= MIN_PRIORITY, "Priority cannot be less than " + |
| 157 | MIN_PRIORITY); | 213 | MIN_PRIORITY); |
| ... | @@ -165,6 +221,8 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -165,6 +221,8 @@ public class DefaultFlowRule implements FlowRule { |
| 165 | this.appId = appId.id(); | 221 | this.appId = appId.id(); |
| 166 | this.groupId = groupId; | 222 | this.groupId = groupId; |
| 167 | this.timeout = timeout; | 223 | this.timeout = timeout; |
| 224 | + this.reason = FlowRemoveReason.NO_REASON; | ||
| 225 | + this.hardTimeout = hardTimeout; | ||
| 168 | this.permanent = permanent; | 226 | this.permanent = permanent; |
| 169 | this.created = System.currentTimeMillis(); | 227 | this.created = System.currentTimeMillis(); |
| 170 | this.tableId = 0; | 228 | this.tableId = 0; |
| ... | @@ -280,6 +338,18 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -280,6 +338,18 @@ public class DefaultFlowRule implements FlowRule { |
| 280 | return timeout; | 338 | return timeout; |
| 281 | } | 339 | } |
| 282 | 340 | ||
| 341 | + | ||
| 342 | + | ||
| 343 | + @Override | ||
| 344 | + public int hardTimeout() { | ||
| 345 | + return hardTimeout; | ||
| 346 | + } | ||
| 347 | + | ||
| 348 | + @Override | ||
| 349 | + public FlowRemoveReason reason() { | ||
| 350 | + return reason; | ||
| 351 | + } | ||
| 352 | + | ||
| 283 | @Override | 353 | @Override |
| 284 | public boolean isPermanent() { | 354 | public boolean isPermanent() { |
| 285 | return permanent; | 355 | return permanent; |
| ... | @@ -310,6 +380,8 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -310,6 +380,8 @@ public class DefaultFlowRule implements FlowRule { |
| 310 | private TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); | 380 | private TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); |
| 311 | private Integer timeout; | 381 | private Integer timeout; |
| 312 | private Boolean permanent; | 382 | private Boolean permanent; |
| 383 | + private Integer hardTimeout = 0; | ||
| 384 | + private FlowRemoveReason reason = FlowRemoveReason.NO_REASON; | ||
| 313 | 385 | ||
| 314 | @Override | 386 | @Override |
| 315 | public FlowRule.Builder withCookie(long cookie) { | 387 | public FlowRule.Builder withCookie(long cookie) { |
| ... | @@ -368,6 +440,20 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -368,6 +440,20 @@ public class DefaultFlowRule implements FlowRule { |
| 368 | } | 440 | } |
| 369 | 441 | ||
| 370 | @Override | 442 | @Override |
| 443 | + public FlowRule.Builder withHardTimeout(int timeout) { | ||
| 444 | + this.permanent = false; | ||
| 445 | + this.hardTimeout = timeout; | ||
| 446 | + this.timeout = timeout; | ||
| 447 | + return this; | ||
| 448 | + } | ||
| 449 | + | ||
| 450 | + @Override | ||
| 451 | + public FlowRule.Builder withReason(FlowRemoveReason reason) { | ||
| 452 | + this.reason = reason; | ||
| 453 | + return this; | ||
| 454 | + } | ||
| 455 | + | ||
| 456 | + @Override | ||
| 371 | public FlowRule build() { | 457 | public FlowRule build() { |
| 372 | FlowId localFlowId; | 458 | FlowId localFlowId; |
| 373 | checkArgument((flowId != null) ^ (appId != null), "Either an application" + | 459 | checkArgument((flowId != null) ^ (appId != null), "Either an application" + |
| ... | @@ -390,7 +476,7 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -390,7 +476,7 @@ public class DefaultFlowRule implements FlowRule { |
| 390 | } | 476 | } |
| 391 | 477 | ||
| 392 | return new DefaultFlowRule(deviceId, selector, treatment, priority, | 478 | return new DefaultFlowRule(deviceId, selector, treatment, priority, |
| 393 | - localFlowId, permanent, timeout, tableId); | 479 | + localFlowId, permanent, timeout, hardTimeout, reason, tableId); |
| 394 | } | 480 | } |
| 395 | 481 | ||
| 396 | private FlowId computeFlowId(ApplicationId appId) { | 482 | private FlowId computeFlowId(ApplicationId appId) { | ... | ... |
| ... | @@ -30,6 +30,28 @@ public interface FlowRule { | ... | @@ -30,6 +30,28 @@ public interface FlowRule { |
| 30 | int MAX_PRIORITY = 65535; | 30 | int MAX_PRIORITY = 65535; |
| 31 | 31 | ||
| 32 | /** | 32 | /** |
| 33 | + * Reason for flow parameter received from switches. | ||
| 34 | + * Used to check reason parameter in flows. | ||
| 35 | + */ | ||
| 36 | + enum FlowRemoveReason { | ||
| 37 | + NO_REASON, | ||
| 38 | + IDLE_TIMEOUT, | ||
| 39 | + HARD_TIMEOUT; | ||
| 40 | + public static FlowRemoveReason parseShort(short reason) { | ||
| 41 | + switch (reason) { | ||
| 42 | + case -1 : | ||
| 43 | + return NO_REASON; | ||
| 44 | + case 0: | ||
| 45 | + return IDLE_TIMEOUT; | ||
| 46 | + case 1: | ||
| 47 | + return HARD_TIMEOUT; | ||
| 48 | + default : | ||
| 49 | + return NO_REASON; | ||
| 50 | + } | ||
| 51 | + } | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + /** | ||
| 33 | * Returns the ID of this flow. | 55 | * Returns the ID of this flow. |
| 34 | * | 56 | * |
| 35 | * @return the flow ID | 57 | * @return the flow ID |
| ... | @@ -88,6 +110,21 @@ public interface FlowRule { | ... | @@ -88,6 +110,21 @@ public interface FlowRule { |
| 88 | int timeout(); | 110 | int timeout(); |
| 89 | 111 | ||
| 90 | /** | 112 | /** |
| 113 | + * Returns the hard timeout for this flow requested by an application. | ||
| 114 | + * This paremeter configure switch's flow hard timeout. | ||
| 115 | + * In case of controller-switch connection lost, this variable can be useful. | ||
| 116 | + * @return integer value of the hard Timeout | ||
| 117 | + */ | ||
| 118 | + int hardTimeout(); | ||
| 119 | + | ||
| 120 | + /** | ||
| 121 | + * Returns the reason for the flow received from switches. | ||
| 122 | + * | ||
| 123 | + * @return FlowRemoveReason value of reason | ||
| 124 | + */ | ||
| 125 | + FlowRemoveReason reason(); | ||
| 126 | + | ||
| 127 | + /** | ||
| 91 | * Returns whether the flow is permanent i.e. does not time out. | 128 | * Returns whether the flow is permanent i.e. does not time out. |
| 92 | * | 129 | * |
| 93 | * @return true if the flow is permanent, otherwise false | 130 | * @return true if the flow is permanent, otherwise false |
| ... | @@ -212,6 +249,20 @@ public interface FlowRule { | ... | @@ -212,6 +249,20 @@ public interface FlowRule { |
| 212 | Builder makeTemporary(int timeout); | 249 | Builder makeTemporary(int timeout); |
| 213 | 250 | ||
| 214 | /** | 251 | /** |
| 252 | + * Sets hard timeout parameter in flow table. | ||
| 253 | + * @param timeout an integer | ||
| 254 | + * @return this | ||
| 255 | + */ | ||
| 256 | + Builder withHardTimeout(int timeout); | ||
| 257 | + | ||
| 258 | + /** | ||
| 259 | + * Sets reason parameter received from switches . | ||
| 260 | + * @param reason a short | ||
| 261 | + * @return this | ||
| 262 | + */ | ||
| 263 | + Builder withReason(FlowRemoveReason reason); | ||
| 264 | + | ||
| 265 | + /** | ||
| 215 | * Builds a flow rule object. | 266 | * Builds a flow rule object. |
| 216 | * | 267 | * |
| 217 | * @return a flow rule. | 268 | * @return a flow rule. | ... | ... |
| ... | @@ -26,6 +26,7 @@ import org.onosproject.net.Link; | ... | @@ -26,6 +26,7 @@ import org.onosproject.net.Link; |
| 26 | import org.onosproject.net.NetTestTools; | 26 | import org.onosproject.net.NetTestTools; |
| 27 | import org.onosproject.net.NetworkResource; | 27 | import org.onosproject.net.NetworkResource; |
| 28 | import org.onosproject.net.Path; | 28 | import org.onosproject.net.Path; |
| 29 | +import org.onosproject.net.flow.FlowRule.FlowRemoveReason; | ||
| 29 | import org.onosproject.net.flow.FlowId; | 30 | import org.onosproject.net.flow.FlowId; |
| 30 | import org.onosproject.net.flow.FlowRule; | 31 | import org.onosproject.net.flow.FlowRule; |
| 31 | import org.onosproject.net.flow.FlowRuleExtPayLoad; | 32 | import org.onosproject.net.flow.FlowRuleExtPayLoad; |
| ... | @@ -330,6 +331,16 @@ public class IntentTestsMocks { | ... | @@ -330,6 +331,16 @@ public class IntentTestsMocks { |
| 330 | } | 331 | } |
| 331 | 332 | ||
| 332 | @Override | 333 | @Override |
| 334 | + public int hardTimeout() { | ||
| 335 | + return 0; | ||
| 336 | + } | ||
| 337 | + | ||
| 338 | + @Override | ||
| 339 | + public FlowRemoveReason reason() { | ||
| 340 | + return FlowRemoveReason.NO_REASON; | ||
| 341 | + } | ||
| 342 | + | ||
| 343 | + @Override | ||
| 333 | public boolean isPermanent() { | 344 | public boolean isPermanent() { |
| 334 | return false; | 345 | return false; |
| 335 | } | 346 | } | ... | ... |
| ... | @@ -313,8 +313,10 @@ public class FlowRuleManager | ... | @@ -313,8 +313,10 @@ public class FlowRuleManager |
| 313 | extends AbstractProviderService<FlowRuleProvider> | 313 | extends AbstractProviderService<FlowRuleProvider> |
| 314 | implements FlowRuleProviderService { | 314 | implements FlowRuleProviderService { |
| 315 | 315 | ||
| 316 | + final Map<FlowEntry, Long> firstSeen = Maps.newConcurrentMap(); | ||
| 316 | final Map<FlowEntry, Long> lastSeen = Maps.newConcurrentMap(); | 317 | final Map<FlowEntry, Long> lastSeen = Maps.newConcurrentMap(); |
| 317 | 318 | ||
| 319 | + | ||
| 318 | protected InternalFlowRuleProviderService(FlowRuleProvider provider) { | 320 | protected InternalFlowRuleProviderService(FlowRuleProvider provider) { |
| 319 | super(provider); | 321 | super(provider); |
| 320 | } | 322 | } |
| ... | @@ -324,11 +326,15 @@ public class FlowRuleManager | ... | @@ -324,11 +326,15 @@ public class FlowRuleManager |
| 324 | checkNotNull(flowEntry, FLOW_RULE_NULL); | 326 | checkNotNull(flowEntry, FLOW_RULE_NULL); |
| 325 | checkValidity(); | 327 | checkValidity(); |
| 326 | lastSeen.remove(flowEntry); | 328 | lastSeen.remove(flowEntry); |
| 329 | + firstSeen.remove(flowEntry); | ||
| 327 | FlowEntry stored = store.getFlowEntry(flowEntry); | 330 | FlowEntry stored = store.getFlowEntry(flowEntry); |
| 328 | if (stored == null) { | 331 | if (stored == null) { |
| 329 | log.debug("Rule already evicted from store: {}", flowEntry); | 332 | log.debug("Rule already evicted from store: {}", flowEntry); |
| 330 | return; | 333 | return; |
| 331 | } | 334 | } |
| 335 | + if (flowEntry.reason() == FlowEntry.FlowRemoveReason.HARD_TIMEOUT) { | ||
| 336 | + ((DefaultFlowEntry) stored).setState(FlowEntry.FlowEntryState.REMOVED); | ||
| 337 | + } | ||
| 332 | Device device = deviceService.getDevice(flowEntry.deviceId()); | 338 | Device device = deviceService.getDevice(flowEntry.deviceId()); |
| 333 | FlowRuleProvider frp = getProvider(device.providerId()); | 339 | FlowRuleProvider frp = getProvider(device.providerId()); |
| 334 | FlowRuleEvent event = null; | 340 | FlowRuleEvent event = null; |
| ... | @@ -422,6 +428,21 @@ public class FlowRuleManager | ... | @@ -422,6 +428,21 @@ public class FlowRuleManager |
| 422 | 428 | ||
| 423 | final long timeout = storedRule.timeout() * 1000; | 429 | final long timeout = storedRule.timeout() * 1000; |
| 424 | final long currentTime = System.currentTimeMillis(); | 430 | final long currentTime = System.currentTimeMillis(); |
| 431 | + | ||
| 432 | + // Checking flow with hardTimeout | ||
| 433 | + if (storedRule.hardTimeout() != 0) { | ||
| 434 | + if (!firstSeen.containsKey(storedRule)) { | ||
| 435 | + // First time rule adding | ||
| 436 | + firstSeen.put(storedRule, currentTime); | ||
| 437 | + } else { | ||
| 438 | + Long first = firstSeen.get(storedRule); | ||
| 439 | + final long hardTimeout = storedRule.hardTimeout() * 1000; | ||
| 440 | + if ((currentTime - first) > hardTimeout) { | ||
| 441 | + return false; | ||
| 442 | + } | ||
| 443 | + } | ||
| 444 | + } | ||
| 445 | + | ||
| 425 | if (storedRule.packets() != swRule.packets()) { | 446 | if (storedRule.packets() != swRule.packets()) { |
| 426 | lastSeen.put(storedRule, currentTime); | 447 | lastSeen.put(storedRule, currentTime); |
| 427 | return true; | 448 | return true; | ... | ... |
| ... | @@ -101,6 +101,7 @@ import org.onosproject.net.flow.DefaultTrafficSelector; | ... | @@ -101,6 +101,7 @@ import org.onosproject.net.flow.DefaultTrafficSelector; |
| 101 | import org.onosproject.net.flow.DefaultTrafficTreatment; | 101 | import org.onosproject.net.flow.DefaultTrafficTreatment; |
| 102 | import org.onosproject.net.flow.FlowEntry; | 102 | import org.onosproject.net.flow.FlowEntry; |
| 103 | import org.onosproject.net.flow.FlowId; | 103 | import org.onosproject.net.flow.FlowId; |
| 104 | +import org.onosproject.net.flow.FlowRule; | ||
| 104 | import org.onosproject.net.flow.FlowRuleBatchEntry; | 105 | import org.onosproject.net.flow.FlowRuleBatchEntry; |
| 105 | import org.onosproject.net.flow.FlowRuleBatchEvent; | 106 | import org.onosproject.net.flow.FlowRuleBatchEvent; |
| 106 | import org.onosproject.net.flow.FlowRuleBatchOperation; | 107 | import org.onosproject.net.flow.FlowRuleBatchOperation; |
| ... | @@ -349,6 +350,7 @@ public final class KryoNamespaces { | ... | @@ -349,6 +350,7 @@ public final class KryoNamespaces { |
| 349 | DefaultFlowEntry.class, | 350 | DefaultFlowEntry.class, |
| 350 | StoredFlowEntry.class, | 351 | StoredFlowEntry.class, |
| 351 | DefaultFlowRule.class, | 352 | DefaultFlowRule.class, |
| 353 | + FlowRule.FlowRemoveReason.class, | ||
| 352 | DefaultPacketRequest.class, | 354 | DefaultPacketRequest.class, |
| 353 | PacketPriority.class, | 355 | PacketPriority.class, |
| 354 | FlowEntry.FlowEntryState.class, | 356 | FlowEntry.FlowEntryState.class, | ... | ... |
providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java
| ... | @@ -95,6 +95,7 @@ public class FlowModBuilderVer10 extends FlowModBuilder { | ... | @@ -95,6 +95,7 @@ public class FlowModBuilderVer10 extends FlowModBuilder { |
| 95 | .setMatch(match) | 95 | .setMatch(match) |
| 96 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) | 96 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) |
| 97 | .setPriority(flowRule().priority()) | 97 | .setPriority(flowRule().priority()) |
| 98 | + .setHardTimeout(flowRule().hardTimeout()) | ||
| 98 | .build(); | 99 | .build(); |
| 99 | 100 | ||
| 100 | return fm; | 101 | return fm; |
| ... | @@ -115,6 +116,7 @@ public class FlowModBuilderVer10 extends FlowModBuilder { | ... | @@ -115,6 +116,7 @@ public class FlowModBuilderVer10 extends FlowModBuilder { |
| 115 | .setMatch(match) | 116 | .setMatch(match) |
| 116 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) | 117 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) |
| 117 | .setPriority(flowRule().priority()) | 118 | .setPriority(flowRule().priority()) |
| 119 | + .setHardTimeout(flowRule().hardTimeout()) | ||
| 118 | .build(); | 120 | .build(); |
| 119 | 121 | ||
| 120 | return fm; | 122 | return fm; |
| ... | @@ -133,6 +135,7 @@ public class FlowModBuilderVer10 extends FlowModBuilder { | ... | @@ -133,6 +135,7 @@ public class FlowModBuilderVer10 extends FlowModBuilder { |
| 133 | .setMatch(match) | 135 | .setMatch(match) |
| 134 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) | 136 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) |
| 135 | .setPriority(flowRule().priority()) | 137 | .setPriority(flowRule().priority()) |
| 138 | + .setHardTimeout(flowRule().hardTimeout()) | ||
| 136 | .build(); | 139 | .build(); |
| 137 | 140 | ||
| 138 | return fm; | 141 | return fm; | ... | ... |
providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
| ... | @@ -158,6 +158,7 @@ public class FlowModBuilderVer13 extends FlowModBuilder { | ... | @@ -158,6 +158,7 @@ public class FlowModBuilderVer13 extends FlowModBuilder { |
| 158 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) | 158 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) |
| 159 | .setPriority(flowRule().priority()) | 159 | .setPriority(flowRule().priority()) |
| 160 | .setTableId(TableId.of(flowRule().tableId())) | 160 | .setTableId(TableId.of(flowRule().tableId())) |
| 161 | + .setHardTimeout(flowRule().hardTimeout()) | ||
| 161 | .build(); | 162 | .build(); |
| 162 | 163 | ||
| 163 | return fm; | 164 | return fm; |
| ... | @@ -201,6 +202,7 @@ public class FlowModBuilderVer13 extends FlowModBuilder { | ... | @@ -201,6 +202,7 @@ public class FlowModBuilderVer13 extends FlowModBuilder { |
| 201 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) | 202 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) |
| 202 | .setPriority(flowRule().priority()) | 203 | .setPriority(flowRule().priority()) |
| 203 | .setTableId(TableId.of(flowRule().tableId())) | 204 | .setTableId(TableId.of(flowRule().tableId())) |
| 205 | + .setHardTimeout(flowRule().hardTimeout()) | ||
| 204 | .build(); | 206 | .build(); |
| 205 | 207 | ||
| 206 | return fm; | 208 | return fm; |
| ... | @@ -220,6 +222,7 @@ public class FlowModBuilderVer13 extends FlowModBuilder { | ... | @@ -220,6 +222,7 @@ public class FlowModBuilderVer13 extends FlowModBuilder { |
| 220 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) | 222 | .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) |
| 221 | .setPriority(flowRule().priority()) | 223 | .setPriority(flowRule().priority()) |
| 222 | .setTableId(TableId.of(flowRule().tableId())) | 224 | .setTableId(TableId.of(flowRule().tableId())) |
| 225 | + .setHardTimeout(flowRule().hardTimeout()) | ||
| 223 | .build(); | 226 | .build(); |
| 224 | 227 | ||
| 225 | return fm; | 228 | return fm; | ... | ... |
| ... | @@ -182,7 +182,9 @@ public class FlowEntryBuilder { | ... | @@ -182,7 +182,9 @@ public class FlowEntryBuilder { |
| 182 | .withSelector(buildSelector()) | 182 | .withSelector(buildSelector()) |
| 183 | .withPriority(removed.getPriority()) | 183 | .withPriority(removed.getPriority()) |
| 184 | .makeTemporary(removed.getIdleTimeout()) | 184 | .makeTemporary(removed.getIdleTimeout()) |
| 185 | - .withCookie(removed.getCookie().getValue()); | 185 | + .withCookie(removed.getCookie().getValue()) |
| 186 | + .withReason(FlowRule.FlowRemoveReason.parseShort(removed.getReason())); | ||
| 187 | + | ||
| 186 | if (removed.getVersion() != OFVersion.OF_10) { | 188 | if (removed.getVersion() != OFVersion.OF_10) { |
| 187 | builder.forTable(removed.getTableId().getValue()); | 189 | builder.forTable(removed.getTableId().getValue()); |
| 188 | } | 190 | } | ... | ... |
| ... | @@ -46,6 +46,7 @@ import org.onosproject.net.flow.DefaultTrafficSelector; | ... | @@ -46,6 +46,7 @@ import org.onosproject.net.flow.DefaultTrafficSelector; |
| 46 | import org.onosproject.net.flow.DefaultTrafficTreatment; | 46 | import org.onosproject.net.flow.DefaultTrafficTreatment; |
| 47 | import org.onosproject.net.flow.FlowEntry; | 47 | import org.onosproject.net.flow.FlowEntry; |
| 48 | import org.onosproject.net.flow.FlowId; | 48 | import org.onosproject.net.flow.FlowId; |
| 49 | +import org.onosproject.net.flow.FlowRule.FlowRemoveReason; | ||
| 49 | import org.onosproject.net.flow.FlowRule; | 50 | import org.onosproject.net.flow.FlowRule; |
| 50 | import org.onosproject.net.flow.FlowRuleExtPayLoad; | 51 | import org.onosproject.net.flow.FlowRuleExtPayLoad; |
| 51 | import org.onosproject.net.flow.FlowRuleService; | 52 | import org.onosproject.net.flow.FlowRuleService; |
| ... | @@ -218,6 +219,16 @@ public class FlowsResourceTest extends ResourceTest { | ... | @@ -218,6 +219,16 @@ public class FlowsResourceTest extends ResourceTest { |
| 218 | } | 219 | } |
| 219 | 220 | ||
| 220 | @Override | 221 | @Override |
| 222 | + public int hardTimeout() { | ||
| 223 | + return 0; | ||
| 224 | + } | ||
| 225 | + | ||
| 226 | + @Override | ||
| 227 | + public FlowRemoveReason reason() { | ||
| 228 | + return FlowRemoveReason.NO_REASON; | ||
| 229 | + } | ||
| 230 | + | ||
| 231 | + @Override | ||
| 221 | public boolean isPermanent() { | 232 | public boolean isPermanent() { |
| 222 | return false; | 233 | return false; |
| 223 | } | 234 | } |
| ... | @@ -295,6 +306,16 @@ public class FlowsResourceTest extends ResourceTest { | ... | @@ -295,6 +306,16 @@ public class FlowsResourceTest extends ResourceTest { |
| 295 | } | 306 | } |
| 296 | 307 | ||
| 297 | @Override | 308 | @Override |
| 309 | + public int hardTimeout() { | ||
| 310 | + return 0; | ||
| 311 | + } | ||
| 312 | + | ||
| 313 | + @Override | ||
| 314 | + public FlowRemoveReason reason() { | ||
| 315 | + return FlowRemoveReason.NO_REASON; | ||
| 316 | + } | ||
| 317 | + | ||
| 318 | + @Override | ||
| 298 | public boolean isPermanent() { | 319 | public boolean isPermanent() { |
| 299 | return false; | 320 | return false; |
| 300 | } | 321 | } | ... | ... |
-
Please register or login to post a comment