Bug 3950: SMR parent subscribers on Src/Dst mapping change
[lispflowmapping.git] / mappingservice / implementation / src / main / java / org / opendaylight / lispflowmapping / implementation / lisp / AbstractLispComponent.java
index c91ebe9ad418d7fb142714502102ced836ff4b88..4ec0dbae529e15a3ec6f3b293fc88606e6f2e2b0 100644 (file)
@@ -96,17 +96,12 @@ public abstract class AbstractLispComponent {
     }
 
     @SuppressWarnings("unchecked")
-    protected HashSet<MappingServiceSubscriberRLOC> getSubscribers(LispAddressContainer prefix, int maskLength) {
+    private HashSet<MappingServiceSubscriberRLOC> 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<MappingServiceSubscriberRLOC>) subscribers;
@@ -114,21 +109,53 @@ public abstract class AbstractLispComponent {
         return null;
     }
 
-    protected LispAFIAddress getSrcForLcafSrcDst(LispAddressContainer container) {
+    protected HashSet<MappingServiceSubscriberRLOC> 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<MappingServiceSubscriberRLOC> resultSet = new HashSet<MappingServiceSubscriberRLOC>();
+            boolean haveResult = false;
+
+            LispAddressContainer srcAddr = LispAFIConvertor.toContainer(getSrcForLcafSrcDst(prefix));
+            short srcMask = getSrcMaskForLcafSrcDst(prefix);
+            ILispDAO srcDstDao = getSrcDstInnerDao(prefix, maskLength);
+            HashSet<MappingServiceSubscriberRLOC> srcDstSubscribers = getSubscribers(srcAddr, srcMask, srcDstDao);
+            if (srcDstSubscribers != null) {
+                resultSet.addAll(srcDstSubscribers);
+                haveResult = true;
+            }
+
+            LispAddressContainer dstAddr = LispAFIConvertor.toContainer(getDstForLcafSrcDst(prefix));
+            short dstMask = getDstMaskForLcafSrcDst(prefix);
+            HashSet<MappingServiceSubscriberRLOC> 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();
     }