1 package org.opendaylight.lispflowmapping.implementation.serializer;
3 import java.nio.ByteBuffer;
4 import java.util.ArrayList;
6 import org.apache.commons.lang3.BooleanUtils;
7 import org.opendaylight.lispflowmapping.implementation.util.ByteUtil;
8 import org.opendaylight.lispflowmapping.implementation.util.NumberUtil;
9 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapReply;
10 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord;
11 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.mapreplymessage.MapReplyBuilder;
14 * This class deals with serializing map reply from the java object to udp.
16 public class MapReplySerializer {
18 private static final MapReplySerializer INSTANCE = new MapReplySerializer();
20 // Private constructor prevents instantiation from other classes
21 private MapReplySerializer() {
24 public static MapReplySerializer getInstance() {
28 public ByteBuffer serialize(MapReply mapReply) {
29 int size = Length.HEADER_SIZE;
30 for (EidToLocatorRecord eidToLocatorRecord : mapReply.getEidToLocatorRecord()) {
31 size += EidToLocatorRecordSerializer.getInstance().getSerializationSize(eidToLocatorRecord);
34 ByteBuffer replyBuffer = ByteBuffer.allocate(size);
36 replyBuffer.put((byte) ((LispMessageEnum.MapReply.getValue() << 4) | //
37 (BooleanUtils.isTrue(mapReply.isProbe()) ? Flags.PROBE : 0x00) | //
38 (BooleanUtils.isTrue(mapReply.isEchoNonceEnabled()) ? Flags.ECHO_NONCE_ENABLED : 0x00)));
40 replyBuffer.position(replyBuffer.position() + Length.RES);
41 if (mapReply.getEidToLocatorRecord() != null) {
42 replyBuffer.put((byte) mapReply.getEidToLocatorRecord().size());
44 replyBuffer.put((byte) 0);
47 replyBuffer.putLong(NumberUtil.asLong(mapReply.getNonce()));
48 if (mapReply.getEidToLocatorRecord() != null) {
49 for (EidToLocatorRecord eidToLocatorRecord : mapReply.getEidToLocatorRecord()) {
50 EidToLocatorRecordSerializer.getInstance().serialize(replyBuffer, eidToLocatorRecord);
56 public MapReply deserialize(ByteBuffer replyBuffer) {
57 MapReplyBuilder builder = new MapReplyBuilder();
58 byte typeAndFlags = replyBuffer.get();
59 builder.setProbe(ByteUtil.extractBit(typeAndFlags, Flags.PROBE));
60 builder.setEchoNonceEnabled(ByteUtil.extractBit(typeAndFlags, Flags.ECHO_NONCE_ENABLED));
61 builder.setSecurityEnabled(ByteUtil.extractBit(typeAndFlags, Flags.SECURITY_ENABLED));
62 replyBuffer.getShort();
63 int recordCount = replyBuffer.get();
64 builder.setNonce(replyBuffer.getLong());
65 builder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
66 for (int i = 0; i < recordCount; i++) {
67 builder.getEidToLocatorRecord().add(EidToLocatorRecordSerializer.getInstance().deserialize(replyBuffer));
70 return builder.build();
73 private interface Length {
78 private interface Flags {
80 int ECHO_NONCE_ENABLED = 0x04;
81 int SECURITY_ENABLED = 0x02;