[ONOS-4718] Deserialize addresses from LISP control message class
With this commit, we try to deserilize all LispAfiAddress from
all LISP control message classes.
Change-Id: Iaf911bff90c45a70859285e426dc1649c3e6db32
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 efc5ea6..006413b 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
@@ -15,8 +15,14 @@
*/
package org.onosproject.lisp.msg.types;
+import io.netty.buffer.ByteBuf;
+import org.onosproject.lisp.msg.exceptions.LispParseError;
+import org.onosproject.lisp.msg.exceptions.LispReaderException;
+
import java.util.Objects;
+import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.*;
+
/**
* LISP Locator address typed by Address Family Identifier (AFI).
*/
@@ -67,4 +73,45 @@
}
return true;
}
+
+ public static class AfiAddressReader implements LispAddressReader<LispAfiAddress> {
+
+ @Override
+ public LispAfiAddress readFrom(ByteBuf byteBuf)
+ throws LispParseError, LispReaderException {
+
+ int index = byteBuf.readerIndex();
+
+ // AFI code -> 16 bits
+ short afiCode = (short) byteBuf.getUnsignedShort(index);
+
+ // handle IPv4 and IPv6 address
+ if (afiCode == IP.getIanaCode() ||
+ afiCode == IP6.getIanaCode()) {
+ return new LispIpAddress.IpAddressReader().readFrom(byteBuf);
+ }
+
+ // handle distinguished name address
+ if (afiCode == DISTINGUISHED_NAME.getIanaCode()) {
+ return new LispDistinguishedNameAddress.DistinguishedNameAddressReader().readFrom(byteBuf);
+ }
+
+ // handle MAC address
+ if (afiCode == MAC.getIanaCode()) {
+ return new LispMacAddress.MacAddressReader().readFrom(byteBuf);
+ }
+
+ // handle LCAF address
+ if (afiCode == LCAF.getIanaCode()) {
+ return new LispLcafAddress.LcafAddressReader().readFrom(byteBuf);
+ }
+
+ // handle autonomous system address
+ if (afiCode == AS.getIanaCode()) {
+ return new LispAsAddress.AsAddressReader().readFrom(byteBuf);
+ }
+
+ return null;
+ }
+ }
}