From 8c8eebd30c994845d70b7d13436a77e9ed8809ef Mon Sep 17 00:00:00 2001 From: Lorand Jakab Date: Tue, 7 Jul 2015 15:16:25 +0300 Subject: [PATCH] Bug 3950: SMR parent subscribers on Src/Dst mapping change Change-Id: Iaf0dc0a62c04e4c67913d67d7b9bb18bba343ce6 Signed-off-by: Lorand Jakab (cherry picked from commit f4246f57e06d62b2617a405d8351da5a53207fa8) --- .../lisp/AbstractLispComponent.java | 55 ++++++++++++++----- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/AbstractLispComponent.java b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/AbstractLispComponent.java index c91ebe9ad..4ec0dbae5 100644 --- a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/AbstractLispComponent.java +++ b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/AbstractLispComponent.java @@ -96,17 +96,12 @@ public abstract class AbstractLispComponent { } @SuppressWarnings("unchecked") - protected HashSet getSubscribers(LispAddressContainer prefix, int maskLength) { + private HashSet getSubscribers(LispAddressContainer prefix, int maskLength, + ILispDAO dao) { Object subscribers; - if (prefix.getAddress() instanceof LcafSourceDest) { - IMappingServiceKey srcKey = MappingServiceKeyUtil.generateMappingServiceKey(getSrcForLcafSrcDst(prefix), - getSrcMaskForLcafSrcDst(prefix)); - ILispDAO srcDstDao = getSrcDstInnerDao(prefix, maskLength); - subscribers = srcDstDao.getSpecific(srcKey, SUBSCRIBERS_SUBKEY); - } else { - IMappingServiceKey key = MappingServiceKeyUtil.generateMappingServiceKey(prefix, maskLength); - subscribers = dao.getSpecific(key, SUBSCRIBERS_SUBKEY); - } + + IMappingServiceKey key = MappingServiceKeyUtil.generateMappingServiceKey(prefix, maskLength); + subscribers = dao.getSpecific(key, SUBSCRIBERS_SUBKEY); if (subscribers != null && subscribers instanceof HashSet) { return (HashSet) subscribers; @@ -114,21 +109,53 @@ public abstract class AbstractLispComponent { return null; } - protected LispAFIAddress getSrcForLcafSrcDst(LispAddressContainer container) { + protected HashSet getSubscribers(LispAddressContainer prefix, int maskLength) { + // For SrcDst we merge the subscriber set from the parent DAO with the source specific DAO + if (prefix.getAddress() instanceof LcafSourceDest) { + HashSet resultSet = new HashSet(); + boolean haveResult = false; + + LispAddressContainer srcAddr = LispAFIConvertor.toContainer(getSrcForLcafSrcDst(prefix)); + short srcMask = getSrcMaskForLcafSrcDst(prefix); + ILispDAO srcDstDao = getSrcDstInnerDao(prefix, maskLength); + HashSet srcDstSubscribers = getSubscribers(srcAddr, srcMask, srcDstDao); + if (srcDstSubscribers != null) { + resultSet.addAll(srcDstSubscribers); + haveResult = true; + } + + LispAddressContainer dstAddr = LispAFIConvertor.toContainer(getDstForLcafSrcDst(prefix)); + short dstMask = getDstMaskForLcafSrcDst(prefix); + HashSet subscribers = getSubscribers(dstAddr, dstMask, dao); + if (subscribers != null) { + resultSet.addAll(subscribers); + haveResult = true; + } + + if (haveResult) { + return resultSet; + } + } else { + return getSubscribers(prefix, maskLength, dao); + } + return null; + } + + protected static LispAFIAddress getSrcForLcafSrcDst(LispAddressContainer container) { return LispAFIConvertor.toAFIfromPrimitive(((LcafSourceDest) container.getAddress()).getLcafSourceDestAddr(). getSrcAddress().getPrimitiveAddress()); } - protected LispAFIAddress getDstForLcafSrcDst(LispAddressContainer container) { + protected static LispAFIAddress getDstForLcafSrcDst(LispAddressContainer container) { return LispAFIConvertor.toAFIfromPrimitive(((LcafSourceDest) container.getAddress()).getLcafSourceDestAddr(). getDstAddress().getPrimitiveAddress()); } - protected short getSrcMaskForLcafSrcDst(LispAddressContainer container) { + protected static short getSrcMaskForLcafSrcDst(LispAddressContainer container) { return ((LcafSourceDest) container.getAddress()).getLcafSourceDestAddr().getSrcMaskLength(); } - protected short getDstMaskForLcafSrcDst(LispAddressContainer container) { + protected static short getDstMaskForLcafSrcDst(LispAddressContainer container) { return ((LcafSourceDest) container.getAddress()).getLcafSourceDestAddr().getDstMaskLength(); } -- 2.36.6