alshabib
Committed by Gerrit Code Review

support addition and removal of mcast sinks

vlan mcast rules are now optional

Change-Id: Icb7022089a6e139970040d8cdea97df0cdc8dc7c
...@@ -246,7 +246,7 @@ public class IgmpSnoop { ...@@ -246,7 +246,7 @@ public class IgmpSnoop {
246 .withMeta(DefaultTrafficTreatment.builder() 246 .withMeta(DefaultTrafficTreatment.builder()
247 .setOutput(PortNumber.CONTROLLER).build()) 247 .setOutput(PortNumber.CONTROLLER).build())
248 .fromApp(appId) 248 .fromApp(appId)
249 - .withPriority(1000) 249 + .withPriority(10000)
250 .add(new ObjectiveContext() { 250 .add(new ObjectiveContext() {
251 @Override 251 @Override
252 public void onSuccess(Objective objective) { 252 public void onSuccess(Objective objective) {
...@@ -417,6 +417,7 @@ public class IgmpSnoop { ...@@ -417,6 +417,7 @@ public class IgmpSnoop {
417 private class InternalDeviceListener implements DeviceListener { 417 private class InternalDeviceListener implements DeviceListener {
418 @Override 418 @Override
419 public void event(DeviceEvent event) { 419 public void event(DeviceEvent event) {
420 + DeviceId devId = event.subject().id();
420 switch (event.type()) { 421 switch (event.type()) {
421 422
422 case DEVICE_ADDED: 423 case DEVICE_ADDED:
...@@ -427,11 +428,15 @@ public class IgmpSnoop { ...@@ -427,11 +428,15 @@ public class IgmpSnoop {
427 case PORT_STATS_UPDATED: 428 case PORT_STATS_UPDATED:
428 break; 429 break;
429 case PORT_ADDED: 430 case PORT_ADDED:
430 - if (event.port().isEnabled()) { 431 + if (!oltData.get(devId).uplink().equals(event.port().number()) &&
432 + event.port().isEnabled()) {
431 processFilterObjective(event.subject().id(), event.port(), false); 433 processFilterObjective(event.subject().id(), event.port(), false);
432 } 434 }
433 break; 435 break;
434 case PORT_UPDATED: 436 case PORT_UPDATED:
437 + if (oltData.get(devId).uplink().equals(event.port().number())) {
438 + break;
439 + }
435 if (event.port().isEnabled()) { 440 if (event.port().isEnabled()) {
436 processFilterObjective(event.subject().id(), event.port(), false); 441 processFilterObjective(event.subject().id(), event.port(), false);
437 } else { 442 } else {
......
...@@ -15,13 +15,10 @@ ...@@ -15,13 +15,10 @@
15 */ 15 */
16 package org.onosproject.store.serializers; 16 package org.onosproject.store.serializers;
17 17
18 -import com.esotericsoftware.kryo.serializers.JavaSerializer;
19 import com.google.common.collect.ImmutableList; 18 import com.google.common.collect.ImmutableList;
20 import com.google.common.collect.ImmutableMap; 19 import com.google.common.collect.ImmutableMap;
21 import com.google.common.collect.ImmutableSet; 20 import com.google.common.collect.ImmutableSet;
22 import com.google.common.collect.Maps; 21 import com.google.common.collect.Maps;
23 -import com.google.common.collect.Sets;
24 -
25 import org.onlab.packet.ChassisId; 22 import org.onlab.packet.ChassisId;
26 import org.onlab.packet.EthType; 23 import org.onlab.packet.EthType;
27 import org.onlab.packet.Ip4Address; 24 import org.onlab.packet.Ip4Address;
...@@ -90,8 +87,8 @@ import org.onosproject.net.device.DefaultPortDescription; ...@@ -90,8 +87,8 @@ import org.onosproject.net.device.DefaultPortDescription;
90 import org.onosproject.net.device.DefaultPortStatistics; 87 import org.onosproject.net.device.DefaultPortStatistics;
91 import org.onosproject.net.device.OchPortDescription; 88 import org.onosproject.net.device.OchPortDescription;
92 import org.onosproject.net.device.OduCltPortDescription; 89 import org.onosproject.net.device.OduCltPortDescription;
93 -import org.onosproject.net.device.OtuPortDescription;
94 import org.onosproject.net.device.OmsPortDescription; 90 import org.onosproject.net.device.OmsPortDescription;
91 +import org.onosproject.net.device.OtuPortDescription;
95 import org.onosproject.net.device.PortStatistics; 92 import org.onosproject.net.device.PortStatistics;
96 import org.onosproject.net.flow.CompletedBatchOperation; 93 import org.onosproject.net.flow.CompletedBatchOperation;
97 import org.onosproject.net.flow.DefaultFlowEntry; 94 import org.onosproject.net.flow.DefaultFlowEntry;
...@@ -257,12 +254,11 @@ public final class KryoNamespaces { ...@@ -257,12 +254,11 @@ public final class KryoNamespaces {
257 .register(HashMap.class) 254 .register(HashMap.class)
258 .register(ConcurrentHashMap.class) 255 .register(ConcurrentHashMap.class)
259 .register(CopyOnWriteArraySet.class) 256 .register(CopyOnWriteArraySet.class)
260 - .register(new JavaSerializer(), Sets.newConcurrentHashSet().getClass())
261 .register(ArrayList.class, 257 .register(ArrayList.class,
262 LinkedList.class, 258 LinkedList.class,
263 HashSet.class, 259 HashSet.class,
264 LinkedHashSet.class 260 LinkedHashSet.class
265 - ) 261 + )
266 .register(Maps.immutableEntry("a", "b").getClass()) 262 .register(Maps.immutableEntry("a", "b").getClass())
267 .register(new ArraysAsListSerializer(), Arrays.asList().getClass()) 263 .register(new ArraysAsListSerializer(), Arrays.asList().getClass())
268 .register(Collections.singletonList(1).getClass()) 264 .register(Collections.singletonList(1).getClass())
...@@ -541,5 +537,6 @@ public final class KryoNamespaces { ...@@ -541,5 +537,6 @@ public final class KryoNamespaces {
541 537
542 538
543 // not to be instantiated 539 // not to be instantiated
544 - private KryoNamespaces() {} 540 + private KryoNamespaces() {
541 + }
545 } 542 }
......
...@@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair; ...@@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
25 import org.onlab.osgi.ServiceDirectory; 25 import org.onlab.osgi.ServiceDirectory;
26 import org.onlab.packet.EthType; 26 import org.onlab.packet.EthType;
27 import org.onlab.packet.IPv4; 27 import org.onlab.packet.IPv4;
28 +import org.onlab.packet.IpPrefix;
28 import org.onlab.packet.VlanId; 29 import org.onlab.packet.VlanId;
29 import org.onlab.util.KryoNamespace; 30 import org.onlab.util.KryoNamespace;
30 import org.onosproject.core.ApplicationId; 31 import org.onosproject.core.ApplicationId;
...@@ -47,6 +48,7 @@ import org.onosproject.net.flow.TrafficTreatment; ...@@ -47,6 +48,7 @@ import org.onosproject.net.flow.TrafficTreatment;
47 import org.onosproject.net.flow.criteria.Criteria; 48 import org.onosproject.net.flow.criteria.Criteria;
48 import org.onosproject.net.flow.criteria.Criterion; 49 import org.onosproject.net.flow.criteria.Criterion;
49 import org.onosproject.net.flow.criteria.EthTypeCriterion; 50 import org.onosproject.net.flow.criteria.EthTypeCriterion;
51 +import org.onosproject.net.flow.criteria.IPCriterion;
50 import org.onosproject.net.flow.criteria.IPProtocolCriterion; 52 import org.onosproject.net.flow.criteria.IPProtocolCriterion;
51 import org.onosproject.net.flow.criteria.PortCriterion; 53 import org.onosproject.net.flow.criteria.PortCriterion;
52 import org.onosproject.net.flow.criteria.VlanIdCriterion; 54 import org.onosproject.net.flow.criteria.VlanIdCriterion;
...@@ -99,6 +101,7 @@ public class OltPipeline extends AbstractHandlerBehaviour implements Pipeliner { ...@@ -99,6 +101,7 @@ public class OltPipeline extends AbstractHandlerBehaviour implements Pipeliner {
99 101
100 private DeviceId deviceId; 102 private DeviceId deviceId;
101 private ApplicationId appId; 103 private ApplicationId appId;
104 + private IpPrefix mcastPrefix = IpPrefix.valueOf("224.0.0.0/4");
102 105
103 protected FlowObjectiveStore flowObjectiveStore; 106 protected FlowObjectiveStore flowObjectiveStore;
104 107
...@@ -253,26 +256,33 @@ public class OltPipeline extends AbstractHandlerBehaviour implements Pipeliner { ...@@ -253,26 +256,33 @@ public class OltPipeline extends AbstractHandlerBehaviour implements Pipeliner {
253 GroupBucket bucket = DefaultGroupBucket.createAllGroupBucket(treatment); 256 GroupBucket bucket = DefaultGroupBucket.createAllGroupBucket(treatment);
254 GroupKey key = new DefaultGroupKey(appKryo.serialize(nextObjective.id())); 257 GroupKey key = new DefaultGroupKey(appKryo.serialize(nextObjective.id()));
255 258
256 - GroupDescription groupDesc = 259 +
257 - new DefaultGroupDescription(deviceId,
258 - GroupDescription.Type.ALL,
259 - new GroupBuckets(Collections.singletonList(bucket)),
260 - key,
261 - null,
262 - nextObjective.appId());
263 260
264 pendingGroups.put(key, nextObjective); 261 pendingGroups.put(key, nextObjective);
265 262
266 switch (nextObjective.op()) { 263 switch (nextObjective.op()) {
267 case ADD: 264 case ADD:
265 + GroupDescription groupDesc =
266 + new DefaultGroupDescription(deviceId,
267 + GroupDescription.Type.ALL,
268 + new GroupBuckets(Collections.singletonList(bucket)),
269 + key,
270 + null,
271 + nextObjective.appId());
268 groupService.addGroup(groupDesc); 272 groupService.addGroup(groupDesc);
269 break; 273 break;
270 case REMOVE: 274 case REMOVE:
271 groupService.removeGroup(deviceId, key, nextObjective.appId()); 275 groupService.removeGroup(deviceId, key, nextObjective.appId());
272 break; 276 break;
273 case ADD_TO_EXISTING: 277 case ADD_TO_EXISTING:
278 + groupService.addBucketsToGroup(deviceId, key,
279 + new GroupBuckets(Collections.singletonList(bucket)),
280 + key, nextObjective.appId());
281 + break;
274 case REMOVE_FROM_EXISTING: 282 case REMOVE_FROM_EXISTING:
275 - //TODO: handle addition to group when caller signals it. 283 + groupService.removeBucketsFromGroup(deviceId, key,
284 + new GroupBuckets(Collections.singletonList(bucket)),
285 + key, nextObjective.appId());
276 break; 286 break;
277 default: 287 default:
278 log.warn("Unknown next objective operation: {}", nextObjective.op()); 288 log.warn("Unknown next objective operation: {}", nextObjective.op());
...@@ -287,14 +297,14 @@ public class OltPipeline extends AbstractHandlerBehaviour implements Pipeliner { ...@@ -287,14 +297,14 @@ public class OltPipeline extends AbstractHandlerBehaviour implements Pipeliner {
287 fail(fwd, ObjectiveError.BADPARAMS); 297 fail(fwd, ObjectiveError.BADPARAMS);
288 } 298 }
289 299
290 - OLTPipelineGroup next = getGroupForNextObjective(fwd.nextId()); 300 + GroupKey key = getGroupForNextObjective(fwd.nextId());
291 301
292 - if (next == null) { 302 + if (key == null) {
293 log.error("Group for forwarding objective missing: {}", fwd); 303 log.error("Group for forwarding objective missing: {}", fwd);
294 fail(fwd, ObjectiveError.GROUPMISSING); 304 fail(fwd, ObjectiveError.GROUPMISSING);
295 } 305 }
296 306
297 - Group group = groupService.getGroup(deviceId, next.key()); 307 + Group group = groupService.getGroup(deviceId, key);
298 TrafficTreatment treatment = 308 TrafficTreatment treatment =
299 buildTreatment(Instructions.createGroup(group.id())); 309 buildTreatment(Instructions.createGroup(group.id()));
300 310
...@@ -330,16 +340,20 @@ public class OltPipeline extends AbstractHandlerBehaviour implements Pipeliner { ...@@ -330,16 +340,20 @@ public class OltPipeline extends AbstractHandlerBehaviour implements Pipeliner {
330 340
331 private boolean checkForMulticast(ForwardingObjective fwd) { 341 private boolean checkForMulticast(ForwardingObjective fwd) {
332 342
333 - VlanIdCriterion vlan = (VlanIdCriterion) filterForCriterion(fwd.selector().criteria(), 343 + IPCriterion ip = (IPCriterion) filterForCriterion(fwd.selector().criteria(),
334 - Criterion.Type.VLAN_VID); 344 + Criterion.Type.IPV4_DST);
345 +
346 + if (ip == null) {
347 + return false;
348 + }
335 349
336 - return (vlan != null && vlan.vlanId().equals(VlanId.vlanId(MCAST_VLAN))); 350 + return mcastPrefix.contains(ip.ip());
337 351
338 } 352 }
339 353
340 - private OLTPipelineGroup getGroupForNextObjective(Integer nextId) { 354 + private GroupKey getGroupForNextObjective(Integer nextId) {
341 NextGroup next = flowObjectiveStore.getNextGroup(nextId); 355 NextGroup next = flowObjectiveStore.getNextGroup(nextId);
342 - return (OLTPipelineGroup) appKryo.deserialize(next.data()); 356 + return appKryo.deserialize(next.data());
343 357
344 } 358 }
345 359
......
...@@ -54,12 +54,12 @@ public class DistributedMcastStore extends AbstractStore<McastEvent, McastStoreD ...@@ -54,12 +54,12 @@ public class DistributedMcastStore extends AbstractStore<McastEvent, McastStoreD
54 mcastRib = storageService.<McastRoute, MulticastData>consistentMapBuilder() 54 mcastRib = storageService.<McastRoute, MulticastData>consistentMapBuilder()
55 .withName(MCASTRIB) 55 .withName(MCASTRIB)
56 .withSerializer(Serializer.using(KryoNamespace.newBuilder() 56 .withSerializer(Serializer.using(KryoNamespace.newBuilder()
57 - .register(KryoNamespaces.API) 57 + .register(KryoNamespaces.API)
58 - .register( 58 + .register(
59 - MulticastData.class, 59 + MulticastData.class,
60 - McastRoute.class, 60 + McastRoute.class,
61 - McastRoute.Type.class 61 + McastRoute.Type.class
62 - ).build())) 62 + ).build()))
63 //.withRelaxedReadConsistency() 63 //.withRelaxedReadConsistency()
64 .build(); 64 .build();
65 65
......
...@@ -66,9 +66,9 @@ public final class MulticastData { ...@@ -66,9 +66,9 @@ public final class MulticastData {
66 sinks.put(sink, true); 66 sinks.put(sink, true);
67 } 67 }
68 68
69 - public boolean removeSink(ConnectPoint sink) { 69 + public void removeSink(ConnectPoint sink) {
70 checkNotNull(sink); 70 checkNotNull(sink);
71 - return sinks.remove(sink); 71 + sinks.remove(sink);
72 } 72 }
73 73
74 public boolean isEmpty() { 74 public boolean isEmpty() {
......