Committed by
Gerrit Code Review
ONOS-3759 Packet fallback driver provider
Change-Id: I8d526f66200b68d21aad3bd88575f6021d10c9a1
Showing
4 changed files
with
272 additions
and
6 deletions
1 | +/* | ||
2 | + * Copyright 2016 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.packet; | ||
18 | + | ||
19 | +import org.onosproject.net.driver.HandlerBehaviour; | ||
20 | + | ||
21 | +/** | ||
22 | + * Packet programmable device behaviour. | ||
23 | + */ | ||
24 | +public interface PacketProgrammable extends HandlerBehaviour { | ||
25 | + | ||
26 | + /** | ||
27 | + * Emits the specified outbound packet onto the network from the device. | ||
28 | + * @param packet outbound packet | ||
29 | + */ | ||
30 | + void emit(OutboundPacket packet); | ||
31 | +} |
1 | +/* | ||
2 | + * Copyright 2016 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.packet.impl; | ||
18 | + | ||
19 | +import org.onosproject.net.DeviceId; | ||
20 | +import org.onosproject.net.device.DeviceService; | ||
21 | +import org.onosproject.net.packet.OutboundPacket; | ||
22 | +import org.onosproject.net.packet.PacketProgrammable; | ||
23 | +import org.onosproject.net.packet.PacketProvider; | ||
24 | +import org.onosproject.net.provider.AbstractProvider; | ||
25 | +import org.onosproject.net.provider.ProviderId; | ||
26 | +import org.slf4j.Logger; | ||
27 | +import org.slf4j.LoggerFactory; | ||
28 | + | ||
29 | +/** | ||
30 | + * Driver-based packet rule provider. | ||
31 | + */ | ||
32 | +public class PacketDriverProvider extends AbstractProvider implements PacketProvider { | ||
33 | + | ||
34 | + private final Logger log = LoggerFactory.getLogger(getClass()); | ||
35 | + | ||
36 | + // To be extracted for reuse as we deal with other. | ||
37 | + private static final String SCHEME = "default"; | ||
38 | + private static final String PROVIDER_NAME = "org.onosproject.provider"; | ||
39 | + protected DeviceService deviceService; | ||
40 | + | ||
41 | + public PacketDriverProvider() { | ||
42 | + super(new ProviderId(SCHEME, PROVIDER_NAME)); | ||
43 | + } | ||
44 | + | ||
45 | + /** | ||
46 | + * Initializes the provider with the necessary device service. | ||
47 | + * | ||
48 | + * @param deviceService device service | ||
49 | + */ | ||
50 | + void init(DeviceService deviceService) { | ||
51 | + this.deviceService = deviceService; | ||
52 | + } | ||
53 | + | ||
54 | + @Override | ||
55 | + public void emit(OutboundPacket packet) { | ||
56 | + PacketProgrammable programmable = getPacketProgrammable(packet.sendThrough()); | ||
57 | + if (programmable != null) { | ||
58 | + programmable.emit(packet); | ||
59 | + } | ||
60 | + } | ||
61 | + | ||
62 | + private PacketProgrammable getPacketProgrammable(DeviceId deviceId) { | ||
63 | + PacketProgrammable programmable = deviceService.getDevice(deviceId).as(PacketProgrammable.class); | ||
64 | + if (programmable == null) { | ||
65 | + log.warn("Device {} is not packet programmable"); | ||
66 | + } | ||
67 | + return programmable; | ||
68 | + } | ||
69 | +} |
... | @@ -89,19 +89,19 @@ public class PacketManager | ... | @@ -89,19 +89,19 @@ public class PacketManager |
89 | private final PacketStoreDelegate delegate = new InternalStoreDelegate(); | 89 | private final PacketStoreDelegate delegate = new InternalStoreDelegate(); |
90 | 90 | ||
91 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 91 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
92 | - private CoreService coreService; | 92 | + protected CoreService coreService; |
93 | 93 | ||
94 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 94 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
95 | - private ClusterService clusterService; | 95 | + protected ClusterService clusterService; |
96 | 96 | ||
97 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 97 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
98 | - private DeviceService deviceService; | 98 | + protected DeviceService deviceService; |
99 | 99 | ||
100 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 100 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
101 | - private FlowRuleService flowService; | 101 | + protected FlowRuleService flowService; |
102 | 102 | ||
103 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 103 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
104 | - private PacketStore store; | 104 | + protected PacketStore store; |
105 | 105 | ||
106 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 106 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
107 | private FlowObjectiveService objectiveService; | 107 | private FlowObjectiveService objectiveService; |
... | @@ -112,6 +112,8 @@ public class PacketManager | ... | @@ -112,6 +112,8 @@ public class PacketManager |
112 | 112 | ||
113 | private final List<ProcessorEntry> processors = Lists.newCopyOnWriteArrayList(); | 113 | private final List<ProcessorEntry> processors = Lists.newCopyOnWriteArrayList(); |
114 | 114 | ||
115 | + private final PacketDriverProvider defaultProvider = new PacketDriverProvider(); | ||
116 | + | ||
115 | private ApplicationId appId; | 117 | private ApplicationId appId; |
116 | private NodeId localNodeId; | 118 | private NodeId localNodeId; |
117 | 119 | ||
... | @@ -124,6 +126,7 @@ public class PacketManager | ... | @@ -124,6 +126,7 @@ public class PacketManager |
124 | store.setDelegate(delegate); | 126 | store.setDelegate(delegate); |
125 | deviceService.addListener(deviceListener); | 127 | deviceService.addListener(deviceListener); |
126 | store.existingRequests().forEach(this::pushToAllDevices); | 128 | store.existingRequests().forEach(this::pushToAllDevices); |
129 | + defaultProvider.init(deviceService); | ||
127 | log.info("Started"); | 130 | log.info("Started"); |
128 | } | 131 | } |
129 | 132 | ||
... | @@ -136,6 +139,11 @@ public class PacketManager | ... | @@ -136,6 +139,11 @@ public class PacketManager |
136 | } | 139 | } |
137 | 140 | ||
138 | @Override | 141 | @Override |
142 | + protected PacketProvider defaultProvider() { | ||
143 | + return defaultProvider; | ||
144 | + } | ||
145 | + | ||
146 | + @Override | ||
139 | public void addProcessor(PacketProcessor processor, int priority) { | 147 | public void addProcessor(PacketProcessor processor, int priority) { |
140 | checkPermission(PACKET_EVENT); | 148 | checkPermission(PACKET_EVENT); |
141 | checkNotNull(processor, "Processor cannot be null"); | 149 | checkNotNull(processor, "Processor cannot be null"); |
... | @@ -374,7 +382,7 @@ public class PacketManager | ... | @@ -374,7 +382,7 @@ public class PacketManager |
374 | /** | 382 | /** |
375 | * Internal callback from the packet store. | 383 | * Internal callback from the packet store. |
376 | */ | 384 | */ |
377 | - private class InternalStoreDelegate implements PacketStoreDelegate { | 385 | + protected class InternalStoreDelegate implements PacketStoreDelegate { |
378 | @Override | 386 | @Override |
379 | public void notify(PacketEvent event) { | 387 | public void notify(PacketEvent event) { |
380 | localEmit(event.subject()); | 388 | localEmit(event.subject()); | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016 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.packet.impl; | ||
18 | + | ||
19 | +import com.google.common.collect.ImmutableList; | ||
20 | +import com.google.common.collect.ImmutableMap; | ||
21 | +import org.junit.Before; | ||
22 | +import org.junit.Test; | ||
23 | +import org.onosproject.cluster.ClusterServiceAdapter; | ||
24 | +import org.onosproject.common.event.impl.TestEventDispatcher; | ||
25 | +import org.onosproject.core.CoreServiceAdapter; | ||
26 | +import org.onosproject.core.IdGenerator; | ||
27 | +import org.onosproject.event.TestListener; | ||
28 | +import org.onosproject.net.AnnotationKeys; | ||
29 | +import org.onosproject.net.DefaultAnnotations; | ||
30 | +import org.onosproject.net.DefaultDevice; | ||
31 | +import org.onosproject.net.Device; | ||
32 | +import org.onosproject.net.DeviceId; | ||
33 | +import org.onosproject.net.device.DeviceServiceAdapter; | ||
34 | +import org.onosproject.net.driver.AbstractHandlerBehaviour; | ||
35 | +import org.onosproject.net.driver.DefaultDriver; | ||
36 | +import org.onosproject.net.driver.impl.DriverManager; | ||
37 | +import org.onosproject.net.flow.DefaultTrafficTreatment; | ||
38 | +import org.onosproject.net.packet.DefaultOutboundPacket; | ||
39 | +import org.onosproject.net.packet.OutboundPacket; | ||
40 | +import org.onosproject.net.packet.PacketProgrammable; | ||
41 | +import org.onosproject.net.packet.PacketProviderRegistry; | ||
42 | +import org.onosproject.net.provider.ProviderId; | ||
43 | +import org.onosproject.net.provider.TestProvider; | ||
44 | +import org.onosproject.store.trivial.SimplePacketStore; | ||
45 | + | ||
46 | +import java.nio.ByteBuffer; | ||
47 | +import java.util.concurrent.atomic.AtomicLong; | ||
48 | + | ||
49 | +import static org.junit.Assert.assertEquals; | ||
50 | +import static org.onosproject.net.NetTestTools.injectEventDispatcher; | ||
51 | + | ||
52 | +/** | ||
53 | + * Test packet manager activity. | ||
54 | + */ | ||
55 | +public class PacketManagerTest { | ||
56 | + | ||
57 | + private static final ProviderId FOO_PID = new ProviderId("foo", "foo"); | ||
58 | + | ||
59 | + private static final DeviceId FOO_DID = DeviceId.deviceId("foo:002"); | ||
60 | + | ||
61 | + private static final DefaultAnnotations ANNOTATIONS = | ||
62 | + DefaultAnnotations.builder().set(AnnotationKeys.DRIVER, "foo").build(); | ||
63 | + | ||
64 | + private static final Device FOO_DEV = | ||
65 | + new DefaultDevice(FOO_PID, FOO_DID, Device.Type.SWITCH, "", "", "", "", null, ANNOTATIONS); | ||
66 | + | ||
67 | + private PacketManager mgr; | ||
68 | + | ||
69 | + protected TestProvider provider; | ||
70 | + protected TestListener listener = new TestListener(); | ||
71 | + | ||
72 | + private PacketProviderRegistry providerRegistry; | ||
73 | + | ||
74 | + private TestDriverManager driverService; | ||
75 | + | ||
76 | + @Before | ||
77 | + public void setUp() { | ||
78 | + mgr = new PacketManager(); | ||
79 | + injectEventDispatcher(mgr, new TestEventDispatcher()); | ||
80 | + mgr.store = new SimplePacketStore(); | ||
81 | + mgr.clusterService = new ClusterServiceAdapter(); | ||
82 | + mgr.deviceService = new TestDeviceService(); | ||
83 | + mgr.deviceService = new TestDeviceService(); | ||
84 | + mgr.coreService = new TestCoreService(); | ||
85 | + providerRegistry = mgr; | ||
86 | + mgr.activate(); | ||
87 | + driverService = new TestDriverManager(); | ||
88 | + driverService.addDriver(new DefaultDriver("foo", ImmutableList.of(), "", "", "", | ||
89 | + ImmutableMap.of(PacketProgrammable.class, | ||
90 | + TestPacketProgrammable.class), | ||
91 | + ImmutableMap.of())); | ||
92 | + } | ||
93 | + | ||
94 | + /** | ||
95 | + * Tests the correct usage of fallback driver provider for packets. | ||
96 | + */ | ||
97 | + @Test | ||
98 | + public void packetProviderfallbackBasics() { | ||
99 | + OutboundPacket packet = | ||
100 | + new DefaultOutboundPacket(FOO_DID, DefaultTrafficTreatment.emptyTreatment(), ByteBuffer.allocate(5)); | ||
101 | + mgr.emit(packet); | ||
102 | + assertEquals("Packet not emitted correctly", packet, emittedPacket); | ||
103 | + } | ||
104 | + | ||
105 | + private static class TestDeviceService extends DeviceServiceAdapter { | ||
106 | + @Override | ||
107 | + public int getDeviceCount() { | ||
108 | + return 1; | ||
109 | + } | ||
110 | + | ||
111 | + @Override | ||
112 | + public Iterable<Device> getDevices() { | ||
113 | + return ImmutableList.of(FOO_DEV); | ||
114 | + } | ||
115 | + | ||
116 | + @Override | ||
117 | + public Iterable<Device> getAvailableDevices() { | ||
118 | + return getDevices(); | ||
119 | + } | ||
120 | + | ||
121 | + @Override | ||
122 | + public Device getDevice(DeviceId deviceId) { | ||
123 | + return FOO_DEV; | ||
124 | + } | ||
125 | + } | ||
126 | + | ||
127 | + private class TestCoreService extends CoreServiceAdapter { | ||
128 | + | ||
129 | + @Override | ||
130 | + public IdGenerator getIdGenerator(String topic) { | ||
131 | + return new IdGenerator() { | ||
132 | + private AtomicLong counter = new AtomicLong(0); | ||
133 | + | ||
134 | + @Override | ||
135 | + public long getNewId() { | ||
136 | + return counter.getAndIncrement(); | ||
137 | + } | ||
138 | + }; | ||
139 | + } | ||
140 | + } | ||
141 | + | ||
142 | + private class TestDriverManager extends DriverManager { | ||
143 | + TestDriverManager() { | ||
144 | + this.deviceService = mgr.deviceService; | ||
145 | + activate(); | ||
146 | + } | ||
147 | + } | ||
148 | + | ||
149 | + private static OutboundPacket emittedPacket = null; | ||
150 | + | ||
151 | + public static class TestPacketProgrammable extends AbstractHandlerBehaviour implements PacketProgrammable { | ||
152 | + | ||
153 | + @Override | ||
154 | + public void emit(OutboundPacket packet) { | ||
155 | + emittedPacket = packet; | ||
156 | + } | ||
157 | + } | ||
158 | +} |
-
Please register or login to post a comment