Force eid normalization and fix SourceDest RPCs 73/26273/1
authorFlorin Coras <fcoras@cisco.com>
Tue, 1 Sep 2015 11:41:03 +0000 (13:41 +0200)
committerFlorin Coras <fcoras@cisco.com>
Tue, 1 Sep 2015 11:41:03 +0000 (13:41 +0200)
This patch introduces two fixes:
1) Force eid normalization for all CRUD operationas. This is
particularly needed for IPv6 addresses.
2) Fix mask lengths for SourceDest addresses in RPCs

Change-Id: I3ad2877da94af9a2a704cf410e508c9d6580218a
Signed-off-by: Florin Coras <fcoras@cisco.com>
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/LfmMappingDatabaseRpc.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/mapcache/TopologyMapCache.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/EidRecordSerializer.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/EidToLocatorRecordSerializer.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/SerializerHelper.java [deleted file]
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/address/LispSourceDestLCAFAddressSerializer.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/MaskUtil.java

index 1a6c69996300b5ed860395838e487349c6733be7..0ded7065624363744d350fb9c22956c15084ccb1 100644 (file)
@@ -79,7 +79,7 @@ public class LfmMappingDatabaseRpc implements MappingserviceService {
 
         // XXX: to remove once RPC API has been updated to remove explicit mask
         input = new AddKeyInputBuilder(input).setLispAddressContainer(
-                MaskUtil.setMask(input.getLispAddressContainer(), input.getMaskLength())).build();
+                MaskUtil.fixMask(input.getLispAddressContainer(), input.getMaskLength())).build();
 
         String key = lispMappingService.getAuthenticationKey(input.getLispAddressContainer());
 
@@ -103,7 +103,7 @@ public class LfmMappingDatabaseRpc implements MappingserviceService {
 
         // XXX: to remove once RPC API has been updated to remove explicit mask
         input = new AddMappingInputBuilder(input).setLispAddressContainer(
-                MaskUtil.setMask(input.getLispAddressContainer(), input.getMaskLength())).build();
+                MaskUtil.fixMask(input.getLispAddressContainer(), input.getMaskLength())).build();
 
         dsbe.addMapping(RPCInputConvertorUtil.toMapping(input));
 
@@ -121,7 +121,7 @@ public class LfmMappingDatabaseRpc implements MappingserviceService {
 
         // XXX: to remove once RPC API has been updated to remove explicit mask
         input = new GetKeyInputBuilder(input).setLispAddressContainer(
-                MaskUtil.setMask(input.getLispAddressContainer(), input.getMaskLength())).build();
+                MaskUtil.fixMask(input.getLispAddressContainer(), input.getMaskLength())).build();
 
         RpcResultBuilder<GetKeyOutput> rpcResultBuilder;
 
@@ -145,7 +145,7 @@ public class LfmMappingDatabaseRpc implements MappingserviceService {
 
         // XXX: to remove once RPC API has been updated to remove explicit mask
         input = new GetMappingInputBuilder(input).setLispAddressContainer(
-                MaskUtil.setMask(input.getLispAddressContainer(), input.getMaskLength())).build();
+                MaskUtil.fixMask(input.getLispAddressContainer(), input.getMaskLength())).build();
 
         RpcResultBuilder<GetMappingOutput> rpcResultBuilder;
 
@@ -172,7 +172,7 @@ public class LfmMappingDatabaseRpc implements MappingserviceService {
 
         // XXX: to remove once RPC API has been updated to remove explicit mask
         input = new RemoveKeyInputBuilder(input).setLispAddressContainer(
-                MaskUtil.setMask(input.getLispAddressContainer(), input.getMaskLength())).build();
+                MaskUtil.fixMask(input.getLispAddressContainer(), input.getMaskLength())).build();
 
         RpcResultBuilder<Void> rpcResultBuilder;
 
@@ -190,7 +190,7 @@ public class LfmMappingDatabaseRpc implements MappingserviceService {
 
         // XXX: to remove once RPC API has been updated to remove explicit mask
         input = new RemoveMappingInputBuilder(input).setLispAddressContainer(
-                MaskUtil.setMask(input.getLispAddressContainer(), input.getMaskLength())).build();
+                MaskUtil.fixMask(input.getLispAddressContainer(), input.getMaskLength())).build();
 
         RpcResultBuilder<Void> rpcResultBuilder;
 
@@ -209,7 +209,7 @@ public class LfmMappingDatabaseRpc implements MappingserviceService {
         // XXX: to remove once RPC API has been updated to remove explicit mask
         input = new UpdateKeyInputBuilder(input).setEid(
                 new EidBuilder(input.getEid()).setLispAddressContainer(
-                        MaskUtil.setMask(input.getEid().getLispAddressContainer(), input.getEid()
+                        MaskUtil.fixMask(input.getEid().getLispAddressContainer(), input.getEid()
                                 .getMaskLength())).build()).build();
 
         RpcResultBuilder<Void> rpcResultBuilder;
@@ -236,7 +236,7 @@ public class LfmMappingDatabaseRpc implements MappingserviceService {
 
         // XXX: to remove once RPC API has been updated to remove explicit mask
         input = new UpdateMappingInputBuilder(input).setLispAddressContainer(
-                MaskUtil.setMask(input.getLispAddressContainer(), input.getMaskLength())).build();
+                MaskUtil.fixMask(input.getLispAddressContainer(), input.getMaskLength())).build();
 
         RpcResultBuilder<Void> rpcResultBuilder;
 
index c385cd2053c5a14bc8d7222ccc9b9b5c285d808c..bf04a29668aad4e4317cbe2bc1ca7941e0f04922 100644 (file)
@@ -158,15 +158,16 @@ public class TopologyMapCache {
         return mapping;
     }
 
-    public static void removeMapping(LispAddressContainer address, ILispDAO dao, boolean oerwrite) {
-        if (address.getAddress() instanceof LcafSourceDest) {
-            ILispDAO db = getSDInnerDao(address, dao);
+    public static void removeMapping(LispAddressContainer eid, ILispDAO dao, boolean oerwrite) {
+        eid = MaskUtil.normalize(eid);
+        if (eid.getAddress() instanceof LcafSourceDest) {
+            ILispDAO db = getSDInnerDao(eid, dao);
             if (db != null) {
-                db.removeSpecific(LcafSourceDestHelper.getSrc(address),
+                db.removeSpecific(LcafSourceDestHelper.getSrc(eid),
                         SubKeys.RECORD);
             }
         } else {
-            dao.removeSpecific(address, SubKeys.RECORD);
+            dao.removeSpecific(eid, SubKeys.RECORD);
         }
     }
 
@@ -215,6 +216,7 @@ public class TopologyMapCache {
     }
 
     public static void removeAuthenticationKey(LispAddressContainer eid, ILispDAO dao) {
+        eid = MaskUtil.normalize(eid);
         if (eid.getAddress() instanceof LcafSourceDest) {
             ILispDAO srcDstDao = getSDInnerDao(eid, dao);
             if (srcDstDao != null) {
@@ -253,14 +255,15 @@ public class TopologyMapCache {
         return null;
     }
 
-    public static void removeSubscribers(LispAddressContainer address, ILispDAO dao, boolean shouldOverwrite) {
-        if (address.getAddress() instanceof LcafSourceDest) {
-            ILispDAO db = getSDInnerDao(address, dao);
+    public static void removeSubscribers(LispAddressContainer eid, ILispDAO dao, boolean shouldOverwrite) {
+        eid = MaskUtil.normalize(eid);
+        if (eid.getAddress() instanceof LcafSourceDest) {
+            ILispDAO db = getSDInnerDao(eid, dao);
             if (db != null) {
-                db.removeSpecific(LcafSourceDestHelper.getSrc(address), SubKeys.SUBSCRIBERS);
+                db.removeSpecific(LcafSourceDestHelper.getSrc(eid), SubKeys.SUBSCRIBERS);
             }
         } else {
-            dao.removeSpecific(address, SubKeys.SUBSCRIBERS);
+            dao.removeSpecific(eid, SubKeys.SUBSCRIBERS);
         }
     }
 
index ea1f410186e20e334f46bac26af377a730b4dcc0..331321e5fb2b197d62a80b6c67df584005252e75 100644 (file)
@@ -12,6 +12,7 @@ import java.nio.ByteBuffer;
 import org.opendaylight.lispflowmapping.lisp.serializer.address.LispAddressSerializer;
 import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
 import org.opendaylight.lispflowmapping.lisp.util.LispAFIConvertor;
+import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.LispAFIAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.eidrecords.EidRecord;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.eidrecords.EidRecordBuilder;
@@ -32,7 +33,7 @@ public class EidRecordSerializer {
         /* byte reserved = */requestBuffer.get();
         short maskLength = (short) (ByteUtil.getUnsignedByte(requestBuffer));
         LispAFIAddress prefix = LispAddressSerializer.getInstance().deserialize(requestBuffer);
-        prefix = SerializerHelper.fixMask(prefix, maskLength);
+        prefix = MaskUtil.fixMask(prefix, maskLength);
         return new EidRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(prefix)).setMask(maskLength)
                 .build();
     }
index c82f64733c75d12109855850afcb60e30b4638cf..494708f2fc0dbec5e09045eebaa0693aa26d6a40 100644 (file)
@@ -14,6 +14,7 @@ import org.apache.commons.lang3.BooleanUtils;
 import org.opendaylight.lispflowmapping.lisp.serializer.address.LispAddressSerializer;
 import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
 import org.opendaylight.lispflowmapping.lisp.util.LispAFIConvertor;
+import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
 import org.opendaylight.lispflowmapping.lisp.util.NumberUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.EidToLocatorRecord;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.EidToLocatorRecord.Action;
@@ -50,7 +51,7 @@ public class EidToLocatorRecordSerializer {
         builder.setMapVersion(buffer.getShort());
 
         LispAFIAddress afiAddress = LispAddressSerializer.getInstance().deserialize(buffer);
-        afiAddress = SerializerHelper.fixMask(afiAddress, builder.getMaskLength());
+        afiAddress = MaskUtil.fixMask(afiAddress, builder.getMaskLength());
         LispAddressContainer container = LispAFIConvertor.toContainer(afiAddress);
         builder.setLispAddressContainer(container);
 
diff --git a/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/SerializerHelper.java b/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/SerializerHelper.java
deleted file mode 100644 (file)
index 462cc47..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.lispflowmapping.lisp.serializer;
-
-import org.opendaylight.lispflowmapping.lisp.util.LcafSourceDestHelper;
-import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.LcafSegmentAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.LcafSourceDestAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.LispAFIAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.LispIpv4Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.LispIpv6Address;
-
-/**
- * @author Florin Coras
- *
- *         Helper class needed to fix masks of EIDs in southbound incoming LISP packets.
- *
- *         RFC6830 defines masks and EIDs as separate fields of larger, encompassing blocks of LISP messages. However
- *         within LispFlowMapping masks are internal fields of EIDs. The method fixMask should be used in deserializers
- *         to ensure that masks for deserialized EIDs reflect accordingly the mask field values carried in LISP
- *         messages.
- */
-
-public class SerializerHelper {
-    public static LispAFIAddress fixMask(LispAFIAddress addr, short mask) {
-        if (addr instanceof LispIpv4Address || addr instanceof LispIpv6Address || addr instanceof LcafSegmentAddress) {
-           return MaskUtil.setMask(addr, mask);
-        } else if (addr instanceof LcafSourceDestAddress) {
-           return MaskUtil.setMaskSourceDest(addr, LcafSourceDestHelper.getSrcMask(addr),
-                    LcafSourceDestHelper.getDstMask(addr));
-        }
-        return addr;
-    }
-}
index 05023abb86554e3c50497bb97780ce267cf4a0cd..a60cb2212304e8607d321cf64e36381ac11a6cde 100644 (file)
@@ -9,11 +9,11 @@ package org.opendaylight.lispflowmapping.lisp.serializer.address;
 
 import java.nio.ByteBuffer;
 
-import org.opendaylight.lispflowmapping.lisp.serializer.SerializerHelper;
 import org.opendaylight.lispflowmapping.lisp.type.AddressFamilyNumberEnum;
 import org.opendaylight.lispflowmapping.lisp.type.LispCanonicalAddressFormatEnum;
 import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
 import org.opendaylight.lispflowmapping.lisp.util.LispAFIConvertor;
+import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.LcafSourceDestAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.LispAFIAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lcafsourcedestaddress.DstAddressBuilder;
@@ -57,9 +57,9 @@ public class LispSourceDestLCAFAddressSerializer extends LispLCAFAddressSerializ
         short srcMaskLength = (short) ByteUtil.getUnsignedByte(buffer);
         short dstMaskLength = (short) ByteUtil.getUnsignedByte(buffer);
         LispAFIAddress srcAddress = LispAddressSerializer.getInstance().deserialize(buffer);
-        srcAddress = SerializerHelper.fixMask(srcAddress, srcMaskLength);
+        srcAddress = MaskUtil.fixMask(srcAddress, srcMaskLength);
         LispAFIAddress dstAddress = LispAddressSerializer.getInstance().deserialize(buffer);
-        dstAddress = SerializerHelper.fixMask(dstAddress, dstMaskLength);
+        dstAddress = MaskUtil.fixMask(dstAddress, dstMaskLength);
         LcafSourceDestAddrBuilder builder = new LcafSourceDestAddrBuilder();
         builder.setDstMaskLength((short) dstMaskLength).setSrcMaskLength((short) srcMaskLength);
         builder.setSrcAddress(new SrcAddressBuilder().setPrimitiveAddress((PrimitiveAddress) LispAFIConvertor.toPrimitive(srcAddress)).build());
index b84b08a8736b7fb7c0e8072b4d63b6bc6eafd839..e1d7fb790c8a55e56d3103ce7ba9e1bf141105a8 100644 (file)
@@ -31,6 +31,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.li
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.Ipv4Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.Ipv6;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.Ipv6Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafSegment;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafSegmentBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafSourceDest;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafSourceDestBuilder;
@@ -57,9 +58,9 @@ public class MaskUtil {
     public static boolean isMaskable(LispAddressContainer address) {
         if (address.getAddress() instanceof Ipv4  || address.getAddress() instanceof Ipv6) {
             return true;
-        } else if (address.getAddress() instanceof LcafSegmentAddress) {
-            return isMaskable(LispAFIConvertor.toAFIfromPrimitive(((LcafSegmentAddress) address).getAddress()
-                    .getPrimitiveAddress()));
+        } else if (address.getAddress() instanceof LcafSegment) {
+            return isMaskable(LispAFIConvertor.toAFIfromPrimitive(((LcafSegment) address.getAddress())
+                    .getLcafSegmentAddr().getAddress().getPrimitiveAddress()));
         } else if (address.getAddress() instanceof LcafSourceDestAddress) {
             LcafSourceDestAddr sd = ((LcafSourceDest) address.getAddress()).getLcafSourceDestAddr();
             return isMaskable(LispAFIConvertor.toAFIfromPrimitive(sd.getSrcAddress().getPrimitiveAddress()))
@@ -121,8 +122,8 @@ public class MaskUtil {
                 return LispAFIConvertor.asIPv6Prefix(normalizeIP(
                         Inet6Address.getByName(((Ipv6) address.getAddress()).getIpv6Address().getIpv6Address().getValue()),
                         mask).getHostAddress(), mask);
-            } else if (address instanceof LcafSegmentAddress) {
-                LcafSegmentAddress segAddr = (LcafSegmentAddress) address;
+            } else if (address.getAddress() instanceof LcafSegment) {
+                LcafSegmentAddress segAddr = ((LcafSegment) address.getAddress()).getLcafSegmentAddr();
                 LispAFIAddress afiAddr = LispAFIConvertor
                         .toAFIfromPrimitive(segAddr.getAddress().getPrimitiveAddress());
                 Address normalizedAddr = new AddressBuilder().setPrimitiveAddress(
@@ -143,8 +144,8 @@ public class MaskUtil {
             return normalize(address, ((Ipv4)address.getAddress()).getIpv4Address().getMask());
         } else if (address.getAddress() instanceof Ipv6) {
             return normalize(address, ((Ipv6)address.getAddress()).getIpv6Address().getMask());
-        } else if (address instanceof LcafSegmentAddress) {
-            LcafSegmentAddress segAddr = (LcafSegmentAddress) address;
+        } else if (address.getAddress() instanceof LcafSegment) {
+            LcafSegmentAddress segAddr = ((LcafSegment) address.getAddress()).getLcafSegmentAddr();
             LispAFIAddress afiAddr = LispAFIConvertor
                     .toAFIfromPrimitive(segAddr.getAddress().getPrimitiveAddress());
             short mask = getMaskForAfiAddress(afiAddr);
@@ -235,9 +236,9 @@ public class MaskUtil {
         } else if (addr.getAddress() instanceof Ipv6) {
             Short res = ((Ipv6)addr.getAddress()).getIpv6Address().getMask();
             return (res != null) ? res.shortValue() : 128;
-        } else if (addr.getAddress() instanceof LcafSegmentAddress) {
-            return getMaskForAfiAddress(LispAFIConvertor.toAFIfromPrimitive(((LcafSegmentAddress) addr.getAddress())
-                    .getAddress().getPrimitiveAddress()));
+        } else if (addr.getAddress() instanceof LcafSegment) {
+            return getMaskForAfiAddress(LispAFIConvertor.toAFIfromPrimitive((((LcafSegment) addr.getAddress())
+                    .getLcafSegmentAddr()).getAddress().getPrimitiveAddress()));
         }
         return 0;
     }
@@ -264,9 +265,9 @@ public class MaskUtil {
                     new Ipv6Builder().setIpv6Address(
                             new Ipv6AddressBuilder(((Ipv6) addr.getAddress()).getIpv6Address()).setMask((short) mask)
                                     .build()).build()).build();
-        } else if (addr.getAddress() instanceof LcafSegmentAddress) {
-            setMask(LispAFIConvertor.toAFIfromPrimitive(((LcafSegmentAddress) addr.getAddress()).getAddress()
-                    .getPrimitiveAddress()), mask);
+        } else if (addr.getAddress() instanceof LcafSegment) {
+            setMask(LispAFIConvertor.toAFIfromPrimitive(((LcafSegment) addr.getAddress()).getLcafSegmentAddr()
+                    .getAddress().getPrimitiveAddress()), mask);
         }
         return addr;
     }
@@ -305,4 +306,31 @@ public class MaskUtil {
                                 ((LcafSourceDest) addr.getAddress()).getLcafSourceDestAddr(), srcMask, dstMask))
                         .build()).build();
     }
+
+    /**
+     * RFC6830 defines masks and EIDs as separate fields of larger, encompassing blocks of LISP messages. However within
+     * LispFlowMapping masks are internal fields of EIDs. The fixMask methods should be used in deserializers and RPC
+     * handlers to ensure that masks for EIDs reflect accordingly the mask field values carried in LISP messages or RPC
+     * input objects respectively.
+     */
+    public static LispAFIAddress fixMask(LispAFIAddress addr, short mask) {
+        if (addr instanceof LispIpv4Address || addr instanceof LispIpv6Address || addr instanceof LcafSegmentAddress) {
+           return MaskUtil.setMask(addr, mask);
+        } else if (addr instanceof LcafSourceDestAddress) {
+           return MaskUtil.setMaskSourceDest(addr, LcafSourceDestHelper.getSrcMask(addr),
+                    LcafSourceDestHelper.getDstMask(addr));
+        }
+        return addr;
+    }
+
+    public static LispAddressContainer fixMask(LispAddressContainer addr, short mask) {
+        if (addr.getAddress() instanceof Ipv4 || addr.getAddress() instanceof Ipv6
+                || addr.getAddress() instanceof LcafSegment) {
+            return MaskUtil.setMask(addr, mask);
+        } else if (addr.getAddress() instanceof LcafSourceDest) {
+            return MaskUtil.setMaskSourceDest(addr, LcafSourceDestHelper.getSrcMask(addr),
+                    LcafSourceDestHelper.getDstMask(addr));
+        }
+        return addr;
+    }
 }