diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java index b1cb6d4575b57237b8b54b8039c19c3ee0ffa0b7..7606532bad1b7484f4a70172ce6be6ed5946bc81 100755 --- a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java +++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java @@ -901,6 +901,9 @@ IFlowReconcileListener, IInfoProvider, IHAListener { // entity. Look up the entity in the returned class' // class entity index. entityClass = entityClassifier.classifyEntity(entity); + if (entityClass == null) { + return null; + } ClassState classState = getClassState(entityClass); if (classState.classIndex != null) { @@ -993,6 +996,10 @@ IFlowReconcileListener, IInfoProvider, IHAListener { // entity. Look up the entity in the returned class' // class entity index. entityClass = entityClassifier.classifyEntity(entity); + if (entityClass == null) { + // could not classify entity. No device + return null; + } ClassState classState = getClassState(entityClass); if (classState.classIndex != null) { diff --git a/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java b/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java index 2bafa6d32a5551aa35d9ac4163d13d5d422fe3a4..f0bc0cdbde2db152c04be08504a4019ebeea6001 100644 --- a/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java +++ b/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java @@ -193,7 +193,7 @@ public class DeviceManagerImplTest extends FloodlightTestCase { .setTargetHardwareAddress(Ethernet.toMACAddress("00:11:22:33:44:55")) .setTargetProtocolAddress(IPv4.toIPv4AddressBytes("192.168.1.2"))); this.testARPReplyPacket_3_Serialized = testARPReplyPacket_3.serialize(); - + // Build the PacketIn this.packetIn_1 = ((OFPacketIn) mockFloodlightProvider. getOFMessageFactory().getMessage(OFType.PACKET_IN)) @@ -391,7 +391,19 @@ public class DeviceManagerImplTest extends FloodlightTestCase { assertEquals(4, deviceManager.getAllDevices().size()); verify(mockListener); + + + reset(mockListener); + replay(mockListener); + + deviceManager.entityClassifier = new MockEntityClassifierMac(); + deviceManager.startUp(null); + Entity entityNoClass = new Entity(5L, (short)1, 5, -1L, 1, new Date()); + assertEquals(null, deviceManager.learnDeviceByEntity(entityNoClass)); + + verify(mockListener); } + @Test public void testAttachmentPointLearning() throws Exception { @@ -1177,6 +1189,7 @@ public class DeviceManagerImplTest extends FloodlightTestCase { Entity entity4 = new Entity(4L, (short)2, 4, 2L, 2, new Date()); Entity entity5 = new Entity(5L, (short)1, 5, 3L, 1, new Date()); + IDevice d1 = deviceManager.learnDeviceByEntity(entity1); IDevice d2 = deviceManager.learnDeviceByEntity(entity2); @@ -1259,6 +1272,11 @@ public class DeviceManagerImplTest extends FloodlightTestCase { if (!exceptionCaught) fail("findDevice() did not throw IllegalArgumentException"); + + Entity entityNoClass = new Entity(5L, (short)1, 5, -1L, 1, new Date()); + assertEquals(null, deviceManager.findDeviceByEntity(entityNoClass)); + + // Now look up destination devices assertEquals(d1, deviceManager.findDestDevice(d2, entity1.getMacAddress(), diff --git a/src/test/java/net/floodlightcontroller/devicemanager/test/MockEntityClassifierMac.java b/src/test/java/net/floodlightcontroller/devicemanager/test/MockEntityClassifierMac.java index 768cc503e6795095df69923d95b995c2b49fdfd0..398b6c0e74c7403e71f0d523d1b9fb670b5f836e 100644 --- a/src/test/java/net/floodlightcontroller/devicemanager/test/MockEntityClassifierMac.java +++ b/src/test/java/net/floodlightcontroller/devicemanager/test/MockEntityClassifierMac.java @@ -44,6 +44,8 @@ public class MockEntityClassifierMac extends DefaultEntityClassifier { return testECMac1; } else if (entity.getSwitchDPID() == 2L) { return testECMac2; + } else if (entity.getSwitchDPID() == -1L) { + return null; } return DefaultEntityClassifier.entityClass; }