Committed by
Gerrit Code Review
moving igmp app to use access device config
Change-Id: I2940b3db9c6da3a3c43c192a2b390c46b40749e7
Showing
7 changed files
with
128 additions
and
119 deletions
... | @@ -51,6 +51,12 @@ | ... | @@ -51,6 +51,12 @@ |
51 | <version>${project.version}</version> | 51 | <version>${project.version}</version> |
52 | </dependency> | 52 | </dependency> |
53 | 53 | ||
54 | + <dependency> | ||
55 | + <groupId>org.onosproject</groupId> | ||
56 | + <artifactId>onos-app-olt-api</artifactId> | ||
57 | + <version>${project.version}</version> | ||
58 | + </dependency> | ||
59 | + | ||
54 | 60 | ||
55 | <dependency> | 61 | <dependency> |
56 | <groupId>org.onosproject</groupId> | 62 | <groupId>org.onosproject</groupId> | ... | ... |
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.igmp; | ||
18 | - | ||
19 | -import org.onosproject.net.DeviceId; | ||
20 | -import org.onosproject.net.config.Config; | ||
21 | - | ||
22 | -/** | ||
23 | - * Config object for access device data. | ||
24 | - */ | ||
25 | -public class IgmpDeviceConfig extends Config<DeviceId> { | ||
26 | - | ||
27 | - /** | ||
28 | - * Gets the device information. | ||
29 | - * | ||
30 | - * @return device information | ||
31 | - */ | ||
32 | - public IgmpDeviceData getDevice() { | ||
33 | - return new IgmpDeviceData(subject()); | ||
34 | - } | ||
35 | -} |
1 | -package org.onosproject.igmp; | ||
2 | - | ||
3 | -import org.onosproject.net.DeviceId; | ||
4 | - | ||
5 | -import static com.google.common.base.Preconditions.checkNotNull; | ||
6 | - | ||
7 | -/** | ||
8 | - * Information about an igmp enabled device. | ||
9 | - */ | ||
10 | -public class IgmpDeviceData { | ||
11 | - | ||
12 | - private static final String DEVICE_ID_MISSING = "Device ID cannot be null"; | ||
13 | - | ||
14 | - private final DeviceId deviceId; | ||
15 | - | ||
16 | - public IgmpDeviceData(DeviceId deviceId) { | ||
17 | - this.deviceId = checkNotNull(deviceId, DEVICE_ID_MISSING); | ||
18 | - } | ||
19 | - | ||
20 | - /** | ||
21 | - * Retrieves the access device ID. | ||
22 | - * | ||
23 | - * @return device ID | ||
24 | - */ | ||
25 | - public DeviceId deviceId() { | ||
26 | - return deviceId; | ||
27 | - } | ||
28 | -} |
... | @@ -15,37 +15,51 @@ | ... | @@ -15,37 +15,51 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.igmp; | 16 | package org.onosproject.igmp; |
17 | 17 | ||
18 | -import static org.slf4j.LoggerFactory.getLogger; | ||
19 | - | ||
20 | import org.apache.felix.scr.annotations.Activate; | 18 | import org.apache.felix.scr.annotations.Activate; |
21 | import org.apache.felix.scr.annotations.Component; | 19 | import org.apache.felix.scr.annotations.Component; |
22 | import org.apache.felix.scr.annotations.Deactivate; | 20 | import org.apache.felix.scr.annotations.Deactivate; |
23 | import org.apache.felix.scr.annotations.Property; | 21 | import org.apache.felix.scr.annotations.Property; |
24 | import org.apache.felix.scr.annotations.Reference; | 22 | import org.apache.felix.scr.annotations.Reference; |
25 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 23 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
24 | +import org.onlab.packet.EthType; | ||
26 | import org.onlab.packet.Ethernet; | 25 | import org.onlab.packet.Ethernet; |
26 | +import org.onlab.packet.IGMP; | ||
27 | import org.onlab.packet.IPv4; | 27 | import org.onlab.packet.IPv4; |
28 | import org.onlab.packet.Ip4Address; | 28 | import org.onlab.packet.Ip4Address; |
29 | import org.onlab.packet.IpAddress; | 29 | import org.onlab.packet.IpAddress; |
30 | import org.onlab.packet.IpPrefix; | 30 | import org.onlab.packet.IpPrefix; |
31 | -import org.onlab.packet.IGMP; | ||
32 | import org.onosproject.core.ApplicationId; | 31 | import org.onosproject.core.ApplicationId; |
33 | import org.onosproject.core.CoreService; | 32 | import org.onosproject.core.CoreService; |
34 | import org.onosproject.net.ConnectPoint; | 33 | import org.onosproject.net.ConnectPoint; |
35 | import org.onosproject.net.DeviceId; | 34 | import org.onosproject.net.DeviceId; |
35 | +import org.onosproject.net.Port; | ||
36 | +import org.onosproject.net.PortNumber; | ||
36 | import org.onosproject.net.config.NetworkConfigRegistry; | 37 | import org.onosproject.net.config.NetworkConfigRegistry; |
37 | -import org.onosproject.net.flow.DefaultTrafficSelector; | 38 | +import org.onosproject.net.device.DeviceEvent; |
38 | -import org.onosproject.net.flow.TrafficSelector; | 39 | +import org.onosproject.net.device.DeviceListener; |
40 | +import org.onosproject.net.device.DeviceService; | ||
41 | +import org.onosproject.net.flow.DefaultTrafficTreatment; | ||
42 | +import org.onosproject.net.flow.criteria.Criteria; | ||
43 | +import org.onosproject.net.flowobjective.DefaultFilteringObjective; | ||
44 | +import org.onosproject.net.flowobjective.FilteringObjective; | ||
45 | +import org.onosproject.net.flowobjective.FlowObjectiveService; | ||
46 | +import org.onosproject.net.flowobjective.Objective; | ||
47 | +import org.onosproject.net.flowobjective.ObjectiveContext; | ||
48 | +import org.onosproject.net.flowobjective.ObjectiveError; | ||
39 | import org.onosproject.net.mcast.McastRoute; | 49 | import org.onosproject.net.mcast.McastRoute; |
40 | import org.onosproject.net.mcast.MulticastRouteService; | 50 | import org.onosproject.net.mcast.MulticastRouteService; |
41 | import org.onosproject.net.packet.InboundPacket; | 51 | import org.onosproject.net.packet.InboundPacket; |
42 | import org.onosproject.net.packet.PacketContext; | 52 | import org.onosproject.net.packet.PacketContext; |
43 | -import org.onosproject.net.packet.PacketPriority; | ||
44 | import org.onosproject.net.packet.PacketProcessor; | 53 | import org.onosproject.net.packet.PacketProcessor; |
45 | import org.onosproject.net.packet.PacketService; | 54 | import org.onosproject.net.packet.PacketService; |
55 | +import org.onosproject.olt.AccessDeviceConfig; | ||
56 | +import org.onosproject.olt.AccessDeviceData; | ||
46 | import org.slf4j.Logger; | 57 | import org.slf4j.Logger; |
47 | 58 | ||
48 | -import java.util.Optional; | 59 | +import java.util.Map; |
60 | +import java.util.concurrent.ConcurrentHashMap; | ||
61 | + | ||
62 | +import static org.slf4j.LoggerFactory.getLogger; | ||
49 | 63 | ||
50 | /** | 64 | /** |
51 | * Internet Group Management Protocol. | 65 | * Internet Group Management Protocol. |
... | @@ -61,6 +75,9 @@ public class IgmpSnoop { | ... | @@ -61,6 +75,9 @@ public class IgmpSnoop { |
61 | private String multicastAddress = DEFAULT_MCAST_ADDR; | 75 | private String multicastAddress = DEFAULT_MCAST_ADDR; |
62 | 76 | ||
63 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 77 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
78 | + protected FlowObjectiveService flowObjectiveService; | ||
79 | + | ||
80 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
64 | protected PacketService packetService; | 81 | protected PacketService packetService; |
65 | 82 | ||
66 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 83 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
... | @@ -72,6 +89,12 @@ public class IgmpSnoop { | ... | @@ -72,6 +89,12 @@ public class IgmpSnoop { |
72 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 89 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
73 | protected MulticastRouteService multicastService; | 90 | protected MulticastRouteService multicastService; |
74 | 91 | ||
92 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
93 | + protected DeviceService deviceService; | ||
94 | + | ||
95 | + private Map<DeviceId, AccessDeviceData> oltData = new ConcurrentHashMap<>(); | ||
96 | + | ||
97 | + private DeviceListener deviceListener = new InternalDeviceListener(); | ||
75 | private IgmpPacketProcessor processor = new IgmpPacketProcessor(); | 98 | private IgmpPacketProcessor processor = new IgmpPacketProcessor(); |
76 | private static ApplicationId appId; | 99 | private static ApplicationId appId; |
77 | 100 | ||
... | @@ -81,17 +104,19 @@ public class IgmpSnoop { | ... | @@ -81,17 +104,19 @@ public class IgmpSnoop { |
81 | 104 | ||
82 | packetService.addProcessor(processor, PacketProcessor.director(1)); | 105 | packetService.addProcessor(processor, PacketProcessor.director(1)); |
83 | 106 | ||
84 | - networkConfig.getSubjects(DeviceId.class, IgmpDeviceConfig.class).forEach( | 107 | + networkConfig.getSubjects(DeviceId.class, AccessDeviceConfig.class).forEach( |
85 | subject -> { | 108 | subject -> { |
86 | - IgmpDeviceConfig config = networkConfig.getConfig(subject, | 109 | + AccessDeviceConfig config = networkConfig.getConfig(subject, |
87 | - IgmpDeviceConfig.class); | 110 | + AccessDeviceConfig.class); |
88 | if (config != null) { | 111 | if (config != null) { |
89 | - IgmpDeviceData data = config.getDevice(); | 112 | + AccessDeviceData data = config.getOlt(); |
90 | - submitPacketRequests(data.deviceId()); | 113 | + oltData.put(data.deviceId(), data); |
91 | } | 114 | } |
92 | } | 115 | } |
93 | ); | 116 | ); |
94 | 117 | ||
118 | + deviceService.addListener(deviceListener); | ||
119 | + | ||
95 | log.info("Started"); | 120 | log.info("Started"); |
96 | } | 121 | } |
97 | 122 | ||
... | @@ -99,18 +124,52 @@ public class IgmpSnoop { | ... | @@ -99,18 +124,52 @@ public class IgmpSnoop { |
99 | public void deactivate() { | 124 | public void deactivate() { |
100 | packetService.removeProcessor(processor); | 125 | packetService.removeProcessor(processor); |
101 | processor = null; | 126 | processor = null; |
127 | + deviceService.removeListener(deviceListener); | ||
102 | log.info("Stopped"); | 128 | log.info("Stopped"); |
103 | } | 129 | } |
104 | 130 | ||
105 | - private void submitPacketRequests(DeviceId deviceId) { | 131 | + private void processFilterObjective(DeviceId devId, Port port, boolean remove) { |
106 | - TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); | 132 | + |
107 | - selector.matchEthType(Ethernet.TYPE_IPV4); | 133 | + //TODO migrate to packet requests when packet service uses filtering objectives |
108 | - selector.matchIPProtocol(IPv4.PROTOCOL_IGMP); | 134 | + DefaultFilteringObjective.Builder builder = DefaultFilteringObjective.builder(); |
109 | - packetService.requestPackets(selector.build(), | 135 | + |
110 | - PacketPriority.REACTIVE, | 136 | + builder = remove ? builder.deny() : builder.permit(); |
111 | - appId, | 137 | + |
112 | - Optional.of(deviceId)); | 138 | + FilteringObjective igmp = builder |
139 | + .withKey(Criteria.matchInPort(port.number())) | ||
140 | + .addCondition(Criteria.matchEthType(EthType.EtherType.IPV4.ethType())) | ||
141 | + .addCondition(Criteria.matchIPProtocol(IPv4.PROTOCOL_IGMP)) | ||
142 | + .withMeta(DefaultTrafficTreatment.builder() | ||
143 | + .setOutput(PortNumber.CONTROLLER).build()) | ||
144 | + .fromApp(appId) | ||
145 | + .withPriority(1000) | ||
146 | + .add(new ObjectiveContext() { | ||
147 | + @Override | ||
148 | + public void onSuccess(Objective objective) { | ||
149 | + log.info("Igmp filter for {} on {} installed.", | ||
150 | + devId, port); | ||
151 | + } | ||
152 | + | ||
153 | + @Override | ||
154 | + public void onError(Objective objective, ObjectiveError error) { | ||
155 | + log.info("Igmp filter for {} on {} failed because {}.", | ||
156 | + devId, port, error); | ||
157 | + } | ||
158 | + }); | ||
159 | + | ||
160 | + flowObjectiveService.filter(devId, igmp); | ||
161 | + } | ||
162 | + | ||
163 | + private void processQuery(IGMP pkt, ConnectPoint location) { | ||
164 | + pkt.getGroups().forEach(group -> group.getSources().forEach(src -> { | ||
165 | + | ||
166 | + McastRoute route = new McastRoute(src, | ||
167 | + group.getGaddr(), | ||
168 | + McastRoute.Type.IGMP); | ||
169 | + multicastService.add(route); | ||
170 | + multicastService.addSink(route, location); | ||
113 | 171 | ||
172 | + })); | ||
114 | } | 173 | } |
115 | 174 | ||
116 | /** | 175 | /** |
... | @@ -188,15 +247,45 @@ public class IgmpSnoop { | ... | @@ -188,15 +247,45 @@ public class IgmpSnoop { |
188 | } | 247 | } |
189 | } | 248 | } |
190 | 249 | ||
191 | - private void processQuery(IGMP pkt, ConnectPoint location) { | ||
192 | - pkt.getGroups().forEach(group -> group.getSources().forEach(src -> { | ||
193 | 250 | ||
194 | - McastRoute route = new McastRoute(src, | ||
195 | - group.getGaddr(), | ||
196 | - McastRoute.Type.IGMP); | ||
197 | - multicastService.add(route); | ||
198 | - multicastService.addSink(route, location); | ||
199 | 251 | ||
200 | - })); | 252 | + private class InternalDeviceListener implements DeviceListener { |
253 | + @Override | ||
254 | + public void event(DeviceEvent event) { | ||
255 | + switch (event.type()) { | ||
256 | + | ||
257 | + case DEVICE_ADDED: | ||
258 | + case DEVICE_UPDATED: | ||
259 | + case DEVICE_REMOVED: | ||
260 | + case DEVICE_SUSPENDED: | ||
261 | + case DEVICE_AVAILABILITY_CHANGED: | ||
262 | + case PORT_STATS_UPDATED: | ||
263 | + break; | ||
264 | + case PORT_ADDED: | ||
265 | + if (event.port().isEnabled()) { | ||
266 | + processFilterObjective(event.subject().id(), event.port(), false); | ||
267 | + } | ||
268 | + break; | ||
269 | + case PORT_UPDATED: | ||
270 | + if (event.port().isEnabled()) { | ||
271 | + processFilterObjective(event.subject().id(), event.port(), false); | ||
272 | + } else { | ||
273 | + processFilterObjective(event.subject().id(), event.port(), true); | ||
274 | + } | ||
275 | + break; | ||
276 | + case PORT_REMOVED: | ||
277 | + processFilterObjective(event.subject().id(), event.port(), false); | ||
278 | + break; | ||
279 | + default: | ||
280 | + log.warn("Unknown device event {}", event.type()); | ||
281 | + break; | ||
282 | + } | ||
283 | + | ||
284 | + } | ||
285 | + | ||
286 | + @Override | ||
287 | + public boolean isRelevant(DeviceEvent event) { | ||
288 | + return oltData.containsKey(event.subject().id()); | ||
289 | + } | ||
201 | } | 290 | } |
202 | } | 291 | } | ... | ... |
... | @@ -14,7 +14,7 @@ | ... | @@ -14,7 +14,7 @@ |
14 | * limitations under the License. | 14 | * limitations under the License. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | -package org.onosproject.olt.impl; | 17 | +package org.onosproject.olt; |
18 | 18 | ||
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import org.onlab.packet.VlanId; | 20 | import org.onlab.packet.VlanId; | ... | ... |
... | @@ -14,7 +14,7 @@ | ... | @@ -14,7 +14,7 @@ |
14 | * limitations under the License. | 14 | * limitations under the License. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | -package org.onosproject.olt.impl; | 17 | +package org.onosproject.olt; |
18 | 18 | ||
19 | import org.onlab.packet.VlanId; | 19 | import org.onlab.packet.VlanId; |
20 | import org.onosproject.net.DeviceId; | 20 | import org.onosproject.net.DeviceId; | ... | ... |
... | @@ -24,7 +24,6 @@ import org.apache.felix.scr.annotations.Reference; | ... | @@ -24,7 +24,6 @@ import org.apache.felix.scr.annotations.Reference; |
24 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 24 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
25 | import org.apache.felix.scr.annotations.Service; | 25 | import org.apache.felix.scr.annotations.Service; |
26 | import org.onlab.packet.EthType; | 26 | import org.onlab.packet.EthType; |
27 | -import org.onlab.packet.IPv4; | ||
28 | import org.onlab.packet.VlanId; | 27 | import org.onlab.packet.VlanId; |
29 | import org.onosproject.core.ApplicationId; | 28 | import org.onosproject.core.ApplicationId; |
30 | import org.onosproject.core.CoreService; | 29 | import org.onosproject.core.CoreService; |
... | @@ -54,6 +53,8 @@ import org.onosproject.net.flowobjective.ForwardingObjective; | ... | @@ -54,6 +53,8 @@ import org.onosproject.net.flowobjective.ForwardingObjective; |
54 | import org.onosproject.net.flowobjective.Objective; | 53 | import org.onosproject.net.flowobjective.Objective; |
55 | import org.onosproject.net.flowobjective.ObjectiveContext; | 54 | import org.onosproject.net.flowobjective.ObjectiveContext; |
56 | import org.onosproject.net.flowobjective.ObjectiveError; | 55 | import org.onosproject.net.flowobjective.ObjectiveError; |
56 | +import org.onosproject.olt.AccessDeviceConfig; | ||
57 | +import org.onosproject.olt.AccessDeviceData; | ||
57 | import org.onosproject.olt.AccessDeviceEvent; | 58 | import org.onosproject.olt.AccessDeviceEvent; |
58 | import org.onosproject.olt.AccessDeviceListener; | 59 | import org.onosproject.olt.AccessDeviceListener; |
59 | import org.onosproject.olt.AccessDeviceService; | 60 | import org.onosproject.olt.AccessDeviceService; |
... | @@ -366,32 +367,8 @@ public class Olt | ... | @@ -366,32 +367,8 @@ public class Olt |
366 | } | 367 | } |
367 | }); | 368 | }); |
368 | 369 | ||
369 | - | ||
370 | - FilteringObjective igmp = DefaultFilteringObjective.builder() | ||
371 | - .permit() | ||
372 | - .withKey(Criteria.matchInPort(port.number())) | ||
373 | - .addCondition(Criteria.matchEthType(EthType.EtherType.IPV4.ethType())) | ||
374 | - .addCondition(Criteria.matchIPProtocol(IPv4.PROTOCOL_IGMP)) | ||
375 | - .withMeta(DefaultTrafficTreatment.builder() | ||
376 | - .setOutput(PortNumber.CONTROLLER).build()) | ||
377 | - .fromApp(appId) | ||
378 | - .withPriority(1000) | ||
379 | - .add(new ObjectiveContext() { | ||
380 | - @Override | ||
381 | - public void onSuccess(Objective objective) { | ||
382 | - log.info("Igmp filter for {} on {} installed.", | ||
383 | - devId, port); | ||
384 | - } | ||
385 | - | ||
386 | - @Override | ||
387 | - public void onError(Objective objective, ObjectiveError error) { | ||
388 | - log.info("Igmp filter for {} on {} failed because {}.", | ||
389 | - devId, port, error); | ||
390 | - } | ||
391 | - }); | ||
392 | - | ||
393 | flowObjectiveService.filter(devId, eapol); | 370 | flowObjectiveService.filter(devId, eapol); |
394 | - flowObjectiveService.filter(devId, igmp); | 371 | + |
395 | } | 372 | } |
396 | 373 | ||
397 | private class InternalDeviceListener implements DeviceListener { | 374 | private class InternalDeviceListener implements DeviceListener { | ... | ... |
-
Please register or login to post a comment