From b015936b52c8b913352f745afadd0e56e0e20790 Mon Sep 17 00:00:00 2001 From: epgoraj Date: Fri, 15 Apr 2016 12:52:47 +0530 Subject: [PATCH] Fix contains deleting the last Elan-Interface present in CSS 1) Updating the Remote broadcast group when new VM is added to the Host CSS 2) NFix for NPE in ELANPacketInHandler Change-Id: I82d33cbfc8147aec380e7e0f4be087d4efa232ba Signed-off-by: epgoraj --- .../elan/internal/ElanInstanceManager.java | 4 -- .../elan/internal/ElanInterfaceManager.java | 54 +++++++++++++++---- .../elan/internal/ElanPacketInHandler.java | 5 +- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInstanceManager.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInstanceManager.java index 6eed6843..4634f522 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInstanceManager.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInstanceManager.java @@ -117,10 +117,6 @@ public class ElanInstanceManager extends AbstractDataChangeListener interfaceLists = dpnInterfaces.getInterfaces(); interfaceLists.remove(interfaceName); - updateElanDpnInterfacesList(elanName, dpId, interfaceLists); + if (interfaceLists == null || interfaceLists.isEmpty()) { + deleteAllRemoteMacsInADpn(elanName, dpId, elanTag); + deleteElanDpnInterface(elanName, dpId); + } else { + updateElanDpnInterfacesList(elanName, dpId, interfaceLists); + } + } + } + + private void deleteAllRemoteMacsInADpn(String elanName, BigInteger dpId, long elanTag) { + List dpnInterfaces = ElanUtils.getInvolvedDpnsInElan(elanName); + for (DpnInterfaces dpnInterface : dpnInterfaces) { + BigInteger currentDpId = dpnInterface.getDpId(); + if (!currentDpId.equals(dpId)) { + for (String elanInterface : dpnInterface.getInterfaces()) { + ElanInterfaceMac macs = ElanUtils.getElanInterfaceMacByInterfaceName(elanInterface); + if (macs == null) { + continue; + } + for (MacEntry mac : macs.getMacEntry()) + mdsalManager.removeFlow(dpId, MDSALUtil.buildFlow(ElanConstants.ELAN_DMAC_TABLE, + ElanUtils.getKnownDynamicmacFlowRef(ElanConstants.ELAN_DMAC_TABLE, dpId, currentDpId, mac.getMacAddress().getValue(), elanTag))); + } + } } } @@ -835,18 +859,13 @@ public class ElanInterfaceManager extends AbstractDataChangeListener elanInterfaces = dpnInterfaces.getInterfaces(); - if (elanInterfaces == null || elanInterfaces.isEmpty()) { - + if (dpnInterfaces == null || dpnInterfaces.getInterfaces() == null || dpnInterfaces.getInterfaces().isEmpty()) { + // No more Elan Interfaces in this DPN logger.debug("deleting the elan: {} present on dpId: {}", elanInfo.getElanInstanceName(), dpId); removeDefaultTermFlow(dpId, elanInfo.getElanTag()); removeUnknownDmacFlow(dpId, elanInfo); @@ -937,6 +956,19 @@ public class ElanInterfaceManager extends AbstractDataChangeListener createElanInterfacesList(String elanInstanceName, String interfaceName, BigInteger dpId) { List interfaceNames = new ArrayList(); interfaceNames.add(interfaceName); diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanPacketInHandler.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanPacketInHandler.java index 314275c9..055698ba 100755 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanPacketInHandler.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanPacketInHandler.java @@ -80,8 +80,11 @@ public class ElanPacketInHandler implements PacketProcessingListener { } String interfaceName = interfaceInfoOp.get().getInterfaceName(); ElanTagName elanTagName = ElanUtils.getElanInfoByElanTag(elanTag); + if (elanTagName == null) { + logger.warn("not able to find elanTagName in elan-tag-name-map for elan tag {}", elanTag); + return; + } String elanName = elanTagName.getName(); - Elan elanInfo = ElanUtils.getElanByName(elanName); MacEntry macEntry = ElanUtils.getInterfaceMacEntriesOperationalDataPath(interfaceName, physAddress); if(macEntry != null && macEntry.getInterface() == interfaceName) { BigInteger macTimeStamp = macEntry.getControllerLearnedForwardingEntryTimestamp(); -- 2.36.6