OpenFlow message processing for new loxi

Depends-On: Id69c8597eb4564653c56cdc90f2dcec50afbdd25

Change-Id: Ib14fbadd3debf98ce1d56343179f8e7929f8ade8
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageDecoder.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageDecoder.java
index 26f7221..c5cb9f7 100644
--- a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageDecoder.java
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageDecoder.java
@@ -17,6 +17,8 @@
 package org.onosproject.openflow.controller.impl;
 
 
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -47,7 +49,15 @@
         // a list of the parsed messages to the controller.
         // The performance *may or may not* not be as good as before.
         OFMessageReader<OFMessage> reader = OFFactories.getGenericReader();
-        OFMessage message = reader.readFrom(buffer);
+
+        //toByteBuffer is optimized to avoid copying.
+        ByteBuf byteBuf = Unpooled.wrappedBuffer(buffer.toByteBuffer());
+        OFMessage message = reader.readFrom(byteBuf);
+
+        if (message != null) {
+            //set buffer's read index, as it has not been changed.
+            buffer.readerIndex(buffer.readerIndex() + byteBuf.readerIndex());
+        }
 
         return message;
     }