@Override
public void serialize(final FlowMod message, final ByteBuf outBuffer) {
+ int index = outBuffer.writerIndex();
ByteBufUtils.writeOFHeader(MESSAGE_TYPE, message, outBuffer, EncodeConstants.EMPTY_LENGTH);
outBuffer.writeLong(message.getCookie().longValue());
outBuffer.writeLong(message.getCookieMask().longValue());
registry.<Match, OFSerializer<Match>>getSerializer(new MessageTypeKey<>(message.getVersion(), Match.class))
.serialize(message.getMatch(), outBuffer);
ListSerializer.serializeList(message.getInstruction(), INSTRUCTION_KEY_MAKER, registry, outBuffer);
- ByteBufUtils.updateOFHeaderLength(outBuffer);
+ ByteBufUtils.updateOFHeaderLength(outBuffer, index);
}
@Override
@Override
public void serialize(FlowRemovedMessage message, ByteBuf outBuffer) {
+ int index = outBuffer.writerIndex();
ByteBufUtils.writeOFHeader(MESSAGE_TYPE, message, outBuffer, EncodeConstants.EMPTY_LENGTH);
outBuffer.writeLong(message.getCookie().longValue());
outBuffer.writeShort(message.getPriority());
OFSerializer<Match> matchSerializer = registry
.<Match, OFSerializer<Match>> getSerializer(new MessageTypeKey<>(message.getVersion(), Match.class));
matchSerializer.serialize(message.getMatch(), outBuffer);
- ByteBufUtils.updateOFHeaderLength(outBuffer);
+ ByteBufUtils.updateOFHeaderLength(outBuffer, index);
}
}
@Override
public void serialize(GroupMod message, ByteBuf outBuffer) {
+ int index = outBuffer.writerIndex();
ByteBufUtils.writeOFHeader(MESSAGE_TYPE, message, outBuffer, EncodeConstants.EMPTY_LENGTH);
outBuffer.writeShort(message.getCommand().getIntValue());
outBuffer.writeByte(message.getType().getIntValue());
outBuffer.writeZero(PADDING_IN_GROUP_MOD_MESSAGE);
outBuffer.writeInt(message.getGroupId().getValue().intValue());
serializerBuckets(message.getBucketsList(), outBuffer);
- ByteBufUtils.updateOFHeaderLength(outBuffer);
+ ByteBufUtils.updateOFHeaderLength(outBuffer, index);
}
private void serializerBuckets(List<BucketsList> buckets, ByteBuf outBuffer) {
@Override
public void serialize(final PortMod message, final ByteBuf outBuffer) {
+ int index = outBuffer.writerIndex();
ByteBufUtils.writeOFHeader(MESSAGE_TYPE, message, outBuffer, EncodeConstants.EMPTY_LENGTH);
outBuffer.writeInt(message.getPortNo().getValue().intValue());
outBuffer.writeZero(PADDING_IN_PORT_MOD_MESSAGE_01);
outBuffer.writeInt(createPortConfigBitmask(message.getMask()));
outBuffer.writeInt(createPortFeaturesBitmask(message.getAdvertise()));
outBuffer.writeZero(PADDING_IN_PORT_MOD_MESSAGE_03);
- ByteBufUtils.updateOFHeaderLength(outBuffer);
+ ByteBufUtils.updateOFHeaderLength(outBuffer, index);
}
/**
FlowModInput message = builder.build();
ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+
+ // simulate parent message
+ out.writeInt(1);
+ out.writeZero(2);
+ out.writeShort(3);
+
flowModFactory.serialize(message, out);
+ // read parent message
+ out.readInt();
+ out.skipBytes(2);
+ out.readShort();
+
BufferHelper.checkHeaderV13(out,(byte) 14, 128);
cookie = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
out.readBytes(cookie);
builder.setMatch(matchBuilder.build());
FlowRemovedMessage message = builder.build();
ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+
+ // simulate parent message
+ serializedBuffer.writeInt(1);
+ serializedBuffer.writeZero(2);
+ serializedBuffer.writeShort(3);
+
factory.serialize(message, serializedBuffer);
+ // read parent message
+ serializedBuffer.readInt();
+ serializedBuffer.skipBytes(2);
+ serializedBuffer.readShort();
+
BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 72);
Assert.assertEquals("Wrong cookie", message.getCookie().longValue(), serializedBuffer.readLong());
Assert.assertEquals("Wrong priority", message.getPriority().intValue(), serializedBuffer.readShort());
GroupModInput message = builder.build();
ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+
+ // simulate parent message
+ out.writeInt(1);
+ out.writeZero(2);
+ out.writeShort(3);
+
groupModFactory.serialize(message, out);
+ // read parent message
+ out.readInt();
+ out.skipBytes(2);
+ out.readShort();
+
BufferHelper.checkHeaderV13(out, MESSAGE_TYPE, 32);
Assert.assertEquals("Wrong command", message.getCommand().getIntValue(), out.readUnsignedShort());
Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedByte());
PortModInput message = builder.build();
ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+
+ // simulate parent message
+ out.writeInt(1);
+ out.writeZero(2);
+ out.writeShort(3);
+
portModFactory.serialize(message, out);
+ // read parent message
+ out.readInt();
+ out.skipBytes(2);
+ out.readShort();
+
BufferHelper.checkHeaderV13(out, MESSAGE_TYPE, MESSAGE_LENGTH);
Assert.assertEquals("Wrong PortNo", message.getPortNo().getValue().longValue(), out.readUnsignedInt());
out.skipBytes(PADDING_IN_PORT_MOD_MESSAGE_01);
out.setShort(EncodeConstants.OFHEADER_LENGTH_INDEX, out.readableBytes());
}
+ /**
+ * Write length OF header
+ * @param out writing buffer
+ * @param index writing index
+ */
+ public static void updateOFHeaderLength(final ByteBuf out, int index) {
+ out.setShort(index + EncodeConstants.OFHEADER_LENGTH_INDEX, out.writerIndex() - index);
+ }
+
/**
* Fills the bitmask from boolean map where key is bit position
* @param booleanMap bit to boolean mapping
Assert.assertTrue(bytes.length == shorts.size()*2);
Assert.assertArrayEquals(EXPECTEDVALUES1AND255, bytes);
}
+
+ @Test
+ public void testUpdateHeader() throws IOException {
+ ByteBuf buffer = PooledByteBufAllocator.DEFAULT.buffer();
+ buffer.writeInt(1);
+ int start = buffer.writerIndex();
+ buffer.writeShort(4);
+ buffer.writeShort(EncodeConstants.EMPTY_LENGTH);
+ buffer.writeLong(8);
+ int end = buffer.writerIndex();
+
+ ByteBufUtils.updateOFHeaderLength(buffer, start);
+ Assert.assertEquals(buffer.readInt(), 1);
+ Assert.assertEquals(buffer.readShort(), 4);
+ Assert.assertEquals(buffer.readShort(), 12);
+ Assert.assertEquals(buffer.readLong(), 8l);
+ Assert.assertEquals(buffer.getShort(start + EncodeConstants.OFHEADER_LENGTH_INDEX), end - start);
+ }
}