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