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.implementation.serializer;
10 import java.nio.ByteBuffer;
11 import java.util.ArrayList;
13 import org.apache.commons.lang3.BooleanUtils;
14 import org.opendaylight.lispflowmapping.implementation.util.ByteUtil;
15 import org.opendaylight.lispflowmapping.implementation.util.NumberUtil;
16 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapReply;
17 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord;
18 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecordBuilder;
19 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.mapreplymessage.MapReplyBuilder;
22 * This class deals with serializing map reply from the java object to udp.
24 public class MapReplySerializer {
26 private static final MapReplySerializer INSTANCE = new MapReplySerializer();
28 // Private constructor prevents instantiation from other classes
29 private MapReplySerializer() {
32 public static MapReplySerializer getInstance() {
36 public ByteBuffer serialize(MapReply mapReply) {
37 int size = Length.HEADER_SIZE;
38 for (EidToLocatorRecord eidToLocatorRecord : mapReply.getEidToLocatorRecord()) {
39 size += EidToLocatorRecordSerializer.getInstance().getSerializationSize(eidToLocatorRecord);
42 ByteBuffer replyBuffer = ByteBuffer.allocate(size);
44 replyBuffer.put((byte) ((LispMessageEnum.MapReply.getValue() << 4) | //
45 (BooleanUtils.isTrue(mapReply.isProbe()) ? Flags.PROBE : 0x00) | //
46 (BooleanUtils.isTrue(mapReply.isEchoNonceEnabled()) ? Flags.ECHO_NONCE_ENABLED : 0x00)));
48 replyBuffer.position(replyBuffer.position() + Length.RES);
49 if (mapReply.getEidToLocatorRecord() != null) {
50 replyBuffer.put((byte) mapReply.getEidToLocatorRecord().size());
52 replyBuffer.put((byte) 0);
55 replyBuffer.putLong(NumberUtil.asLong(mapReply.getNonce()));
56 if (mapReply.getEidToLocatorRecord() != null) {
57 for (EidToLocatorRecord eidToLocatorRecord : mapReply.getEidToLocatorRecord()) {
58 EidToLocatorRecordSerializer.getInstance().serialize(replyBuffer, eidToLocatorRecord);
64 public MapReply deserialize(ByteBuffer replyBuffer) {
65 MapReplyBuilder builder = new MapReplyBuilder();
66 byte typeAndFlags = replyBuffer.get();
67 builder.setProbe(ByteUtil.extractBit(typeAndFlags, Flags.PROBE));
68 builder.setEchoNonceEnabled(ByteUtil.extractBit(typeAndFlags, Flags.ECHO_NONCE_ENABLED));
69 builder.setSecurityEnabled(ByteUtil.extractBit(typeAndFlags, Flags.SECURITY_ENABLED));
70 replyBuffer.getShort();
71 int recordCount = ByteUtil.getUnsignedByte(replyBuffer);
72 builder.setNonce(replyBuffer.getLong());
73 builder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
74 for (int i = 0; i < recordCount; i++) {
75 builder.getEidToLocatorRecord().add(
76 new EidToLocatorRecordBuilder(EidToLocatorRecordSerializer.getInstance().deserialize(replyBuffer)).build());
79 return builder.build();
82 private interface Length {
87 private interface Flags {
89 int ECHO_NONCE_ENABLED = 0x04;
90 int SECURITY_ENABLED = 0x02;