[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;
+        }
+    }
 }