[SEBA-40, SEBA-942 & SEBA-957] Operational status for IGMP Channel, IGMP Group and Invalid IGMP Packets
Change-Id: I8efb475f69ca5df8f2f4c1daaaba52b8ce8572f7
diff --git a/src/test/java/org/opencord/igmpproxy/IgmpManagerBase.java b/src/test/java/org/opencord/igmpproxy/IgmpManagerBase.java
index 05581ed..4c68b1b 100644
--- a/src/test/java/org/opencord/igmpproxy/IgmpManagerBase.java
+++ b/src/test/java/org/opencord/igmpproxy/IgmpManagerBase.java
@@ -17,6 +17,8 @@
import com.google.common.collect.ImmutableSet;
import org.onlab.packet.Ethernet;
+import org.onlab.packet.IGMP;
+import org.onlab.packet.IGMPMembership;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
@@ -61,8 +63,6 @@
import org.opencord.sadis.BaseInformationService;
import org.opencord.sadis.SadisService;
import org.opencord.sadis.SubscriberAndDeviceInformation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
@@ -84,9 +84,12 @@
// Device configuration
protected static final DeviceId DEVICE_ID_OF_A = DeviceId.deviceId("of:1");
protected static final DeviceId DEVICE_ID_OF_B = DeviceId.deviceId("of:2");
+ protected static final DeviceId DEVICE_ID_OF_C = DeviceId.deviceId("of:00000000000000003");
//Multicast ip address
protected static final Ip4Address GROUP_IP = Ip4Address.valueOf("224.0.0.0");
+ //Unknown group Ip address
+ protected static final Ip4Address UNKNOWN_GRP_IP = Ip4Address.valueOf("124.0.0.0");
// Source ip address of two different device.
protected static final Ip4Address SOURCE_IP_OF_A = Ip4Address.valueOf("10.177.125.4");
protected static final Ip4Address SOURCE_IP_OF_B = Ip4Address.valueOf("10.177.125.5");
@@ -97,11 +100,13 @@
// Uplink ports for two olts A and B
protected static final PortNumber PORT_A = PortNumber.portNumber(1);
protected static final PortNumber PORT_B = PortNumber.portNumber(2);
+ protected static final PortNumber PORT_C = PortNumber.portNumber(3);
protected static final PortNumber PORT_NNI = PortNumber.portNumber(65536);
// Connect Point mode for two olts
protected static final ConnectPoint CONNECT_POINT_A = new ConnectPoint(DEVICE_ID_OF_A, PORT_A);
protected static final ConnectPoint CONNECT_POINT_B = new ConnectPoint(DEVICE_ID_OF_B, PORT_B);
+ protected static final ConnectPoint CONNECT_POINT_C = new ConnectPoint(DEVICE_ID_OF_C, PORT_C);
protected static final String CLIENT_NAS_PORT_ID = "PON 1/1";
protected static final String CLIENT_CIRCUIT_ID = "CIR-PON 1/1";
@@ -112,15 +117,19 @@
private static final String NNI_PREFIX = "nni";
protected List<Port> lsPorts = new ArrayList<Port>();
+ protected List<Device> lsDevices = new ArrayList<Device>();
// Flag for adding two different devices in oltData
protected boolean flagForDevice = true;
PacketContext context;
// Flag for sending two different packets
protected boolean flagForPacket = true;
+ // Flag for sending two different packets
+ protected boolean flagForQueryPacket = false;
+ // Flag to check permission
+ boolean flagForPermission = false;
// List to store the packets emitted
protected List<OutboundPacket> savedPackets;
protected PacketProcessor packetProcessor;
- private Logger log = LoggerFactory.getLogger(getClass());
class MockDeviceService extends DeviceServiceAdapter {
@@ -149,6 +158,17 @@
}
@Override
+ public Iterable<Device> getAvailableDevices() {
+ DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder()
+ .set(AnnotationKeys.MANAGEMENT_ADDRESS, SOURCE_IP_OF_A.toString());
+ SparseAnnotations annotations = annotationsBuilder.build();
+ Annotations[] da = {annotations };
+ Device deviceA = new DefaultDevice(null, DEVICE_ID_OF_C, Device.Type.OTHER, "", "", "", "", null, da);
+ lsDevices.add(deviceA);
+ return lsDevices;
+ }
+
+ @Override
public Port getPort(DeviceId deviceId, PortNumber portNumber) {
if (portNumber.equals(PORT_NNI)) {
DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder()
@@ -196,7 +216,10 @@
@Override
public ConnectPoint getSourceDeviceAndPort() {
- return COMMON_CONNECT_POINT;
+ if (flagForPermission) {
+ return null;
+ }
+ return COMMON_CONNECT_POINT;
}
@Override
@@ -400,32 +423,32 @@
* @param reply Ethernet packet
* @throws InterruptedException
*/
- void sendPacket(Ethernet reply, boolean isSingleSend) {
+ void sendPacket(Ethernet reply) {
- final ByteBuffer byteBuffer = ByteBuffer.wrap(reply.serialize());
+ if (reply != null) {
+ final ByteBuffer byteBuffer = ByteBuffer.wrap(reply.serialize());
- if (isSingleSend) {
- InboundPacket inBoundPacket = new DefaultInboundPacket(CONNECT_POINT_B, reply, byteBuffer);
- context = new TestPacketContext(127L, inBoundPacket, null, false);
+ if (flagForQueryPacket) {
+ InboundPacket inBoundPacket = new DefaultInboundPacket(CONNECT_POINT_C, reply, byteBuffer);
+ context = new TestPacketContext(127L, inBoundPacket, null, false);
+ packetProcessor.process(context);
+ } else {
+ if (flagForPacket) {
+ InboundPacket inPacket = new DefaultInboundPacket(CONNECT_POINT_A, reply, byteBuffer);
+ context = new TestPacketContext(127L, inPacket, null, false);
+ flagForPacket = false;
- packetProcessor.process(context);
- } else {
- if (flagForPacket) {
- InboundPacket inPacket = new DefaultInboundPacket(CONNECT_POINT_A, reply, byteBuffer);
- context = new TestPacketContext(127L, inPacket, null, false);
- flagForPacket = false;
+ packetProcessor.process(context);
+ } else {
+ InboundPacket inBoundPacket = new DefaultInboundPacket(CONNECT_POINT_B, reply, byteBuffer);
+ context = new TestPacketContext(127L, inBoundPacket, null, false);
+ flagForPacket = true;
- packetProcessor.process(context);
- } else {
- InboundPacket inBoundPacket = new DefaultInboundPacket(CONNECT_POINT_B, reply, byteBuffer);
- context = new TestPacketContext(127L, inBoundPacket, null, false);
- flagForPacket = true;
-
- packetProcessor.process(context);
- }
- }
-
- }
+ packetProcessor.process(context);
+ }
+ }
+ }
+ }
protected class MockSadisService implements SadisService {
@@ -640,4 +663,20 @@
return null;
}
}
+
+ Ethernet buildWrongIgmpPacket(Ip4Address groupIp, Ip4Address sourceIp) {
+ IGMPMembership igmpMembership = new IGMPMembership(groupIp);
+ igmpMembership.setRecordType((byte) 0x33);
+
+ return IgmpSender.getInstance().buildIgmpPacket(IGMP.TYPE_IGMPV3_MEMBERSHIP_REPORT, groupIp,
+ igmpMembership, sourceIp, false);
+ }
+
+ Ethernet buildUnknownIgmpPacket(Ip4Address groupIp, Ip4Address sourceIp) {
+ IGMPMembership igmpMembership = new IGMPMembership(groupIp);
+ igmpMembership.setRecordType((byte) 0x33);
+
+ return IgmpSender.getInstance().buildIgmpPacket((byte) 0x44, groupIp, igmpMembership, sourceIp, false);
+ }
+
}
diff --git a/src/test/java/org/opencord/igmpproxy/IgmpManagerTest.java b/src/test/java/org/opencord/igmpproxy/IgmpManagerTest.java
index b77a09c..8159463 100644
--- a/src/test/java/org/opencord/igmpproxy/IgmpManagerTest.java
+++ b/src/test/java/org/opencord/igmpproxy/IgmpManagerTest.java
@@ -96,7 +96,7 @@
Ethernet firstPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_A);
Ethernet secondPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_B);
// Sending first packet and here shouldSendjoin flag will be true
- sendPacket(firstPacket, false);
+ sendPacket(firstPacket);
// Emitted packet is stored in list savedPackets
assertNotNull(savedPackets);
synchronized (savedPackets) {
@@ -106,7 +106,7 @@
assertNotNull(savedPackets);
assertEquals(1, savedPackets.size());
// Sending the second packet with same group ip address
- sendPacket(secondPacket, false);
+ sendPacket(secondPacket);
synchronized (savedPackets) {
savedPackets.wait(WAIT_TIMEOUT);
}
@@ -126,7 +126,7 @@
Ethernet firstPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_A);
Ethernet secondPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_B);
// Sending first packet and here shouldSendjoin flag will be true
- sendPacket(firstPacket, false);
+ sendPacket(firstPacket);
// Emitted packet is stored in list savedPackets
synchronized (savedPackets) {
savedPackets.wait(WAIT_TIMEOUT);
@@ -135,7 +135,7 @@
assertEquals(1, savedPackets.size());
// Sending the second packet with same group ip address which will not be emitted
// shouldSendJoin flag will be false.
- sendPacket(secondPacket, false);
+ sendPacket(secondPacket);
synchronized (savedPackets) {
savedPackets.wait(WAIT_TIMEOUT);
}
diff --git a/src/test/java/org/opencord/igmpproxy/IgmpStatisticsTest.java b/src/test/java/org/opencord/igmpproxy/IgmpStatisticsTest.java
index e1e4f35..1198d1a 100644
--- a/src/test/java/org/opencord/igmpproxy/IgmpStatisticsTest.java
+++ b/src/test/java/org/opencord/igmpproxy/IgmpStatisticsTest.java
@@ -26,6 +26,7 @@
import org.junit.Test;
import org.onlab.junit.TestUtils;
import org.onlab.packet.Ethernet;
+import org.onlab.packet.Ip4Address;
import org.onosproject.core.CoreServiceAdapter;
import org.onosproject.net.flow.FlowRuleServiceAdapter;
import org.onosproject.net.flowobjective.FlowObjectiveServiceAdapter;
@@ -79,17 +80,21 @@
//Test Igmp Statistics.
@Test
public void testIgmpStatistics() throws InterruptedException {
+ SingleStateMachine.sendQuery = false;
igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
igmpManager.activate();
+
//IGMPv3 Join
+ flagForPacket = false;
Ethernet igmpv3MembershipReportPkt = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_A);
- sendPacket(igmpv3MembershipReportPkt, true);
+ sendPacket(igmpv3MembershipReportPkt);
synchronized (savedPackets) {
savedPackets.wait(WAIT_TIMEOUT);
}
//Leave
+ flagForPacket = false;
Ethernet igmpv3LeavePkt = IgmpSender.getInstance().buildIgmpV3Leave(GROUP_IP, SOURCE_IP_OF_A);
- sendPacket(igmpv3LeavePkt, true);
+ sendPacket(igmpv3LeavePkt);
synchronized (savedPackets) {
savedPackets.wait(WAIT_TIMEOUT);
}
@@ -99,12 +104,56 @@
assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpJoinReq().longValue());
assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getIgmpv3MembershipReport().longValue());
assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpSuccessJoinRejoinReq().longValue());
-
+ assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getUnconfiguredGroupCounter().longValue());
+ assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getValidIgmpPacketCounter().longValue());
+ assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpChannelJoinCounter().longValue());
assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpLeaveReq().longValue());
assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getIgmpMsgReceived().longValue());
+ assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getIgmpValidChecksumCounter().longValue());
}
+ //Test packet with Unknown Multicast IpAddress
+ @Test
+ public void testIgmpUnknownMulticastIpAddress() throws InterruptedException {
+ SingleStateMachine.sendQuery = false;
+
+ igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
+ igmpManager.activate();
+
+ Ethernet firstPacket =
+ IgmpSender.getInstance().buildIgmpV3Join(UNKNOWN_GRP_IP, SOURCE_IP_OF_A);
+ // Sending first packet
+ sendPacket(firstPacket);
+ assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
+ assertEquals((long) 1,
+ igmpStatisticsManager.getIgmpStats().getFailJoinReqUnknownMulticastIpCounter().longValue()));
+ }
+
+ //Test Igmp Query Statistics.
+ @Test
+ public void testIgmpQueryStatistics() throws InterruptedException {
+ igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
+ igmpManager.activate();
+
+ flagForQueryPacket = true;
+ //IGMPV3 Group Specific Membership Query packet
+ Ethernet igmpv3MembershipQueryPkt = IgmpSender.getInstance().buildIgmpV3Query(GROUP_IP, SOURCE_IP_OF_A);
+ sendPacket(igmpv3MembershipQueryPkt);
+
+ //IGMPV3 General Membership Query packet
+ Ethernet igmpv3MembershipQueryPkt1 =
+ IgmpSender.getInstance().buildIgmpV3Query(Ip4Address.valueOf(0), SOURCE_IP_OF_A);
+ sendPacket(igmpv3MembershipQueryPkt1);
+ assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
+ assertEquals(igmpStatisticsManager.getIgmpStats()
+ .getIgmpGrpAndSrcSpecificMembershipQuery().longValue(), 1));
+ assertEquals(igmpStatisticsManager.getIgmpStats()
+ .getIgmpGeneralMembershipQuery().longValue(), 1);
+ assertEquals(igmpStatisticsManager.getIgmpStats()
+ .getCurrentGrpNumCounter().longValue(), 1);
+ }
+
//Test Events
@Test
public void testIgmpStatisticsEvent() {
@@ -121,6 +170,55 @@
}
}
+ //Test packet with Unknown Wrong Membership mode
+ @Test
+ public void testWrongIgmpPacket() throws InterruptedException {
+ SingleStateMachine.sendQuery = false;
+
+ igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
+ igmpManager.activate();
+
+ Ethernet firstPacket = buildWrongIgmpPacket(GROUP_IP, SOURCE_IP_OF_A);
+ // Sending first packet
+ sendPacket(firstPacket);
+ assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
+ assertEquals((long) 1,
+ igmpStatisticsManager.getIgmpStats().getReportsRxWithWrongModeCounter().longValue()));
+ }
+
+ //Test packet with Unknown IGMP type.
+ @Test
+ public void testUnknownIgmpPacket() throws InterruptedException {
+ SingleStateMachine.sendQuery = false;
+
+ igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
+ igmpManager.activate();
+
+ Ethernet firstPacket = buildUnknownIgmpPacket(GROUP_IP, SOURCE_IP_OF_A);
+ // Sending first packet
+ sendPacket(firstPacket);
+ assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
+ assertEquals((long) 1,
+ igmpStatisticsManager.getIgmpStats().getUnknownIgmpTypePacketsRxCounter().longValue()));
+ }
+
+ //Test packet with Insufficient Permission.
+ @Test
+ public void testSufficientPermission() throws InterruptedException {
+ SingleStateMachine.sendQuery = false;
+
+ flagForPermission = true;
+ igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
+ igmpManager.activate();
+
+ Ethernet firstPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_A);
+ // Sending first packet
+ sendPacket(firstPacket);
+ assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
+ assertEquals((long) 1,
+ igmpStatisticsManager.getIgmpStats().getFailJoinReqInsuffPermissionAccessCounter().longValue()));
+ }
+
public class MockIgmpStatisticsEventListener implements IgmpStatisticsEventListener {
protected List<IgmpStatisticsEvent> events = Lists.newArrayList();