X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fprotocol%2Fimpl%2Fcore%2FOFVersionDetector.java;h=0142ebfd671634a89b6604369c201c7fab55a6c0;hb=c3c505024150f1c6acf2c1db42f0b5479ad78e0a;hp=719965b9dd44e001d04b4feafe805033d5488878;hpb=b423babf834657a6e60912d7733c1df93baff6f6;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFVersionDetector.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFVersionDetector.java index 719965b9..0142ebfd 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFVersionDetector.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/OFVersionDetector.java @@ -11,10 +11,10 @@ package org.opendaylight.openflowjava.protocol.impl.core; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; - import java.util.List; - -import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.statistics.CounterEventTypes; +import org.opendaylight.openflowjava.statistics.StatisticsCounters; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,35 +28,45 @@ public class OFVersionDetector extends ByteToMessageDecoder { private static final byte OF10_VERSION_ID = EncodeConstants.OF10_VERSION_ID; /** Version number of OpenFlow 1.3 protocol */ private static final byte OF13_VERSION_ID = EncodeConstants.OF13_VERSION_ID; + private static final short OF_PACKETIN = 10; private static final Logger LOGGER = LoggerFactory.getLogger(OFVersionDetector.class); + private final StatisticsCounters statisticsCounters; + private volatile boolean filterPacketIns; /** * Constructor of class. */ public OFVersionDetector() { LOGGER.trace("Creating OFVersionDetector"); + statisticsCounters = StatisticsCounters.getInstance(); + } + + public void setFilterPacketIns(final boolean enabled) { + filterPacketIns = enabled; } @Override - protected void decode(ChannelHandlerContext chc, ByteBuf bb, List list) throws Exception { - if (bb.readableBytes() == 0) { + protected void decode(final ChannelHandlerContext ctx, final ByteBuf in, final List out) { + if (!in.isReadable()) { LOGGER.debug("not enough data"); - bb.release(); + in.release(); return; } - byte version = bb.readByte(); - if ((version == OF13_VERSION_ID) || (version == OF10_VERSION_ID)) { - LOGGER.debug("detected version: " + version); + + final byte version = in.readByte(); + if (version == OF13_VERSION_ID || version == OF10_VERSION_ID) { + LOGGER.debug("detected version: {}", version); + if (!filterPacketIns || OF_PACKETIN != in.getUnsignedByte(in.readerIndex())) { + ByteBuf messageBuffer = in.slice(); + out.add(new VersionMessageWrapper(version, messageBuffer)); + messageBuffer.retain(); + } else { + LOGGER.debug("dropped packetin"); + statisticsCounters.incrementCounter(CounterEventTypes.US_DROPPED_PACKET_IN); + } } else { - LOGGER.warn("detected version: " + version + " - currently not supported"); - bb.skipBytes(bb.readableBytes()); - return; + LOGGER.warn("detected version: {} - currently not supported", version); } - - ByteBuf messageBuffer = bb.slice(); - list.add(new VersionMessageWrapper(version, messageBuffer)); - messageBuffer.retain(); - bb.skipBytes(bb.readableBytes()); + in.skipBytes(in.readableBytes()); } - }