Magnesium platform upgrade
[lispflowmapping.git] / mappingservice / lisp-proto / src / main / java / org / opendaylight / lispflowmapping / lisp / serializer / address / ServicePathSerializer.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc.  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 static org.opendaylight.yangtools.yang.common.UintConversions.fromJava;
11
12 import java.nio.ByteBuffer;
13 import org.opendaylight.lispflowmapping.lisp.type.LispCanonicalAddressFormatEnum;
14 import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
15 import org.opendaylight.lispflowmapping.lisp.util.NumberUtil;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.afn.safi.rev130704.AddressFamily;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddress;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePath;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePathBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
25
26 /**
27  * Class to (de)serialize Service Path data type.
28  *
29  * @author Lorand Jakab
30  *
31  */
32 public final class ServicePathSerializer extends LcafSerializer {
33
34     private static final ServicePathSerializer INSTANCE = new ServicePathSerializer();
35
36     // Private constructor prevents instantiation from other classes
37     private ServicePathSerializer() {
38     }
39
40     public static ServicePathSerializer getInstance() {
41         return INSTANCE;
42     }
43
44     @Override
45     protected byte getLcafType() {
46         return LispCanonicalAddressFormatEnum.SERVICE_PATH.getLispCode();
47     }
48
49     @Override
50     protected short getLcafLength(LispAddress lispAddress) {
51         return (short) (Length.SPI + Length.SI);
52     }
53
54     @Override
55     protected short getAfi() {
56         return (short) AddressFamily.LispCanonicalAddressFormat.getIntValue();
57     }
58
59     @Override
60     protected void serializeData(ByteBuffer buffer, LispAddress lispAddress) {
61         ServicePath sp = (ServicePath) lispAddress.getAddress();
62         buffer.put(ByteUtil.partialIntToByteArray(NumberUtil.asInt(
63                 sp.getServicePath().getServicePathId().getValue().intValue()), Length.SPI));
64         buffer.put((byte) NumberUtil.asShort(sp.getServicePath().getServiceIndex().toJava()));
65     }
66
67     @Override
68     protected Eid deserializeLcafEidData(ByteBuffer buffer, byte res2, short length, LispAddressSerializerContext ctx) {
69         EidBuilder eb = new EidBuilder();
70         eb.setAddressType(ServicePathLcaf.class);
71         eb.setVirtualNetworkId(getVni(ctx));
72         eb.setAddress(deserializeData(buffer));
73         return eb.build();
74     }
75
76     private Address deserializeData(ByteBuffer buffer) {
77         ServicePathBuilder spb = new ServicePathBuilder();
78         byte[] spi = new byte[3];
79         buffer.get(spi);
80         spb.setServicePathId(new ServicePathIdType(fromJava((long) ByteUtil.getPartialInt(spi))));
81         spb.setServiceIndex(fromJava((short) ByteUtil.getUnsignedByte(buffer)));
82         return new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
83                 .lisp.address.address.ServicePathBuilder().setServicePath(spb.build()).build();
84     }
85
86     private interface Length {
87         int SPI = 3;
88         int SI = 1;
89     }
90 }