Merge "Fixed decoder table key values"
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / core / OFVersionDetector.java
index 8ad4526055fe1297608e8fec9822d0b55d1824c0..671b8dd97fa730a3d1a831c569d30b9e5dd2a110 100644 (file)
@@ -1,4 +1,11 @@
-/* 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;
@@ -7,61 +14,51 @@ import io.netty.handler.codec.ByteToMessageDecoder;
 
 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");
-        }
-    }
 }