blob: 2595911d1365dbeb6ed99bdf9175ea141acba864 [file] [log] [blame]
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +00001/*
2 * Copyright 2017-present Open Networking Foundation
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 */
developere400c582020-03-24 19:42:08 +010016package org.opencord.igmpproxy.impl;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000017
Matteo Scandolo7482bbe2020-02-12 14:37:09 -080018import com.google.common.collect.ImmutableSet;
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +000019import com.google.common.collect.Maps;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000020import org.onlab.packet.Ethernet;
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000021import org.onlab.packet.IGMP;
22import org.onlab.packet.IGMPMembership;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000023import org.onlab.packet.Ip4Address;
24import org.onlab.packet.IpAddress;
Matteo Scandolo7482bbe2020-02-12 14:37:09 -080025import org.onlab.packet.MacAddress;
Esin Karaman586f1d62020-06-04 10:15:34 +000026import org.onlab.packet.VlanId;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000027import org.onosproject.cfg.ComponentConfigService;
28import org.onosproject.cfg.ConfigProperty;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000029import org.onosproject.core.ApplicationId;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000030import org.onosproject.event.DefaultEventSinkRegistry;
31import org.onosproject.event.Event;
32import org.onosproject.event.EventDeliveryService;
33import org.onosproject.event.EventSink;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000034import org.onosproject.mastership.MastershipServiceAdapter;
35import org.onosproject.mcast.api.McastListener;
36import org.onosproject.mcast.api.McastRoute;
37import org.onosproject.mcast.api.McastRouteData;
38import org.onosproject.mcast.api.MulticastRouteService;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000039import org.onosproject.net.AnnotationKeys;
40import org.onosproject.net.Annotations;
41import org.onosproject.net.ConnectPoint;
42import org.onosproject.net.DefaultAnnotations;
43import org.onosproject.net.DefaultDevice;
Esin Karaman00e16b72020-02-21 10:32:39 +000044import org.onosproject.net.DefaultPort;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000045import org.onosproject.net.Device;
46import org.onosproject.net.DeviceId;
47import org.onosproject.net.HostId;
48import org.onosproject.net.Port;
49import org.onosproject.net.PortNumber;
50import org.onosproject.net.SparseAnnotations;
51import org.onosproject.net.config.Config;
Matteo Scandolo7482bbe2020-02-12 14:37:09 -080052import org.onosproject.net.config.ConfigFactory;
53import org.onosproject.net.config.NetworkConfigRegistryAdapter;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000054import org.onosproject.net.config.basics.McastConfig;
55import org.onosproject.net.config.basics.SubjectFactories;
56import org.onosproject.net.device.DeviceServiceAdapter;
57import org.onosproject.net.packet.DefaultInboundPacket;
58import org.onosproject.net.packet.DefaultPacketContext;
59import org.onosproject.net.packet.InboundPacket;
60import org.onosproject.net.packet.OutboundPacket;
61import org.onosproject.net.packet.PacketContext;
62import org.onosproject.net.packet.PacketProcessor;
63import org.onosproject.net.packet.PacketServiceAdapter;
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +000064import org.opencord.igmpproxy.IgmpLeadershipService;
65import org.opencord.igmpproxy.impl.store.groupmember.AbstractGroupMemberStore;
66import org.opencord.igmpproxy.impl.store.machine.AbstractStateMachineStore;
67import org.opencord.igmpproxy.statemachine.StateMachine;
68import org.opencord.igmpproxy.statemachine.StateMachineId;
Matteo Scandolo7482bbe2020-02-12 14:37:09 -080069import org.opencord.sadis.BandwidthProfileInformation;
70import org.opencord.sadis.BaseInformationService;
71import org.opencord.sadis.SadisService;
72import org.opencord.sadis.SubscriberAndDeviceInformation;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000073import org.osgi.framework.Bundle;
74import org.osgi.framework.BundleContext;
75import org.osgi.framework.ServiceReference;
76import org.osgi.service.component.ComponentContext;
77import org.osgi.service.component.ComponentInstance;
78
79import static com.google.common.base.Preconditions.checkState;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000080
Matteo Scandolo7482bbe2020-02-12 14:37:09 -080081import java.nio.ByteBuffer;
82import java.util.ArrayList;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000083import java.util.Dictionary;
84import java.util.Hashtable;
Matteo Scandolo7482bbe2020-02-12 14:37:09 -080085import java.util.LinkedList;
86import java.util.List;
87import java.util.Set;
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +000088import java.util.Map;
89import java.util.concurrent.atomic.AtomicLong;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000090
91public class IgmpManagerBase {
92
93 // Device configuration
94 protected static final DeviceId DEVICE_ID_OF_A = DeviceId.deviceId("of:1");
95 protected static final DeviceId DEVICE_ID_OF_B = DeviceId.deviceId("of:2");
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000096 protected static final DeviceId DEVICE_ID_OF_C = DeviceId.deviceId("of:00000000000000003");
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +000097
98 //Multicast ip address
99 protected static final Ip4Address GROUP_IP = Ip4Address.valueOf("224.0.0.0");
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000100 //Unknown group Ip address
101 protected static final Ip4Address UNKNOWN_GRP_IP = Ip4Address.valueOf("124.0.0.0");
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000102 // Source ip address of two different device.
103 protected static final Ip4Address SOURCE_IP_OF_A = Ip4Address.valueOf("10.177.125.4");
104 protected static final Ip4Address SOURCE_IP_OF_B = Ip4Address.valueOf("10.177.125.5");
105
106 // Common connect point of aggregation switch used by all devices.
107 protected static final ConnectPoint COMMON_CONNECT_POINT =
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000108 ConnectPoint.deviceConnectPoint("of:00000000000000003/3");
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000109 // Uplink ports for two olts A and B
110 protected static final PortNumber PORT_A = PortNumber.portNumber(1);
111 protected static final PortNumber PORT_B = PortNumber.portNumber(2);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000112 protected static final PortNumber PORT_C = PortNumber.portNumber(3);
Esin Karaman00e16b72020-02-21 10:32:39 +0000113 protected static final PortNumber PORT_NNI = PortNumber.portNumber(65536);
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000114
115 // Connect Point mode for two olts
116 protected static final ConnectPoint CONNECT_POINT_A = new ConnectPoint(DEVICE_ID_OF_A, PORT_A);
117 protected static final ConnectPoint CONNECT_POINT_B = new ConnectPoint(DEVICE_ID_OF_B, PORT_B);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000118 protected static final ConnectPoint CONNECT_POINT_C = new ConnectPoint(DEVICE_ID_OF_C, PORT_C);
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000119
Matteo Scandolo7482bbe2020-02-12 14:37:09 -0800120 protected static final String CLIENT_NAS_PORT_ID = "PON 1/1";
121 protected static final String CLIENT_CIRCUIT_ID = "CIR-PON 1/1";
122 protected String dsBpId = "HSIA-DS";
123
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000124 private static final int STATISTICS_GEN_PERIOD_IN_SEC = 2;
125
Esin Karaman00e16b72020-02-21 10:32:39 +0000126 private static final String NNI_PREFIX = "nni";
127
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000128 protected List<Port> lsPorts = new ArrayList<Port>();
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000129 protected List<Device> lsDevices = new ArrayList<Device>();
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000130 // Flag for adding two different devices in oltData
131 protected boolean flagForDevice = true;
132 PacketContext context;
133 // Flag for sending two different packets
134 protected boolean flagForPacket = true;
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000135 // Flag for sending two different packets
136 protected boolean flagForQueryPacket = false;
137 // Flag to check permission
138 boolean flagForPermission = false;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000139 // List to store the packets emitted
140 protected List<OutboundPacket> savedPackets;
141 protected PacketProcessor packetProcessor;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000142
143 class MockDeviceService extends DeviceServiceAdapter {
144
145 @Override
146 public Device getDevice(DeviceId deviceId) {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000147 if (flagForDevice) {
148 DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder()
149 .set(AnnotationKeys.MANAGEMENT_ADDRESS, SOURCE_IP_OF_A.toString());
150 SparseAnnotations annotations = annotationsBuilder.build();
151 Annotations[] da = {annotations};
152 Device deviceA = new DefaultDevice(null, DEVICE_ID_OF_A, Device.Type.OTHER, "", "", "", "", null, da);
153 flagForDevice = false;
154 return deviceA;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000155 } else {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000156 DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder()
157 .set(AnnotationKeys.MANAGEMENT_ADDRESS, SOURCE_IP_OF_B.toString());
158 SparseAnnotations annotations = annotationsBuilder.build();
159 Annotations[] da = {annotations};
160 Device deviceB = new DefaultDevice(null, DEVICE_ID_OF_B, Device.Type.OTHER, "", "", "", "", null, da);
161 return deviceB;
162 }
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000163 }
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000164
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000165 @Override
166 public List<Port> getPorts(DeviceId deviceId) {
167 return lsPorts;
168 }
Esin Karaman00e16b72020-02-21 10:32:39 +0000169
170 @Override
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000171 public Iterable<Device> getAvailableDevices() {
172 DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder()
173 .set(AnnotationKeys.MANAGEMENT_ADDRESS, SOURCE_IP_OF_A.toString());
174 SparseAnnotations annotations = annotationsBuilder.build();
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000175 Annotations[] da = {annotations};
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000176 Device deviceA = new DefaultDevice(null, DEVICE_ID_OF_C, Device.Type.OTHER, "", "", "", "", null, da);
177 lsDevices.add(deviceA);
178 return lsDevices;
179 }
180
181 @Override
Esin Karaman00e16b72020-02-21 10:32:39 +0000182 public Port getPort(DeviceId deviceId, PortNumber portNumber) {
183 if (portNumber.equals(PORT_NNI)) {
184 DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder()
185 .set(AnnotationKeys.PORT_NAME, NNI_PREFIX);
186 Port nni = new DefaultPort(null, portNumber, true, annotationsBuilder.build());
187 return nni;
188 }
189 return super.getPort(deviceId, portNumber);
190 }
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000191 }
192
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000193 static final Class<IgmpproxyConfig> IGMPPROXY_CONFIG_CLASS = IgmpproxyConfig.class;
194 static final Class<IgmpproxySsmTranslateConfig> IGMPPROXY_SSM_CONFIG_CLASS = IgmpproxySsmTranslateConfig.class;
195 static final Class<McastConfig> MCAST_CONFIG_CLASS = McastConfig.class;
196 ConfigFactory<ApplicationId, IgmpproxyConfig> igmpproxyConfigFactory =
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000197 new ConfigFactory<ApplicationId, IgmpproxyConfig>(
198 SubjectFactories.APP_SUBJECT_FACTORY, IGMPPROXY_CONFIG_CLASS, "igmpproxy") {
199 @Override
200 public IgmpproxyConfig createConfig() {
201 return new IgmpproxyConfig();
202 }
203 };
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000204
205 ConfigFactory<ApplicationId, IgmpproxySsmTranslateConfig> igmpproxySsmConfigFactory =
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000206 new ConfigFactory<ApplicationId, IgmpproxySsmTranslateConfig>(
207 SubjectFactories.APP_SUBJECT_FACTORY, IGMPPROXY_SSM_CONFIG_CLASS, "ssmTranslate", true) {
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000208
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000209 @Override
210 public IgmpproxySsmTranslateConfig createConfig() {
211 return new IgmpproxySsmTranslateConfig();
212 }
213 };
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000214
215
216 class MockIgmpProxyConfig extends IgmpproxyConfig {
217 boolean igmpOnPodBasis = true;
218
219 MockIgmpProxyConfig(boolean igmpFlagValue) {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000220 igmpOnPodBasis = igmpFlagValue;
221 }
222
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000223 @Override
224 public boolean igmpOnPodBasis() {
225 return igmpOnPodBasis;
226 }
227
228 @Override
229 public ConnectPoint getSourceDeviceAndPort() {
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000230 if (flagForPermission) {
231 return null;
232 }
233 return COMMON_CONNECT_POINT;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000234 }
235
236 @Override
237 public ConnectPoint connectPoint() {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000238 return COMMON_CONNECT_POINT;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000239 }
240 }
241
242
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000243 class TestNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
244 Boolean igmpOnPodFlag = false;
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000245
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000246 TestNetworkConfigRegistry(Boolean igmpFlag) {
247 igmpOnPodFlag = igmpFlag;
248 }
249
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000250 @SuppressWarnings("unchecked")
251 @Override
Matteo Scandolo7482bbe2020-02-12 14:37:09 -0800252 public <S> Set<S> getSubjects(Class<S> subjectClass) {
253 if (subjectClass.getName().equalsIgnoreCase("org.onosproject.net.DeviceId")) {
254 return (Set<S>) ImmutableSet.of(DEVICE_ID_OF_A, DEVICE_ID_OF_B);
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000255 }
256 return null;
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000257 }
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000258
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000259 @SuppressWarnings("unchecked")
260 @Override
261 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
262 if (configClass.getName().equalsIgnoreCase("org.opencord.igmpproxy.impl.IgmpproxyConfig")) {
263 IgmpproxyConfig igmpproxyConfig = new MockIgmpProxyConfig(igmpOnPodFlag);
264 return (C) igmpproxyConfig;
265 } else {
266 super.getConfig(subject, configClass);
267 }
268 return null;
269 }
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000270 }
271
272
273 /**
274 * Keeps a reference to the PacketProcessor and saves the OutboundPackets. Adds
275 * the emitted packet in savedPackets list
276 */
277 class MockPacketService extends PacketServiceAdapter {
278
279 public MockPacketService() {
280 savedPackets = new LinkedList<>();
281 }
282
283 @Override
284 public void addProcessor(PacketProcessor processor, int priority) {
285 packetProcessor = processor;
286 }
287
288 @Override
289 public void emit(OutboundPacket packet) {
290 synchronized (savedPackets) {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000291 savedPackets.add(packet);
292 savedPackets.notify();
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000293 }
294 }
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000295 }
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000296
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000297 class TestIgmpLeaderShipService implements IgmpLeadershipService {
298 @Override
299 public boolean isLocalLeader(DeviceId deviceId) {
300 return true;
301 }
302 }
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000303
304 class MockMastershipService extends MastershipServiceAdapter {
305 @Override
306 public boolean isLocalMaster(DeviceId deviceId) {
307 return true;
308 }
309 }
310
311 final class TestMulticastRouteService implements MulticastRouteService {
312 @Override
313 public void addListener(McastListener listener) {
314 }
315
316 @Override
317 public void removeListener(McastListener listener) {
318 }
319
320 @Override
321 public void add(McastRoute route) {
322 }
323
324 @Override
325 public void remove(McastRoute route) {
326 }
327
328 @Override
329 public Set<McastRoute> getRoutes() {
330 return null;
331 }
332
333 @Override
334 public Set<McastRoute> getRoute(IpAddress groupIp, IpAddress sourceIp) {
335 return null;
336 }
337
338 @Override
339 public void addSource(McastRoute route, HostId source) {
340 }
341
342 @Override
343 public void addSources(McastRoute route, HostId hostId, Set<ConnectPoint> connectPoints) {
344 }
345
346 @Override
347 public void addSources(McastRoute route, Set<ConnectPoint> sources) {
348
349 }
350
351 @Override
352 public void removeSources(McastRoute route) {
353
354 }
355
356 @Override
357 public void removeSource(McastRoute route, HostId source) {
358
359 }
360
361 @Override
Esin Karaman09b41e52020-06-01 10:52:55 +0000362 public void removeSources(McastRoute route, Set<ConnectPoint> sources) {
363
364 }
365
366 @Override
367 public void removeSources(McastRoute route, HostId hostId, Set<ConnectPoint> connectPoints) {
368
369 }
370
371 @Override
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000372 public void addSink(McastRoute route, HostId hostId) {
373
374 }
375
376 @Override
377 public void addSinks(McastRoute route, HostId hostId, Set<ConnectPoint> connectPoints) {
378
379 }
380
381 @Override
382 public void addSinks(McastRoute route, Set<ConnectPoint> sinks) {
383
384 }
385
386 @Override
387 public void removeSinks(McastRoute route) {
388
389 }
390
391 @Override
392 public void removeSink(McastRoute route, HostId hostId) {
393
394 }
395
396 @Override
397 public void removeSinks(McastRoute route, Set<ConnectPoint> sink) {
398
399 }
400
401 @Override
402 public McastRouteData routeData(McastRoute route) {
403 return null;
404 }
405
406 @Override
407 public Set<ConnectPoint> sources(McastRoute route) {
408 return null;
409 }
410
411 @Override
412 public Set<ConnectPoint> sources(McastRoute route, HostId hostId) {
413 return null;
414 }
415
416 @Override
417 public Set<ConnectPoint> sinks(McastRoute route) {
418 return null;
419 }
420
421 @Override
422 public Set<ConnectPoint> sinks(McastRoute route, HostId hostId) {
423 return null;
424 }
425
426 @Override
427 public Set<ConnectPoint> nonHostSinks(McastRoute route) {
428 return null;
429 }
430
431 }
432
433
434 /**
435 * Mocks the DefaultPacketContext.
436 */
437 final class TestPacketContext extends DefaultPacketContext {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000438 TestPacketContext(long time, InboundPacket inPkt, OutboundPacket outPkt, boolean block) {
439 super(time, inPkt, outPkt, block);
440 }
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000441
442 @Override
443 public void send() {
444 // We don't send anything out.
445 }
446 }
447
448 /**
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000449 * Sends Ethernet packet to the process method of the Packet Processor.
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000450 *
451 * @param reply Ethernet packet
452 * @throws InterruptedException
453 */
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000454 void sendPacket(Ethernet reply) {
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000455
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000456 if (reply != null) {
457 final ByteBuffer byteBuffer = ByteBuffer.wrap(reply.serialize());
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000458
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000459 if (flagForQueryPacket) {
460 InboundPacket inBoundPacket = new DefaultInboundPacket(CONNECT_POINT_C, reply, byteBuffer);
461 context = new TestPacketContext(127L, inBoundPacket, null, false);
462 packetProcessor.process(context);
463 } else {
464 if (flagForPacket) {
465 InboundPacket inPacket = new DefaultInboundPacket(CONNECT_POINT_A, reply, byteBuffer);
466 context = new TestPacketContext(127L, inPacket, null, false);
467 flagForPacket = false;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000468
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000469 packetProcessor.process(context);
470 } else {
471 InboundPacket inBoundPacket = new DefaultInboundPacket(CONNECT_POINT_B, reply, byteBuffer);
472 context = new TestPacketContext(127L, inBoundPacket, null, false);
473 flagForPacket = true;
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000474
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000475 packetProcessor.process(context);
476 }
477 }
478 }
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000479 }
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000480
Matteo Scandolo7482bbe2020-02-12 14:37:09 -0800481 protected class MockSadisService implements SadisService {
482
483 @Override
484 public BaseInformationService<SubscriberAndDeviceInformation> getSubscriberInfoService() {
485 return new MockSubService();
486 }
487
488 @Override
489 public BaseInformationService<BandwidthProfileInformation> getBandwidthProfileService() {
490 return new MockBpService();
491 }
492 }
493
494 private class MockBpService implements BaseInformationService<BandwidthProfileInformation> {
495
496 @Override
497 public void invalidateAll() {
498
499 }
500
501 @Override
502 public void invalidateId(String id) {
503
504 }
505
506 @Override
507 public BandwidthProfileInformation get(String id) {
508 if (id.equals(dsBpId)) {
509 BandwidthProfileInformation bpInfo = new BandwidthProfileInformation();
510 bpInfo.setAssuredInformationRate(0);
511 bpInfo.setCommittedInformationRate(10000);
512 bpInfo.setCommittedBurstSize(1000L);
513 bpInfo.setExceededBurstSize(2000L);
514 bpInfo.setExceededInformationRate(20000);
515 return bpInfo;
516 }
517 return null;
518 }
519
520 @Override
521 public BandwidthProfileInformation getfromCache(String id) {
522 return null;
523 }
524 }
525
526 private class MockSubService implements BaseInformationService<SubscriberAndDeviceInformation> {
527 MockSubscriberAndDeviceInformation sub =
528 new MockSubscriberAndDeviceInformation(CLIENT_NAS_PORT_ID,
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000529 CLIENT_NAS_PORT_ID, CLIENT_CIRCUIT_ID, null, null);
Matteo Scandolo7482bbe2020-02-12 14:37:09 -0800530
531 @Override
532 public SubscriberAndDeviceInformation get(String id) {
533 return sub;
534 }
535
536 @Override
537 public void invalidateAll() {
538 }
539
540 @Override
541 public void invalidateId(String id) {
542 }
543
544 @Override
545 public SubscriberAndDeviceInformation getfromCache(String id) {
546 return null;
547 }
548 }
549
550 private class MockSubscriberAndDeviceInformation extends SubscriberAndDeviceInformation {
551
552 MockSubscriberAndDeviceInformation(String id, String nasPortId,
553 String circuitId, MacAddress hardId,
554 Ip4Address ipAddress) {
555 this.setHardwareIdentifier(hardId);
556 this.setId(id);
557 this.setIPAddress(ipAddress);
558 this.setNasPortId(nasPortId);
559 this.setCircuitId(circuitId);
Esin Karaman00e16b72020-02-21 10:32:39 +0000560 this.setUplinkPort((int) PORT_NNI.toLong());
Matteo Scandolo7482bbe2020-02-12 14:37:09 -0800561 }
562 }
563
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000564 protected class MockCfgService implements ComponentConfigService {
565
566 @Override
567 public Set<String> getComponentNames() {
568 return null;
569 }
570
571 @Override
572 public void registerProperties(Class<?> componentClass) {
573
574 }
575
576 @Override
577 public void unregisterProperties(Class<?> componentClass, boolean clear) {
578
579 }
580
581 @Override
582 public Set<ConfigProperty> getProperties(String componentName) {
583 return null;
584 }
585
586 @Override
587 public void setProperty(String componentName, String name, String value) {
588
589 }
590
591 @Override
592 public void preSetProperty(String componentName, String name, String value) {
593
594 }
595
596 @Override
597 public void preSetProperty(String componentName, String name, String value, boolean override) {
598
599 }
600
601 @Override
602 public void unsetProperty(String componentName, String name) {
603
604 }
605
606 @Override
607 public ConfigProperty getProperty(String componentName, String attribute) {
608 return null;
609 }
610
611 }
612
613 public static class TestEventDispatcher extends DefaultEventSinkRegistry implements EventDeliveryService {
614
615 @Override
616 @SuppressWarnings("unchecked")
617 public synchronized void post(Event event) {
618 EventSink sink = getSink(event.getClass());
619 checkState(sink != null, "No sink for event %s", event);
620 sink.process(event);
621 }
622
623 @Override
624 public void setDispatchTimeLimit(long millis) {
625 }
626
627 @Override
628 public long getDispatchTimeLimit() {
629 return 0;
630 }
631 }
632
633 class MockComponentContext implements ComponentContext {
634
635 @Override
636 public Dictionary<String, Object> getProperties() {
637 Dictionary<String, Object> cfgDict = new Hashtable<String, Object>();
638 cfgDict.put("statisticsGenerationPeriodInSeconds", STATISTICS_GEN_PERIOD_IN_SEC);
639 return cfgDict;
640 }
641
642 @Override
643 public Object locateService(String name) {
644 // TODO Auto-generated method stub
645 return null;
646 }
647
648 @Override
649 public Object locateService(String name, ServiceReference reference) {
650 // TODO Auto-generated method stub
651 return null;
652 }
653
654 @Override
655 public Object[] locateServices(String name) {
656 // TODO Auto-generated method stub
657 return null;
658 }
659
660 @Override
661 public BundleContext getBundleContext() {
662 // TODO Auto-generated method stub
663 return null;
664 }
665
666 @Override
667 public Bundle getUsingBundle() {
668 // TODO Auto-generated method stub
669 return null;
670 }
671
672 @Override
673 public ComponentInstance getComponentInstance() {
674 // TODO Auto-generated method stub
675 return null;
676 }
677
678 @Override
679 public void enableComponent(String name) {
680 // TODO Auto-generated method stub
681 }
682
683 @Override
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000684 public void disableComponent(String name) {
685 // TODO Auto-generated method stub
686 }
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000687
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000688 @Override
689 public ServiceReference getServiceReference() {
690 // TODO Auto-generated method stub
691 return null;
692 }
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000693 }
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000694
695 Ethernet buildWrongIgmpPacket(Ip4Address groupIp, Ip4Address sourceIp) {
696 IGMPMembership igmpMembership = new IGMPMembership(groupIp);
697 igmpMembership.setRecordType((byte) 0x33);
698
699 return IgmpSender.getInstance().buildIgmpPacket(IGMP.TYPE_IGMPV3_MEMBERSHIP_REPORT, groupIp,
Esin Karaman586f1d62020-06-04 10:15:34 +0000700 igmpMembership, sourceIp, false, VlanId.ANY_VALUE, VlanId.NO_VID, IgmpSender.DEFAULT_COS);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000701 }
702
703 Ethernet buildUnknownIgmpPacket(Ip4Address groupIp, Ip4Address sourceIp) {
704 IGMPMembership igmpMembership = new IGMPMembership(groupIp);
705 igmpMembership.setRecordType((byte) 0x33);
706
Esin Karaman586f1d62020-06-04 10:15:34 +0000707 return IgmpSender.getInstance().buildIgmpPacket((byte) 0x44, groupIp, igmpMembership, sourceIp, false,
708 VlanId.ANY_VALUE, VlanId.NO_VID, IgmpSender.DEFAULT_COS);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000709 }
710
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000711 class TestStateMachineStoreService extends AbstractStateMachineStore {
712 private static final int DEFAULT_COUNT = 0;
713 private Map<StateMachineId, AtomicLong> countsMap;
714
715 public TestStateMachineStoreService(Map<StateMachineId, StateMachine> map) {
716 super();
717 stateMachineMap = Maps.newConcurrentMap();
718 countsMap = Maps.newConcurrentMap();
719 }
720
721 @Override
722 public long increaseAndGetCounter(StateMachineId stateMachineId) {
723 AtomicLong count = countsMap.get(stateMachineId);
724 if (count == null) {
725 count = new AtomicLong(DEFAULT_COUNT);
726 countsMap.put(stateMachineId, count);
727 }
728 return count.incrementAndGet();
729 }
730
731 @Override
732 public long decreaseAndGetCounter(StateMachineId stateMachineId) {
733 AtomicLong count = countsMap.get(stateMachineId);
734 if (count.get() > 0) {
735 return count.decrementAndGet();
736 } else {
737 return count.get();
738 }
739 }
740
741 @Override
742 public boolean removeCounter(StateMachineId stateMachineId) {
743 countsMap.remove(stateMachineId);
744 return true;
745 }
746
747 @Override
748 public long getCounter(StateMachineId stateMachineId) {
749 return countsMap.get(stateMachineId).get();
750 }
751
752 }
753
754
755 class TestGroupMemberStoreService extends AbstractGroupMemberStore {
756 public TestGroupMemberStoreService() {
757 super(Maps.newConcurrentMap());
758 }
759 }
Sonal Kasliwalddc3ff22019-11-18 11:52:49 +0000760}