From f2f1be791bbba35c1e50d93b3ee793573f07705f Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Tue, 7 Jul 2015 17:20:01 +0200 Subject: [PATCH] Bug 3951: Send SMRs to both SrcDst and Dst subscribers Change-Id: I6754d02e67005b74be033dbbea2395910b8c479c Signed-off-by: Florin Coras (cherry picked from commit 5d2c9ca667c38dd83d072d8487e7e6c477694991) --- .../lisp/AbstractLispComponent.java | 47 ++++--------------- .../implementation/lisp/MapServer.java | 31 ++++++++---- 2 files changed, 31 insertions(+), 47 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 4ec0dbae5..ef4175d07 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,47 +96,20 @@ public abstract class AbstractLispComponent { } @SuppressWarnings("unchecked") - private HashSet getSubscribers(LispAddressContainer prefix, int maskLength, - ILispDAO dao) { - Object subscribers; - - IMappingServiceKey key = MappingServiceKeyUtil.generateMappingServiceKey(prefix, maskLength); - subscribers = dao.getSpecific(key, SUBSCRIBERS_SUBKEY); - - if (subscribers != null && subscribers instanceof HashSet) { - return (HashSet) subscribers; - } - return null; - } - protected HashSet getSubscribers(LispAddressContainer prefix, int maskLength) { - // For SrcDst we merge the subscriber set from the parent DAO with the source specific DAO + Object subscribers; if (prefix.getAddress() instanceof LcafSourceDest) { - HashSet resultSet = new HashSet(); - boolean haveResult = false; - - LispAddressContainer srcAddr = LispAFIConvertor.toContainer(getSrcForLcafSrcDst(prefix)); - short srcMask = getSrcMaskForLcafSrcDst(prefix); + IMappingServiceKey srcKey = MappingServiceKeyUtil.generateMappingServiceKey(getSrcForLcafSrcDst(prefix), + 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; - } + subscribers = srcDstDao.getSpecific(srcKey, SUBSCRIBERS_SUBKEY); } else { - return getSubscribers(prefix, maskLength, dao); + IMappingServiceKey key = MappingServiceKeyUtil.generateMappingServiceKey(prefix, maskLength); + subscribers = dao.getSpecific(key, SUBSCRIBERS_SUBKEY); + } + + if (subscribers != null && subscribers instanceof HashSet) { + return (HashSet) subscribers; } return null; } diff --git a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/MapServer.java b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/MapServer.java index b32a4a62a..b03d13f7d 100644 --- a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/MapServer.java +++ b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/MapServer.java @@ -115,13 +115,6 @@ public class MapServer extends AbstractLispComponent implements IMapServerAsync builder.setEidRecord(new ArrayList()); LispAddressContainer container = eidRecord.getLispAddressContainer(); short mask = (short) eidRecord.getMaskLength(); - - // For Src/Dst don't use an LCAF EID, just use the destination prefix - if (container.getAddress() instanceof LcafSourceDest) { - mask = getDstMaskForLcafSrcDst(container); - container = LispAFIConvertor.toContainer(getDstForLcafSrcDst(container)); - } - builder.getEidRecord().add(new EidRecordBuilder().setMask(mask).setLispAddressContainer(container).build()); builder.setItrRloc(new ArrayList()); @@ -152,9 +145,7 @@ public class MapServer extends AbstractLispComponent implements IMapServerAsync } boolean mappingChanged = saveRlocs(eidRecord, smr); if (smr && mappingChanged) { - HashSet subscribers = getSubscribers(eidRecord.getLispAddressContainer(), - eidRecord.getMaskLength()); - handleSmr(eidRecord, subscribers, callback); + sendSmrs(eidRecord, callback); } } if (!failed) { @@ -306,6 +297,26 @@ public class MapServer extends AbstractLispComponent implements IMapServerAsync } } + private void sendSmrs(EidToLocatorRecord record, IMapNotifyHandler callback) { + LispAddressContainer eid = record.getLispAddressContainer(); + HashSet subscribers; + + subscribers = getSubscribers(eid, record.getMaskLength()); + handleSmr(record, subscribers, callback); + + // For SrcDst LCAF also send SMRs to Dst prefix + if (eid.getAddress() instanceof LcafSourceDest) { + LispAddressContainer dstAddr = LispAFIConvertor.toContainer(getDstForLcafSrcDst(eid)); + short dstMask = getDstMaskForLcafSrcDst(eid); + subscribers = getSubscribers(dstAddr, dstMask); + EidToLocatorRecord newRecord = new EidToLocatorRecordBuilder().setAction(record.getAction()). + setAuthoritative(record.isAuthoritative()).setLocatorRecord(record.getLocatorRecord()). + setMapVersion(record.getMapVersion()).setRecordTtl(record.getRecordTtl()). + setLispAddressContainer(dstAddr).setMaskLength(dstMask).build(); + handleSmr(newRecord, subscribers, callback); + } + } + private void handleSmr(EidToLocatorRecord record, HashSet subscribers, IMapNotifyHandler callback) { if (subscribers == null) { -- 2.36.6