Bug 4832: Add serializer for Service Path LCAF 02/31802/1
authorLorand Jakab <lojakab@cisco.com>
Tue, 22 Dec 2015 22:42:13 +0000 (00:42 +0200)
committerLorand Jakab <lojakab@cisco.com>
Tue, 22 Dec 2015 22:43:19 +0000 (00:43 +0200)
Change-Id: Ie4d45e6ec9d2635d14a242c109e0e2d1c00f9cd3
Signed-off-by: Lorand Jakab <lojakab@cisco.com>
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/address/ServicePathSerializer.java [new file with mode: 0644]
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/address/factory/LispAddressSerializerFactory.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/type/LispCanonicalAddressFormatEnum.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/AddressTypeMap.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/LispAddressUtil.java
mappingservice/lisp-proto/src/test/java/org/opendaylight/lispflowmapping/serializer/address/ServicePathTest.java [new file with mode: 0644]

diff --git a/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/address/ServicePathSerializer.java b/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/address/ServicePathSerializer.java
new file mode 100644 (file)
index 0000000..3b48efa
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * 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.address;
+
+import java.nio.ByteBuffer;
+
+import org.opendaylight.lispflowmapping.lisp.type.LispCanonicalAddressFormatEnum;
+import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
+import org.opendaylight.lispflowmapping.lisp.util.NumberUtil;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.afn.safi.rev130704.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePath;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePathBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
+
+/**
+ * @author Lorand Jakab
+ *
+ */
+public class ServicePathSerializer extends LcafSerializer {
+
+    private static final ServicePathSerializer INSTANCE = new ServicePathSerializer();
+
+    // Private constructor prevents instantiation from other classes
+    private ServicePathSerializer() {
+    }
+
+    public static ServicePathSerializer getInstance() {
+        return INSTANCE;
+    }
+
+    @Override
+    protected byte getLcafType() {
+        return LispCanonicalAddressFormatEnum.SERVICE_PATH.getLispCode();
+    }
+
+    @Override
+    protected short getLcafLength(LispAddress lispAddress) {
+        return (short) (Length.SPI + Length.SI);
+    }
+
+    @Override
+    protected short getAfi() {
+        return (short) AddressFamily.LispCanonicalAddressFormat.getIntValue();
+    }
+
+    @Override
+    protected void serializeData(ByteBuffer buffer, LispAddress lispAddress) {
+        ServicePath sp = (ServicePath) lispAddress.getAddress();
+        buffer.put(ByteUtil.partialIntToByteArray(NumberUtil.asInt(
+                sp.getServicePath().getServicePathId().getValue().intValue()), Length.SPI));
+        buffer.put((byte) NumberUtil.asShort(sp.getServicePath().getServiceIndex()));
+    }
+
+    @Override
+    protected Eid deserializeLcafEidData(ByteBuffer buffer, byte res2, short length, LispAddressSerializerContext ctx) {
+        EidBuilder eb = new EidBuilder();
+        eb.setAddressType(ServicePathLcaf.class);
+        eb.setVirtualNetworkId(getVni(ctx));
+        eb.setAddress(deserializeData(buffer));
+        return eb.build();
+    }
+
+    private Address deserializeData(ByteBuffer buffer) {
+        ServicePathBuilder spb = new ServicePathBuilder();
+        byte[] spi = new byte[3];
+        buffer.get(spi);
+        spb.setServicePathId(new ServicePathIdType((long) ByteUtil.getPartialInt(spi)));
+        spb.setServiceIndex((short) ByteUtil.getUnsignedByte(buffer));
+        return new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder()
+                .setServicePath(spb.build()).build();
+    }
+
+    private interface Length {
+        int SPI = 3;
+        int SI = 1;
+    }
+}
index 4dbe11a70a875153cdfd9df657891f1918539788..ce984a9343235dcbde6c6ed10b7b857655da6d03 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.lispflowmapping.lisp.serializer.address.LispAddressSeria
 import org.opendaylight.lispflowmapping.lisp.serializer.address.Ipv4Serializer;
 import org.opendaylight.lispflowmapping.lisp.serializer.address.MacSerializer;
 import org.opendaylight.lispflowmapping.lisp.serializer.address.NoAddressSerializer;
+import org.opendaylight.lispflowmapping.lisp.serializer.address.ServicePathSerializer;
 import org.opendaylight.lispflowmapping.lisp.serializer.address.SourceDestKeySerializer;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AfiListLcaf;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ApplicationDataLcaf;
@@ -39,6 +40,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.addres
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
 
 /**
@@ -70,6 +72,7 @@ public final class LispAddressSerializerFactory {
         addressTypeToSerializerMap.put(ExplicitLocatorPathLcaf.class, ExplicitLocatorPathSerializer.getInstance());
         addressTypeToSerializerMap.put(SourceDestKeyLcaf.class, SourceDestKeySerializer.getInstance());
         addressTypeToSerializerMap.put(KeyValueAddressLcaf.class, KeyValueAddressSerializer.getInstance());
+        addressTypeToSerializerMap.put(ServicePathLcaf.class, ServicePathSerializer.getInstance());
     }
 
     public static LispAddressSerializer getSerializer(Class<? extends LispAddressFamily> clazz) {
index 4fe863716631a37dfc9f087bd535d4dd7c6e96ef..94dec8af977b5b305c122640f191342dea909abb 100644 (file)
@@ -18,6 +18,7 @@ public enum LispCanonicalAddressFormatEnum {
     SOURCE_DEST(12), //
     TRAFFIC_ENGINEERING(10), //
     KEY_VALUE(15), //
+    SERVICE_PATH(17),
     UNKNOWN(-1);
 
     private byte lispCode;
index fa79e45560d656d27105b53e1332964667cf44af..f38f7e93589e90a20e8ce3fd5804a05e647fef6b 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.addres
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
 
@@ -69,6 +70,8 @@ public final class AddressTypeMap {
                 SourceDestKeyLcaf.class);
         lcafToAddressTypeMap.put((short) LispCanonicalAddressFormatEnum.KEY_VALUE.getLispCode(),
                 KeyValueAddressLcaf.class);
+        lcafToAddressTypeMap.put((short) LispCanonicalAddressFormatEnum.SERVICE_PATH.getLispCode(),
+                ServicePathLcaf.class);
         // TODO
     }
 
index 252549b9aea6f4efc0d8b4cebf7409a425ee3236..99fa6b567237f39f99b18e4fe255241736c42fed 100644 (file)
@@ -373,7 +373,9 @@ public final class LispAddressUtil {
     public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
         EidBuilder eb = new EidBuilder();
         eb.setAddressType(ServicePathLcaf.class);
-        eb.setVirtualNetworkId(new InstanceIdType(vni));
+        if (vni >= 0) {
+            eb.setVirtualNetworkId(new InstanceIdType(vni));
+        }
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePathBuilder spb = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePathBuilder();
         spb.setServicePathId(new ServicePathIdType(servicePathId));
         spb.setServiceIndex(serviceIndex);
diff --git a/mappingservice/lisp-proto/src/test/java/org/opendaylight/lispflowmapping/serializer/address/ServicePathTest.java b/mappingservice/lisp-proto/src/test/java/org/opendaylight/lispflowmapping/serializer/address/ServicePathTest.java
new file mode 100644 (file)
index 0000000..fac4cb9
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * 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.serializer.address;
+
+import static org.junit.Assert.assertEquals;
+
+import java.nio.ByteBuffer;
+
+import junitx.framework.ArrayAssert;
+
+import org.junit.Test;
+import org.opendaylight.lispflowmapping.lisp.serializer.address.LispAddressSerializer;
+import org.opendaylight.lispflowmapping.lisp.serializer.address.LispAddressSerializerContext;
+import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
+import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePath;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
+
+/**
+ * @author Lorand Jakab
+ *
+ */
+public class ServicePathTest extends BaseTestCase {
+
+    @Test
+    public void deserialize__Simple() throws Exception {
+        Eid address = LispAddressSerializer.getInstance().deserializeEid(hexToByteBuffer("40 03 00 00 " +
+                "11 00 00 04 " +
+                "AA BB CC FF"),
+                new LispAddressSerializerContext(null));
+        assertEquals(ServicePathLcaf.class, address.getAddressType());
+        ServicePath sp = (ServicePath) address.getAddress();
+
+        assertEquals(ByteUtil.getPartialInt(new byte[] { (byte) 0xAA, (byte) 0xBB, (byte) 0xCC }),
+                sp.getServicePath().getServicePathId().getValue().intValue());
+        assertEquals((byte) 0xFF, sp.getServicePath().getServiceIndex().byteValue());
+    }
+
+    @Test
+    public void serialize__Simple() throws Exception {
+        Eid eid = LispAddressUtil.asServicePathEid(-1, 1L, (short) 0xFF);
+
+        ByteBuffer buf = ByteBuffer.allocate(LispAddressSerializer.getInstance().getAddressSize(eid));
+        LispAddressSerializer.getInstance().serialize(buf, eid);
+        ByteBuffer expectedBuf = hexToByteBuffer("40 03 00 00 " +
+                "11 00 00 04 " +
+                "00 00 01 FF");
+        ArrayAssert.assertEquals(expectedBuf.array(), buf.array());
+    }
+}