Adding missing files under onlab-netty
diff --git a/utils/netty/src/main/java/org/onlab/netty/MessageDecoder.java b/utils/netty/src/main/java/org/onlab/netty/MessageDecoder.java
new file mode 100644
index 0000000..ecf2d62
--- /dev/null
+++ b/utils/netty/src/main/java/org/onlab/netty/MessageDecoder.java
@@ -0,0 +1,58 @@
+package org.onlab.netty;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.ByteToMessageDecoder;
+
+/**
+ * Decode bytes into a InternalMessage.
+ */
+public class MessageDecoder extends ByteToMessageDecoder {
+
+    private final NettyMessagingService messagingService;
+    private final Serializer serializer;
+
+    public MessageDecoder(NettyMessagingService messagingService, Serializer serializer) {
+        this.messagingService = messagingService;
+        this.serializer = serializer;
+    }
+
+    @Override
+    protected void decode(ChannelHandlerContext context, ByteBuf in,
+            List<Object> messages) throws Exception {
+
+        byte[] preamble = in.readBytes(MessageEncoder.PREAMBLE.length).array();
+        checkState(Arrays.equals(MessageEncoder.PREAMBLE, preamble), "Message has wrong preamble");
+
+        // read message Id.
+        long id = in.readLong();
+
+        // read message type; first read size and then bytes.
+        String type = new String(in.readBytes(in.readInt()).array());
+
+        // read sender host name; first read size and then bytes.
+        String host = new String(in.readBytes(in.readInt()).array());
+
+        // read sender port.
+        int port = in.readInt();
+
+        Endpoint sender = new Endpoint(host, port);
+
+        // read message payload; first read size and then bytes.
+        Object payload = serializer.decode(in.readBytes(in.readInt()).array());
+
+        InternalMessage message = new InternalMessage.Builder(messagingService)
+                .withId(id)
+                .withSender(sender)
+                .withType(type)
+                .withPayload(payload)
+                .build();
+
+        messages.add(message);
+    }
+}