Fix for Bug 8005. Parsing Sub Tlv for multiple neighbors
Change-Id: I32c86793db14698280199dd24f9a0e3731fb9771
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
index 41265d1..b248dec 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
@@ -102,7 +102,11 @@
this.setMetric(channelBuffer.readUnsignedMedium());
int nTlvPresent = channelBuffer.readByte();
if (nTlvPresent > 0) {
- while (channelBuffer.readableBytes() > IsisUtil.TWO_BYTES) {
+ /* ntlvPresent=0 infers that all Sub TLVs,
+ for a particular neighbor,
+ have been parsed and the loop has to be terminated
+ */
+ while (channelBuffer.readableBytes() > IsisUtil.TWO_BYTES && nTlvPresent > 0) {
TlvHeader tlvHeader = new TlvHeader();
tlvHeader.setTlvType(channelBuffer.readByte());
tlvHeader.setTlvLength(channelBuffer.readByte());
@@ -115,10 +119,18 @@
if (subTlv != null) {
this.addSubTlv(subTlv);
}
+ /*As one Sub TLV is parsed, its length is
+ subtracted from total length to be read
+ */
+ nTlvPresent = nTlvPresent - (tlvLength + IsisUtil.TWO_BYTES);
}
} else {
if (channelBuffer.readableBytes() >= tlvLength) {
channelBuffer.readBytes(tlvLength);
+ /*As one Sub TLV is parsed, its length is
+ subtracted from total length to be read
+ */
+ nTlvPresent = nTlvPresent - (tlvLength + IsisUtil.TWO_BYTES);
}
}
}
@@ -151,4 +163,4 @@
.add("teSubTlv", teSubTlv)
.toString();
}
-}
\ No newline at end of file
+}