[ONOS-2808] Properly deserialzes NDP packets without options
In addition, add following cases into NDP unit tests:
- testDeserializeBadInput
- testDeserializeTruncated (NDP headers only, options skipped)
Change-Id: Ia295a5bd7fcdcc25ac556da7bc2eaab13ad8e3b8
diff --git a/utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java b/utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java
index c3f46dd..51256d4 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java
@@ -210,11 +210,13 @@
bb.get(redirect.targetAddress, 0, Ip6Address.BYTE_LENGTH);
bb.get(redirect.destinationAddress, 0, Ip6Address.BYTE_LENGTH);
- NeighborDiscoveryOptions options = NeighborDiscoveryOptions.deserializer()
- .deserialize(data, bb.position(), bb.limit() - bb.position());
+ if (bb.limit() - bb.position() > 0) {
+ NeighborDiscoveryOptions options = NeighborDiscoveryOptions.deserializer()
+ .deserialize(data, bb.position(), bb.limit() - bb.position());
- for (NeighborDiscoveryOptions.Option option : options.options()) {
- redirect.addOption(option.type(), option.data());
+ for (NeighborDiscoveryOptions.Option option : options.options()) {
+ redirect.addOption(option.type(), option.data());
+ }
}
return redirect;