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