Bugfix: handle LISP map-request message that is encapsulated in ECM
Change-Id: If7ed64f4999719d2d13cd2f5c59bcaf920157bfe
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java
index 34ec469..110fe3e 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java
@@ -29,9 +29,8 @@
import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.lisp.msg.types.LispAfiAddress.AfiAddressWriter;
import static org.onosproject.lisp.msg.protocols.LispEidRecord.EidRecordWriter;
+import static org.onosproject.lisp.msg.types.LispAfiAddress.AfiAddressWriter;
/**
* Default LISP map request message class.
@@ -280,7 +279,6 @@
@Override
public LispMapRequest build() {
- checkNotNull(sourceEid, "Must have a source EID");
checkArgument((itrRlocs != null) && (itrRlocs.size() > 0), "Must have an ITR RLOC entry");
return new DefaultLispMapRequest(nonce, sourceEid, itrRlocs, eidRecords,
@@ -344,7 +342,7 @@
// deserialize a collection of RLOC addresses
List<LispAfiAddress> itrRlocs = Lists.newArrayList();
- for (int i = 0; i < irc; i++) {
+ for (int i = 0; i < irc + 1; i++) {
itrRlocs.add(new LispAfiAddress.AfiAddressReader().readFrom(byteBuf));
}
@@ -433,7 +431,7 @@
byteBuf.writeByte((byte) (pitr + smrInvoked));
// ITR Rloc count
- byteBuf.writeByte((byte) message.getItrRlocs().size());
+ byteBuf.writeByte((byte) message.getItrRlocs().size() - 1);
// record count
byteBuf.writeByte(message.getEids().size());
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMessageReaderFactory.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMessageReaderFactory.java
index 2798cc9..4bb47af 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMessageReaderFactory.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMessageReaderFactory.java
@@ -41,7 +41,7 @@
LispMessageReader reader;
LispType type = LispType.valueOf(
- (short) (buffer.getByte(0) >> TYPE_SHIFT_BIT));
+ (short) (buffer.getUnsignedByte(0) >> TYPE_SHIFT_BIT));
switch (type) {
case LISP_MAP_REQUEST:
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java
index aba3475..7f67277 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java
@@ -89,6 +89,11 @@
// AFI code -> 16 bits
short afiCode = (short) byteBuf.getUnsignedShort(index);
+ // handle no address
+ if (afiCode == NO_ADDRESS.getIanaCode()) {
+ byteBuf.readUnsignedShort();
+ }
+
// handle IPv4 and IPv6 address
if (afiCode == IP4.getIanaCode() ||
afiCode == IP6.getIanaCode()) {