use of org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequest in project lispflowmapping by opendaylight.
the class MapRequestSerializationTest method deserialize__MultipleEidItem.
@Test
public void deserialize__MultipleEidItem() throws Exception {
MapRequest mr = MapRequestSerializer.getInstance().deserialize(hexToByteBuffer("16 80 00 " + //
"02 " + // 2 records
"3d 8d 2a cd 39 c8 d6 08 00 00 00 01 c0 a8 88 0a " + //
"00 20 00 01 01 02 03 04 " + //
"00 80 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05"), null);
assertEquals(2, mr.getEidItem().size());
assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"), mr.getEidItem().get(0).getEid());
assertEquals(LispAddressUtil.asIpv6PrefixBinaryEid("0:0:0:0:0:0:0:5/128"), mr.getEidItem().get(1).getEid());
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequest in project lispflowmapping by opendaylight.
the class MapRequestSerializer method serialize.
public ByteBuffer serialize(MapRequest mapRequest) {
int size = Length.HEADER_SIZE;
if (mapRequest.getSourceEid() != null && mapRequest.getSourceEid().getEid() != null) {
size += LispAddressSerializer.getInstance().getAddressSize(mapRequest.getSourceEid().getEid());
} else {
size += 2;
}
if (mapRequest.getItrRloc() != null) {
for (ItrRloc address : mapRequest.getItrRloc()) {
size += LispAddressSerializer.getInstance().getAddressSize(address.getRloc());
}
}
if (mapRequest.getEidItem() != null) {
for (EidItem record : mapRequest.getEidItem()) {
size += 2 + LispAddressSerializer.getInstance().getAddressSize(record.getEid());
}
}
ByteBuffer requestBuffer = ByteBuffer.allocate(size);
requestBuffer.put((byte) ((byte) (MessageType.MapRequest.getIntValue() << 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);
}
if (mapRequest.getEidItem() != null) {
requestBuffer.put((byte) mapRequest.getEidItem().size());
} else {
requestBuffer.put((byte) 0);
}
requestBuffer.putLong(NumberUtil.asLong(mapRequest.getNonce()));
if (mapRequest.getSourceEid() != null && mapRequest.getSourceEid().getEid() != null) {
LispAddressSerializer.getInstance().serialize(requestBuffer, mapRequest.getSourceEid().getEid());
} else {
requestBuffer.putShort((short) 0);
}
if (mapRequest.getItrRloc() != null) {
for (ItrRloc address : mapRequest.getItrRloc()) {
LispAddressSerializer.getInstance().serialize(requestBuffer, address.getRloc());
}
}
if (mapRequest.getEidItem() != null) {
for (EidItem record : mapRequest.getEidItem()) {
requestBuffer.put((byte) 0);
requestBuffer.put((byte) MaskUtil.getMaskForAddress(record.getEid().getAddress()));
LispAddressSerializer.getInstance().serialize(requestBuffer, record.getEid());
}
}
if (mapRequest.getMapReply() != null) {
ByteBuffer replyBuffer = ByteBuffer.allocate(MappingRecordSerializer.getInstance().getSerializationSize(mapRequest.getMapReply().getMappingRecord()));
MappingRecordSerializer.getInstance().serialize(replyBuffer, mapRequest.getMapReply().getMappingRecord());
ByteBuffer combinedBuffer = ByteBuffer.allocate(requestBuffer.capacity() + replyBuffer.capacity());
combinedBuffer.put(requestBuffer.array());
combinedBuffer.put(replyBuffer.array());
return combinedBuffer;
}
return requestBuffer;
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequest in project lispflowmapping by opendaylight.
the class MapRequestSerializer method deserialize.
@SuppressWarnings("checkstyle:IllegalCatch")
public MapRequest deserialize(ByteBuffer requestBuffer, InetAddress sourceRloc) {
try {
final byte typeAndFlags = requestBuffer.get();
final int type = typeAndFlags >> 4;
if (MessageType.forValue(type) != MessageType.MapRequest) {
throw new LispSerializationException("Expected Map-Request packet (type 1), but was type " + type);
}
MapRequestBuilder builder = new MapRequestBuilder();
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));
final byte moreFlags = requestBuffer.get();
builder.setPitr(ByteUtil.extractBit(moreFlags, Flags.PITR));
builder.setSmrInvoked(ByteUtil.extractBit(moreFlags, Flags.SMR_INVOKED));
final int itrCount = ByteUtil.getUnsignedByte(requestBuffer) + 1;
final int recordCount = ByteUtil.getUnsignedByte(requestBuffer);
builder.setNonce(requestBuffer.getLong());
LispAddressSerializerContext ctx = new LispAddressSerializerContext(LispAddressSerializerContext.MASK_LEN_MISSING);
builder.setSourceEid(new SourceEidBuilder().setEid(LispAddressSerializer.getInstance().deserializeEid(requestBuffer, ctx)).build());
if (builder.getItrRloc() == null) {
builder.setItrRloc(new ArrayList<ItrRloc>());
}
for (int i = 0; i < itrCount; i++) {
builder.getItrRloc().add(new ItrRlocBuilder().setRloc(LispAddressSerializer.getInstance().deserializeRloc(requestBuffer)).build());
}
if (builder.getEidItem() == null) {
builder.setEidItem(new ArrayList<EidItem>());
}
for (int i = 0; i < recordCount; i++) {
builder.getEidItem().add(new EidItemBuilder().setEid(EidRecordSerializer.getInstance().deserialize(requestBuffer)).build());
}
if (builder.isMapDataPresent() && requestBuffer.hasRemaining()) {
try {
builder.setMapReply(new org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.MapReplyBuilder().setMappingRecord(MappingRecordSerializer.getInstance().deserialize(requestBuffer)).build()).build();
} catch (RuntimeException re) {
LOG.warn("Couldn't deserialize Map-Reply encapsulated in Map-Request", re);
}
}
builder.setSourceRloc(LispAddressUtil.addressBinaryFromInet(sourceRloc));
return builder.build();
} catch (RuntimeException re) {
throw new LispSerializationException("Couldn't deserialize Map-Request (len=" + requestBuffer.capacity() + ")", re);
}
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequest in project lispflowmapping by opendaylight.
the class LispXtrSouthboundHandler method handleMapRequest.
@SuppressWarnings("checkstyle:IllegalCatch")
private void handleMapRequest(ByteBuffer inBuffer, InetAddress sourceAddress) {
try {
MapRequest request = MapRequestSerializer.getInstance().deserialize(inBuffer, sourceAddress);
InetAddress finalSourceAddress = MapRequestUtil.selectItrRloc(request);
if (finalSourceAddress == null) {
throw new LispMalformedPacketException("Couldn't deserialize Map-Request, no ITR Rloc found!");
}
XtrRequestMappingBuilder requestMappingBuilder = new XtrRequestMappingBuilder();
requestMappingBuilder.setMapRequest(LispNotificationHelper.convertMapRequest(request));
TransportAddressBuilder transportAddressBuilder = new TransportAddressBuilder();
transportAddressBuilder.setIpAddress(LispNotificationHelper.getIpAddressBinaryFromInetAddress(finalSourceAddress));
transportAddressBuilder.setPort(new PortNumber(LispMessage.PORT_NUM));
requestMappingBuilder.setTransportAddress(transportAddressBuilder.build());
lispSbPlugin.sendNotificationIfPossible(requestMappingBuilder.build());
} catch (RuntimeException re) {
throw new LispMalformedPacketException("Couldn't deserialize Map-Request (len=" + inBuffer.capacity() + ")", re);
} catch (InterruptedException e) {
LOG.warn("Notification publication interrupted!");
}
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequest in project lispflowmapping by opendaylight.
the class LispXtrSouthboundHandlerTest method handlePacketTest_withMapRequest.
/**
* Tests {@link LispXtrSouthboundHandler#handlePacket} method with Map-Request.
*/
@Test
public void handlePacketTest_withMapRequest() throws InterruptedException {
final ArgumentCaptor<XtrRequestMapping> captor = ArgumentCaptor.forClass(XtrRequestMapping.class);
// expected result
final MapRequest expectedRequest = getDefaultMapRequestBuilder().build();
handler.handlePacket(extractLispPacket(MAP_REQUEST_PACKET_STRING, HEADER_LENGTH, LISP_MAP_REQUEST_PACKET_LENGTH));
Mockito.verify(lispSbPluginMock).sendNotificationIfPossible(captor.capture());
assertEquals(expectedRequest, captor.getValue().getMapRequest());
}
Aggregations