From fb4c34b64b6b5737d187e5296da9f83fdbca13e2 Mon Sep 17 00:00:00 2001 From: Ning Zhang Date: Fri, 10 Jan 2020 10:00:46 +0800 Subject: [PATCH] Optimize Elan flow table process Optimize Elan Dmac flow sends process. Change-Id: I23741a3bce83b647ed24d91e3d727a5a9aece51a Signed-off-by: Ning Zhang --- .../elan/internal/ElanInterfaceManager.java | 31 +++++++++++-------- .../netvirt/elan/utils/ElanUtils.java | 3 +- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java index 80c981833d..5a2d6fdcf6 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java @@ -674,31 +674,36 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase(); + if (dpnInterfaceLists != null && !dpnInterfaceLists.isEmpty()) { + Uint64 dstDpId = interfaceInfo.getDpId(); + processRemoteDmacFlowForInterface(dstDpId, elanInstance, dpnInterfaceLists, writeFlowGroupTx); } + } + + private void processRemoteDmacFlowForInterface(Uint64 dstDpId, ElanInstance elanInstance, + List dpnInterfaceLists, TypedWriteTransaction writeFlowGroupTx) { for (DpnInterfaces dpnInterfaces : dpnInterfaceLists) { - Uint64 dstDpId = interfaceInfo.getDpId(); if (Objects.equals(dpnInterfaces.getDpId(), dstDpId)) { continue; } List remoteElanInterfaces = dpnInterfaces.getInterfaces(); + if (remoteElanInterfaces == null || remoteElanInterfaces.isEmpty()) { + continue; + } for (String remoteIf : remoteElanInterfaces) { ElanInterfaceMac elanIfMac = elanUtils.getElanInterfaceMacByInterfaceName(remoteIf); InterfaceInfo remoteInterface = interfaceManager.getInterfaceInfo(remoteIf); if (elanIfMac == null || remoteInterface == null) { continue; } - List remoteMacEntries = elanIfMac.getMacEntry(); - if (remoteMacEntries != null) { - for (MacEntry macEntry : remoteMacEntries) { - String macAddress = macEntry.getMacAddress().getValue(); - LOG.info("Programming remote dmac {} on the newly added DPN {} for elan {}", macAddress, - dstDpId, elanInstance.getElanInstanceName()); - elanUtils.setupRemoteDmacFlow(dstDpId, remoteInterface.getDpId(), - remoteInterface.getInterfaceTag(), elanInstance.getElanTag(), macAddress, - elanInstance.getElanInstanceName(), writeFlowGroupTx, remoteIf, elanInstance); - } + List remoteMacEntries = elanIfMac.nonnullMacEntry(); + for (MacEntry macEntry : remoteMacEntries) { + String macAddress = macEntry.getMacAddress().getValue(); + LOG.info("Programming remote dmac {} on the newly added DPN {} for elan {}", macAddress, + dstDpId, elanInstance.getElanInstanceName()); + elanUtils.setupRemoteDmacFlow(dstDpId, remoteInterface.getDpId(), + remoteInterface.getInterfaceTag(), elanInstance.getElanTag(), macAddress, + elanInstance.getElanInstanceName(), writeFlowGroupTx, remoteIf, elanInstance); } } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java index 850a2e08c5..f518d7ff36 100755 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java @@ -952,12 +952,11 @@ public class ElanUtils { macAddress, interfaceName, elanInstance.getElanInstanceName()); return; } - Flow flowEntity; // if openstack-vni-semantics are enforced, segmentation ID is passed as network VNI for VxLAN based provider // networks, 0 otherwise long lportTagOrVni = !isOpenstackVniSemanticsEnforced() ? lportTag : isVxlanNetworkOrVxlanSegment(elanInstance) ? getVxlanSegmentationId(elanInstance).longValue() : 0; - flowEntity = buildRemoteDmacFlowEntry(srcDpId, destDpId, lportTagOrVni, elanTag, macAddress, displayName, + Flow flowEntity = buildRemoteDmacFlowEntry(srcDpId, destDpId, lportTagOrVni, elanTag, macAddress, displayName, elanInstance); mdsalManager.addFlow(writeFlowGroupTx, srcDpId, flowEntity); setupEtreeRemoteDmacFlow(srcDpId, destDpId, lportTagOrVni, elanTag, macAddress, displayName, interfaceName, -- 2.36.6