import java.nio.ByteBuffer;
import java.util.ArrayList;
-
import org.apache.commons.lang3.BooleanUtils;
-import org.opendaylight.lispflowmapping.lisp.type.LispMessageEnum;
+import org.opendaylight.lispflowmapping.lisp.serializer.exception.LispSerializationException;
import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
import org.opendaylight.lispflowmapping.lisp.util.NumberUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapReply;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MessageType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapreplymessage.MapReplyBuilder;
/**
* This class deals with serializing map reply from the java object to udp.
*/
-public class MapReplySerializer {
+public final class MapReplySerializer {
private static final MapReplySerializer INSTANCE = new MapReplySerializer();
public ByteBuffer serialize(MapReply mapReply) {
int size = Length.HEADER_SIZE;
- for (MappingRecordItem eidToLocatorRecord : mapReply.getMappingRecordItem()) {
+ for (MappingRecordItem eidToLocatorRecord : mapReply.nonnullMappingRecordItem()) {
size += MappingRecordSerializer.getInstance().getSerializationSize(eidToLocatorRecord.getMappingRecord());
}
ByteBuffer replyBuffer = ByteBuffer.allocate(size);
- replyBuffer.put((byte) ((LispMessageEnum.MapReply.getValue() << 4) | //
- (BooleanUtils.isTrue(mapReply.isProbe()) ? Flags.PROBE : 0x00) | //
- (BooleanUtils.isTrue(mapReply.isEchoNonceEnabled()) ? Flags.ECHO_NONCE_ENABLED : 0x00)));
+ replyBuffer.put((byte) (MessageType.MapReply.getIntValue() << 4
+ | (BooleanUtils.isTrue(mapReply.getProbe()) ? Flags.PROBE : 0x00)
+ | (BooleanUtils.isTrue(mapReply.getEchoNonceEnabled()) ? Flags.ECHO_NONCE_ENABLED : 0x00)));
replyBuffer.position(replyBuffer.position() + Length.RES);
if (mapReply.getMappingRecordItem() != null) {
}
replyBuffer.putLong(NumberUtil.asLong(mapReply.getNonce()));
if (mapReply.getMappingRecordItem() != null) {
- for (MappingRecordItem eidToLocatorRecord : mapReply.getMappingRecordItem()) {
+ for (MappingRecordItem eidToLocatorRecord : mapReply.nonnullMappingRecordItem()) {
MappingRecordSerializer.getInstance().serialize(replyBuffer, eidToLocatorRecord.getMappingRecord());
}
}
}
public MapReply deserialize(ByteBuffer replyBuffer) {
+ final byte typeAndFlags = replyBuffer.get();
+ final int type = typeAndFlags >> 4;
+ if (MessageType.forValue(type) != MessageType.MapReply) {
+ throw new LispSerializationException("Expected Map-Reply packet (type 2), but was type " + type);
+ }
+
MapReplyBuilder builder = new MapReplyBuilder();
- byte typeAndFlags = replyBuffer.get();
builder.setProbe(ByteUtil.extractBit(typeAndFlags, Flags.PROBE));
builder.setEchoNonceEnabled(ByteUtil.extractBit(typeAndFlags, Flags.ECHO_NONCE_ENABLED));
builder.setSecurityEnabled(ByteUtil.extractBit(typeAndFlags, Flags.SECURITY_ENABLED));
builder.setNonce(replyBuffer.getLong());
builder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
for (int i = 0; i < recordCount; i++) {
- builder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(
- MappingRecordSerializer.getInstance().deserialize(replyBuffer)).build());
+ builder.getMappingRecordItem().add(new MappingRecordItemBuilder()
+ .withKey(new MappingRecordItemKey(Integer.toString(i)))
+ .setMappingRecord(MappingRecordSerializer.getInstance().deserialize(replyBuffer))
+ .build());
}
return builder.build();