Bug 6402: Convert src eid from binary IP to prefix 66/43866/3
authorFlorin Coras <fcoras@cisco.com>
Fri, 12 Aug 2016 15:56:24 +0000 (17:56 +0200)
committerFlorin Coras <fcoras@cisco.com>
Fri, 12 Aug 2016 21:02:18 +0000 (23:02 +0200)
Change-Id: I31d8783c44b2a61e4984df255c9168628c8a3d9b
Signed-off-by: Florin Coras <fcoras@cisco.com>
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/LispAddressUtil.java
mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/MultiTableMapCache.java
mappingservice/mapcache/src/test/java/org/opendaylight/lispflowmapping/mapcache/MultiTableMapCacheTest.java

index b210f09b9e80e58fc4927fd95192b8e67f2dc3b2..1db6e968cc0d468ca561af6cb0262b86ef687636 100644 (file)
@@ -565,6 +565,28 @@ public final class LispAddressUtil {
         return LispAddressUtil.asEid(address, iid);
     }
 
+    public static Eid asIpPrefixBinaryEid(Eid eid) {
+        Address address = eid.getAddress();
+        if (address instanceof Ipv4Binary) {
+            return LispAddressUtil.asIpv4PrefixBinaryEid(eid, ((Ipv4Binary) address).getIpv4Binary().getValue(),
+                    (short) 32);
+        } else if (address instanceof Ipv6Binary) {
+            return LispAddressUtil.asIpv6PrefixBinaryEid(eid, ((Ipv6Binary) address).getIpv6Binary().getValue(),
+                    (short) 128);
+        } else if (address instanceof Ipv4PrefixBinary || address instanceof Ipv6PrefixBinary) {
+            return eid;
+        } else if (address instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address
+                .types.rev151105.lisp.address.address.Ipv4) {
+            return LispAddressUtil.asIpv4PrefixBinaryEid(((Ipv4) address).getIpv4().getValue() + "/32",
+                    eid.getVirtualNetworkId());
+        } else if (address instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address
+                .types.rev151105.lisp.address.address.Ipv6) {
+            return LispAddressUtil.asIpv6PrefixBinaryEid(((Ipv6) address).getIpv6().getValue() + "/128",
+                    eid.getVirtualNetworkId());
+        }
+        return convertToBinary(eid);
+    }
+
     public static int ipVersionFromString(String ip) {
         if (IP4_PATTERN.matcher(ip).matches()) {
             return 4;
index 281f1a775ce994bfef32a7f6b1900bb1e19af3a7..f94a9f4776cbcccdfb22403da0b18c0c6d01e03e 100644 (file)
@@ -14,6 +14,7 @@ import org.opendaylight.lispflowmapping.interfaces.dao.IRowVisitor;
 import org.opendaylight.lispflowmapping.interfaces.dao.MappingEntry;
 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
 import org.opendaylight.lispflowmapping.interfaces.mapcache.IMapCache;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
 import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
 import org.opendaylight.lispflowmapping.lisp.util.SourceDestKeyHelper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
@@ -98,8 +99,9 @@ public class MultiTableMapCache implements IMapCache {
         if (daoEntry != null) {
             // try SrcDst eid lookup
             ILispDAO srcDstDao = (ILispDAO) daoEntry.get(SubKeys.LCAF_SRCDST);
-            if (srcDstDao != null) {
-                Object mapping = getMappingLpmEid(srcEid, srcDstDao);
+            if (srcEid != null && srcDstDao != null) {
+                // make sure that srcEid is a prefix, not an IP and binary
+                Object mapping = getMappingLpmEid(LispAddressUtil.asIpPrefixBinaryEid(srcEid), srcDstDao);
                 if (mapping !=  null) {
                     return mapping;
                 }
index 505bb6711943359dbc9cffeb6d8ca90cad193d02..2a1e3082e2bcbc12451092300b88ca4fbd807597 100644 (file)
@@ -175,7 +175,7 @@ public class MultiTableMapCacheTest {
 
         when(daoMock.getSpecific(VNI, SubKeys.VNI)).thenReturn(tableDaoMock);
         when(tableDaoMock.getBest(key)).thenReturn(entry);
-        when(srcDstDaoMock.getBest(key2)).thenReturn(entry2);
+        when(srcDstDaoMock.getBest(LispAddressUtil.asIpPrefixBinaryEid(key2))).thenReturn(entry2);
 
         assertEquals(DUMMY_OBJECT_2, multiTableMapCache.getMapping(EID_IPV4_PREFIX_SRC, EID_IPV4_PREFIX_DST));
         assertEquals(DUMMY_OBJECT, multiTableMapCache.getMapping(null, EID_IPV4_PREFIX_DST));