Improve ExpireMap lookup performance with code refactoring

Change-Id: I304456a5e5b648ca9c02cc4924a86f50ccc61ab2
diff --git a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispExpireMapDatabase.java b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispExpireMapDatabase.java
index e3649b9..308ae3a 100644
--- a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispExpireMapDatabase.java
+++ b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispExpireMapDatabase.java
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import org.onlab.packet.IpPrefix;
 import org.onosproject.lisp.ctl.impl.map.ExpireMap;
 import org.onosproject.lisp.ctl.impl.map.ExpireHashMap;
 import org.onosproject.lisp.msg.protocols.DefaultLispProxyMapRecord.DefaultMapWithProxyBuilder;
@@ -29,8 +30,8 @@
 import java.util.List;
 import java.util.Optional;
 
+import static org.onosproject.lisp.ctl.impl.util.LispMapUtil.*;
 import static org.slf4j.LoggerFactory.getLogger;
-import static org.onosproject.lisp.ctl.impl.util.LispMapUtil.isInRange;
 
 /**
  * An expire map based LISP mapping database.
@@ -106,13 +107,10 @@
     @Override
     public LispMapRecord getMapRecordByEidRecord(LispEidRecord eid,
                                                  boolean proxyMapReply) {
-        Optional<LispEidRecord> filteredEidRecord = map.keySet().parallelStream()
-                .filter(k -> isInRange(k, eid)).findAny();
-        if (filteredEidRecord.isPresent()) {
-            LispProxyMapRecord record = map.get(filteredEidRecord.get());
-            if (record != null && record.isProxyMapReply() == proxyMapReply) {
-                return record.getMapRecord();
-            }
+
+        LispProxyMapRecord record = getMapRecordForClosestParentAddress(getIpPrefixFromEidRecord(eid));
+        if (record != null && record.isProxyMapReply() == proxyMapReply) {
+            return record.getMapRecord();
         }
 
         return null;
@@ -147,6 +145,27 @@
     }
 
     /**
+     * Returns the map record associated with the closest parent address from a
+     * given expire map, or returns null if no such map record is associated
+     * with the address.
+     *
+     * @param prefix IP prefix
+     * @return a map record with the closest parent address, or null if no value
+     * was associated with the address
+     */
+    private LispProxyMapRecord getMapRecordForClosestParentAddress(IpPrefix prefix) {
+        while (prefix != null && prefix.prefixLength() > 0) {
+            LispProxyMapRecord record = map.get(getEidRecordFromIpPrefix(prefix));
+            if (record != null) {
+                return record;
+            }
+            prefix = getParentPrefix(prefix);
+        }
+
+        return null;
+    }
+
+    /**
      * Prevents object instantiation from external.
      */
     private static final class SingletonHelper {
diff --git a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/tree/IpConcurrentRadixTree.java b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/tree/IpConcurrentRadixTree.java
index 306f278..a66a08e 100644
--- a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/tree/IpConcurrentRadixTree.java
+++ b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/tree/IpConcurrentRadixTree.java
@@ -19,27 +19,20 @@
 import com.googlecode.concurrenttrees.radix.ConcurrentRadixTree;
 import com.googlecode.concurrenttrees.radix.RadixTree;
 import com.googlecode.concurrenttrees.radix.node.concrete.DefaultCharArrayNodeFactory;
-import org.apache.commons.lang3.StringUtils;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpAddress.Version;
 import org.onlab.packet.IpPrefix;
 
 import java.util.List;
 
+import static org.onosproject.lisp.ctl.impl.util.LispMapUtil.getParentPrefix;
+import static org.onosproject.lisp.ctl.impl.util.LispMapUtil.getPrefixString;
+
 /**
  * Implements current radix tree that stores IP address as a key.
  */
 public class IpConcurrentRadixTree<V> implements IpRadixTree<V> {
 
-    private static final int IPV4_BLOCK_LENGTH = 8;
-    private static final int IPV6_BLOCK_LENGTH = 16;
-
-    private static final String IPV4_DELIMITER = ".";
-    private static final String IPV6_DELIMITER = ":";
-
-    private static final String IPV4_ZERO = "0";
-    private static final String IPV6_SUFFIX = "::";
-
     private RadixTree<V> ipv4Tree =
             new ConcurrentRadixTree<>(new DefaultCharArrayNodeFactory());
     private RadixTree<V> ipv6Tree =
@@ -167,99 +160,6 @@
     }
 
     /**
-     * Obtains the string formatted IP prefix.
-     * For example, if the IP address is 10.1.1.1 and has 16 prefix length,
-     * the resulting string is 10.1
-     *
-     * @param prefix IP prefix
-     * @return string formatted IP prefix
-     */
-    private String getPrefixString(IpPrefix prefix) {
-        String addressString = prefix.address().toString();
-        StringBuilder sb = new StringBuilder();
-        String delimiter = "";
-        int numOfBlock = 0;
-
-        if (prefix.isIp4()) {
-            delimiter = IPV4_DELIMITER;
-            numOfBlock = prefix.prefixLength() / IPV4_BLOCK_LENGTH;
-        }
-
-        if (prefix.isIp6()) {
-            delimiter = IPV6_DELIMITER;
-            numOfBlock = prefix.prefixLength() / IPV6_BLOCK_LENGTH;
-        }
-
-        String[] octets = StringUtils.split(addressString, delimiter);
-
-        for (int i = 0; i < numOfBlock; i++) {
-            sb.append(octets[i]);
-
-            if (i < numOfBlock - 1) {
-                sb.append(delimiter);
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Obtains the parent IP prefix of the given IP prefix.
-     * For example, if the given IP prefix is 10.1.1.1, the parent IP prefix
-     * will be 10.1.1
-     *
-     * @param prefix IP prefix
-     * @return parent IP prefix
-     */
-    private IpPrefix getParentPrefix(IpPrefix prefix) {
-        String addressString = prefix.address().toString();
-        int prefixLength = prefix.prefixLength();
-        StringBuilder sb = new StringBuilder();
-        String delimiter = "";
-        String zero = "";
-        int blockLength = 0;
-
-        if (prefix.isIp4()) {
-            delimiter = IPV4_DELIMITER;
-            blockLength = IPV4_BLOCK_LENGTH;
-            zero = IPV4_ZERO;
-        }
-
-        if (prefix.isIp6()) {
-            delimiter = IPV6_DELIMITER;
-            blockLength = IPV6_BLOCK_LENGTH;
-        }
-
-        String[] octets = StringUtils.split(addressString, delimiter);
-        String parentAddressString;
-        if (octets.length == 1) {
-            return prefix;
-        } else {
-            prefixLength = prefixLength - blockLength;
-            int blockIdx = prefixLength / blockLength;
-            for (int i = 0; i < octets.length; i++) {
-                if (i < blockIdx) {
-                    sb.append(octets[i]);
-                    sb.append(delimiter);
-                } else {
-                    sb.append(zero);
-                    if (prefix.isIp4()) {
-                        sb.append(delimiter);
-                    }
-                }
-            }
-
-            // ipv6 address prefix typically ends with ::
-            if (prefix.isIp6()) {
-                sb.append(IPV6_SUFFIX);
-            }
-            parentAddressString = StringUtils.substring(sb.toString(),
-                    0, sb.toString().length() - 1);
-            return IpPrefix.valueOf(parentAddressString + "/" + prefixLength);
-        }
-    }
-
-    /**
      * Returns the value associated with the closest parent address from a
      * given radix tree, or returns null if no such value is associated
      * with the address.
@@ -271,7 +171,7 @@
      */
     private V getValueForClosestParentAddress(IpPrefix prefix, RadixTree<V> tree) {
 
-        while (prefix != null) {
+        while (prefix != null && prefix.prefixLength() > 0) {
             V value = tree.getValueForExactKey(getPrefixString(prefix));
             if (value != null) {
                 return value;
diff --git a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/util/LispMapUtil.java b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/util/LispMapUtil.java
index 34b6ff9..a91bede 100644
--- a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/util/LispMapUtil.java
+++ b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/util/LispMapUtil.java
@@ -16,14 +16,25 @@
 
 package org.onosproject.lisp.ctl.impl.util;
 
+import org.apache.commons.lang3.StringUtils;
+import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.lisp.msg.protocols.LispEidRecord;
+import org.onosproject.lisp.msg.types.LispIpAddress;
+import org.onosproject.lisp.msg.types.LispIpv4Address;
+import org.onosproject.lisp.msg.types.LispIpv6Address;
 
 /**
  * A LISP map utility class includes various useful methods.
  */
 public final class LispMapUtil {
 
+    private static final int IPV4_BLOCK_LENGTH = 8;
+    private static final int IPV6_BLOCK_LENGTH = 16;
+
+    private static final String IPV4_DELIMITER = ".";
+    private static final String IPV6_DELIMITER = ":";
+
     /**
      * Prevents object instantiation from external.
      */
@@ -58,4 +69,86 @@
 
         return originIpPrefix.contains(compareIpPrefix);
     }
+
+    /**
+     * Obtains the EID record from an IP prefix.
+     *
+     * @param prefix IP prefix
+     * @return EID record
+     */
+    public static LispEidRecord getEidRecordFromIpPrefix(IpPrefix prefix) {
+
+        LispIpAddress eid = null;
+
+        if (prefix.isIp4()) {
+            eid = new LispIpv4Address(prefix.address());
+        }
+
+        if (prefix.isIp6()) {
+            eid = new LispIpv6Address(prefix.address());
+        }
+
+        return new LispEidRecord((byte) prefix.prefixLength(), eid);
+    }
+
+    /**
+     * Obtains the IP prefix from an EID record.
+     *
+     * @param eidRecord EID record
+     * @return IP prefix
+     */
+    public static IpPrefix getIpPrefixFromEidRecord(LispEidRecord eidRecord) {
+        return IpPrefix.valueOf(eidRecord.getPrefix().toString() +
+                "/" + eidRecord.getMaskLength());
+    }
+
+    /**
+     * Obtains the string formatted IP prefix.
+     * For example, if the IP address is 10.1.1.1 and has 16 prefix length,
+     * the resulting string is 10.1
+     *
+     * @param prefix IP prefix
+     * @return string formatted IP prefix
+     */
+    public static String getPrefixString(IpPrefix prefix) {
+        String addressString = prefix.address().toString();
+        StringBuilder sb = new StringBuilder();
+        String delimiter = "";
+        int numOfBlock = 0;
+
+        if (prefix.isIp4()) {
+            delimiter = IPV4_DELIMITER;
+            numOfBlock = prefix.prefixLength() / IPV4_BLOCK_LENGTH;
+        }
+
+        if (prefix.isIp6()) {
+            delimiter = IPV6_DELIMITER;
+            numOfBlock = prefix.prefixLength() / IPV6_BLOCK_LENGTH;
+        }
+
+        String[] octets = StringUtils.split(addressString, delimiter);
+
+        for (int i = 0; i < numOfBlock; i++) {
+            sb.append(octets[i]);
+
+            if (i < numOfBlock - 1) {
+                sb.append(delimiter);
+            }
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * Obtains the parent IP prefix of the given IP prefix.
+     * For example, if the given IP prefix is 10.1.1.1/32, the parent IP prefix
+     * will be 10.1.1.0/31.
+     *
+     * @param prefix IP prefix
+     * @return parent IP prefix
+     */
+    public static IpPrefix getParentPrefix(IpPrefix prefix) {
+        return IpPrefix.valueOf(IpAddress.makeMaskedAddress(prefix.address(),
+                prefix.prefixLength() - 1), prefix.prefixLength() - 1);
+    }
 }
\ No newline at end of file
diff --git a/protocols/lisp/ctl/src/test/java/org/onosproject/lisp/ctl/impl/LispMappingDatabaseTest.java b/protocols/lisp/ctl/src/test/java/org/onosproject/lisp/ctl/impl/LispMappingDatabaseTest.java
index 8eb888d..f765df1 100644
--- a/protocols/lisp/ctl/src/test/java/org/onosproject/lisp/ctl/impl/LispMappingDatabaseTest.java
+++ b/protocols/lisp/ctl/src/test/java/org/onosproject/lisp/ctl/impl/LispMappingDatabaseTest.java
@@ -31,6 +31,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertNull;
 
 /**
  * Tests for LISP EID RLOC Map class.
@@ -40,23 +41,34 @@
     private static final String LOCATOR_IP_1_1 = "123.1.1.1";
     private static final String LOCATOR_IP_1_2 = "123.1.1.2";
     private static final String LOCATOR_IP_1_3 = "123.1.1.3";
+    private static final String LOCATOR_IP_1_4 = "123.1.1.4";
 
     private static final String LOCATOR_IP_2_1 = "123.2.1.1";
     private static final String LOCATOR_IP_2_2 = "123.2.1.2";
+    private static final String LOCATOR_IP_2_3 = "123.2.1.3";
 
     private static final String LOCATOR_IP_3_1 = "123.3.1.1";
+    private static final String LOCATOR_IP_3_2 = "123.3.1.2";
+
+    private static final String LOCATOR_IP_4_1 = "123.4.1.1";
 
     private static final String EID_IP_1 = "10.1.1.1";
     private static final String EID_IP_2 = "10.1.2.0";
     private static final String EID_IP_3 = "10.2.0.0";
+    private static final String EID_IP_4 = "10.0.0.0";
 
     private static final String EID_IP_PREFIX_1_32 = "10.2.1.1";
     private static final String EID_IP_PREFIX_1_24 = "10.2.1.0";
     private static final String EID_IP_PREFIX_1_16 = "10.2.0.0";
+    private static final String EID_IP_PREFIX_1_12 = "10.0.0.0";
 
     private static final String EID_IP_PREFIX_2_32 = "10.1.2.1";
     private static final String EID_IP_PREFIX_2_24 = "10.1.2.0";
 
+    private static final String EID_IP_PREFIX_3_24 = "192.168.1.0";
+
+    private static final int RECORD_TTL = 60;
+
     private final LispMappingDatabase expireMapDb = LispExpireMapDatabase.getInstance();
     private final LispMappingDatabase radixTreeDb = LispRadixTreeDatabase.getInstance();
 
@@ -70,6 +82,7 @@
         LispIpv4Address locator11 = new LispIpv4Address(IpAddress.valueOf(LOCATOR_IP_1_1));
         LispIpv4Address locator12 = new LispIpv4Address(IpAddress.valueOf(LOCATOR_IP_1_2));
         LispIpv4Address locator13 = new LispIpv4Address(IpAddress.valueOf(LOCATOR_IP_1_3));
+        LispIpv4Address locator14 = new LispIpv4Address(IpAddress.valueOf(LOCATOR_IP_1_4));
 
         LispLocator locatorRecord11 = new DefaultLocatorBuilder()
                 .withLocatorAfi(locator11).build();
@@ -77,8 +90,10 @@
                 .withLocatorAfi(locator12).build();
         LispLocator locatorRecord13 = new DefaultLocatorBuilder()
                 .withLocatorAfi(locator13).build();
+        LispLocator locatorRecord14 = new DefaultLocatorBuilder()
+                .withLocatorAfi(locator14).build();
         List<LispLocator> locatorRecords1 =
-                ImmutableList.of(locatorRecord11, locatorRecord12, locatorRecord13);
+                ImmutableList.of(locatorRecord11, locatorRecord12, locatorRecord13, locatorRecord14);
 
         byte cidr2 = (byte) 24;
         LispIpv4Address eid2 = new LispIpv4Address(IpAddress.valueOf(EID_IP_2));
@@ -86,54 +101,80 @@
 
         LispIpv4Address locator21 = new LispIpv4Address(IpAddress.valueOf(LOCATOR_IP_2_1));
         LispIpv4Address locator22 = new LispIpv4Address(IpAddress.valueOf(LOCATOR_IP_2_2));
+        LispIpv4Address locator23 = new LispIpv4Address(IpAddress.valueOf(LOCATOR_IP_2_3));
 
         LispLocator locatorRecord21 = new DefaultLocatorBuilder()
                 .withLocatorAfi(locator21).build();
         LispLocator locatorRecord22 = new DefaultLocatorBuilder()
                 .withLocatorAfi(locator22).build();
+        LispLocator locatorRecord23 = new DefaultLocatorBuilder()
+                .withLocatorAfi(locator23).build();
 
         List<LispLocator> locatorRecords2 =
-                ImmutableList.of(locatorRecord21, locatorRecord22);
+                ImmutableList.of(locatorRecord21, locatorRecord22, locatorRecord23);
 
         byte cidr3 = (byte) 16;
         LispIpv4Address eid3 = new LispIpv4Address(IpAddress.valueOf(EID_IP_3));
         LispEidRecord eidRecord3 = new LispEidRecord(cidr3, eid3);
 
         LispIpv4Address locator31 = new LispIpv4Address(IpAddress.valueOf(LOCATOR_IP_3_1));
+        LispIpv4Address locator32 = new LispIpv4Address(IpAddress.valueOf(LOCATOR_IP_3_2));
 
         LispLocator locatorRecord31 = new DefaultLocatorBuilder()
                 .withLocatorAfi(locator31).build();
+        LispLocator locatorRecord32 = new DefaultLocatorBuilder()
+                .withLocatorAfi(locator32).build();
 
-        List<LispLocator> locatorRecords3 = ImmutableList.of(locatorRecord31);
+        List<LispLocator> locatorRecords3 = ImmutableList.of(locatorRecord31, locatorRecord32);
+
+        byte cidr4 = (byte) 12;
+        LispIpv4Address eid4 = new LispIpv4Address(IpAddress.valueOf(EID_IP_4));
+        LispEidRecord eidRecord4 = new LispEidRecord(cidr4, eid4);
+
+        LispIpv4Address locator41 = new LispIpv4Address(IpAddress.valueOf(LOCATOR_IP_4_1));
+
+        LispLocator locatorRecord41 = new DefaultLocatorBuilder()
+                .withLocatorAfi(locator41).build();
+
+        List<LispLocator> locatorRecords4 = ImmutableList.of(locatorRecord41);
 
         MapRecordBuilder builder1 = new DefaultMapRecordBuilder();
         builder1.withMaskLength(cidr1);
         builder1.withEidPrefixAfi(eid1);
         builder1.withLocators(locatorRecords1);
-        builder1.withRecordTtl(60);
+        builder1.withRecordTtl(RECORD_TTL);
         LispMapRecord mapRecord1 = builder1.build();
 
         MapRecordBuilder builder2 = new DefaultMapRecordBuilder();
         builder2.withMaskLength(cidr2);
         builder2.withEidPrefixAfi(eid2);
         builder2.withLocators(locatorRecords2);
-        builder2.withRecordTtl(60);
+        builder2.withRecordTtl(RECORD_TTL);
         LispMapRecord mapRecord2 = builder2.build();
 
         MapRecordBuilder builder3 = new DefaultMapRecordBuilder();
         builder3.withMaskLength(cidr3);
         builder3.withEidPrefixAfi(eid3);
         builder3.withLocators(locatorRecords3);
-        builder3.withRecordTtl(60);
+        builder3.withRecordTtl(RECORD_TTL);
         LispMapRecord mapRecord3 = builder3.build();
 
+        MapRecordBuilder builder4 = new DefaultMapRecordBuilder();
+        builder4.withMaskLength(cidr4);
+        builder4.withEidPrefixAfi(eid4);
+        builder4.withLocators(locatorRecords4);
+        builder4.withRecordTtl(RECORD_TTL);
+        LispMapRecord mapRecord4 = builder4.build();
+
         expireMapDb.putMapRecord(eidRecord1, mapRecord1, true);
         expireMapDb.putMapRecord(eidRecord2, mapRecord2, true);
         expireMapDb.putMapRecord(eidRecord3, mapRecord3, true);
+        expireMapDb.putMapRecord(eidRecord4, mapRecord4, true);
 
         radixTreeDb.putMapRecord(eidRecord1, mapRecord1, true);
         radixTreeDb.putMapRecord(eidRecord2, mapRecord2, true);
         radixTreeDb.putMapRecord(eidRecord3, mapRecord3, true);
+        radixTreeDb.putMapRecord(eidRecord4, mapRecord4, true);
     }
 
     @Test
@@ -145,10 +186,10 @@
         LispMapRecord mapRecord2 = radixTreeDb.getMapRecordByEidRecord(record, true);
 
         assertThat("Failed to fetch the RLOCs with /32 EID record",
-                mapRecord1.getLocatorCount(), is(3));
+                mapRecord1.getLocatorCount(), is(4));
 
         assertThat("Failed to fetch the RLOCs with /32 EID record",
-                mapRecord2.getLocatorCount(), is(3));
+                mapRecord2.getLocatorCount(), is(4));
     }
 
     @Test
@@ -166,18 +207,18 @@
         LispMapRecord mapRecordRadixTree24 = radixTreeDb.getMapRecordByEidRecord(record32, true);
 
         assertThat("Failed to fetch the RLOCs with /32 EID record",
-                mapRecordExpireMap32.getLocatorCount(), is(2));
+                mapRecordExpireMap32.getLocatorCount(), is(3));
         assertThat("Failed to fetch the RLOCs with /24 EID record",
-                mapRecordExpireMap24.getLocatorCount(), is(2));
+                mapRecordExpireMap24.getLocatorCount(), is(3));
 
         assertThat("Failed to fetch the RLOCs with /32 EID record",
-                mapRecordRadixTree32.getLocatorCount(), is(2));
+                mapRecordRadixTree32.getLocatorCount(), is(3));
         assertThat("Failed to fetch the RLOCs with /24 EID record",
-                mapRecordRadixTree24.getLocatorCount(), is(2));
+                mapRecordRadixTree24.getLocatorCount(), is(3));
     }
 
     @Test
-    public void test16MaskRange() {
+    public void test12MaskRange() {
         byte cidr32 = (byte) 32;
         LispIpv4Address eid = new LispIpv4Address(IpAddress.valueOf(EID_IP_PREFIX_1_32));
         LispEidRecord record32 = new LispEidRecord(cidr32, eid);
@@ -196,18 +237,37 @@
         LispMapRecord mapRecordExpireMap16 = expireMapDb.getMapRecordByEidRecord(record16, true);
         LispMapRecord mapRecordRadixTree16 = radixTreeDb.getMapRecordByEidRecord(record16, true);
 
-        assertThat("Failed to fetch the RLOCs with /32 EID record",
-                mapRecordExpireMap32.getLocatorCount(), is(1));
-        assertThat("Failed to fetch the RLOCs with /24 EID record",
-                mapRecordExpireMap24.getLocatorCount(), is(1));
-        assertThat("Failed to fetch the RLOCs with /16 EID record",
-                mapRecordExpireMap16.getLocatorCount(), is(1));
+        byte cidr12 = (byte) 12;
+        LispIpv4Address eid12 = new LispIpv4Address(IpAddress.valueOf(EID_IP_PREFIX_1_12));
+        LispEidRecord record12 = new LispEidRecord(cidr12, eid12);
+        LispMapRecord mapRecordExpireMap12 = expireMapDb.getMapRecordByEidRecord(record12, true);
+        LispMapRecord mapRecordRadixTree12 = radixTreeDb.getMapRecordByEidRecord(record12, true);
 
         assertThat("Failed to fetch the RLOCs with /32 EID record",
-                mapRecordRadixTree32.getLocatorCount(), is(1));
+                mapRecordExpireMap32.getLocatorCount(), is(2));
         assertThat("Failed to fetch the RLOCs with /24 EID record",
-                mapRecordRadixTree24.getLocatorCount(), is(1));
+                mapRecordExpireMap24.getLocatorCount(), is(2));
         assertThat("Failed to fetch the RLOCs with /16 EID record",
-                mapRecordRadixTree16.getLocatorCount(), is(1));
+                mapRecordExpireMap16.getLocatorCount(), is(2));
+        assertThat("Failed to fetch the RLOCs with /12 EID record",
+                mapRecordExpireMap12.getLocatorCount(), is(1));
+
+        assertThat("Failed to fetch the RLOCs with /32 EID record",
+                mapRecordRadixTree32.getLocatorCount(), is(2));
+        assertThat("Failed to fetch the RLOCs with /24 EID record",
+                mapRecordRadixTree24.getLocatorCount(), is(2));
+        assertThat("Failed to fetch the RLOCs with /16 EID record",
+                mapRecordRadixTree16.getLocatorCount(), is(2));
+        assertThat("Failed to fetch the RLOCs with /12 EID record",
+                mapRecordRadixTree12.getLocatorCount(), is(1));
+
+        LispIpv4Address wrongEid =
+                new LispIpv4Address(IpAddress.valueOf(EID_IP_PREFIX_3_24));
+        LispEidRecord wrongRecord = new LispEidRecord(cidr24, wrongEid);
+
+        LispMapRecord nullRecord =
+                expireMapDb.getMapRecordByEidRecord(wrongRecord, true);
+
+        assertNull("The record should be null", nullRecord);
     }
 }
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java
index 5a8fd6c..9325dcb 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java
@@ -17,12 +17,15 @@
 
 import io.netty.buffer.ByteBuf;
 import com.google.common.base.Objects;
+import org.onlab.packet.IpAddress;
 import org.onosproject.lisp.msg.exceptions.LispParseError;
 import org.onosproject.lisp.msg.exceptions.LispReaderException;
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
 import org.onosproject.lisp.msg.types.LispAfiAddress;
 import org.onosproject.lisp.msg.types.LispAfiAddress.AfiAddressReader;
 import org.onosproject.lisp.msg.types.LispAfiAddress.AfiAddressWriter;
+import org.onosproject.lisp.msg.types.LispIpv4Address;
+import org.onosproject.lisp.msg.types.LispIpv6Address;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -49,7 +52,20 @@
 
         checkNotNull(prefix, "Must specify an address prefix");
 
-        this.prefix = prefix;
+        // re-calculate the IP address based on the maskLength
+        switch (prefix.getAfi()) {
+            case IP4:
+                this.prefix = new LispIpv4Address(IpAddress.makeMaskedAddress(
+                        IpAddress.valueOf(prefix.toString()), maskLength));
+                break;
+            case IP6:
+                this.prefix = new LispIpv6Address(IpAddress.makeMaskedAddress(
+                        IpAddress.valueOf(prefix.toString()), maskLength));
+                break;
+            default:
+                this.prefix = prefix;
+        }
+
         this.hash = 31 * 17 + Objects.hashCode(maskLength, prefix);
     }