From 045d5f1497d33efa7f2397cb87b0a11f82c8f947 Mon Sep 17 00:00:00 2001 From: Michal Rehak Date: Fri, 29 Nov 2013 11:13:35 +0100 Subject: [PATCH] fixed slicing in frame processing detected length of next (incomplete) message was readed from wrong position Change-Id: Iea7ec3f392c2a38e8dc6becb21914b018f878faa Signed-off-by: Michal Rehak --- .../protocol/impl/core/OFDecoder.java | 7 +++-- .../protocol/impl/core/OFFrameDecoder.java | 29 +++++++++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFDecoder.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFDecoder.java index ceec8dfa..d0d39962 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFDecoder.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFDecoder.java @@ -30,8 +30,11 @@ public class OFDecoder extends MessageToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, VersionMessageWrapper msg, List out) throws Exception { - LOGGER.debug("VersionMessageWrapper received"); - LOGGER.debug("<< " + ByteBufUtils.byteBufToHexString(msg.getMessageBuffer())); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("VersionMessageWrapper received"); + LOGGER.debug("buffer size: " + msg.getMessageBuffer().readableBytes()); + LOGGER.debug("<< " + ByteBufUtils.byteBufToHexString(msg.getMessageBuffer())); + } DataObject dataObject = null; try { dataObject = DeserializationFactory.bufferToMessage(msg.getMessageBuffer(), diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFFrameDecoder.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFFrameDecoder.java index 300e3373..c342e9d5 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFFrameDecoder.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFFrameDecoder.java @@ -8,6 +8,7 @@ import io.netty.handler.codec.ByteToMessageDecoder; import java.util.List; +import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,19 +38,29 @@ public class OFFrameDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext chc, ByteBuf bb, List list) throws Exception { - if (bb.readableBytes() < LENGTH_OF_HEADER) { - LOGGER.debug("skipping bb - too few data for header: " + bb.readableBytes()); + int readableBytes = bb.readableBytes(); + if (readableBytes < LENGTH_OF_HEADER) { + LOGGER.debug("skipping bb - too few data for header: " + readableBytes); return; } - - int length = bb.getUnsignedShort(LENGTH_INDEX_IN_HEADER); - if (bb.readableBytes() < length) { - LOGGER.debug("skipping bb - too few data for msg: " + - bb.readableBytes() + " < " + length); + + int length = bb.getUnsignedShort(bb.readerIndex() + LENGTH_INDEX_IN_HEADER); + LOGGER.debug("length of actual message: {}", length); + + if (readableBytes < length) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("skipping bb - too few data for msg: " + + readableBytes + " < " + length); + LOGGER.debug("bb: " + ByteBufUtils.byteBufToHexString(bb)); + LOGGER.debug("readableBytes: " + readableBytes); + } + return; + } else { + LOGGER.debug("[enough bytes] readableBytes: " + readableBytes); } - LOGGER.info("OF Protocol message received, type:{}", bb.getByte(1)); - + LOGGER.info("OF Protocol message received, type:{}", bb.getByte(bb.readerIndex() + 1)); + ByteBuf messageBuffer = bb.slice(bb.readerIndex(), length); list.add(messageBuffer); messageBuffer.retain(); -- 2.36.6