From: Michal Rehak Date: Fri, 29 Nov 2013 10:13:35 +0000 (+0100) Subject: fixed slicing in frame processing X-Git-Tag: jenkins-openflowjava-bulk-release-prepare-only-1~49^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=045d5f1497d33efa7f2397cb87b0a11f82c8f947;p=openflowjava.git fixed slicing in frame processing detected length of next (incomplete) message was readed from wrong position Change-Id: Iea7ec3f392c2a38e8dc6becb21914b018f878faa Signed-off-by: Michal Rehak --- 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();