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) {