Support IP deserialization when PACKET_IN carries Ethernet FCS

Some switches carry Ethernet FCS in the PACKET_IN.
In that case, Ethernet FCS should not be treated as IP payload.

payload length: the length specified in IP header
remaining length: the actual remaining bytes
    payload < remaining: padding or Ethernet FCS exists, use payload length
    payload = remaining: usual case, use either one
    payload > remaining: fragmented packets, use remaining length

In addition,
    - Fix unit test. TotalLen should never be smaller than headerLen * 4
    - Refactoring unit tests

Change-Id: I5d4736ad89ea2ab4ac3bd0cfaeb91da5d974db64
diff --git a/utils/misc/src/main/java/org/onlab/packet/IPv4.java b/utils/misc/src/main/java/org/onlab/packet/IPv4.java
index ac27918..b8b58bc 100644
--- a/utils/misc/src/main/java/org/onlab/packet/IPv4.java
+++ b/utils/misc/src/main/java/org/onlab/packet/IPv4.java
@@ -709,8 +709,12 @@
             } else {
                 deserializer = Data.deserializer();
             }
-            ipv4.payload = deserializer.deserialize(data, bb.position(),
-                                                    bb.limit() - bb.position());
+
+            int remainingLength = bb.limit() - bb.position();
+            int payloadLength = ipv4.totalLength - ipv4.headerLength * 4;
+            int bytesToRead = (payloadLength <= remainingLength) ?
+                    payloadLength : remainingLength;
+            ipv4.payload = deserializer.deserialize(data, bb.position(), bytesToRead);
             ipv4.payload.setParent(ipv4);
 
             if (ipv4.totalLength != length) {