the return of the flowentry
Change-Id: I7dbeb6af2014a4df5b0beb7fe0157eaaac63bd0f
Showing
14 changed files
with
229 additions
and
375 deletions
... | @@ -5,7 +5,7 @@ import java.util.SortedSet; | ... | @@ -5,7 +5,7 @@ import java.util.SortedSet; |
5 | 5 | ||
6 | import org.apache.karaf.shell.console.Completer; | 6 | import org.apache.karaf.shell.console.Completer; |
7 | import org.apache.karaf.shell.console.completer.StringsCompleter; | 7 | import org.apache.karaf.shell.console.completer.StringsCompleter; |
8 | -import org.onlab.onos.net.flow.FlowRule.FlowRuleState; | 8 | +import org.onlab.onos.net.flow.FlowEntry.FlowEntryState; |
9 | 9 | ||
10 | /** | 10 | /** |
11 | * Device ID completer. | 11 | * Device ID completer. |
... | @@ -16,7 +16,7 @@ public class FlowRuleStatusCompleter implements Completer { | ... | @@ -16,7 +16,7 @@ public class FlowRuleStatusCompleter implements Completer { |
16 | // Delegate string completer | 16 | // Delegate string completer |
17 | StringsCompleter delegate = new StringsCompleter(); | 17 | StringsCompleter delegate = new StringsCompleter(); |
18 | 18 | ||
19 | - FlowRuleState[] states = FlowRuleState.values(); | 19 | + FlowEntryState[] states = FlowEntryState.values(); |
20 | SortedSet<String> strings = delegate.getStrings(); | 20 | SortedSet<String> strings = delegate.getStrings(); |
21 | for (int i = 0; i < states.length; i++) { | 21 | for (int i = 0; i < states.length; i++) { |
22 | strings.add(states[i].toString().toLowerCase()); | 22 | strings.add(states[i].toString().toLowerCase()); | ... | ... |
... | @@ -13,8 +13,8 @@ import org.onlab.onos.cli.Comparators; | ... | @@ -13,8 +13,8 @@ import org.onlab.onos.cli.Comparators; |
13 | import org.onlab.onos.net.Device; | 13 | import org.onlab.onos.net.Device; |
14 | import org.onlab.onos.net.DeviceId; | 14 | import org.onlab.onos.net.DeviceId; |
15 | import org.onlab.onos.net.device.DeviceService; | 15 | import org.onlab.onos.net.device.DeviceService; |
16 | -import org.onlab.onos.net.flow.FlowRule; | 16 | +import org.onlab.onos.net.flow.FlowEntry; |
17 | -import org.onlab.onos.net.flow.FlowRule.FlowRuleState; | 17 | +import org.onlab.onos.net.flow.FlowEntry.FlowEntryState; |
18 | import org.onlab.onos.net.flow.FlowRuleService; | 18 | import org.onlab.onos.net.flow.FlowRuleService; |
19 | 19 | ||
20 | import com.google.common.collect.Maps; | 20 | import com.google.common.collect.Maps; |
... | @@ -45,7 +45,7 @@ public class FlowsListCommand extends AbstractShellCommand { | ... | @@ -45,7 +45,7 @@ public class FlowsListCommand extends AbstractShellCommand { |
45 | protected void execute() { | 45 | protected void execute() { |
46 | DeviceService deviceService = get(DeviceService.class); | 46 | DeviceService deviceService = get(DeviceService.class); |
47 | FlowRuleService service = get(FlowRuleService.class); | 47 | FlowRuleService service = get(FlowRuleService.class); |
48 | - Map<Device, List<FlowRule>> flows = getSortedFlows(deviceService, service); | 48 | + Map<Device, List<FlowEntry>> flows = getSortedFlows(deviceService, service); |
49 | for (Device d : flows.keySet()) { | 49 | for (Device d : flows.keySet()) { |
50 | printFlows(d, flows.get(d)); | 50 | printFlows(d, flows.get(d)); |
51 | } | 51 | } |
... | @@ -57,12 +57,12 @@ public class FlowsListCommand extends AbstractShellCommand { | ... | @@ -57,12 +57,12 @@ public class FlowsListCommand extends AbstractShellCommand { |
57 | * @param service device service | 57 | * @param service device service |
58 | * @return sorted device list | 58 | * @return sorted device list |
59 | */ | 59 | */ |
60 | - protected Map<Device, List<FlowRule>> getSortedFlows(DeviceService deviceService, FlowRuleService service) { | 60 | + protected Map<Device, List<FlowEntry>> getSortedFlows(DeviceService deviceService, FlowRuleService service) { |
61 | - Map<Device, List<FlowRule>> flows = Maps.newHashMap(); | 61 | + Map<Device, List<FlowEntry>> flows = Maps.newHashMap(); |
62 | - List<FlowRule> rules; | 62 | + List<FlowEntry> rules; |
63 | - FlowRuleState s = null; | 63 | + FlowEntryState s = null; |
64 | if (state != null && !state.equals("any")) { | 64 | if (state != null && !state.equals("any")) { |
65 | - s = FlowRuleState.valueOf(state.toUpperCase()); | 65 | + s = FlowEntryState.valueOf(state.toUpperCase()); |
66 | } | 66 | } |
67 | Iterable<Device> devices = uri == null ? deviceService.getDevices() : | 67 | Iterable<Device> devices = uri == null ? deviceService.getDevices() : |
68 | Collections.singletonList(deviceService.getDevice(DeviceId.deviceId(uri))); | 68 | Collections.singletonList(deviceService.getDevice(DeviceId.deviceId(uri))); |
... | @@ -71,7 +71,7 @@ public class FlowsListCommand extends AbstractShellCommand { | ... | @@ -71,7 +71,7 @@ public class FlowsListCommand extends AbstractShellCommand { |
71 | rules = newArrayList(service.getFlowEntries(d.id())); | 71 | rules = newArrayList(service.getFlowEntries(d.id())); |
72 | } else { | 72 | } else { |
73 | rules = newArrayList(); | 73 | rules = newArrayList(); |
74 | - for (FlowRule f : service.getFlowEntries(d.id())) { | 74 | + for (FlowEntry f : service.getFlowEntries(d.id())) { |
75 | if (f.state().equals(s)) { | 75 | if (f.state().equals(s)) { |
76 | rules.add(f); | 76 | rules.add(f); |
77 | } | 77 | } |
... | @@ -88,13 +88,13 @@ public class FlowsListCommand extends AbstractShellCommand { | ... | @@ -88,13 +88,13 @@ public class FlowsListCommand extends AbstractShellCommand { |
88 | * @param d the device | 88 | * @param d the device |
89 | * @param flows the set of flows for that device. | 89 | * @param flows the set of flows for that device. |
90 | */ | 90 | */ |
91 | - protected void printFlows(Device d, List<FlowRule> flows) { | 91 | + protected void printFlows(Device d, List<FlowEntry> flows) { |
92 | print("Device: " + d.id()); | 92 | print("Device: " + d.id()); |
93 | if (flows == null | flows.isEmpty()) { | 93 | if (flows == null | flows.isEmpty()) { |
94 | print(" %s", "No flows."); | 94 | print(" %s", "No flows."); |
95 | return; | 95 | return; |
96 | } | 96 | } |
97 | - for (FlowRule f : flows) { | 97 | + for (FlowEntry f : flows) { |
98 | print(FMT, Long.toHexString(f.id().value()), f.state(), f.bytes(), | 98 | print(FMT, Long.toHexString(f.id().value()), f.state(), f.bytes(), |
99 | f.packets(), f.life(), f.priority()); | 99 | f.packets(), f.life(), f.priority()); |
100 | print(SFMT, f.selector().criteria()); | 100 | print(SFMT, f.selector().criteria()); | ... | ... |
... | @@ -18,10 +18,6 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -18,10 +18,6 @@ public class DefaultFlowRule implements FlowRule { |
18 | private final TrafficSelector selector; | 18 | private final TrafficSelector selector; |
19 | private final TrafficTreatment treatment; | 19 | private final TrafficTreatment treatment; |
20 | private final long created; | 20 | private final long created; |
21 | - private final long life; | ||
22 | - private final long packets; | ||
23 | - private final long bytes; | ||
24 | - private final FlowRuleState state; | ||
25 | 21 | ||
26 | private final FlowId id; | 22 | private final FlowId id; |
27 | 23 | ||
... | @@ -29,90 +25,50 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -29,90 +25,50 @@ public class DefaultFlowRule implements FlowRule { |
29 | 25 | ||
30 | private final int timeout; | 26 | private final int timeout; |
31 | 27 | ||
32 | - /** | 28 | + |
33 | - * Creates a flow rule given the following paremeters. | ||
34 | - * @param deviceId the device where the rule should be installed | ||
35 | - * @param selector the traffic selection | ||
36 | - * @param treatment how the seleted traffic should be handled | ||
37 | - * @param priority the rule priority cannot be less than FlowRule.MIN_PRIORITY | ||
38 | - * @param state the state in which the rule is | ||
39 | - * @param life how long it has existed for (ms) | ||
40 | - * @param packets number of packets it has seen | ||
41 | - * @param bytes number of bytes it has seen | ||
42 | - * @param flowId the identifier | ||
43 | - * @param timeout the rule's timeout (idle) not to exceed | ||
44 | - * FlowRule.MAX_TIMEOUT of idle time | ||
45 | - */ | ||
46 | public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector, | 29 | public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector, |
47 | - TrafficTreatment treatment, int priority, FlowRuleState state, | 30 | + TrafficTreatment treatment, int priority, long flowId, |
48 | - long life, long packets, long bytes, long flowId, | ||
49 | int timeout) { | 31 | int timeout) { |
50 | this.deviceId = deviceId; | 32 | this.deviceId = deviceId; |
51 | this.priority = priority; | 33 | this.priority = priority; |
52 | this.selector = selector; | 34 | this.selector = selector; |
53 | this.treatment = treatment; | 35 | this.treatment = treatment; |
54 | - this.state = state; | 36 | + this.timeout = timeout; |
37 | + this.created = System.currentTimeMillis(); | ||
38 | + | ||
55 | this.appId = ApplicationId.valueOf((int) (flowId >> 32)); | 39 | this.appId = ApplicationId.valueOf((int) (flowId >> 32)); |
56 | this.id = FlowId.valueOf(flowId); | 40 | this.id = FlowId.valueOf(flowId); |
57 | - this.life = life; | ||
58 | - this.packets = packets; | ||
59 | - this.bytes = bytes; | ||
60 | - this.created = System.currentTimeMillis(); | ||
61 | - this.timeout = timeout; | ||
62 | } | 41 | } |
63 | 42 | ||
64 | public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector, | 43 | public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector, |
65 | TrafficTreatment treatement, int priority, ApplicationId appId, | 44 | TrafficTreatment treatement, int priority, ApplicationId appId, |
66 | int timeout) { | 45 | int timeout) { |
67 | - this(deviceId, selector, treatement, priority, | ||
68 | - FlowRuleState.CREATED, appId, timeout); | ||
69 | - } | ||
70 | - | ||
71 | - public DefaultFlowRule(FlowRule rule, FlowRuleState state) { | ||
72 | - this(rule.deviceId(), rule.selector(), rule.treatment(), | ||
73 | - rule.priority(), state, rule.id(), rule.appId(), | ||
74 | - rule.timeout()); | ||
75 | - } | ||
76 | 46 | ||
77 | - private DefaultFlowRule(DeviceId deviceId, | 47 | + if (priority < FlowRule.MIN_PRIORITY) { |
78 | - TrafficSelector selector, TrafficTreatment treatment, | ||
79 | - int priority, FlowRuleState state, ApplicationId appId, | ||
80 | - int timeout) { | ||
81 | - if (priority < MIN_PRIORITY) { | ||
82 | throw new IllegalArgumentException("Priority cannot be less than " + MIN_PRIORITY); | 48 | throw new IllegalArgumentException("Priority cannot be less than " + MIN_PRIORITY); |
83 | } | 49 | } |
50 | + | ||
84 | this.deviceId = deviceId; | 51 | this.deviceId = deviceId; |
85 | this.priority = priority; | 52 | this.priority = priority; |
86 | this.selector = selector; | 53 | this.selector = selector; |
87 | - this.treatment = treatment; | 54 | + this.treatment = treatement; |
88 | - this.state = state; | ||
89 | - this.life = 0; | ||
90 | - this.packets = 0; | ||
91 | - this.bytes = 0; | ||
92 | this.appId = appId; | 55 | this.appId = appId; |
93 | - | ||
94 | this.timeout = timeout; | 56 | this.timeout = timeout; |
57 | + this.created = System.currentTimeMillis(); | ||
95 | 58 | ||
96 | this.id = FlowId.valueOf((((long) appId().id()) << 32) | (this.hash() & 0xffffffffL)); | 59 | this.id = FlowId.valueOf((((long) appId().id()) << 32) | (this.hash() & 0xffffffffL)); |
97 | - this.created = System.currentTimeMillis(); | ||
98 | } | 60 | } |
99 | 61 | ||
100 | - private DefaultFlowRule(DeviceId deviceId, | 62 | + public DefaultFlowRule(FlowRule rule) { |
101 | - TrafficSelector selector, TrafficTreatment treatment, | 63 | + this.deviceId = rule.deviceId(); |
102 | - int priority, FlowRuleState state, FlowId flowId, ApplicationId appId, | 64 | + this.priority = rule.priority(); |
103 | - int timeout) { | 65 | + this.selector = rule.selector(); |
104 | - this.deviceId = deviceId; | 66 | + this.treatment = rule.treatment(); |
105 | - this.priority = priority; | 67 | + this.appId = rule.appId(); |
106 | - this.selector = selector; | 68 | + this.id = rule.id(); |
107 | - this.treatment = treatment; | 69 | + this.timeout = rule.timeout(); |
108 | - this.state = state; | ||
109 | - this.life = 0; | ||
110 | - this.packets = 0; | ||
111 | - this.bytes = 0; | ||
112 | - this.appId = appId; | ||
113 | - this.id = flowId; | ||
114 | - this.timeout = timeout; | ||
115 | this.created = System.currentTimeMillis(); | 70 | this.created = System.currentTimeMillis(); |
71 | + | ||
116 | } | 72 | } |
117 | 73 | ||
118 | 74 | ||
... | @@ -146,26 +102,6 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -146,26 +102,6 @@ public class DefaultFlowRule implements FlowRule { |
146 | return treatment; | 102 | return treatment; |
147 | } | 103 | } |
148 | 104 | ||
149 | - @Override | ||
150 | - public long life() { | ||
151 | - return life; | ||
152 | - } | ||
153 | - | ||
154 | - @Override | ||
155 | - public long packets() { | ||
156 | - return packets; | ||
157 | - } | ||
158 | - | ||
159 | - @Override | ||
160 | - public long bytes() { | ||
161 | - return bytes; | ||
162 | - } | ||
163 | - | ||
164 | - @Override | ||
165 | - public FlowRuleState state() { | ||
166 | - return this.state; | ||
167 | - } | ||
168 | - | ||
169 | 105 | ||
170 | @Override | 106 | @Override |
171 | /* | 107 | /* |
... | @@ -213,7 +149,6 @@ public class DefaultFlowRule implements FlowRule { | ... | @@ -213,7 +149,6 @@ public class DefaultFlowRule implements FlowRule { |
213 | .add("selector", selector.criteria()) | 149 | .add("selector", selector.criteria()) |
214 | .add("treatment", treatment == null ? "N/A" : treatment.instructions()) | 150 | .add("treatment", treatment == null ? "N/A" : treatment.instructions()) |
215 | .add("created", created) | 151 | .add("created", created) |
216 | - .add("state", state) | ||
217 | .toString(); | 152 | .toString(); |
218 | } | 153 | } |
219 | 154 | ... | ... |
... | @@ -12,41 +12,6 @@ public interface FlowRule { | ... | @@ -12,41 +12,6 @@ public interface FlowRule { |
12 | static final int MAX_TIMEOUT = 60; | 12 | static final int MAX_TIMEOUT = 60; |
13 | static final int MIN_PRIORITY = 0; | 13 | static final int MIN_PRIORITY = 0; |
14 | 14 | ||
15 | - public enum FlowRuleState { | ||
16 | - /** | ||
17 | - * Indicates that this rule has been created. | ||
18 | - */ | ||
19 | - CREATED, | ||
20 | - | ||
21 | - /** | ||
22 | - * Indicates that this rule has been submitted for addition. | ||
23 | - * Not necessarily in the flow table. | ||
24 | - */ | ||
25 | - PENDING_ADD, | ||
26 | - | ||
27 | - /** | ||
28 | - * Rule has been added which means it is in the flow table. | ||
29 | - */ | ||
30 | - ADDED, | ||
31 | - | ||
32 | - /** | ||
33 | - * Flow has been marked for removal, might still be in flow table. | ||
34 | - */ | ||
35 | - PENDING_REMOVE, | ||
36 | - | ||
37 | - /** | ||
38 | - * Flow has been removed from flow table and can be purged. | ||
39 | - */ | ||
40 | - REMOVED | ||
41 | - } | ||
42 | - | ||
43 | - /** | ||
44 | - * Returns the flow rule state. | ||
45 | - * | ||
46 | - * @return flow rule state | ||
47 | - */ | ||
48 | - FlowRuleState state(); | ||
49 | - | ||
50 | //TODO: build cookie value | 15 | //TODO: build cookie value |
51 | /** | 16 | /** |
52 | * Returns the ID of this flow. | 17 | * Returns the ID of this flow. |
... | @@ -93,27 +58,6 @@ public interface FlowRule { | ... | @@ -93,27 +58,6 @@ public interface FlowRule { |
93 | TrafficTreatment treatment(); | 58 | TrafficTreatment treatment(); |
94 | 59 | ||
95 | /** | 60 | /** |
96 | - * Returns the number of milliseconds this flow rule has been applied. | ||
97 | - * | ||
98 | - * @return number of millis | ||
99 | - */ | ||
100 | - long life(); | ||
101 | - | ||
102 | - /** | ||
103 | - * Returns the number of packets this flow rule has matched. | ||
104 | - * | ||
105 | - * @return number of packets | ||
106 | - */ | ||
107 | - long packets(); | ||
108 | - | ||
109 | - /** | ||
110 | - * Returns the number of bytes this flow rule has matched. | ||
111 | - * | ||
112 | - * @return number of bytes | ||
113 | - */ | ||
114 | - long bytes(); | ||
115 | - | ||
116 | - /** | ||
117 | * Returns the timeout for this flow requested by an application. | 61 | * Returns the timeout for this flow requested by an application. |
118 | * @return integer value of the timeout | 62 | * @return integer value of the timeout |
119 | */ | 63 | */ | ... | ... |
... | @@ -14,7 +14,7 @@ public interface FlowRuleProviderService extends ProviderService<FlowRuleProvide | ... | @@ -14,7 +14,7 @@ public interface FlowRuleProviderService extends ProviderService<FlowRuleProvide |
14 | * | 14 | * |
15 | * @param flowRule information about the removed flow | 15 | * @param flowRule information about the removed flow |
16 | */ | 16 | */ |
17 | - void flowRemoved(FlowRule flowRule); | 17 | + void flowRemoved(FlowEntry flowEntry); |
18 | 18 | ||
19 | /** | 19 | /** |
20 | * Pushes the collection of flow entries currently applied on the given | 20 | * Pushes the collection of flow entries currently applied on the given |
... | @@ -22,7 +22,7 @@ public interface FlowRuleProviderService extends ProviderService<FlowRuleProvide | ... | @@ -22,7 +22,7 @@ public interface FlowRuleProviderService extends ProviderService<FlowRuleProvide |
22 | * | 22 | * |
23 | * @param flowRules collection of flow rules | 23 | * @param flowRules collection of flow rules |
24 | */ | 24 | */ |
25 | - void pushFlowMetrics(DeviceId deviceId, Iterable<FlowRule> flowRules); | 25 | + void pushFlowMetrics(DeviceId deviceId, Iterable<FlowEntry> flowEntries); |
26 | 26 | ||
27 | 27 | ||
28 | 28 | ... | ... |
... | @@ -20,7 +20,7 @@ public interface FlowRuleService { | ... | @@ -20,7 +20,7 @@ public interface FlowRuleService { |
20 | * @param deviceId device identifier | 20 | * @param deviceId device identifier |
21 | * @return collection of flow rules | 21 | * @return collection of flow rules |
22 | */ | 22 | */ |
23 | - Iterable<FlowRule> getFlowEntries(DeviceId deviceId); | 23 | + Iterable<FlowEntry> getFlowEntries(DeviceId deviceId); |
24 | 24 | ||
25 | // TODO: add createFlowRule factory method and execute operations method | 25 | // TODO: add createFlowRule factory method and execute operations method |
26 | 26 | ... | ... |
... | @@ -14,7 +14,7 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat | ... | @@ -14,7 +14,7 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat |
14 | * @param rule the rule to look for | 14 | * @param rule the rule to look for |
15 | * @return a flow rule | 15 | * @return a flow rule |
16 | */ | 16 | */ |
17 | - FlowRule getFlowRule(FlowRule rule); | 17 | + FlowEntry getFlowEntry(FlowRule rule); |
18 | 18 | ||
19 | /** | 19 | /** |
20 | * Returns the flow entries associated with a device. | 20 | * Returns the flow entries associated with a device. |
... | @@ -22,7 +22,7 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat | ... | @@ -22,7 +22,7 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat |
22 | * @param deviceId the device ID | 22 | * @param deviceId the device ID |
23 | * @return the flow entries | 23 | * @return the flow entries |
24 | */ | 24 | */ |
25 | - Iterable<FlowRule> getFlowEntries(DeviceId deviceId); | 25 | + Iterable<FlowEntry> getFlowEntries(DeviceId deviceId); |
26 | 26 | ||
27 | /** | 27 | /** |
28 | * Returns the flow entries associated with an application. | 28 | * Returns the flow entries associated with an application. |
... | @@ -30,7 +30,7 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat | ... | @@ -30,7 +30,7 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat |
30 | * @param appId the application id | 30 | * @param appId the application id |
31 | * @return the flow entries | 31 | * @return the flow entries |
32 | */ | 32 | */ |
33 | - Iterable<FlowRule> getFlowEntriesByAppId(ApplicationId appId); | 33 | + Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId); |
34 | 34 | ||
35 | /** | 35 | /** |
36 | * Stores a new flow rule without generating events. | 36 | * Stores a new flow rule without generating events. |
... | @@ -40,7 +40,8 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat | ... | @@ -40,7 +40,8 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat |
40 | void storeFlowRule(FlowRule rule); | 40 | void storeFlowRule(FlowRule rule); |
41 | 41 | ||
42 | /** | 42 | /** |
43 | - * Deletes a flow rule without generating events. | 43 | + * Marks a flow rule for deletion. Actual deletion will occur |
44 | + * when the provider indicates that the flow has been removed. | ||
44 | * | 45 | * |
45 | * @param rule the flow rule to delete | 46 | * @param rule the flow rule to delete |
46 | */ | 47 | */ |
... | @@ -52,12 +53,12 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat | ... | @@ -52,12 +53,12 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat |
52 | * @param rule the flow rule to add or update | 53 | * @param rule the flow rule to add or update |
53 | * @return flow_added event, or null if just an update | 54 | * @return flow_added event, or null if just an update |
54 | */ | 55 | */ |
55 | - FlowRuleEvent addOrUpdateFlowRule(FlowRule rule); | 56 | + FlowRuleEvent addOrUpdateFlowRule(FlowEntry rule); |
56 | 57 | ||
57 | /** | 58 | /** |
58 | - * @param rule the flow rule to remove | 59 | + * @param rule the flow entry to remove |
59 | * @return flow_removed event, or null if nothing removed | 60 | * @return flow_removed event, or null if nothing removed |
60 | */ | 61 | */ |
61 | - FlowRuleEvent removeFlowRule(FlowRule rule); | 62 | + FlowRuleEvent removeFlowRule(FlowEntry rule); |
62 | 63 | ||
63 | } | 64 | } | ... | ... |
... | @@ -5,8 +5,6 @@ import static org.slf4j.LoggerFactory.getLogger; | ... | @@ -5,8 +5,6 @@ import static org.slf4j.LoggerFactory.getLogger; |
5 | 5 | ||
6 | import java.util.Iterator; | 6 | import java.util.Iterator; |
7 | import java.util.List; | 7 | import java.util.List; |
8 | -import java.util.Map; | ||
9 | -import java.util.concurrent.ConcurrentHashMap; | ||
10 | 8 | ||
11 | import org.apache.felix.scr.annotations.Activate; | 9 | import org.apache.felix.scr.annotations.Activate; |
12 | import org.apache.felix.scr.annotations.Component; | 10 | import org.apache.felix.scr.annotations.Component; |
... | @@ -20,6 +18,7 @@ import org.onlab.onos.event.EventDeliveryService; | ... | @@ -20,6 +18,7 @@ import org.onlab.onos.event.EventDeliveryService; |
20 | import org.onlab.onos.net.Device; | 18 | import org.onlab.onos.net.Device; |
21 | import org.onlab.onos.net.DeviceId; | 19 | import org.onlab.onos.net.DeviceId; |
22 | import org.onlab.onos.net.device.DeviceService; | 20 | import org.onlab.onos.net.device.DeviceService; |
21 | +import org.onlab.onos.net.flow.FlowEntry; | ||
23 | import org.onlab.onos.net.flow.FlowRule; | 22 | import org.onlab.onos.net.flow.FlowRule; |
24 | import org.onlab.onos.net.flow.FlowRuleEvent; | 23 | import org.onlab.onos.net.flow.FlowRuleEvent; |
25 | import org.onlab.onos.net.flow.FlowRuleListener; | 24 | import org.onlab.onos.net.flow.FlowRuleListener; |
... | @@ -61,8 +60,6 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -61,8 +60,6 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
61 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 60 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
62 | protected DeviceService deviceService; | 61 | protected DeviceService deviceService; |
63 | 62 | ||
64 | - private final Map<FlowRule, Long> idleTime = new ConcurrentHashMap<>(); | ||
65 | - | ||
66 | @Activate | 63 | @Activate |
67 | public void activate() { | 64 | public void activate() { |
68 | store.setDelegate(delegate); | 65 | store.setDelegate(delegate); |
... | @@ -78,7 +75,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -78,7 +75,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
78 | } | 75 | } |
79 | 76 | ||
80 | @Override | 77 | @Override |
81 | - public Iterable<FlowRule> getFlowEntries(DeviceId deviceId) { | 78 | + public Iterable<FlowEntry> getFlowEntries(DeviceId deviceId) { |
82 | return store.getFlowEntries(deviceId); | 79 | return store.getFlowEntries(deviceId); |
83 | } | 80 | } |
84 | 81 | ||
... | @@ -88,7 +85,6 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -88,7 +85,6 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
88 | FlowRule f = flowRules[i]; | 85 | FlowRule f = flowRules[i]; |
89 | final Device device = deviceService.getDevice(f.deviceId()); | 86 | final Device device = deviceService.getDevice(f.deviceId()); |
90 | final FlowRuleProvider frp = getProvider(device.providerId()); | 87 | final FlowRuleProvider frp = getProvider(device.providerId()); |
91 | - idleTime.put(f, System.currentTimeMillis()); | ||
92 | store.storeFlowRule(f); | 88 | store.storeFlowRule(f); |
93 | frp.applyFlowRule(f); | 89 | frp.applyFlowRule(f); |
94 | } | 90 | } |
... | @@ -103,7 +99,6 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -103,7 +99,6 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
103 | f = flowRules[i]; | 99 | f = flowRules[i]; |
104 | device = deviceService.getDevice(f.deviceId()); | 100 | device = deviceService.getDevice(f.deviceId()); |
105 | frp = getProvider(device.providerId()); | 101 | frp = getProvider(device.providerId()); |
106 | - idleTime.remove(f); | ||
107 | store.deleteFlowRule(f); | 102 | store.deleteFlowRule(f); |
108 | frp.removeFlowRule(f); | 103 | frp.removeFlowRule(f); |
109 | } | 104 | } |
... | @@ -125,7 +120,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -125,7 +120,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
125 | 120 | ||
126 | @Override | 121 | @Override |
127 | public Iterable<FlowRule> getFlowRulesById(ApplicationId id) { | 122 | public Iterable<FlowRule> getFlowRulesById(ApplicationId id) { |
128 | - return store.getFlowEntriesByAppId(id); | 123 | + return store.getFlowRulesByAppId(id); |
129 | } | 124 | } |
130 | 125 | ||
131 | @Override | 126 | @Override |
... | @@ -153,15 +148,15 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -153,15 +148,15 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
153 | } | 148 | } |
154 | 149 | ||
155 | @Override | 150 | @Override |
156 | - public void flowRemoved(FlowRule flowRule) { | 151 | + public void flowRemoved(FlowEntry flowEntry) { |
157 | - checkNotNull(flowRule, FLOW_RULE_NULL); | 152 | + checkNotNull(flowEntry, FLOW_RULE_NULL); |
158 | checkValidity(); | 153 | checkValidity(); |
159 | - FlowRule stored = store.getFlowRule(flowRule); | 154 | + FlowEntry stored = store.getFlowEntry(flowEntry); |
160 | if (stored == null) { | 155 | if (stored == null) { |
161 | - log.info("Rule already evicted from store: {}", flowRule); | 156 | + log.info("Rule already evicted from store: {}", flowEntry); |
162 | return; | 157 | return; |
163 | } | 158 | } |
164 | - Device device = deviceService.getDevice(flowRule.deviceId()); | 159 | + Device device = deviceService.getDevice(flowEntry.deviceId()); |
165 | FlowRuleProvider frp = getProvider(device.providerId()); | 160 | FlowRuleProvider frp = getProvider(device.providerId()); |
166 | FlowRuleEvent event = null; | 161 | FlowRuleEvent event = null; |
167 | switch (stored.state()) { | 162 | switch (stored.state()) { |
... | @@ -171,20 +166,20 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -171,20 +166,20 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
171 | break; | 166 | break; |
172 | case PENDING_REMOVE: | 167 | case PENDING_REMOVE: |
173 | case REMOVED: | 168 | case REMOVED: |
174 | - event = store.removeFlowRule(flowRule); | 169 | + event = store.removeFlowRule(stored); |
175 | break; | 170 | break; |
176 | default: | 171 | default: |
177 | break; | 172 | break; |
178 | 173 | ||
179 | } | 174 | } |
180 | if (event != null) { | 175 | if (event != null) { |
181 | - log.debug("Flow {} removed", flowRule); | 176 | + log.debug("Flow {} removed", flowEntry); |
182 | post(event); | 177 | post(event); |
183 | } | 178 | } |
184 | } | 179 | } |
185 | 180 | ||
186 | 181 | ||
187 | - private void flowMissing(FlowRule flowRule) { | 182 | + private void flowMissing(FlowEntry flowRule) { |
188 | checkNotNull(flowRule, FLOW_RULE_NULL); | 183 | checkNotNull(flowRule, FLOW_RULE_NULL); |
189 | checkValidity(); | 184 | checkValidity(); |
190 | Device device = deviceService.getDevice(flowRule.deviceId()); | 185 | Device device = deviceService.getDevice(flowRule.deviceId()); |
... | @@ -220,36 +215,37 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -220,36 +215,37 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
220 | } | 215 | } |
221 | 216 | ||
222 | 217 | ||
223 | - private void flowAdded(FlowRule flowRule) { | 218 | + private void flowAdded(FlowEntry flowEntry) { |
224 | - checkNotNull(flowRule, FLOW_RULE_NULL); | 219 | + checkNotNull(flowEntry, FLOW_RULE_NULL); |
225 | checkValidity(); | 220 | checkValidity(); |
226 | 221 | ||
227 | - if (idleTime.containsKey(flowRule) && | 222 | + if (checkRuleLiveness(flowEntry, store.getFlowEntry(flowEntry))) { |
228 | - checkRuleLiveness(flowRule, store.getFlowRule(flowRule))) { | ||
229 | 223 | ||
230 | - FlowRuleEvent event = store.addOrUpdateFlowRule(flowRule); | 224 | + FlowRuleEvent event = store.addOrUpdateFlowRule(flowEntry); |
231 | if (event == null) { | 225 | if (event == null) { |
232 | log.debug("No flow store event generated."); | 226 | log.debug("No flow store event generated."); |
233 | } else { | 227 | } else { |
234 | - log.debug("Flow {} {}", flowRule, event.type()); | 228 | + log.debug("Flow {} {}", flowEntry, event.type()); |
235 | post(event); | 229 | post(event); |
236 | } | 230 | } |
237 | } else { | 231 | } else { |
238 | - removeFlowRules(flowRule); | 232 | + removeFlowRules(flowEntry); |
239 | } | 233 | } |
240 | 234 | ||
241 | } | 235 | } |
242 | 236 | ||
243 | - private boolean checkRuleLiveness(FlowRule swRule, FlowRule storedRule) { | 237 | + private boolean checkRuleLiveness(FlowEntry swRule, FlowEntry storedRule) { |
238 | + if (storedRule == null) { | ||
239 | + return false; | ||
240 | + } | ||
244 | long timeout = storedRule.timeout() * 1000; | 241 | long timeout = storedRule.timeout() * 1000; |
245 | Long currentTime = System.currentTimeMillis(); | 242 | Long currentTime = System.currentTimeMillis(); |
246 | if (storedRule.packets() != swRule.packets()) { | 243 | if (storedRule.packets() != swRule.packets()) { |
247 | - idleTime.put(swRule, currentTime); | 244 | + storedRule.setLastSeen(); |
248 | return true; | 245 | return true; |
249 | } | 246 | } |
250 | 247 | ||
251 | - if ((currentTime - idleTime.get(swRule)) <= timeout) { | 248 | + if ((currentTime - storedRule.lastSeen()) <= timeout) { |
252 | - idleTime.put(swRule, currentTime); | ||
253 | return true; | 249 | return true; |
254 | } | 250 | } |
255 | return false; | 251 | return false; |
... | @@ -263,13 +259,13 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -263,13 +259,13 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
263 | } | 259 | } |
264 | 260 | ||
265 | @Override | 261 | @Override |
266 | - public void pushFlowMetrics(DeviceId deviceId, Iterable<FlowRule> flowEntries) { | 262 | + public void pushFlowMetrics(DeviceId deviceId, Iterable<FlowEntry> flowEntries) { |
267 | - List<FlowRule> storedRules = Lists.newLinkedList(store.getFlowEntries(deviceId)); | 263 | + List<FlowEntry> storedRules = Lists.newLinkedList(store.getFlowEntries(deviceId)); |
268 | 264 | ||
269 | - Iterator<FlowRule> switchRulesIterator = flowEntries.iterator(); | 265 | + Iterator<FlowEntry> switchRulesIterator = flowEntries.iterator(); |
270 | 266 | ||
271 | while (switchRulesIterator.hasNext()) { | 267 | while (switchRulesIterator.hasNext()) { |
272 | - FlowRule rule = switchRulesIterator.next(); | 268 | + FlowEntry rule = switchRulesIterator.next(); |
273 | if (storedRules.remove(rule)) { | 269 | if (storedRules.remove(rule)) { |
274 | // we both have the rule, let's update some info then. | 270 | // we both have the rule, let's update some info then. |
275 | flowAdded(rule); | 271 | flowAdded(rule); |
... | @@ -278,7 +274,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { | ... | @@ -278,7 +274,7 @@ implements FlowRuleService, FlowRuleProviderRegistry { |
278 | extraneousFlow(rule); | 274 | extraneousFlow(rule); |
279 | } | 275 | } |
280 | } | 276 | } |
281 | - for (FlowRule rule : storedRules) { | 277 | + for (FlowEntry rule : storedRules) { |
282 | // there are rules in the store that aren't on the switch | 278 | // there are rules in the store that aren't on the switch |
283 | flowMissing(rule); | 279 | flowMissing(rule); |
284 | 280 | ... | ... |
... | @@ -27,9 +27,11 @@ import org.onlab.onos.net.Port; | ... | @@ -27,9 +27,11 @@ import org.onlab.onos.net.Port; |
27 | import org.onlab.onos.net.PortNumber; | 27 | import org.onlab.onos.net.PortNumber; |
28 | import org.onlab.onos.net.device.DeviceListener; | 28 | import org.onlab.onos.net.device.DeviceListener; |
29 | import org.onlab.onos.net.device.DeviceService; | 29 | import org.onlab.onos.net.device.DeviceService; |
30 | +import org.onlab.onos.net.flow.DefaultFlowEntry; | ||
30 | import org.onlab.onos.net.flow.DefaultFlowRule; | 31 | import org.onlab.onos.net.flow.DefaultFlowRule; |
32 | +import org.onlab.onos.net.flow.FlowEntry; | ||
33 | +import org.onlab.onos.net.flow.FlowEntry.FlowEntryState; | ||
31 | import org.onlab.onos.net.flow.FlowRule; | 34 | import org.onlab.onos.net.flow.FlowRule; |
32 | -import org.onlab.onos.net.flow.FlowRule.FlowRuleState; | ||
33 | import org.onlab.onos.net.flow.FlowRuleEvent; | 35 | import org.onlab.onos.net.flow.FlowRuleEvent; |
34 | import org.onlab.onos.net.flow.FlowRuleListener; | 36 | import org.onlab.onos.net.flow.FlowRuleListener; |
35 | import org.onlab.onos.net.flow.FlowRuleProvider; | 37 | import org.onlab.onos.net.flow.FlowRuleProvider; |
... | @@ -103,9 +105,6 @@ public class FlowRuleManagerTest { | ... | @@ -103,9 +105,6 @@ public class FlowRuleManagerTest { |
103 | return new DefaultFlowRule(DID, ts, tr, 10, appId, TIMEOUT); | 105 | return new DefaultFlowRule(DID, ts, tr, 10, appId, TIMEOUT); |
104 | } | 106 | } |
105 | 107 | ||
106 | - private FlowRule flowRule(FlowRule rule, FlowRuleState state) { | ||
107 | - return new DefaultFlowRule(rule, state); | ||
108 | - } | ||
109 | 108 | ||
110 | private FlowRule addFlowRule(int hval) { | 109 | private FlowRule addFlowRule(int hval) { |
111 | FlowRule rule = flowRule(hval, hval); | 110 | FlowRule rule = flowRule(hval, hval); |
... | @@ -143,24 +142,26 @@ public class FlowRuleManagerTest { | ... | @@ -143,24 +142,26 @@ public class FlowRuleManagerTest { |
143 | FlowRule f1 = addFlowRule(1); | 142 | FlowRule f1 = addFlowRule(1); |
144 | FlowRule f2 = addFlowRule(2); | 143 | FlowRule f2 = addFlowRule(2); |
145 | 144 | ||
145 | + FlowEntry fe1 = new DefaultFlowEntry(f1); | ||
146 | + FlowEntry fe2 = new DefaultFlowEntry(f2); | ||
146 | assertEquals("2 rules should exist", 2, flowCount()); | 147 | assertEquals("2 rules should exist", 2, flowCount()); |
147 | 148 | ||
148 | - providerService.pushFlowMetrics(DID, ImmutableList.of(f1, f2)); | 149 | + providerService.pushFlowMetrics(DID, ImmutableList.of(fe1, fe2)); |
149 | validateEvents(RULE_ADDED, RULE_ADDED); | 150 | validateEvents(RULE_ADDED, RULE_ADDED); |
150 | 151 | ||
151 | addFlowRule(1); | 152 | addFlowRule(1); |
152 | assertEquals("should still be 2 rules", 2, flowCount()); | 153 | assertEquals("should still be 2 rules", 2, flowCount()); |
153 | 154 | ||
154 | - providerService.pushFlowMetrics(DID, ImmutableList.of(f1)); | 155 | + providerService.pushFlowMetrics(DID, ImmutableList.of(fe1)); |
155 | validateEvents(RULE_UPDATED); | 156 | validateEvents(RULE_UPDATED); |
156 | } | 157 | } |
157 | 158 | ||
158 | 159 | ||
159 | //backing store is sensitive to the order of additions/removals | 160 | //backing store is sensitive to the order of additions/removals |
160 | - private boolean validateState(FlowRuleState... state) { | 161 | + private boolean validateState(FlowEntryState... state) { |
161 | - Iterable<FlowRule> rules = service.getFlowEntries(DID); | 162 | + Iterable<FlowEntry> rules = service.getFlowEntries(DID); |
162 | int i = 0; | 163 | int i = 0; |
163 | - for (FlowRule f : rules) { | 164 | + for (FlowEntry f : rules) { |
164 | if (f.state() != state[i]) { | 165 | if (f.state() != state[i]) { |
165 | return false; | 166 | return false; |
166 | } | 167 | } |
... | @@ -181,8 +182,8 @@ public class FlowRuleManagerTest { | ... | @@ -181,8 +182,8 @@ public class FlowRuleManagerTest { |
181 | mgr.applyFlowRules(r1, r2, r3); | 182 | mgr.applyFlowRules(r1, r2, r3); |
182 | assertEquals("3 rules should exist", 3, flowCount()); | 183 | assertEquals("3 rules should exist", 3, flowCount()); |
183 | assertTrue("Entries should be pending add.", | 184 | assertTrue("Entries should be pending add.", |
184 | - validateState(FlowRuleState.PENDING_ADD, FlowRuleState.PENDING_ADD, | 185 | + validateState(FlowEntryState.PENDING_ADD, FlowEntryState.PENDING_ADD, |
185 | - FlowRuleState.PENDING_ADD)); | 186 | + FlowEntryState.PENDING_ADD)); |
186 | } | 187 | } |
187 | 188 | ||
188 | @Test | 189 | @Test |
... | @@ -192,20 +193,21 @@ public class FlowRuleManagerTest { | ... | @@ -192,20 +193,21 @@ public class FlowRuleManagerTest { |
192 | FlowRule f3 = addFlowRule(3); | 193 | FlowRule f3 = addFlowRule(3); |
193 | assertEquals("3 rules should exist", 3, flowCount()); | 194 | assertEquals("3 rules should exist", 3, flowCount()); |
194 | 195 | ||
195 | - providerService.pushFlowMetrics(DID, ImmutableList.of(f1, f2, f3)); | 196 | + FlowEntry fe1 = new DefaultFlowEntry(f1); |
197 | + FlowEntry fe2 = new DefaultFlowEntry(f2); | ||
198 | + FlowEntry fe3 = new DefaultFlowEntry(f3); | ||
199 | + providerService.pushFlowMetrics(DID, ImmutableList.of(fe1, fe2, fe3)); | ||
196 | validateEvents(RULE_ADDED, RULE_ADDED, RULE_ADDED); | 200 | validateEvents(RULE_ADDED, RULE_ADDED, RULE_ADDED); |
197 | 201 | ||
198 | - FlowRule rem1 = flowRule(f1, FlowRuleState.REMOVED); | 202 | + mgr.removeFlowRules(f1, f2); |
199 | - FlowRule rem2 = flowRule(f2, FlowRuleState.REMOVED); | ||
200 | - mgr.removeFlowRules(rem1, rem2); | ||
201 | //removing from north, so no events generated | 203 | //removing from north, so no events generated |
202 | validateEvents(); | 204 | validateEvents(); |
203 | assertEquals("3 rule should exist", 3, flowCount()); | 205 | assertEquals("3 rule should exist", 3, flowCount()); |
204 | assertTrue("Entries should be pending remove.", | 206 | assertTrue("Entries should be pending remove.", |
205 | - validateState(FlowRuleState.CREATED, FlowRuleState.PENDING_REMOVE, | 207 | + validateState(FlowEntryState.PENDING_REMOVE, FlowEntryState.PENDING_REMOVE, |
206 | - FlowRuleState.PENDING_REMOVE)); | 208 | + FlowEntryState.ADDED)); |
207 | 209 | ||
208 | - mgr.removeFlowRules(rem1); | 210 | + mgr.removeFlowRules(f1); |
209 | assertEquals("3 rule should still exist", 3, flowCount()); | 211 | assertEquals("3 rule should still exist", 3, flowCount()); |
210 | } | 212 | } |
211 | 213 | ||
... | @@ -213,21 +215,24 @@ public class FlowRuleManagerTest { | ... | @@ -213,21 +215,24 @@ public class FlowRuleManagerTest { |
213 | public void flowRemoved() { | 215 | public void flowRemoved() { |
214 | FlowRule f1 = addFlowRule(1); | 216 | FlowRule f1 = addFlowRule(1); |
215 | FlowRule f2 = addFlowRule(2); | 217 | FlowRule f2 = addFlowRule(2); |
216 | - providerService.pushFlowMetrics(f1.deviceId(), ImmutableList.of(f1, f2)); | 218 | + FlowEntry fe1 = new DefaultFlowEntry(f1); |
219 | + FlowEntry fe2 = new DefaultFlowEntry(f2); | ||
220 | + providerService.pushFlowMetrics(DID, ImmutableList.of(fe1, fe2)); | ||
217 | service.removeFlowRules(f1); | 221 | service.removeFlowRules(f1); |
218 | - FlowRule rem1 = flowRule(f1, FlowRuleState.REMOVED); | 222 | + fe1.setState(FlowEntryState.REMOVED); |
219 | - providerService.flowRemoved(rem1); | 223 | + providerService.flowRemoved(fe1); |
220 | validateEvents(RULE_ADDED, RULE_ADDED, RULE_REMOVED); | 224 | validateEvents(RULE_ADDED, RULE_ADDED, RULE_REMOVED); |
221 | 225 | ||
222 | - providerService.flowRemoved(rem1); | 226 | + providerService.flowRemoved(fe1); |
223 | validateEvents(); | 227 | validateEvents(); |
224 | 228 | ||
225 | FlowRule f3 = flowRule(3, 3); | 229 | FlowRule f3 = flowRule(3, 3); |
230 | + FlowEntry fe3 = new DefaultFlowEntry(f3); | ||
226 | service.applyFlowRules(f3); | 231 | service.applyFlowRules(f3); |
227 | - providerService.pushFlowMetrics(f3.deviceId(), Collections.singletonList(f3)); | 232 | + providerService.pushFlowMetrics(DID, Collections.singletonList(fe3)); |
228 | validateEvents(RULE_ADDED); | 233 | validateEvents(RULE_ADDED); |
229 | 234 | ||
230 | - providerService.flowRemoved(f3); | 235 | + providerService.flowRemoved(fe3); |
231 | validateEvents(); | 236 | validateEvents(); |
232 | } | 237 | } |
233 | 238 | ||
... | @@ -237,17 +242,20 @@ public class FlowRuleManagerTest { | ... | @@ -237,17 +242,20 @@ public class FlowRuleManagerTest { |
237 | FlowRule f2 = flowRule(2, 2); | 242 | FlowRule f2 = flowRule(2, 2); |
238 | FlowRule f3 = flowRule(3, 3); | 243 | FlowRule f3 = flowRule(3, 3); |
239 | 244 | ||
245 | + mgr.applyFlowRules(f1, f2, f3); | ||
240 | 246 | ||
247 | + FlowEntry fe1 = new DefaultFlowEntry(f1); | ||
248 | + FlowEntry fe2 = new DefaultFlowEntry(f2); | ||
241 | 249 | ||
242 | - mgr.applyFlowRules(f1, f2, f3); | ||
243 | - FlowRule updatedF1 = flowRule(f1, FlowRuleState.ADDED); | ||
244 | - FlowRule updatedF2 = flowRule(f2, FlowRuleState.ADDED); | ||
245 | 250 | ||
246 | - providerService.pushFlowMetrics(DID, Lists.newArrayList(updatedF1, updatedF2)); | 251 | + //FlowRule updatedF1 = flowRule(f1, FlowRuleState.ADDED); |
252 | + //FlowRule updatedF2 = flowRule(f2, FlowRuleState.ADDED); | ||
253 | + | ||
254 | + providerService.pushFlowMetrics(DID, Lists.newArrayList(fe1, fe2)); | ||
247 | 255 | ||
248 | assertTrue("Entries should be added.", | 256 | assertTrue("Entries should be added.", |
249 | - validateState(FlowRuleState.PENDING_ADD, FlowRuleState.ADDED, | 257 | + validateState(FlowEntryState.ADDED, FlowEntryState.ADDED, |
250 | - FlowRuleState.ADDED)); | 258 | + FlowEntryState.PENDING_ADD)); |
251 | 259 | ||
252 | validateEvents(RULE_ADDED, RULE_ADDED); | 260 | validateEvents(RULE_ADDED, RULE_ADDED); |
253 | } | 261 | } |
... | @@ -259,11 +267,15 @@ public class FlowRuleManagerTest { | ... | @@ -259,11 +267,15 @@ public class FlowRuleManagerTest { |
259 | FlowRule f3 = flowRule(3, 3); | 267 | FlowRule f3 = flowRule(3, 3); |
260 | mgr.applyFlowRules(f1, f2); | 268 | mgr.applyFlowRules(f1, f2); |
261 | 269 | ||
262 | - FlowRule updatedF1 = flowRule(f1, FlowRuleState.ADDED); | 270 | +// FlowRule updatedF1 = flowRule(f1, FlowRuleState.ADDED); |
263 | - FlowRule updatedF2 = flowRule(f2, FlowRuleState.ADDED); | 271 | +// FlowRule updatedF2 = flowRule(f2, FlowRuleState.ADDED); |
264 | - FlowRule updatedF3 = flowRule(f3, FlowRuleState.ADDED); | 272 | +// FlowRule updatedF3 = flowRule(f3, FlowRuleState.ADDED); |
273 | + FlowEntry fe1 = new DefaultFlowEntry(f1); | ||
274 | + FlowEntry fe2 = new DefaultFlowEntry(f2); | ||
275 | + FlowEntry fe3 = new DefaultFlowEntry(f3); | ||
276 | + | ||
265 | 277 | ||
266 | - providerService.pushFlowMetrics(DID, Lists.newArrayList(updatedF1, updatedF2, updatedF3)); | 278 | + providerService.pushFlowMetrics(DID, Lists.newArrayList(fe1, fe2, fe3)); |
267 | 279 | ||
268 | validateEvents(RULE_ADDED, RULE_ADDED); | 280 | validateEvents(RULE_ADDED, RULE_ADDED); |
269 | 281 | ||
... | @@ -279,13 +291,16 @@ public class FlowRuleManagerTest { | ... | @@ -279,13 +291,16 @@ public class FlowRuleManagerTest { |
279 | FlowRule f2 = flowRule(2, 2); | 291 | FlowRule f2 = flowRule(2, 2); |
280 | FlowRule f3 = flowRule(3, 3); | 292 | FlowRule f3 = flowRule(3, 3); |
281 | 293 | ||
282 | - FlowRule updatedF1 = flowRule(f1, FlowRuleState.ADDED); | 294 | +// FlowRule updatedF1 = flowRule(f1, FlowRuleState.ADDED); |
283 | - FlowRule updatedF2 = flowRule(f2, FlowRuleState.ADDED); | 295 | +// FlowRule updatedF2 = flowRule(f2, FlowRuleState.ADDED); |
296 | + | ||
297 | + FlowEntry fe1 = new DefaultFlowEntry(f1); | ||
298 | + FlowEntry fe2 = new DefaultFlowEntry(f2); | ||
284 | mgr.applyFlowRules(f1, f2, f3); | 299 | mgr.applyFlowRules(f1, f2, f3); |
285 | 300 | ||
286 | mgr.removeFlowRules(f3); | 301 | mgr.removeFlowRules(f3); |
287 | 302 | ||
288 | - providerService.pushFlowMetrics(DID, Lists.newArrayList(updatedF1, updatedF2)); | 303 | + providerService.pushFlowMetrics(DID, Lists.newArrayList(fe1, fe2)); |
289 | 304 | ||
290 | validateEvents(RULE_ADDED, RULE_ADDED, RULE_REMOVED); | 305 | validateEvents(RULE_ADDED, RULE_ADDED, RULE_REMOVED); |
291 | 306 | ||
... | @@ -312,7 +327,7 @@ public class FlowRuleManagerTest { | ... | @@ -312,7 +327,7 @@ public class FlowRuleManagerTest { |
312 | 327 | ||
313 | //only check that we are in pending remove. Events and actual remove state will | 328 | //only check that we are in pending remove. Events and actual remove state will |
314 | // be set by flowRemoved call. | 329 | // be set by flowRemoved call. |
315 | - validateState(FlowRuleState.PENDING_REMOVE, FlowRuleState.PENDING_REMOVE); | 330 | + validateState(FlowEntryState.PENDING_REMOVE, FlowEntryState.PENDING_REMOVE); |
316 | } | 331 | } |
317 | 332 | ||
318 | private static class TestListener implements FlowRuleListener { | 333 | private static class TestListener implements FlowRuleListener { | ... | ... |
1 | package org.onlab.onos.store.flow.impl; | 1 | package org.onlab.onos.store.flow.impl; |
2 | 2 | ||
3 | -import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_ADDED; | ||
4 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; | 3 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; |
5 | import static org.slf4j.LoggerFactory.getLogger; | 4 | import static org.slf4j.LoggerFactory.getLogger; |
6 | 5 | ||
... | @@ -13,9 +12,10 @@ import org.apache.felix.scr.annotations.Deactivate; | ... | @@ -13,9 +12,10 @@ import org.apache.felix.scr.annotations.Deactivate; |
13 | import org.apache.felix.scr.annotations.Service; | 12 | import org.apache.felix.scr.annotations.Service; |
14 | import org.onlab.onos.ApplicationId; | 13 | import org.onlab.onos.ApplicationId; |
15 | import org.onlab.onos.net.DeviceId; | 14 | import org.onlab.onos.net.DeviceId; |
16 | -import org.onlab.onos.net.flow.DefaultFlowRule; | 15 | +import org.onlab.onos.net.flow.DefaultFlowEntry; |
16 | +import org.onlab.onos.net.flow.FlowEntry; | ||
17 | +import org.onlab.onos.net.flow.FlowEntry.FlowEntryState; | ||
17 | import org.onlab.onos.net.flow.FlowRule; | 18 | import org.onlab.onos.net.flow.FlowRule; |
18 | -import org.onlab.onos.net.flow.FlowRule.FlowRuleState; | ||
19 | import org.onlab.onos.net.flow.FlowRuleEvent; | 19 | import org.onlab.onos.net.flow.FlowRuleEvent; |
20 | import org.onlab.onos.net.flow.FlowRuleEvent.Type; | 20 | import org.onlab.onos.net.flow.FlowRuleEvent.Type; |
21 | import org.onlab.onos.net.flow.FlowRuleStore; | 21 | import org.onlab.onos.net.flow.FlowRuleStore; |
... | @@ -30,18 +30,18 @@ import com.google.common.collect.Multimap; | ... | @@ -30,18 +30,18 @@ import com.google.common.collect.Multimap; |
30 | /** | 30 | /** |
31 | * Manages inventory of flow rules using trivial in-memory implementation. | 31 | * Manages inventory of flow rules using trivial in-memory implementation. |
32 | */ | 32 | */ |
33 | -//FIXME: I LIE I AM NOT DISTRIBUTED | 33 | +//FIXME I LIE. I AIN'T DISTRIBUTED |
34 | @Component(immediate = true) | 34 | @Component(immediate = true) |
35 | @Service | 35 | @Service |
36 | public class DistributedFlowRuleStore | 36 | public class DistributedFlowRuleStore |
37 | -extends AbstractStore<FlowRuleEvent, FlowRuleStoreDelegate> | 37 | + extends AbstractStore<FlowRuleEvent, FlowRuleStoreDelegate> |
38 | -implements FlowRuleStore { | 38 | + implements FlowRuleStore { |
39 | 39 | ||
40 | private final Logger log = getLogger(getClass()); | 40 | private final Logger log = getLogger(getClass()); |
41 | 41 | ||
42 | // store entries as a pile of rules, no info about device tables | 42 | // store entries as a pile of rules, no info about device tables |
43 | - private final Multimap<DeviceId, FlowRule> flowEntries = | 43 | + private final Multimap<DeviceId, FlowEntry> flowEntries = |
44 | - ArrayListMultimap.<DeviceId, FlowRule>create(); | 44 | + ArrayListMultimap.<DeviceId, FlowEntry>create(); |
45 | 45 | ||
46 | private final Multimap<ApplicationId, FlowRule> flowEntriesById = | 46 | private final Multimap<ApplicationId, FlowRule> flowEntriesById = |
47 | ArrayListMultimap.<ApplicationId, FlowRule>create(); | 47 | ArrayListMultimap.<ApplicationId, FlowRule>create(); |
... | @@ -58,8 +58,8 @@ implements FlowRuleStore { | ... | @@ -58,8 +58,8 @@ implements FlowRuleStore { |
58 | 58 | ||
59 | 59 | ||
60 | @Override | 60 | @Override |
61 | - public synchronized FlowRule getFlowRule(FlowRule rule) { | 61 | + public synchronized FlowEntry getFlowEntry(FlowRule rule) { |
62 | - for (FlowRule f : flowEntries.get(rule.deviceId())) { | 62 | + for (FlowEntry f : flowEntries.get(rule.deviceId())) { |
63 | if (f.equals(rule)) { | 63 | if (f.equals(rule)) { |
64 | return f; | 64 | return f; |
65 | } | 65 | } |
... | @@ -68,8 +68,8 @@ implements FlowRuleStore { | ... | @@ -68,8 +68,8 @@ implements FlowRuleStore { |
68 | } | 68 | } |
69 | 69 | ||
70 | @Override | 70 | @Override |
71 | - public synchronized Iterable<FlowRule> getFlowEntries(DeviceId deviceId) { | 71 | + public synchronized Iterable<FlowEntry> getFlowEntries(DeviceId deviceId) { |
72 | - Collection<FlowRule> rules = flowEntries.get(deviceId); | 72 | + Collection<FlowEntry> rules = flowEntries.get(deviceId); |
73 | if (rules == null) { | 73 | if (rules == null) { |
74 | return Collections.emptyList(); | 74 | return Collections.emptyList(); |
75 | } | 75 | } |
... | @@ -77,7 +77,7 @@ implements FlowRuleStore { | ... | @@ -77,7 +77,7 @@ implements FlowRuleStore { |
77 | } | 77 | } |
78 | 78 | ||
79 | @Override | 79 | @Override |
80 | - public synchronized Iterable<FlowRule> getFlowEntriesByAppId(ApplicationId appId) { | 80 | + public synchronized Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId) { |
81 | Collection<FlowRule> rules = flowEntriesById.get(appId); | 81 | Collection<FlowRule> rules = flowEntriesById.get(appId); |
82 | if (rules == null) { | 82 | if (rules == null) { |
83 | return Collections.emptyList(); | 83 | return Collections.emptyList(); |
... | @@ -87,7 +87,7 @@ implements FlowRuleStore { | ... | @@ -87,7 +87,7 @@ implements FlowRuleStore { |
87 | 87 | ||
88 | @Override | 88 | @Override |
89 | public synchronized void storeFlowRule(FlowRule rule) { | 89 | public synchronized void storeFlowRule(FlowRule rule) { |
90 | - FlowRule f = new DefaultFlowRule(rule, FlowRuleState.PENDING_ADD); | 90 | + FlowEntry f = new DefaultFlowEntry(rule); |
91 | DeviceId did = f.deviceId(); | 91 | DeviceId did = f.deviceId(); |
92 | if (!flowEntries.containsEntry(did, f)) { | 92 | if (!flowEntries.containsEntry(did, f)) { |
93 | flowEntries.put(did, f); | 93 | flowEntries.put(did, f); |
... | @@ -97,57 +97,41 @@ implements FlowRuleStore { | ... | @@ -97,57 +97,41 @@ implements FlowRuleStore { |
97 | 97 | ||
98 | @Override | 98 | @Override |
99 | public synchronized void deleteFlowRule(FlowRule rule) { | 99 | public synchronized void deleteFlowRule(FlowRule rule) { |
100 | - FlowRule f = new DefaultFlowRule(rule, FlowRuleState.PENDING_REMOVE); | 100 | + FlowEntry entry = getFlowEntry(rule); |
101 | - DeviceId did = f.deviceId(); | 101 | + if (entry == null) { |
102 | - | 102 | + return; |
103 | - /* | ||
104 | - * find the rule and mark it for deletion. | ||
105 | - * Ultimately a flow removed will come remove it. | ||
106 | - */ | ||
107 | - | ||
108 | - if (flowEntries.containsEntry(did, f)) { | ||
109 | - //synchronized (flowEntries) { | ||
110 | - flowEntries.remove(did, f); | ||
111 | - flowEntries.put(did, f); | ||
112 | - flowEntriesById.remove(rule.appId(), rule); | ||
113 | - //} | ||
114 | } | 103 | } |
104 | + entry.setState(FlowEntryState.PENDING_REMOVE); | ||
115 | } | 105 | } |
116 | 106 | ||
117 | @Override | 107 | @Override |
118 | - public synchronized FlowRuleEvent addOrUpdateFlowRule(FlowRule rule) { | 108 | + public synchronized FlowRuleEvent addOrUpdateFlowRule(FlowEntry rule) { |
119 | DeviceId did = rule.deviceId(); | 109 | DeviceId did = rule.deviceId(); |
120 | 110 | ||
121 | // check if this new rule is an update to an existing entry | 111 | // check if this new rule is an update to an existing entry |
122 | - if (flowEntries.containsEntry(did, rule)) { | 112 | + FlowEntry stored = getFlowEntry(rule); |
123 | - //synchronized (flowEntries) { | 113 | + if (stored != null) { |
124 | - // Multimaps support duplicates so we have to remove our rule | 114 | + stored.setBytes(rule.bytes()); |
125 | - // and replace it with the current version. | 115 | + stored.setLife(rule.life()); |
126 | - flowEntries.remove(did, rule); | 116 | + stored.setPackets(rule.packets()); |
127 | - flowEntries.put(did, rule); | 117 | + if (stored.state() == FlowEntryState.PENDING_ADD) { |
128 | - //} | 118 | + stored.setState(FlowEntryState.ADDED); |
119 | + return new FlowRuleEvent(Type.RULE_ADDED, rule); | ||
120 | + } | ||
129 | return new FlowRuleEvent(Type.RULE_UPDATED, rule); | 121 | return new FlowRuleEvent(Type.RULE_UPDATED, rule); |
130 | } | 122 | } |
131 | 123 | ||
132 | flowEntries.put(did, rule); | 124 | flowEntries.put(did, rule); |
133 | - return new FlowRuleEvent(RULE_ADDED, rule); | 125 | + return null; |
134 | } | 126 | } |
135 | 127 | ||
136 | @Override | 128 | @Override |
137 | - public synchronized FlowRuleEvent removeFlowRule(FlowRule rule) { | 129 | + public synchronized FlowRuleEvent removeFlowRule(FlowEntry rule) { |
138 | - //synchronized (this) { | 130 | + // This is where one could mark a rule as removed and still keep it in the store. |
139 | if (flowEntries.remove(rule.deviceId(), rule)) { | 131 | if (flowEntries.remove(rule.deviceId(), rule)) { |
140 | return new FlowRuleEvent(RULE_REMOVED, rule); | 132 | return new FlowRuleEvent(RULE_REMOVED, rule); |
141 | } else { | 133 | } else { |
142 | return null; | 134 | return null; |
143 | } | 135 | } |
144 | - //} | ||
145 | } | 136 | } |
146 | - | ||
147 | - | ||
148 | - | ||
149 | - | ||
150 | - | ||
151 | - | ||
152 | - | ||
153 | } | 137 | } | ... | ... |
1 | package org.onlab.onos.store.flow.impl; | 1 | package org.onlab.onos.store.flow.impl; |
2 | 2 | ||
3 | -import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_ADDED; | ||
4 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; | 3 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; |
5 | import static org.slf4j.LoggerFactory.getLogger; | 4 | import static org.slf4j.LoggerFactory.getLogger; |
6 | 5 | ||
... | @@ -13,9 +12,10 @@ import org.apache.felix.scr.annotations.Deactivate; | ... | @@ -13,9 +12,10 @@ import org.apache.felix.scr.annotations.Deactivate; |
13 | import org.apache.felix.scr.annotations.Service; | 12 | import org.apache.felix.scr.annotations.Service; |
14 | import org.onlab.onos.ApplicationId; | 13 | import org.onlab.onos.ApplicationId; |
15 | import org.onlab.onos.net.DeviceId; | 14 | import org.onlab.onos.net.DeviceId; |
16 | -import org.onlab.onos.net.flow.DefaultFlowRule; | 15 | +import org.onlab.onos.net.flow.DefaultFlowEntry; |
16 | +import org.onlab.onos.net.flow.FlowEntry; | ||
17 | +import org.onlab.onos.net.flow.FlowEntry.FlowEntryState; | ||
17 | import org.onlab.onos.net.flow.FlowRule; | 18 | import org.onlab.onos.net.flow.FlowRule; |
18 | -import org.onlab.onos.net.flow.FlowRule.FlowRuleState; | ||
19 | import org.onlab.onos.net.flow.FlowRuleEvent; | 19 | import org.onlab.onos.net.flow.FlowRuleEvent; |
20 | import org.onlab.onos.net.flow.FlowRuleEvent.Type; | 20 | import org.onlab.onos.net.flow.FlowRuleEvent.Type; |
21 | import org.onlab.onos.net.flow.FlowRuleStore; | 21 | import org.onlab.onos.net.flow.FlowRuleStore; |
... | @@ -28,20 +28,20 @@ import com.google.common.collect.ImmutableSet; | ... | @@ -28,20 +28,20 @@ import com.google.common.collect.ImmutableSet; |
28 | import com.google.common.collect.Multimap; | 28 | import com.google.common.collect.Multimap; |
29 | 29 | ||
30 | /** | 30 | /** |
31 | - * TEMPORARY: Manages inventory of flow rules using distributed store implementation. | 31 | + * Manages inventory of flow rules using trivial in-memory implementation. |
32 | */ | 32 | */ |
33 | -//FIXME: I LIE I AM NOT DISTRIBUTED | 33 | +//FIXME I LIE. I AIN'T DISTRIBUTED |
34 | @Component(immediate = true) | 34 | @Component(immediate = true) |
35 | @Service | 35 | @Service |
36 | public class DistributedFlowRuleStore | 36 | public class DistributedFlowRuleStore |
37 | -extends AbstractStore<FlowRuleEvent, FlowRuleStoreDelegate> | 37 | + extends AbstractStore<FlowRuleEvent, FlowRuleStoreDelegate> |
38 | -implements FlowRuleStore { | 38 | + implements FlowRuleStore { |
39 | 39 | ||
40 | private final Logger log = getLogger(getClass()); | 40 | private final Logger log = getLogger(getClass()); |
41 | 41 | ||
42 | // store entries as a pile of rules, no info about device tables | 42 | // store entries as a pile of rules, no info about device tables |
43 | - private final Multimap<DeviceId, FlowRule> flowEntries = | 43 | + private final Multimap<DeviceId, FlowEntry> flowEntries = |
44 | - ArrayListMultimap.<DeviceId, FlowRule>create(); | 44 | + ArrayListMultimap.<DeviceId, FlowEntry>create(); |
45 | 45 | ||
46 | private final Multimap<ApplicationId, FlowRule> flowEntriesById = | 46 | private final Multimap<ApplicationId, FlowRule> flowEntriesById = |
47 | ArrayListMultimap.<ApplicationId, FlowRule>create(); | 47 | ArrayListMultimap.<ApplicationId, FlowRule>create(); |
... | @@ -58,8 +58,8 @@ implements FlowRuleStore { | ... | @@ -58,8 +58,8 @@ implements FlowRuleStore { |
58 | 58 | ||
59 | 59 | ||
60 | @Override | 60 | @Override |
61 | - public synchronized FlowRule getFlowRule(FlowRule rule) { | 61 | + public synchronized FlowEntry getFlowEntry(FlowRule rule) { |
62 | - for (FlowRule f : flowEntries.get(rule.deviceId())) { | 62 | + for (FlowEntry f : flowEntries.get(rule.deviceId())) { |
63 | if (f.equals(rule)) { | 63 | if (f.equals(rule)) { |
64 | return f; | 64 | return f; |
65 | } | 65 | } |
... | @@ -68,8 +68,8 @@ implements FlowRuleStore { | ... | @@ -68,8 +68,8 @@ implements FlowRuleStore { |
68 | } | 68 | } |
69 | 69 | ||
70 | @Override | 70 | @Override |
71 | - public synchronized Iterable<FlowRule> getFlowEntries(DeviceId deviceId) { | 71 | + public synchronized Iterable<FlowEntry> getFlowEntries(DeviceId deviceId) { |
72 | - Collection<FlowRule> rules = flowEntries.get(deviceId); | 72 | + Collection<FlowEntry> rules = flowEntries.get(deviceId); |
73 | if (rules == null) { | 73 | if (rules == null) { |
74 | return Collections.emptyList(); | 74 | return Collections.emptyList(); |
75 | } | 75 | } |
... | @@ -77,7 +77,7 @@ implements FlowRuleStore { | ... | @@ -77,7 +77,7 @@ implements FlowRuleStore { |
77 | } | 77 | } |
78 | 78 | ||
79 | @Override | 79 | @Override |
80 | - public synchronized Iterable<FlowRule> getFlowEntriesByAppId(ApplicationId appId) { | 80 | + public synchronized Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId) { |
81 | Collection<FlowRule> rules = flowEntriesById.get(appId); | 81 | Collection<FlowRule> rules = flowEntriesById.get(appId); |
82 | if (rules == null) { | 82 | if (rules == null) { |
83 | return Collections.emptyList(); | 83 | return Collections.emptyList(); |
... | @@ -87,7 +87,7 @@ implements FlowRuleStore { | ... | @@ -87,7 +87,7 @@ implements FlowRuleStore { |
87 | 87 | ||
88 | @Override | 88 | @Override |
89 | public synchronized void storeFlowRule(FlowRule rule) { | 89 | public synchronized void storeFlowRule(FlowRule rule) { |
90 | - FlowRule f = new DefaultFlowRule(rule, FlowRuleState.PENDING_ADD); | 90 | + FlowEntry f = new DefaultFlowEntry(rule); |
91 | DeviceId did = f.deviceId(); | 91 | DeviceId did = f.deviceId(); |
92 | if (!flowEntries.containsEntry(did, f)) { | 92 | if (!flowEntries.containsEntry(did, f)) { |
93 | flowEntries.put(did, f); | 93 | flowEntries.put(did, f); |
... | @@ -97,57 +97,41 @@ implements FlowRuleStore { | ... | @@ -97,57 +97,41 @@ implements FlowRuleStore { |
97 | 97 | ||
98 | @Override | 98 | @Override |
99 | public synchronized void deleteFlowRule(FlowRule rule) { | 99 | public synchronized void deleteFlowRule(FlowRule rule) { |
100 | - FlowRule f = new DefaultFlowRule(rule, FlowRuleState.PENDING_REMOVE); | 100 | + FlowEntry entry = getFlowEntry(rule); |
101 | - DeviceId did = f.deviceId(); | 101 | + if (entry == null) { |
102 | - | 102 | + return; |
103 | - /* | ||
104 | - * find the rule and mark it for deletion. | ||
105 | - * Ultimately a flow removed will come remove it. | ||
106 | - */ | ||
107 | - | ||
108 | - if (flowEntries.containsEntry(did, f)) { | ||
109 | - //synchronized (flowEntries) { | ||
110 | - flowEntries.remove(did, f); | ||
111 | - flowEntries.put(did, f); | ||
112 | - flowEntriesById.remove(rule.appId(), rule); | ||
113 | - //} | ||
114 | } | 103 | } |
104 | + entry.setState(FlowEntryState.PENDING_REMOVE); | ||
115 | } | 105 | } |
116 | 106 | ||
117 | @Override | 107 | @Override |
118 | - public synchronized FlowRuleEvent addOrUpdateFlowRule(FlowRule rule) { | 108 | + public synchronized FlowRuleEvent addOrUpdateFlowRule(FlowEntry rule) { |
119 | DeviceId did = rule.deviceId(); | 109 | DeviceId did = rule.deviceId(); |
120 | 110 | ||
121 | // check if this new rule is an update to an existing entry | 111 | // check if this new rule is an update to an existing entry |
122 | - if (flowEntries.containsEntry(did, rule)) { | 112 | + FlowEntry stored = getFlowEntry(rule); |
123 | - //synchronized (flowEntries) { | 113 | + if (stored != null) { |
124 | - // Multimaps support duplicates so we have to remove our rule | 114 | + stored.setBytes(rule.bytes()); |
125 | - // and replace it with the current version. | 115 | + stored.setLife(rule.life()); |
126 | - flowEntries.remove(did, rule); | 116 | + stored.setPackets(rule.packets()); |
127 | - flowEntries.put(did, rule); | 117 | + if (stored.state() == FlowEntryState.PENDING_ADD) { |
128 | - //} | 118 | + stored.setState(FlowEntryState.ADDED); |
119 | + return new FlowRuleEvent(Type.RULE_ADDED, rule); | ||
120 | + } | ||
129 | return new FlowRuleEvent(Type.RULE_UPDATED, rule); | 121 | return new FlowRuleEvent(Type.RULE_UPDATED, rule); |
130 | } | 122 | } |
131 | 123 | ||
132 | flowEntries.put(did, rule); | 124 | flowEntries.put(did, rule); |
133 | - return new FlowRuleEvent(RULE_ADDED, rule); | 125 | + return null; |
134 | } | 126 | } |
135 | 127 | ||
136 | @Override | 128 | @Override |
137 | - public synchronized FlowRuleEvent removeFlowRule(FlowRule rule) { | 129 | + public synchronized FlowRuleEvent removeFlowRule(FlowEntry rule) { |
138 | - //synchronized (this) { | 130 | + // This is where one could mark a rule as removed and still keep it in the store. |
139 | if (flowEntries.remove(rule.deviceId(), rule)) { | 131 | if (flowEntries.remove(rule.deviceId(), rule)) { |
140 | return new FlowRuleEvent(RULE_REMOVED, rule); | 132 | return new FlowRuleEvent(RULE_REMOVED, rule); |
141 | } else { | 133 | } else { |
142 | return null; | 134 | return null; |
143 | } | 135 | } |
144 | - //} | ||
145 | } | 136 | } |
146 | - | ||
147 | - | ||
148 | - | ||
149 | - | ||
150 | - | ||
151 | - | ||
152 | - | ||
153 | } | 137 | } | ... | ... |
... | @@ -12,9 +12,10 @@ import org.apache.felix.scr.annotations.Deactivate; | ... | @@ -12,9 +12,10 @@ import org.apache.felix.scr.annotations.Deactivate; |
12 | import org.apache.felix.scr.annotations.Service; | 12 | import org.apache.felix.scr.annotations.Service; |
13 | import org.onlab.onos.ApplicationId; | 13 | import org.onlab.onos.ApplicationId; |
14 | import org.onlab.onos.net.DeviceId; | 14 | import org.onlab.onos.net.DeviceId; |
15 | -import org.onlab.onos.net.flow.DefaultFlowRule; | 15 | +import org.onlab.onos.net.flow.DefaultFlowEntry; |
16 | +import org.onlab.onos.net.flow.FlowEntry; | ||
17 | +import org.onlab.onos.net.flow.FlowEntry.FlowEntryState; | ||
16 | import org.onlab.onos.net.flow.FlowRule; | 18 | import org.onlab.onos.net.flow.FlowRule; |
17 | -import org.onlab.onos.net.flow.FlowRule.FlowRuleState; | ||
18 | import org.onlab.onos.net.flow.FlowRuleEvent; | 19 | import org.onlab.onos.net.flow.FlowRuleEvent; |
19 | import org.onlab.onos.net.flow.FlowRuleEvent.Type; | 20 | import org.onlab.onos.net.flow.FlowRuleEvent.Type; |
20 | import org.onlab.onos.net.flow.FlowRuleStore; | 21 | import org.onlab.onos.net.flow.FlowRuleStore; |
... | @@ -38,8 +39,8 @@ public class SimpleFlowRuleStore | ... | @@ -38,8 +39,8 @@ public class SimpleFlowRuleStore |
38 | private final Logger log = getLogger(getClass()); | 39 | private final Logger log = getLogger(getClass()); |
39 | 40 | ||
40 | // store entries as a pile of rules, no info about device tables | 41 | // store entries as a pile of rules, no info about device tables |
41 | - private final Multimap<DeviceId, FlowRule> flowEntries = | 42 | + private final Multimap<DeviceId, FlowEntry> flowEntries = |
42 | - ArrayListMultimap.<DeviceId, FlowRule>create(); | 43 | + ArrayListMultimap.<DeviceId, FlowEntry>create(); |
43 | 44 | ||
44 | private final Multimap<ApplicationId, FlowRule> flowEntriesById = | 45 | private final Multimap<ApplicationId, FlowRule> flowEntriesById = |
45 | ArrayListMultimap.<ApplicationId, FlowRule>create(); | 46 | ArrayListMultimap.<ApplicationId, FlowRule>create(); |
... | @@ -56,8 +57,8 @@ public class SimpleFlowRuleStore | ... | @@ -56,8 +57,8 @@ public class SimpleFlowRuleStore |
56 | 57 | ||
57 | 58 | ||
58 | @Override | 59 | @Override |
59 | - public synchronized FlowRule getFlowRule(FlowRule rule) { | 60 | + public synchronized FlowEntry getFlowEntry(FlowRule rule) { |
60 | - for (FlowRule f : flowEntries.get(rule.deviceId())) { | 61 | + for (FlowEntry f : flowEntries.get(rule.deviceId())) { |
61 | if (f.equals(rule)) { | 62 | if (f.equals(rule)) { |
62 | return f; | 63 | return f; |
63 | } | 64 | } |
... | @@ -66,8 +67,8 @@ public class SimpleFlowRuleStore | ... | @@ -66,8 +67,8 @@ public class SimpleFlowRuleStore |
66 | } | 67 | } |
67 | 68 | ||
68 | @Override | 69 | @Override |
69 | - public synchronized Iterable<FlowRule> getFlowEntries(DeviceId deviceId) { | 70 | + public synchronized Iterable<FlowEntry> getFlowEntries(DeviceId deviceId) { |
70 | - Collection<FlowRule> rules = flowEntries.get(deviceId); | 71 | + Collection<FlowEntry> rules = flowEntries.get(deviceId); |
71 | if (rules == null) { | 72 | if (rules == null) { |
72 | return Collections.emptyList(); | 73 | return Collections.emptyList(); |
73 | } | 74 | } |
... | @@ -75,7 +76,7 @@ public class SimpleFlowRuleStore | ... | @@ -75,7 +76,7 @@ public class SimpleFlowRuleStore |
75 | } | 76 | } |
76 | 77 | ||
77 | @Override | 78 | @Override |
78 | - public synchronized Iterable<FlowRule> getFlowEntriesByAppId(ApplicationId appId) { | 79 | + public synchronized Iterable<FlowRule> getFlowRulesByAppId(ApplicationId appId) { |
79 | Collection<FlowRule> rules = flowEntriesById.get(appId); | 80 | Collection<FlowRule> rules = flowEntriesById.get(appId); |
80 | if (rules == null) { | 81 | if (rules == null) { |
81 | return Collections.emptyList(); | 82 | return Collections.emptyList(); |
... | @@ -85,7 +86,7 @@ public class SimpleFlowRuleStore | ... | @@ -85,7 +86,7 @@ public class SimpleFlowRuleStore |
85 | 86 | ||
86 | @Override | 87 | @Override |
87 | public synchronized void storeFlowRule(FlowRule rule) { | 88 | public synchronized void storeFlowRule(FlowRule rule) { |
88 | - FlowRule f = new DefaultFlowRule(rule, FlowRuleState.PENDING_ADD); | 89 | + FlowEntry f = new DefaultFlowEntry(rule); |
89 | DeviceId did = f.deviceId(); | 90 | DeviceId did = f.deviceId(); |
90 | if (!flowEntries.containsEntry(did, f)) { | 91 | if (!flowEntries.containsEntry(did, f)) { |
91 | flowEntries.put(did, f); | 92 | flowEntries.put(did, f); |
... | @@ -95,34 +96,25 @@ public class SimpleFlowRuleStore | ... | @@ -95,34 +96,25 @@ public class SimpleFlowRuleStore |
95 | 96 | ||
96 | @Override | 97 | @Override |
97 | public synchronized void deleteFlowRule(FlowRule rule) { | 98 | public synchronized void deleteFlowRule(FlowRule rule) { |
98 | - FlowRule f = new DefaultFlowRule(rule, FlowRuleState.PENDING_REMOVE); | 99 | + FlowEntry entry = getFlowEntry(rule); |
99 | - DeviceId did = f.deviceId(); | 100 | + if (entry == null) { |
100 | - | 101 | + return; |
101 | - /* | ||
102 | - * find the rule and mark it for deletion. | ||
103 | - * Ultimately a flow removed will come remove it. | ||
104 | - */ | ||
105 | - | ||
106 | - if (flowEntries.containsEntry(did, f)) { | ||
107 | - flowEntries.remove(did, f); | ||
108 | - flowEntries.put(did, f); | ||
109 | - flowEntriesById.remove(rule.appId(), rule); | ||
110 | } | 102 | } |
103 | + entry.setState(FlowEntryState.PENDING_REMOVE); | ||
111 | } | 104 | } |
112 | 105 | ||
113 | @Override | 106 | @Override |
114 | - public synchronized FlowRuleEvent addOrUpdateFlowRule(FlowRule rule) { | 107 | + public synchronized FlowRuleEvent addOrUpdateFlowRule(FlowEntry rule) { |
115 | DeviceId did = rule.deviceId(); | 108 | DeviceId did = rule.deviceId(); |
116 | 109 | ||
117 | // check if this new rule is an update to an existing entry | 110 | // check if this new rule is an update to an existing entry |
118 | - FlowRule stored = getFlowRule(rule); | 111 | + FlowEntry stored = getFlowEntry(rule); |
119 | if (stored != null) { | 112 | if (stored != null) { |
120 | - // Multimaps support duplicates so we have to remove our rule | 113 | + stored.setBytes(rule.bytes()); |
121 | - // and replace it with the current version. | 114 | + stored.setLife(rule.life()); |
122 | - flowEntries.remove(did, rule); | 115 | + stored.setPackets(rule.packets()); |
123 | - flowEntries.put(did, rule); | 116 | + if (stored.state() == FlowEntryState.PENDING_ADD) { |
124 | - | 117 | + stored.setState(FlowEntryState.ADDED); |
125 | - if (stored.state() == FlowRuleState.PENDING_ADD) { | ||
126 | return new FlowRuleEvent(Type.RULE_ADDED, rule); | 118 | return new FlowRuleEvent(Type.RULE_ADDED, rule); |
127 | } | 119 | } |
128 | return new FlowRuleEvent(Type.RULE_UPDATED, rule); | 120 | return new FlowRuleEvent(Type.RULE_UPDATED, rule); |
... | @@ -133,13 +125,12 @@ public class SimpleFlowRuleStore | ... | @@ -133,13 +125,12 @@ public class SimpleFlowRuleStore |
133 | } | 125 | } |
134 | 126 | ||
135 | @Override | 127 | @Override |
136 | - public synchronized FlowRuleEvent removeFlowRule(FlowRule rule) { | 128 | + public synchronized FlowRuleEvent removeFlowRule(FlowEntry rule) { |
137 | - //synchronized (this) { | 129 | + // This is where one could mark a rule as removed and still keep it in the store. |
138 | if (flowEntries.remove(rule.deviceId(), rule)) { | 130 | if (flowEntries.remove(rule.deviceId(), rule)) { |
139 | return new FlowRuleEvent(RULE_REMOVED, rule); | 131 | return new FlowRuleEvent(RULE_REMOVED, rule); |
140 | } else { | 132 | } else { |
141 | return null; | 133 | return null; |
142 | } | 134 | } |
143 | - //} | ||
144 | } | 135 | } |
145 | } | 136 | } | ... | ... |
... | @@ -6,11 +6,13 @@ import java.util.List; | ... | @@ -6,11 +6,13 @@ import java.util.List; |
6 | 6 | ||
7 | import org.onlab.onos.net.DeviceId; | 7 | import org.onlab.onos.net.DeviceId; |
8 | import org.onlab.onos.net.PortNumber; | 8 | import org.onlab.onos.net.PortNumber; |
9 | +import org.onlab.onos.net.flow.DefaultFlowEntry; | ||
9 | import org.onlab.onos.net.flow.DefaultFlowRule; | 10 | import org.onlab.onos.net.flow.DefaultFlowRule; |
10 | import org.onlab.onos.net.flow.DefaultTrafficSelector; | 11 | import org.onlab.onos.net.flow.DefaultTrafficSelector; |
11 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; | 12 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; |
13 | +import org.onlab.onos.net.flow.FlowEntry; | ||
14 | +import org.onlab.onos.net.flow.FlowEntry.FlowEntryState; | ||
12 | import org.onlab.onos.net.flow.FlowRule; | 15 | import org.onlab.onos.net.flow.FlowRule; |
13 | -import org.onlab.onos.net.flow.FlowRule.FlowRuleState; | ||
14 | import org.onlab.onos.net.flow.TrafficSelector; | 16 | import org.onlab.onos.net.flow.TrafficSelector; |
15 | import org.onlab.onos.net.flow.TrafficTreatment; | 17 | import org.onlab.onos.net.flow.TrafficTreatment; |
16 | import org.onlab.onos.openflow.controller.Dpid; | 18 | import org.onlab.onos.openflow.controller.Dpid; |
... | @@ -37,7 +39,7 @@ import org.slf4j.Logger; | ... | @@ -37,7 +39,7 @@ import org.slf4j.Logger; |
37 | 39 | ||
38 | import com.google.common.collect.Lists; | 40 | import com.google.common.collect.Lists; |
39 | 41 | ||
40 | -public class FlowRuleBuilder { | 42 | +public class FlowEntryBuilder { |
41 | private final Logger log = getLogger(getClass()); | 43 | private final Logger log = getLogger(getClass()); |
42 | 44 | ||
43 | private final OFFlowStatsEntry stat; | 45 | private final OFFlowStatsEntry stat; |
... | @@ -51,7 +53,7 @@ public class FlowRuleBuilder { | ... | @@ -51,7 +53,7 @@ public class FlowRuleBuilder { |
51 | private final boolean addedRule; | 53 | private final boolean addedRule; |
52 | 54 | ||
53 | 55 | ||
54 | - public FlowRuleBuilder(Dpid dpid, OFFlowStatsEntry entry) { | 56 | + public FlowEntryBuilder(Dpid dpid, OFFlowStatsEntry entry) { |
55 | this.stat = entry; | 57 | this.stat = entry; |
56 | this.match = entry.getMatch(); | 58 | this.match = entry.getMatch(); |
57 | this.actions = getActions(entry); | 59 | this.actions = getActions(entry); |
... | @@ -60,7 +62,7 @@ public class FlowRuleBuilder { | ... | @@ -60,7 +62,7 @@ public class FlowRuleBuilder { |
60 | this.addedRule = true; | 62 | this.addedRule = true; |
61 | } | 63 | } |
62 | 64 | ||
63 | - public FlowRuleBuilder(Dpid dpid, OFFlowRemoved removed) { | 65 | + public FlowEntryBuilder(Dpid dpid, OFFlowRemoved removed) { |
64 | this.match = removed.getMatch(); | 66 | this.match = removed.getMatch(); |
65 | this.removed = removed; | 67 | this.removed = removed; |
66 | 68 | ||
... | @@ -71,20 +73,21 @@ public class FlowRuleBuilder { | ... | @@ -71,20 +73,21 @@ public class FlowRuleBuilder { |
71 | 73 | ||
72 | } | 74 | } |
73 | 75 | ||
74 | - public FlowRule build() { | 76 | + public FlowEntry build() { |
75 | if (addedRule) { | 77 | if (addedRule) { |
76 | - return new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)), | 78 | + FlowRule rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)), |
77 | buildSelector(), buildTreatment(), stat.getPriority(), | 79 | buildSelector(), buildTreatment(), stat.getPriority(), |
78 | - FlowRuleState.ADDED, stat.getDurationSec(), | ||
79 | - stat.getPacketCount().getValue(), stat.getByteCount().getValue(), | ||
80 | stat.getCookie().getValue(), stat.getIdleTimeout()); | 80 | stat.getCookie().getValue(), stat.getIdleTimeout()); |
81 | + return new DefaultFlowEntry(rule, FlowEntryState.ADDED, | ||
82 | + stat.getDurationSec(), stat.getPacketCount().getValue(), | ||
83 | + stat.getByteCount().getValue()); | ||
84 | + | ||
81 | } else { | 85 | } else { |
82 | - // TODO: revisit potentially. | 86 | + FlowRule rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)), |
83 | - return new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)), | ||
84 | buildSelector(), null, removed.getPriority(), | 87 | buildSelector(), null, removed.getPriority(), |
85 | - FlowRuleState.REMOVED, removed.getDurationSec(), | ||
86 | - removed.getPacketCount().getValue(), removed.getByteCount().getValue(), | ||
87 | removed.getCookie().getValue(), removed.getIdleTimeout()); | 88 | removed.getCookie().getValue(), removed.getIdleTimeout()); |
89 | + return new DefaultFlowEntry(rule, FlowEntryState.REMOVED, removed.getDurationSec(), | ||
90 | + removed.getPacketCount().getValue(), removed.getByteCount().getValue()); | ||
88 | } | 91 | } |
89 | } | 92 | } |
90 | 93 | ... | ... |
providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/OpenFlowRuleProvider.java
... | @@ -12,6 +12,7 @@ import org.apache.felix.scr.annotations.Reference; | ... | @@ -12,6 +12,7 @@ import org.apache.felix.scr.annotations.Reference; |
12 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 12 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
13 | import org.onlab.onos.ApplicationId; | 13 | import org.onlab.onos.ApplicationId; |
14 | import org.onlab.onos.net.DeviceId; | 14 | import org.onlab.onos.net.DeviceId; |
15 | +import org.onlab.onos.net.flow.FlowEntry; | ||
15 | import org.onlab.onos.net.flow.FlowRule; | 16 | import org.onlab.onos.net.flow.FlowRule; |
16 | import org.onlab.onos.net.flow.FlowRuleProvider; | 17 | import org.onlab.onos.net.flow.FlowRuleProvider; |
17 | import org.onlab.onos.net.flow.FlowRuleProviderRegistry; | 18 | import org.onlab.onos.net.flow.FlowRuleProviderRegistry; |
... | @@ -131,7 +132,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr | ... | @@ -131,7 +132,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr |
131 | implements OpenFlowSwitchListener, OpenFlowEventListener { | 132 | implements OpenFlowSwitchListener, OpenFlowEventListener { |
132 | 133 | ||
133 | private final Map<Dpid, FlowStatsCollector> collectors = Maps.newHashMap(); | 134 | private final Map<Dpid, FlowStatsCollector> collectors = Maps.newHashMap(); |
134 | - private final Multimap<DeviceId, FlowRule> completeEntries = | 135 | + private final Multimap<DeviceId, FlowEntry> completeEntries = |
135 | ArrayListMultimap.create(); | 136 | ArrayListMultimap.create(); |
136 | 137 | ||
137 | @Override | 138 | @Override |
... | @@ -158,7 +159,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr | ... | @@ -158,7 +159,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr |
158 | //TODO: make this better | 159 | //TODO: make this better |
159 | OFFlowRemoved removed = (OFFlowRemoved) msg; | 160 | OFFlowRemoved removed = (OFFlowRemoved) msg; |
160 | 161 | ||
161 | - FlowRule fr = new FlowRuleBuilder(dpid, removed).build(); | 162 | + FlowEntry fr = new FlowEntryBuilder(dpid, removed).build(); |
162 | providerService.flowRemoved(fr); | 163 | providerService.flowRemoved(fr); |
163 | break; | 164 | break; |
164 | case STATS_REPLY: | 165 | case STATS_REPLY: |
... | @@ -188,7 +189,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr | ... | @@ -188,7 +189,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr |
188 | 189 | ||
189 | for (OFFlowStatsEntry reply : replies.getEntries()) { | 190 | for (OFFlowStatsEntry reply : replies.getEntries()) { |
190 | if (!tableMissRule(dpid, reply)) { | 191 | if (!tableMissRule(dpid, reply)) { |
191 | - completeEntries.put(did, new FlowRuleBuilder(dpid, reply).build()); | 192 | + completeEntries.put(did, new FlowEntryBuilder(dpid, reply).build()); |
192 | } | 193 | } |
193 | } | 194 | } |
194 | 195 | ... | ... |
-
Please register or login to post a comment