Bug 5239: Fix IID Source/Dest lookup 46/34146/2
authorFlorin Coras <fcoras@cisco.com>
Fri, 5 Feb 2016 11:12:19 +0000 (12:12 +0100)
committerFlorin Coras <fcoras@cisco.com>
Fri, 5 Feb 2016 12:03:37 +0000 (13:03 +0100)
The issue is that the source EID is passed to the map-cache lookup as an
IP, not as an IP-prefix, and therefore it is not masked accordingly when
performing the longest prefix match. This patch updates the
MaskUtil.normalize() code to convert IPs to an IP-prefixes.

Change-Id: Iafd7bef2ef0911e6cbc61b8315208eb639e41766
Signed-off-by: Florin Coras <fcoras@cisco.com>
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/mapcache/MultiTableMapCache.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/LispAddressUtil.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/MaskUtil.java

index 110638e5c2601b621b6ed3f404f27a7a852df63e..ab13a31c0973fee7b962d3ecc9f871d14fe2494e 100644 (file)
@@ -121,7 +121,8 @@ public class MultiTableMapCache implements IMapCache {
         if (eid == null) {
             return null;
         }
-        Map<String, ?> daoEntry = getDaoEntryBest(eid, dao);
+        Eid key = MaskUtil.normalize(eid);
+        Map<String, ?> daoEntry = getDaoEntryBest(key, dao);
         if (daoEntry != null) {
             return daoEntry.get(SubKeys.RECORD);
         } else {
index 51a32ab8087df81849b035328852243ea231bb24..b59fa83ca9c7310b625b8467dd5807527c5534ee 100644 (file)
@@ -270,19 +270,28 @@ public final class LispAddressUtil {
         return builder.build();
     }
 
-    public static Eid toEid(IpPrefix prefix, int vni) {
+    // XXX getMapping rcp fails if VNI set to 0
+    public static Eid toEidNoVni(IpPrefix prefix) {
         EidBuilder builder = new EidBuilder();
         builder.setAddress(addressFromIpPrefix(prefix));
         builder.setAddressType(addressTypeFromIpPrefix(prefix));
-        // XXX getMapping rcp fails if set to 0
-        //builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
+        return builder.build();
+    }
+
+    public static Eid toEid(IpPrefix prefix, InstanceIdType vni) {
+        EidBuilder builder = new EidBuilder();
+        builder.setAddress(addressFromIpPrefix(prefix));
+        builder.setAddressType(addressTypeFromIpPrefix(prefix));
+        builder.setVirtualNetworkId(vni);
         return builder.build();
     }
 
     public static Eid toIpPrefixEid(IpAddress addr, int vni) {
+        // If you touch this, be sure that sfclisp compiles!
         int mask = addressTypeFromIpAddress(addr) == Ipv4Afi.class ? 32 : 128;
         IpPrefix prefix = asIpPrefix(addr.getValue().toString(), mask);
-        return toEid(prefix, vni);
+        // XXX getMapping rcp fails if VNI set to 0
+        return toEidNoVni(prefix);
     }
 
     public static Eid asEid(SimpleAddress address, InstanceIdType vni) {
@@ -355,6 +364,14 @@ public final class LispAddressUtil {
         }
     }
 
+    public static Eid asIpv4PrefixEid(Ipv4Address addr, InstanceIdType vni) {
+        return toEid(new IpPrefix(new Ipv4Prefix(addr.getValue() + "/" + 32)), vni);
+    }
+
+    public static Eid asIpv6PrefixEid(Ipv6Address addr, InstanceIdType vni) {
+        return toEid(new IpPrefix(new Ipv4Prefix(addr.getValue() + "/" + 128)), vni);
+    }
+
     public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
         EidBuilder builder = new EidBuilder();
         builder.setAddressType(eid.getAddressType());
index 85a374d5cb02ce4c695ee73bf7a16da1ee4b074a..3c98cce5f11936085d65c1dbfcbfaebb1c751e83 100644 (file)
@@ -87,6 +87,10 @@ public final class MaskUtil {
                 short mask = Short.parseShort(v6prefix[1]);
                 InetAddress normalized = normalizeIP(Inet6Address.getByName(v6prefix[0]), mask);
                 return LispAddressUtil.asIpv6PrefixEid(eid, (Inet6Address)normalized, mask);
+            } else if (address instanceof Ipv4) {
+                return LispAddressUtil.asIpv4PrefixEid(((Ipv4) address).getIpv4(), eid.getVirtualNetworkId());
+            } else if (address instanceof Ipv6) {
+                return LispAddressUtil.asIpv6PrefixEid(((Ipv6) address).getIpv6(), eid.getVirtualNetworkId());
             } else if (address instanceof InstanceId) {
                 // TODO - not absolutely necessary, but should be implemented
                 return eid;