Add unit tests for LISP address serializer and deserializer
Change-Id: I56538221f3951d18c1feb9343d87cbb46c3ed04d
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 1d88008..c7e72c5 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
@@ -126,6 +126,10 @@
@Override
public void writeTo(ByteBuf byteBuf, LispAfiAddress address) throws LispWriterException {
+
+ // AFI code
+ byteBuf.writeShort(address.getAfi().getIanaCode());
+
switch (address.getAfi()) {
case IP:
new LispIpAddress.IpAddressWriter().writeTo(byteBuf, (LispIpv4Address) address);
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
index 284ebe4..56ff2f2 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
@@ -21,6 +21,7 @@
import org.onosproject.lisp.msg.exceptions.LispWriterException;
import java.nio.ByteBuffer;
+import java.util.Arrays;
import java.util.Objects;
import static com.google.common.base.MoreObjects.toStringHelper;
@@ -352,7 +353,7 @@
}
/**
- * A utility function that obtains the partial int value from byte arrays.
+ * An utility function that obtains the partial int value from byte arrays.
*
* @param bytes an array of bytes
* @return converted integer
@@ -378,8 +379,8 @@
LispLcafAddress.serializeCommon(byteBuf, address);
- // TODO: need to handle TOS
-
+ byte[] tos = getPartialByteArray(address.getIpTos());
+ byteBuf.writeBytes(tos);
byteBuf.writeByte(address.getProtocol());
byteBuf.writeShort(address.getLocalPortLow());
byteBuf.writeShort(address.getLocalPortHigh());
@@ -389,5 +390,17 @@
AfiAddressWriter writer = new LispAfiAddress.AfiAddressWriter();
writer.writeTo(byteBuf, address.getAddress());
}
+
+ /**
+ * An utility function that obtains byte array from partial int value.
+ *
+ * @param value integer value
+ * @return an array of bytes
+ */
+ public static byte[] getPartialByteArray(int value) {
+ ByteBuffer buffer = ByteBuffer.allocate(4);
+ byte[] array = buffer.putInt(value).array();
+ return Arrays.copyOfRange(array, 1, 4);
+ }
}
}
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispDistinguishedNameAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispDistinguishedNameAddress.java
index 77f1c08..d4be998 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispDistinguishedNameAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispDistinguishedNameAddress.java
@@ -84,10 +84,10 @@
public LispDistinguishedNameAddress readFrom(ByteBuf byteBuf) throws LispParseError {
StringBuilder sb = new StringBuilder();
- byte character = byteBuf.readByte();
- while (character != 0) {
- sb.append((char) character);
+ byte character;
+ while (byteBuf.readerIndex() < byteBuf.writerIndex()) {
character = byteBuf.readByte();
+ sb.append((char) character);
}
return new LispDistinguishedNameAddress(sb.toString());
@@ -105,7 +105,7 @@
String distinguishedName = address.getDistinguishedName();
byte[] nameBytes = distinguishedName.getBytes();
for (int i = 0; i < nameBytes.length; i++) {
- byteBuf.writeChar(nameBytes[i]);
+ byteBuf.writeByte(nameBytes[i]);
}
}
}
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv6Address.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv6Address.java
index ed3ad43..2017174 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv6Address.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv6Address.java
@@ -35,7 +35,7 @@
* @param address IP address
*/
public LispIpv6Address(IpAddress address) {
- super(address, AddressFamilyIdentifierEnum.IP);
+ super(address, AddressFamilyIdentifierEnum.IP6);
checkArgument(address.isIp6());
}
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java
index 3552b45..68834db 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java
@@ -128,8 +128,10 @@
LispLcafAddress lcafAddress = LispLcafAddress.deserializeCommon(byteBuf);
- LispAfiAddress ipv4 = new LispAfiAddress.AfiAddressReader().readFrom(byteBuf);
- LispAfiAddress ipv6 = new LispAfiAddress.AfiAddressReader().readFrom(byteBuf);
+ AfiAddressReader reader = new AfiAddressReader();
+
+ LispAfiAddress ipv4 = reader.readFrom(byteBuf);
+ LispAfiAddress ipv6 = reader.readFrom(byteBuf);
return new LispListLcafAddress(lcafAddress.getReserved1(), lcafAddress.getReserved2(),
lcafAddress.getFlag(), ImmutableList.of(ipv4, ipv6));
@@ -141,6 +143,9 @@
*/
public static class ListLcafAddressWriter implements LispAddressWriter<LispListLcafAddress> {
+ private static final int IPV4_ADDRESS_INDEX = 0;
+ private static final int IPV6_ADDRESS_INDEX = 1;
+
@Override
public void writeTo(ByteBuf byteBuf, LispListLcafAddress address) throws LispWriterException {
@@ -149,8 +154,16 @@
LispIpv4Address.Ipv4AddressWriter v4Writer = new LispIpv4Address.Ipv4AddressWriter();
LispIpv6Address.Ipv6AddressWriter v6Writer = new LispIpv6Address.Ipv6AddressWriter();
- v4Writer.writeTo(byteBuf, (LispIpv4Address) address.getAddresses().get(0));
- v6Writer.writeTo(byteBuf, (LispIpv6Address) address.getAddresses().get(1));
+ LispAfiAddress ipv4 = address.getAddresses().get(IPV4_ADDRESS_INDEX);
+ LispAfiAddress ipv6 = address.getAddresses().get(IPV6_ADDRESS_INDEX);
+
+ // IPv4 address
+ byteBuf.writeShort(ipv4.getAfi().getIanaCode());
+ v4Writer.writeTo(byteBuf, (LispIpv4Address) ipv4);
+
+ // IPv6 address
+ byteBuf.writeShort(ipv6.getAfi().getIanaCode());
+ v6Writer.writeTo(byteBuf, (LispIpv6Address) ipv6);
}
}
}
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java
index 8405695..c6a84cc 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java
@@ -227,7 +227,8 @@
LispLcafAddress.serializeCommon(byteBuf, address);
byteBuf.writeInt(address.getInstanceId());
- new LispIpAddress.IpAddressWriter().writeTo(byteBuf, (LispIpAddress) address.getAddress());
+
+ new LispAfiAddress.AfiAddressWriter().writeTo(byteBuf, address.getAddress());
}
}
}