2 * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved.
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
8 package org.opendaylight.lispflowmapping.lisp.serializer.address;
10 import java.nio.ByteBuffer;
12 import org.opendaylight.lispflowmapping.lisp.type.LispCanonicalAddressFormatEnum;
13 import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
14 import org.opendaylight.lispflowmapping.lisp.util.NumberUtil;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.afn.safi.rev130704.AddressFamily;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ApplicationDataLcaf;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddress;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
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.application.data.ApplicationData;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.application.data.ApplicationDataBuilder;
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 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
28 public class ApplicationDataSerializer extends LcafSerializer {
30 private static final ApplicationDataSerializer INSTANCE = new ApplicationDataSerializer();
32 // Private constructor prevents instantiation from other classes
33 private ApplicationDataSerializer() {
36 public static ApplicationDataSerializer getInstance() {
41 protected byte getLcafType() {
42 return LispCanonicalAddressFormatEnum.APPLICATION_DATA.getLispCode();
46 protected short getLcafLength(LispAddress lispAddress) {
47 ApplicationData appData = ((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ApplicationData)
48 lispAddress.getAddress()).getApplicationData();
49 return (short) (Length.ALL_FIELDS + SimpleAddressSerializer.getInstance().getAddressSize(appData.getAddress()));
53 protected short getAfi() {
54 return (short) AddressFamily.LispCanonicalAddressFormat.getIntValue();
58 protected void serializeData(ByteBuffer buffer, LispAddress lispAddress) {
59 ApplicationData appData = ((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ApplicationData)
60 lispAddress.getAddress()).getApplicationData();
61 buffer.put(ByteUtil.partialIntToByteArray(NumberUtil.asInt(appData.getIpTos()), Length.TOC));
62 buffer.put((byte) NumberUtil.asShort(appData.getProtocol()));
63 if (appData.getLocalPortLow() != null) {
64 buffer.putShort(NumberUtil.asShort(appData.getLocalPortLow().getValue().shortValue()));
66 buffer.putShort((short) 0);
68 if (appData.getLocalPortHigh() != null) {
69 buffer.putShort(NumberUtil.asShort(appData.getLocalPortHigh().getValue().shortValue()));
71 buffer.putShort((short) 0);
73 if (appData.getRemotePortLow() != null) {
74 buffer.putShort(NumberUtil.asShort(appData.getRemotePortLow().getValue().shortValue()));
76 buffer.putShort((short) 0);
78 if (appData.getRemotePortHigh() != null) {
79 buffer.putShort(NumberUtil.asShort(appData.getRemotePortHigh().getValue().shortValue()));
81 buffer.putShort((short) 0);
83 SimpleAddressSerializer.getInstance().serialize(buffer, appData.getAddress());
87 protected Eid deserializeLcafEidData(ByteBuffer buffer, byte res2, short length, LispAddressSerializerContext ctx) {
88 EidBuilder eb = new EidBuilder();
89 eb.setAddressType(ApplicationDataLcaf.class);
90 eb.setVirtualNetworkId(getVni(ctx));
91 eb.setAddress(deserializeData(buffer, ctx));
96 protected Rloc deserializeLcafRlocData(ByteBuffer buffer, byte res2, short length, LispAddressSerializerContext ctx) {
97 RlocBuilder eb = new RlocBuilder();
98 eb.setAddressType(ApplicationDataLcaf.class);
99 eb.setVirtualNetworkId(null);
100 eb.setAddress(deserializeData(buffer, ctx));
104 private Address deserializeData(ByteBuffer buffer, LispAddressSerializerContext ctx) {
105 ApplicationDataBuilder builder = new ApplicationDataBuilder();
106 byte[] rawIPTos = new byte[3];
107 buffer.get(rawIPTos);
108 builder.setIpTos(ByteUtil.getPartialInt(rawIPTos));
109 builder.setProtocol((short) ByteUtil.getUnsignedByte(buffer));
110 builder.setLocalPortLow(new PortNumber(ByteUtil.asUnsignedShort(buffer.getShort())));
111 builder.setLocalPortHigh(new PortNumber(ByteUtil.asUnsignedShort(buffer.getShort())));
112 builder.setRemotePortLow(new PortNumber(ByteUtil.asUnsignedShort(buffer.getShort())));
113 builder.setRemotePortHigh(new PortNumber(ByteUtil.asUnsignedShort(buffer.getShort())));
114 SimpleAddress address = SimpleAddressSerializer.getInstance().deserialize(buffer, ctx);
115 builder.setAddress(address);
116 return new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ApplicationDataBuilder()
117 .setApplicationData(builder.build()).build();
120 private interface Length {
121 int LOCAL_PORT_LOW = 2;
122 int LOCAL_PORT_HIGH = 2;
123 int REMOTE_PORT_LOW = 2;
124 int REMOTE_PORT_HIGH = 2;
127 int ALL_FIELDS = LOCAL_PORT_LOW + LOCAL_PORT_HIGH + REMOTE_PORT_LOW + REMOTE_PORT_HIGH + TOC + PROTOCOL;