-/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
+/*
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.opendaylight.openflowjava.protocol.impl.core;
import io.netty.buffer.ByteBuf;
import java.util.List;
+import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler.COMPONENT_NAMES;
/**
- * Class that detects version of used OpenFlow Protocol and engages right OFCodec into
- * pipeline.
- *
+ * Detects version of used OpenFlow Protocol and discards unsupported version messages
* @author michal.polkorab
*/
public class OFVersionDetector extends ByteToMessageDecoder {
+ /** Version number of OpenFlow 1.0 protocol */
+ private static final byte OF10_VERSION_ID = EncodeConstants.OF10_VERSION_ID;
/** Version number of OpenFlow 1.3 protocol */
- public static final byte OF13_VERSION_ID = 0x04;
+ private static final byte OF13_VERSION_ID = EncodeConstants.OF13_VERSION_ID;
private static final Logger LOGGER = LoggerFactory.getLogger(OFVersionDetector.class);
/**
* Constructor of class.
*/
public OFVersionDetector() {
- LOGGER.info("Creating OFVersionDetector");
+ LOGGER.debug("Creating OFVersionDetector");
}
@Override
protected void decode(ChannelHandlerContext chc, ByteBuf bb, List<Object> list) throws Exception {
- LOGGER.info("Decoding frame");
-
if (bb.readableBytes() == 0) {
- LOGGER.info("not enough data");
+ LOGGER.debug("not enough data");
bb.release();
return;
}
LOGGER.debug("RI: " + bb.readerIndex());
byte version = bb.readByte();
- if (version == OF13_VERSION_ID) {
+ if ((version == OF13_VERSION_ID) || (version == OF10_VERSION_ID)) {
LOGGER.debug("detected version: " + version);
- enableOF13Codec(chc);
} else {
LOGGER.warn("detected version: " + version + " - currently not supported");
+ bb.skipBytes(bb.readableBytes());
return;
}
ByteBuf messageBuffer = bb.slice();
- list.add(messageBuffer);
+ list.add(new VersionMessageWrapper(version, messageBuffer));
messageBuffer.retain();
bb.skipBytes(bb.readableBytes());
}
- private static void enableOF13Codec(ChannelHandlerContext chc) {
- if (chc.pipeline().get(COMPONENT_NAMES.OF_CODEC.name()) == null) {
- LOGGER.info("Engaging OF13Codec");
- chc.pipeline().addLast(COMPONENT_NAMES.OF_CODEC.name(), new OF13Codec());
- } else {
- LOGGER.debug("OF13Codec already in pipeline");
- }
- }
}