X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=mappingservice%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Flispflowmapping%2Fimplementation%2Fserializer%2FMapRequestSerializer.java;h=ef3ef1a4ebf414b8fa334895ec7bfa3666486ec1;hb=6421fa3f64d1cda64c51990ee366c16c74f96600;hp=4cd760ab354ffa8f785075a244b6881f7d434702;hpb=704be5bf966999341e588564610e6233ce7c4ef4;p=lispflowmapping.git diff --git a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/serializer/MapRequestSerializer.java b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/serializer/MapRequestSerializer.java index 4cd760ab3..ef3ef1a4e 100644 --- a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/serializer/MapRequestSerializer.java +++ b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/serializer/MapRequestSerializer.java @@ -1,13 +1,30 @@ +/* + * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ package org.opendaylight.lispflowmapping.implementation.serializer; import java.nio.ByteBuffer; +import java.util.ArrayList; +import org.apache.commons.lang3.BooleanUtils; import org.opendaylight.lispflowmapping.implementation.lisp.exception.LispSerializationException; import org.opendaylight.lispflowmapping.implementation.serializer.address.LispAddressSerializer; import org.opendaylight.lispflowmapping.implementation.util.ByteUtil; -import org.opendaylight.lispflowmapping.type.lisp.EidRecord; -import org.opendaylight.lispflowmapping.type.lisp.MapRequest; -import org.opendaylight.lispflowmapping.type.lisp.address.LispAddress; +import org.opendaylight.lispflowmapping.implementation.util.LispAFIConvertor; +import org.opendaylight.lispflowmapping.implementation.util.NumberUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.MapRequest; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidrecords.EidRecord; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidtolocatorrecords.EidToLocatorRecordBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.maprequest.ItrRloc; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.maprequest.ItrRlocBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.maprequest.SourceEidBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.maprequestnotification.MapRequestBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * This class deals with deserializing map request from udp to the java object. @@ -15,6 +32,7 @@ import org.opendaylight.lispflowmapping.type.lisp.address.LispAddress; public class MapRequestSerializer { private static final MapRequestSerializer INSTANCE = new MapRequestSerializer(); + protected static final Logger LOG = LoggerFactory.getLogger(MapRequestSerializer.class); // Private constructor prevents instantiation from other classes private MapRequestSerializer() { @@ -26,67 +44,122 @@ public class MapRequestSerializer { public ByteBuffer serialize(MapRequest mapRequest) { int size = Length.HEADER_SIZE; - size += LispAddressSerializer.getInstance().getAddressSize(mapRequest.getSourceEid()); - for (LispAddress address : mapRequest.getItrRlocs()) { - size += LispAddressSerializer.getInstance().getAddressSize(address); + if (mapRequest.getSourceEid() != null && mapRequest.getSourceEid().getLispAddressContainer() != null) { + size += LispAddressSerializer.getInstance().getAddressSize( + LispAFIConvertor.toAFI(mapRequest.getSourceEid().getLispAddressContainer())); + } else { + size += 2; } - for (EidRecord record : mapRequest.getEids()) { - size += 2 + LispAddressSerializer.getInstance().getAddressSize(record.getPrefix()); + if (mapRequest.getItrRloc() != null) { + for (ItrRloc address : mapRequest.getItrRloc()) { + size += LispAddressSerializer.getInstance().getAddressSize(LispAFIConvertor.toAFI(address.getLispAddressContainer())); + } } - ByteBuffer requestBuffer = ByteBuffer.allocate(size); - requestBuffer - .put((byte) ((byte) (LispMessageEnum.MapRequest.getValue() << 4) - | ByteUtil.boolToBit(mapRequest.isAuthoritative(), Flags.AUTHORITATIVE) - | ByteUtil.boolToBit(mapRequest.isMapDataPresent(), Flags.MAP_DATA_PRESENT) - | ByteUtil.boolToBit(mapRequest.isProbe(), Flags.PROBE) | ByteUtil.boolToBit(mapRequest.isSmr(), Flags.SMR))); - requestBuffer.put((byte) (ByteUtil.boolToBit(mapRequest.isPitr(), Flags.PITR) | ByteUtil.boolToBit(mapRequest.isSmrInvoked(), - Flags.SMR_INVOKED))); - int IRC = mapRequest.getItrRlocs().size(); - if (IRC > 0) { - IRC--; + if (mapRequest.getEidRecord() != null) { + for (EidRecord record : mapRequest.getEidRecord()) { + size += 2 + LispAddressSerializer.getInstance().getAddressSize(LispAFIConvertor.toAFI(record.getLispAddressContainer())); + } } - requestBuffer.put((byte) (IRC)); - requestBuffer.put((byte) mapRequest.getEids().size()); - requestBuffer.putLong(mapRequest.getNonce()); - LispAddressSerializer.getInstance().serialize(requestBuffer, mapRequest.getSourceEid()); - for (LispAddress address : mapRequest.getItrRlocs()) { - LispAddressSerializer.getInstance().serialize(requestBuffer, address); + ByteBuffer requestBuffer = ByteBuffer.allocate(size); + requestBuffer.put((byte) ((byte) (LispMessageEnum.MapRequest.getValue() << 4) + | ByteUtil.boolToBit(BooleanUtils.isTrue(mapRequest.isAuthoritative()), Flags.AUTHORITATIVE) + | ByteUtil.boolToBit(BooleanUtils.isTrue(mapRequest.isMapDataPresent()), Flags.MAP_DATA_PRESENT) + | ByteUtil.boolToBit(BooleanUtils.isTrue(mapRequest.isProbe()), Flags.PROBE) | ByteUtil.boolToBit( + BooleanUtils.isTrue(mapRequest.isSmr()), Flags.SMR))); + requestBuffer.put((byte) (ByteUtil.boolToBit(BooleanUtils.isTrue(mapRequest.isPitr()), Flags.PITR) | ByteUtil.boolToBit( + BooleanUtils.isTrue(mapRequest.isSmrInvoked()), Flags.SMR_INVOKED))); + if (mapRequest.getItrRloc() != null) { + int IRC = mapRequest.getItrRloc().size(); + if (IRC > 0) { + IRC--; + } + requestBuffer.put((byte) (IRC)); + } else { + requestBuffer.put((byte) 0); + } - for (EidRecord record : mapRequest.getEids()) { + if (mapRequest.getEidRecord() != null) { + requestBuffer.put((byte) mapRequest.getEidRecord().size()); + } else { requestBuffer.put((byte) 0); - requestBuffer.put((byte) record.getMaskLength()); - LispAddressSerializer.getInstance().serialize(requestBuffer, record.getPrefix()); + + } + requestBuffer.putLong(NumberUtil.asLong(mapRequest.getNonce())); + if (mapRequest.getSourceEid() != null && mapRequest.getSourceEid().getLispAddressContainer() != null) { + LispAddressSerializer.getInstance().serialize(requestBuffer, + LispAFIConvertor.toAFI(mapRequest.getSourceEid().getLispAddressContainer())); + } else { + requestBuffer.putShort((short) 0); + } + if (mapRequest.getItrRloc() != null) { + for (ItrRloc address : mapRequest.getItrRloc()) { + LispAddressSerializer.getInstance().serialize(requestBuffer, LispAFIConvertor.toAFI(address.getLispAddressContainer())); + } + } + if (mapRequest.getEidRecord() != null) { + for (EidRecord record : mapRequest.getEidRecord()) { + requestBuffer.put((byte) 0); + requestBuffer.put((byte) record.getMask().byteValue()); + LispAddressSerializer.getInstance().serialize(requestBuffer, LispAFIConvertor.toAFI(record.getLispAddressContainer())); + } + } + if (mapRequest.getMapReply() != null) { + ByteBuffer replyBuffer = ByteBuffer.allocate(EidToLocatorRecordSerializer.getInstance().getSerializationSize(mapRequest.getMapReply())); + EidToLocatorRecordSerializer.getInstance().serialize(replyBuffer, mapRequest.getMapReply()); + ByteBuffer combinedBuffer = ByteBuffer.allocate(requestBuffer.capacity() + replyBuffer.capacity()); + combinedBuffer.put(requestBuffer.array()); + combinedBuffer.put(replyBuffer.array()); + return combinedBuffer; } return requestBuffer; } public MapRequest deserialize(ByteBuffer requestBuffer) { try { - MapRequest mapRequest = new MapRequest(); + MapRequestBuilder builder = new MapRequestBuilder(); byte typeAndFlags = requestBuffer.get(); - mapRequest.setAuthoritative(ByteUtil.extractBit(typeAndFlags, Flags.AUTHORITATIVE)); - mapRequest.setMapDataPresent(ByteUtil.extractBit(typeAndFlags, Flags.MAP_DATA_PRESENT)); - mapRequest.setProbe(ByteUtil.extractBit(typeAndFlags, Flags.PROBE)); - mapRequest.setSmr(ByteUtil.extractBit(typeAndFlags, Flags.SMR)); + builder.setAuthoritative(ByteUtil.extractBit(typeAndFlags, Flags.AUTHORITATIVE)); + builder.setMapDataPresent(ByteUtil.extractBit(typeAndFlags, Flags.MAP_DATA_PRESENT)); + builder.setProbe(ByteUtil.extractBit(typeAndFlags, Flags.PROBE)); + builder.setSmr(ByteUtil.extractBit(typeAndFlags, Flags.SMR)); byte moreFlags = requestBuffer.get(); - mapRequest.setPitr(ByteUtil.extractBit(moreFlags, Flags.PITR)); - mapRequest.setSmrInvoked(ByteUtil.extractBit(moreFlags, Flags.SMR_INVOKED)); - - int itrCount = requestBuffer.get() + 1; - int recordCount = requestBuffer.get(); - mapRequest.setNonce(requestBuffer.getLong()); - mapRequest.setSourceEid(LispAddressSerializer.getInstance().deserialize(requestBuffer)); - + builder.setPitr(ByteUtil.extractBit(moreFlags, Flags.PITR)); + builder.setSmrInvoked(ByteUtil.extractBit(moreFlags, Flags.SMR_INVOKED)); + + int itrCount = ByteUtil.getUnsignedByte(requestBuffer) + 1; + int recordCount = ByteUtil.getUnsignedByte(requestBuffer); + builder.setNonce(requestBuffer.getLong()); + builder.setSourceEid(new SourceEidBuilder().setLispAddressContainer( + LispAFIConvertor.toContainer(LispAddressSerializer.getInstance().deserialize(requestBuffer))) + .build()); + + if (builder.getItrRloc() == null) { + builder.setItrRloc(new ArrayList()); + } for (int i = 0; i < itrCount; i++) { - mapRequest.addItrRloc(LispAddressSerializer.getInstance().deserialize(requestBuffer)); + builder.getItrRloc().add( + new ItrRlocBuilder().setLispAddressContainer( + LispAFIConvertor.toContainer(LispAddressSerializer.getInstance().deserialize(requestBuffer))) + .build()); } + if (builder.getEidRecord() == null) { + builder.setEidRecord(new ArrayList()); + } for (int i = 0; i < recordCount; i++) { - mapRequest.addEidRecord(EidRecordSerializer.getInstance().deserialize(requestBuffer)); + builder.getEidRecord().add(EidRecordSerializer.getInstance().deserialize(requestBuffer)); + } + if (builder.isMapDataPresent() && requestBuffer.hasRemaining()) { + try { + builder.setMapReply(new org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.maprequest.MapReplyBuilder( + new EidToLocatorRecordBuilder(EidToLocatorRecordSerializer.getInstance().deserialize(requestBuffer)).build()).build()); + } catch (RuntimeException re) { + LOG.warn("couldn't deserialize map reply encapsulated in map request. {}", re.getMessage()); + } } - return mapRequest; + return builder.build(); } catch (RuntimeException re) { throw new LispSerializationException("Couldn't deserialize Map-Request (len=" + requestBuffer.capacity() + ")", re); }