Committed by
Gerrit Code Review
Upgrade packet requests to use flow objectives API.
Addressed a few issues found while using the flow objectives across a cluster: * Flow objectives should be installable from any node, not just the master. Therefore we need to ensure all nodes initialize a driver for each switch. * We no longer store a list of objectives that are waiting for the switch to arrive. If the we don't know about the switch yet we'll try a few times over a few seconds to find it, but after that we'll give up and report an error to the client. * Default drivers need to be available when the FlowObjectiveManager starts up, otherwise it is common to get flow objective requests before any drivers have been loaded. Change-Id: I1c2ea6a223232402c31e8139729e4b6251ab8b0f
Showing
7 changed files
with
80 additions
and
23 deletions
1 | +/* | ||
2 | + * Copyright 2015 Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | + | ||
17 | +package org.onosproject.net.driver; | ||
18 | + | ||
19 | +/** | ||
20 | + * Service capable of providing a set of default drivers. | ||
21 | + */ | ||
22 | +public interface DefaultDriverProviderService extends DriverProvider { | ||
23 | +} |
... | @@ -36,7 +36,7 @@ public final class DefaultForwardingObjective implements ForwardingObjective { | ... | @@ -36,7 +36,7 @@ public final class DefaultForwardingObjective implements ForwardingObjective { |
36 | private final int timeout; | 36 | private final int timeout; |
37 | private final ApplicationId appId; | 37 | private final ApplicationId appId; |
38 | private final int priority; | 38 | private final int priority; |
39 | - private final int nextId; | 39 | + private final Integer nextId; |
40 | private final TrafficTreatment treatment; | 40 | private final TrafficTreatment treatment; |
41 | private final Operation op; | 41 | private final Operation op; |
42 | private final Optional<ObjectiveContext> context; | 42 | private final Optional<ObjectiveContext> context; |
... | @@ -46,7 +46,7 @@ public final class DefaultForwardingObjective implements ForwardingObjective { | ... | @@ -46,7 +46,7 @@ public final class DefaultForwardingObjective implements ForwardingObjective { |
46 | private DefaultForwardingObjective(TrafficSelector selector, | 46 | private DefaultForwardingObjective(TrafficSelector selector, |
47 | Flag flag, boolean permanent, | 47 | Flag flag, boolean permanent, |
48 | int timeout, ApplicationId appId, | 48 | int timeout, ApplicationId appId, |
49 | - int priority, int nextId, | 49 | + int priority, Integer nextId, |
50 | TrafficTreatment treatment, Operation op) { | 50 | TrafficTreatment treatment, Operation op) { |
51 | this.selector = selector; | 51 | this.selector = selector; |
52 | this.flag = flag; | 52 | this.flag = flag; |
... | @@ -67,7 +67,7 @@ public final class DefaultForwardingObjective implements ForwardingObjective { | ... | @@ -67,7 +67,7 @@ public final class DefaultForwardingObjective implements ForwardingObjective { |
67 | private DefaultForwardingObjective(TrafficSelector selector, | 67 | private DefaultForwardingObjective(TrafficSelector selector, |
68 | Flag flag, boolean permanent, | 68 | Flag flag, boolean permanent, |
69 | int timeout, ApplicationId appId, | 69 | int timeout, ApplicationId appId, |
70 | - int priority, int nextId, | 70 | + int priority, Integer nextId, |
71 | TrafficTreatment treatment, | 71 | TrafficTreatment treatment, |
72 | ObjectiveContext context, Operation op) { | 72 | ObjectiveContext context, Operation op) { |
73 | this.selector = selector; | 73 | this.selector = selector; | ... | ... |
... | @@ -41,6 +41,11 @@ public enum ObjectiveError { | ... | @@ -41,6 +41,11 @@ public enum ObjectiveError { |
41 | GROUPMISSING, | 41 | GROUPMISSING, |
42 | 42 | ||
43 | /** | 43 | /** |
44 | + * The device was not available to install objectives to. | ||
45 | + */ | ||
46 | + DEVICEMISSING, | ||
47 | + | ||
48 | + /** | ||
44 | * An unknown error occurred. | 49 | * An unknown error occurred. |
45 | */ | 50 | */ |
46 | UNKNOWN | 51 | UNKNOWN | ... | ... |
... | @@ -31,6 +31,7 @@ import org.onosproject.net.driver.Behaviour; | ... | @@ -31,6 +31,7 @@ import org.onosproject.net.driver.Behaviour; |
31 | import org.onosproject.net.driver.DefaultDriverData; | 31 | import org.onosproject.net.driver.DefaultDriverData; |
32 | import org.onosproject.net.driver.DefaultDriverHandler; | 32 | import org.onosproject.net.driver.DefaultDriverHandler; |
33 | import org.onosproject.net.driver.DefaultDriverProvider; | 33 | import org.onosproject.net.driver.DefaultDriverProvider; |
34 | +import org.onosproject.net.driver.DefaultDriverProviderService; | ||
34 | import org.onosproject.net.driver.Driver; | 35 | import org.onosproject.net.driver.Driver; |
35 | import org.onosproject.net.driver.DriverAdminService; | 36 | import org.onosproject.net.driver.DriverAdminService; |
36 | import org.onosproject.net.driver.DriverHandler; | 37 | import org.onosproject.net.driver.DriverHandler; |
... | @@ -62,16 +63,21 @@ public class DriverManager extends DefaultDriverProvider implements DriverAdminS | ... | @@ -62,16 +63,21 @@ public class DriverManager extends DefaultDriverProvider implements DriverAdminS |
62 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 63 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
63 | protected DeviceService deviceService; | 64 | protected DeviceService deviceService; |
64 | 65 | ||
66 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
67 | + protected DefaultDriverProviderService defaultDriverService; | ||
68 | + | ||
65 | private Set<DriverProvider> providers = Sets.newConcurrentHashSet(); | 69 | private Set<DriverProvider> providers = Sets.newConcurrentHashSet(); |
66 | private Map<String, Driver> driverByKey = Maps.newConcurrentMap(); | 70 | private Map<String, Driver> driverByKey = Maps.newConcurrentMap(); |
67 | 71 | ||
68 | @Activate | 72 | @Activate |
69 | protected void activate() { | 73 | protected void activate() { |
74 | + registerProvider(defaultDriverService); | ||
70 | log.info("Started"); | 75 | log.info("Started"); |
71 | } | 76 | } |
72 | 77 | ||
73 | @Deactivate | 78 | @Deactivate |
74 | protected void deactivate() { | 79 | protected void deactivate() { |
80 | + unregisterProvider(defaultDriverService); | ||
75 | log.info("Stopped"); | 81 | log.info("Stopped"); |
76 | } | 82 | } |
77 | 83 | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -27,12 +27,17 @@ import org.onosproject.net.Device; | ... | @@ -27,12 +27,17 @@ import org.onosproject.net.Device; |
27 | import org.onosproject.net.device.DeviceEvent; | 27 | import org.onosproject.net.device.DeviceEvent; |
28 | import org.onosproject.net.device.DeviceListener; | 28 | import org.onosproject.net.device.DeviceListener; |
29 | import org.onosproject.net.device.DeviceService; | 29 | import org.onosproject.net.device.DeviceService; |
30 | -import org.onosproject.net.flow.DefaultFlowRule; | ||
31 | import org.onosproject.net.flow.DefaultTrafficTreatment; | 30 | import org.onosproject.net.flow.DefaultTrafficTreatment; |
32 | import org.onosproject.net.flow.FlowRule; | 31 | import org.onosproject.net.flow.FlowRule; |
33 | import org.onosproject.net.flow.FlowRuleService; | 32 | import org.onosproject.net.flow.FlowRuleService; |
34 | import org.onosproject.net.flow.TrafficSelector; | 33 | import org.onosproject.net.flow.TrafficSelector; |
35 | import org.onosproject.net.flow.TrafficTreatment; | 34 | import org.onosproject.net.flow.TrafficTreatment; |
35 | +import org.onosproject.net.flowobjective.DefaultForwardingObjective; | ||
36 | +import org.onosproject.net.flowobjective.FlowObjectiveService; | ||
37 | +import org.onosproject.net.flowobjective.ForwardingObjective; | ||
38 | +import org.onosproject.net.flowobjective.Objective; | ||
39 | +import org.onosproject.net.flowobjective.ObjectiveContext; | ||
40 | +import org.onosproject.net.flowobjective.ObjectiveError; | ||
36 | import org.onosproject.net.packet.DefaultPacketRequest; | 41 | import org.onosproject.net.packet.DefaultPacketRequest; |
37 | import org.onosproject.net.packet.OutboundPacket; | 42 | import org.onosproject.net.packet.OutboundPacket; |
38 | import org.onosproject.net.packet.PacketContext; | 43 | import org.onosproject.net.packet.PacketContext; |
... | @@ -73,6 +78,9 @@ public class PacketManager | ... | @@ -73,6 +78,9 @@ public class PacketManager |
73 | private CoreService coreService; | 78 | private CoreService coreService; |
74 | 79 | ||
75 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 80 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
81 | + private FlowObjectiveService objectiveService; | ||
82 | + | ||
83 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
76 | private DeviceService deviceService; | 84 | private DeviceService deviceService; |
77 | 85 | ||
78 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 86 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
... | @@ -169,12 +177,28 @@ public class PacketManager | ... | @@ -169,12 +177,28 @@ public class PacketManager |
169 | return; | 177 | return; |
170 | } | 178 | } |
171 | 179 | ||
172 | - TrafficTreatment treatment = DefaultTrafficTreatment.builder().punt().build(); | 180 | + TrafficTreatment treatment = DefaultTrafficTreatment.builder() |
173 | - FlowRule flow = new DefaultFlowRule(device.id(), request.selector(), treatment, | 181 | + .punt() |
174 | - request.priority().priorityValue(), | 182 | + .build(); |
175 | - appId, 0, true, request.tableType()); | 183 | + |
176 | - | 184 | + ForwardingObjective forwarding = DefaultForwardingObjective.builder() |
177 | - flowService.applyFlowRules(flow); | 185 | + .withPriority(request.priority().priorityValue()) |
186 | + .withSelector(request.selector()) | ||
187 | + .fromApp(appId) | ||
188 | + .withFlag(ForwardingObjective.Flag.VERSATILE) | ||
189 | + .withTreatment(treatment) | ||
190 | + .makePermanent() | ||
191 | + .add(new ObjectiveContext() { | ||
192 | + @Override | ||
193 | + public void onSuccess(Objective objective) { } | ||
194 | + | ||
195 | + @Override | ||
196 | + public void onError(Objective objective, ObjectiveError error) { | ||
197 | + log.warn("Failed to install packet request flow: {}", error); | ||
198 | + } | ||
199 | + }); | ||
200 | + | ||
201 | + objectiveService.forward(device.id(), forwarding); | ||
178 | } | 202 | } |
179 | 203 | ||
180 | @Override | 204 | @Override | ... | ... |
... | @@ -16,32 +16,31 @@ | ... | @@ -16,32 +16,31 @@ |
16 | package org.onosproject.driver.pipeline; | 16 | package org.onosproject.driver.pipeline; |
17 | 17 | ||
18 | import org.apache.felix.scr.annotations.Activate; | 18 | import org.apache.felix.scr.annotations.Activate; |
19 | +import org.apache.felix.scr.annotations.Component; | ||
19 | import org.apache.felix.scr.annotations.Deactivate; | 20 | import org.apache.felix.scr.annotations.Deactivate; |
20 | -import org.apache.felix.scr.annotations.Reference; | 21 | +import org.apache.felix.scr.annotations.Service; |
21 | -import org.apache.felix.scr.annotations.ReferenceCardinality; | 22 | +import org.onosproject.net.driver.DefaultDriverProviderService; |
22 | -import org.onosproject.net.driver.DriverAdminService; | 23 | +import org.onosproject.net.driver.Driver; |
23 | import org.onosproject.net.driver.DriverProvider; | 24 | import org.onosproject.net.driver.DriverProvider; |
24 | import org.onosproject.net.driver.XmlDriverLoader; | 25 | import org.onosproject.net.driver.XmlDriverLoader; |
25 | -import org.apache.felix.scr.annotations.Component; | ||
26 | import org.slf4j.Logger; | 26 | import org.slf4j.Logger; |
27 | import org.slf4j.LoggerFactory; | 27 | import org.slf4j.LoggerFactory; |
28 | 28 | ||
29 | import java.io.IOException; | 29 | import java.io.IOException; |
30 | import java.io.InputStream; | 30 | import java.io.InputStream; |
31 | +import java.util.Set; | ||
31 | 32 | ||
32 | /** | 33 | /** |
33 | * Bootstrap for built in drivers. | 34 | * Bootstrap for built in drivers. |
34 | */ | 35 | */ |
35 | -@Component(immediate = true) | 36 | +@Service |
36 | -public class DefaultDrivers { | 37 | +@Component(immediate = false) |
38 | +public class DefaultDrivers implements DefaultDriverProviderService { | ||
37 | 39 | ||
38 | private final Logger log = LoggerFactory.getLogger(getClass()); | 40 | private final Logger log = LoggerFactory.getLogger(getClass()); |
39 | 41 | ||
40 | private static final String DRIVERS_XML = "/onos-drivers.xml"; | 42 | private static final String DRIVERS_XML = "/onos-drivers.xml"; |
41 | 43 | ||
42 | - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
43 | - protected DriverAdminService driverService; | ||
44 | - | ||
45 | private DriverProvider provider; | 44 | private DriverProvider provider; |
46 | 45 | ||
47 | @Activate | 46 | @Activate |
... | @@ -50,7 +49,6 @@ public class DefaultDrivers { | ... | @@ -50,7 +49,6 @@ public class DefaultDrivers { |
50 | try { | 49 | try { |
51 | InputStream stream = classLoader.getResourceAsStream(DRIVERS_XML); | 50 | InputStream stream = classLoader.getResourceAsStream(DRIVERS_XML); |
52 | provider = new XmlDriverLoader(classLoader).loadDrivers(stream); | 51 | provider = new XmlDriverLoader(classLoader).loadDrivers(stream); |
53 | - driverService.registerProvider(provider); | ||
54 | } catch (IOException e) { | 52 | } catch (IOException e) { |
55 | log.error("Unable to load default drivers", e); | 53 | log.error("Unable to load default drivers", e); |
56 | } | 54 | } |
... | @@ -59,10 +57,11 @@ public class DefaultDrivers { | ... | @@ -59,10 +57,11 @@ public class DefaultDrivers { |
59 | 57 | ||
60 | @Deactivate | 58 | @Deactivate |
61 | protected void deactivate() { | 59 | protected void deactivate() { |
62 | - if (provider != null) { | ||
63 | - driverService.unregisterProvider(provider); | ||
64 | - } | ||
65 | log.info("Stopped"); | 60 | log.info("Stopped"); |
66 | } | 61 | } |
67 | 62 | ||
63 | + @Override | ||
64 | + public Set<Driver> getDrivers() { | ||
65 | + return provider.getDrivers(); | ||
66 | + } | ||
68 | } | 67 | } | ... | ... |
-
Please register or login to post a comment