Reorganize mappingservice.implementation
[lispflowmapping.git] / mappingservice / yangmodel / src / main / java / org / opendaylight / lispflowmapping / lisp / serializer / address / LispSegmentLCAFAddressSerializer.java
1 /*
2  * Copyright (c) 2014 Contextream, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.lispflowmapping.lisp.serializer.address;
9
10 import java.nio.ByteBuffer;
11
12 import org.opendaylight.lispflowmapping.lisp.serializer.exception.LispSerializationException;
13 import org.opendaylight.lispflowmapping.lisp.type.AddressFamilyNumberEnum;
14 import org.opendaylight.lispflowmapping.lisp.type.LispCanonicalAddressFormatEnum;
15 import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
16 import org.opendaylight.lispflowmapping.lisp.util.LispAFIConvertor;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.LcafSegmentAddress;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.LispAFIAddress;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.lcafsegmentaddress.AddressBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.lispaddress.lispaddresscontainer.address.lcafsegment.LcafSegmentAddrBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.lispsimpleaddress.PrimitiveAddress;
22
23 public class LispSegmentLCAFAddressSerializer extends LispLCAFAddressSerializer {
24
25     private static final int MAX_INSTANCE_ID = 16777216;
26     private static final LispSegmentLCAFAddressSerializer INSTANCE = new LispSegmentLCAFAddressSerializer();
27
28     // Private constructor prevents instantiation from other classes
29     private LispSegmentLCAFAddressSerializer() {
30     }
31
32     public static LispSegmentLCAFAddressSerializer getInstance() {
33         return INSTANCE;
34     }
35
36     @Override
37     protected short getLcafLength(LispAFIAddress lispAddress) {
38         return (short) (Length.INSTANCE + LispAddressSerializer.getInstance().getAddressSize(
39                 LispAFIConvertor.toAFIfromPrimitive(((LcafSegmentAddress) lispAddress).getAddress().getPrimitiveAddress())));
40     }
41
42     @Override
43     protected void serializeData(ByteBuffer buffer, LispAFIAddress lispAddress) {
44         // The IID mask-len field is in the LCAF header on the res2 position
45         buffer.put(buffer.position() - 3, ((LcafSegmentAddress) lispAddress).getIidMaskLength().byteValue());
46
47         buffer.putInt(((LcafSegmentAddress) lispAddress).getInstanceId().intValue());
48         LispAddressSerializer.getInstance().serialize(buffer, LispAFIConvertor.toAFIfromPrimitive(((LcafSegmentAddress) lispAddress).getAddress().getPrimitiveAddress()));
49     }
50
51     @Override
52     protected LcafSegmentAddress deserializeData(ByteBuffer buffer, byte res2, short length) {
53         long instanceId = (int) ByteUtil.asUnsignedInteger(buffer.getInt());
54
55         if (instanceId > MAX_INSTANCE_ID) {
56             throw new LispSerializationException("Instance ID is longer than 24 bits. got " + instanceId);
57         }
58         LispAFIAddress address = LispAddressSerializer.getInstance().deserialize(buffer);
59         LcafSegmentAddrBuilder builder = new LcafSegmentAddrBuilder();
60         builder.setInstanceId(instanceId);
61         builder.setIidMaskLength((short) res2);
62         builder.setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode()).setLcafType((short) LispCanonicalAddressFormatEnum.SEGMENT.getLispCode())
63                 .setAddress(new AddressBuilder().setPrimitiveAddress((PrimitiveAddress) LispAFIConvertor.toPrimitive(address)).build());
64
65         return builder.build();
66     }
67
68     private interface Length {
69         int INSTANCE = 4;
70     }
71 }