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.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.statistics.CounterEventTypes;
+import org.opendaylight.openflowjava.statistics.StatisticsCounters;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 Logger LOGGER = LoggerFactory.getLogger(OFVersionDetector.class);
+ private static final short OF_PACKETIN = 10;
+ private static final Logger LOG = LoggerFactory.getLogger(OFVersionDetector.class);
+ private final StatisticsCounters statisticsCounters;
+ private volatile boolean filterPacketIns;
/**
* Constructor of class.
*/
public OFVersionDetector() {
- LOGGER.trace("Creating OFVersionDetector");
+ LOG.trace("Creating OFVersionDetector");
+ statisticsCounters = StatisticsCounters.getInstance();
+ }
+
+ public void setFilterPacketIns(final boolean enabled) {
+ filterPacketIns = enabled;
}
@Override
- protected void decode(ChannelHandlerContext chc, ByteBuf bb, List<Object> list) throws Exception {
- if (bb.readableBytes() == 0) {
- LOGGER.debug("not enough data");
- bb.release();
+ protected void decode(final ChannelHandlerContext ctx, final ByteBuf in, final List<Object> out) {
+ if (!in.isReadable()) {
+ LOG.debug("not enough data");
+ in.release();
return;
}
- byte version = bb.readByte();
- if ((version == OF13_VERSION_ID) || (version == OF10_VERSION_ID)) {
- LOGGER.debug("detected version: " + version);
- ByteBuf messageBuffer = bb.slice();
- list.add(new VersionMessageWrapper(version, messageBuffer));
- messageBuffer.retain();
+
+ final byte version = in.readByte();
+ if (version == OF13_VERSION_ID || version == OF10_VERSION_ID) {
+ LOG.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 {
+ LOG.debug("dropped packetin");
+ statisticsCounters.incrementCounter(CounterEventTypes.US_DROPPED_PACKET_IN);
+ }
} else {
- LOGGER.warn("detected version: " + version + " - currently not supported");
+ LOG.warn("detected version: {} - currently not supported", version);
}
- bb.skipBytes(bb.readableBytes());
+ in.skipBytes(in.readableBytes());
}
-
}