[ONOS-6142] Add AppData and AS extension addresses with unit test

- Correct RFC page number for LCAF addresses

Change-Id: I51dbf02f69c15aad81d5571198b39e030f991a96
diff --git a/drivers/lisp/BUCK b/drivers/lisp/BUCK
index e5f7d2a..02cc884 100644
--- a/drivers/lisp/BUCK
+++ b/drivers/lisp/BUCK
@@ -2,6 +2,7 @@
     '//lib:CORE_DEPS',
     '//protocols/lisp/api:onos-protocols-lisp-api',
     '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api',
+    '//core/store/serializers:onos-core-serializers'
 ]
 
 TEST_DEPS = [
diff --git a/drivers/lisp/pom.xml b/drivers/lisp/pom.xml
index 579b5bc..329854b 100644
--- a/drivers/lisp/pom.xml
+++ b/drivers/lisp/pom.xml
@@ -52,6 +52,11 @@
             <artifactId>onos-mapping-api</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-core-serializers</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddress.java
index 7819a3b..8766aa5 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddress.java
@@ -15,27 +15,317 @@
  */
 package org.onosproject.drivers.lisp.extensions;
 
+import com.google.common.collect.Maps;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.mapping.addresses.ASMappingAddress;
+import org.onosproject.mapping.addresses.DNMappingAddress;
+import org.onosproject.mapping.addresses.EthMappingAddress;
 import org.onosproject.mapping.addresses.ExtensionMappingAddress;
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
+import org.onosproject.mapping.addresses.IPMappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
 import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.store.serializers.KryoNamespaces;
+
+import java.util.Map;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                        .ExtensionMappingAddressTypes.APPLICATION_DATA_ADDRESS;
 
 /**
  * Implementation of LISP application data address.
+ * When a locator-set needs to be conveyed based on the type of application or
+ * the Per-Hop Behavior (PHB) of a packet, the Application Data Type can be used.
  */
-public class LispAppDataAddress extends AbstractExtension
+public final class LispAppDataAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
+
+    private static final String PROTOCOL = "protocol";
+    private static final String IP_TOS = "ipTos";
+    private static final String LOCAL_PORT_LOW = "localPortLow";
+    private static final String LOCAL_PORT_HIGH = "localPortHigh";
+    private static final String REMOTE_PORT_LOW = "remotePortLow";
+    private static final String REMOTE_PORT_HIGH = "remotePortHigh";
+    private static final String ADDRESS = "address";
+
+    private byte protocol;
+    private int ipTos;
+    private short localPortLow;
+    private short localPortHigh;
+    private short remotePortLow;
+    private short remotePortHigh;
+    private MappingAddress address;
+
+    private final KryoNamespace appKryo = new KryoNamespace.Builder()
+                                                .register(KryoNamespaces.API)
+                                                .register(MappingAddress.class)
+                                                .register(MappingAddress.Type.class)
+                                                .register(IPMappingAddress.class)
+                                                .register(ASMappingAddress.class)
+                                                .register(DNMappingAddress.class)
+                                                .register(EthMappingAddress.class)
+                                                .build();
+
+    /**
+     * Default constructor.
+     */
+    public LispAppDataAddress() {
+    }
+
+    /**
+     * Creates an instance with initialized parameters.
+     *
+     * @param protocol       protocol number
+     * @param ipTos          IP type of service
+     * @param localPortLow   low-ranged local port number
+     * @param localPortHigh  high-ranged local port number
+     * @param remotePortLow  low-ranged remote port number
+     * @param remotePortHigh high-ranged remote port number
+     */
+    private LispAppDataAddress(byte protocol, int ipTos, short localPortLow,
+                              short localPortHigh, short remotePortLow,
+                              short remotePortHigh, MappingAddress address) {
+        this.protocol = protocol;
+        this.ipTos = ipTos;
+        this.localPortLow = localPortLow;
+        this.localPortHigh = localPortHigh;
+        this.remotePortLow = remotePortLow;
+        this.remotePortHigh = remotePortHigh;
+        this.address = address;
+    }
+
+    /**
+     * Obtains protocol type.
+     *
+     * @return protocol type
+     */
+    public byte getProtocol() {
+        return protocol;
+    }
+
+    /**
+     * Obtains IP type of service.
+     *
+     * @return IP type of service
+     */
+    public int getIpTos() {
+        return ipTos;
+    }
+
+    /**
+     * Obtains local port low.
+     *
+     * @return local port low
+     */
+    public short getLocalPortLow() {
+        return localPortLow;
+    }
+
+    /**
+     * Obtains local port high.
+     *
+     * @return local port high
+     */
+    public short getLocalPortHigh() {
+        return localPortHigh;
+    }
+
+    /**
+     * Obtains remote port low.
+     *
+     * @return remote port low
+     */
+    public short getRemotePortLow() {
+        return remotePortLow;
+    }
+
+    /**
+     * Obtains remote port high.
+     *
+     * @return remote port high
+     */
+    public short getRemotePortHigh() {
+        return remotePortHigh;
+    }
+
+    /**
+     * Obtains mapping address.
+     *
+     * @return mapping address
+     */
+    public MappingAddress getAddress() {
+        return address;
+    }
+
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return APPLICATION_DATA_ADDRESS.type();
     }
 
     @Override
     public byte[] serialize() {
-        return new byte[0];
+        Map<String, Object> parameterMap = Maps.newHashMap();
+        parameterMap.put(PROTOCOL, protocol);
+        parameterMap.put(IP_TOS, ipTos);
+        parameterMap.put(LOCAL_PORT_LOW, localPortLow);
+        parameterMap.put(LOCAL_PORT_HIGH, localPortHigh);
+        parameterMap.put(REMOTE_PORT_LOW, remotePortLow);
+        parameterMap.put(REMOTE_PORT_HIGH, remotePortHigh);
+        parameterMap.put(ADDRESS, address);
+
+        return appKryo.serialize(parameterMap);
     }
 
     @Override
     public void deserialize(byte[] data) {
+        Map<String, Object> parameterMap = appKryo.deserialize(data);
 
+        this.protocol = (byte) parameterMap.get(PROTOCOL);
+        this.ipTos = (int) parameterMap.get(IP_TOS);
+        this.localPortLow = (short) parameterMap.get(LOCAL_PORT_LOW);
+        this.localPortHigh = (short) parameterMap.get(LOCAL_PORT_HIGH);
+        this.remotePortLow = (short) parameterMap.get(REMOTE_PORT_LOW);
+        this.remotePortHigh = (short) parameterMap.get(REMOTE_PORT_HIGH);
+        this.address = (MappingAddress) parameterMap.get(ADDRESS);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(protocol, ipTos, localPortLow, localPortHigh,
+                remotePortLow, remotePortHigh, address);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof LispAppDataAddress) {
+            LispAppDataAddress that = (LispAppDataAddress) obj;
+            return Objects.equals(protocol, that.protocol) &&
+                    Objects.equals(ipTos, that.ipTos) &&
+                    Objects.equals(localPortLow, that.localPortLow) &&
+                    Objects.equals(localPortHigh, that.localPortHigh) &&
+                    Objects.equals(remotePortLow, that.remotePortLow) &&
+                    Objects.equals(remotePortHigh, that.remotePortHigh) &&
+                    Objects.equals(address, that.address);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(type().toString())
+                .add("protocol", protocol)
+                .add("IP type of service", ipTos)
+                .add("low-ranged local port number", localPortLow)
+                .add("high-ranged local port number", localPortHigh)
+                .add("low-ranged remote port number", remotePortLow)
+                .add("high-ranged remote port number", remotePortHigh)
+                .add("address", address)
+                .toString();
+    }
+
+    /**
+     * A builder for building LispAppDataAddress.
+     */
+    public static final class Builder {
+        private byte protocol;
+        private int ipTos;
+        private short localPortLow;
+        private short localPortHigh;
+        private short remotePortLow;
+        private short remotePortHigh;
+        private MappingAddress address;
+
+        /**
+         * Sets protocol number.
+         *
+         * @param protocol protocol number
+         * @return Builder object
+         */
+        public Builder withProtocol(byte protocol) {
+            this.protocol = protocol;
+            return this;
+        }
+
+        /**
+         * Sets IP type of service.
+         *
+         * @param ipTos IP type of service
+         * @return Builder object
+         */
+        public Builder withIpTos(int ipTos) {
+            this.ipTos = ipTos;
+            return this;
+        }
+
+        /**
+         * Sets low-ranged local port number.
+         *
+         * @param localPortLow low-ranged local port number
+         * @return Builder object
+         */
+        public Builder withLocalPortLow(short localPortLow) {
+            this.localPortLow = localPortLow;
+            return this;
+        }
+
+        /**
+         * Sets high-ranged local port number.
+         *
+         * @param localPortHigh high-ranged local port number
+         * @return Builder object
+         */
+        public Builder withLocalPortHigh(short localPortHigh) {
+            this.localPortHigh = localPortHigh;
+            return this;
+        }
+
+        /**
+         * Sets low-ranged remote port number.
+         *
+         * @param remotePortLow low-ranged remote port number
+         * @return Builder object
+         */
+        public Builder withRemotePortLow(short remotePortLow) {
+            this.remotePortLow = remotePortLow;
+            return this;
+        }
+
+        /**
+         * Sets high-ranged remote port number.
+         *
+         * @param remotePortHigh high-ranged remote port number
+         * @return Builder object
+         */
+        public Builder withRemotePortHigh(short remotePortHigh) {
+            this.remotePortHigh = remotePortHigh;
+            return this;
+        }
+
+        /**
+         * Sets mapping address.
+         *
+         * @param address mapping address
+         * @return Builder object
+         */
+        public Builder withAddress(MappingAddress address) {
+            this.address = address;
+            return this;
+        }
+
+        /**
+         * Builds LispAppDataLcafAddress instance.
+         *
+         * @return LispAddDataLcafAddress instance
+         */
+        public LispAppDataAddress build() {
+
+            return new LispAppDataAddress(protocol, ipTos, localPortLow,
+                    localPortHigh, remotePortLow, remotePortHigh, address);
+        }
     }
 }
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAsAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAsAddress.java
index 4b1dfe9..a0480aa 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAsAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAsAddress.java
@@ -16,27 +16,170 @@
 
 package org.onosproject.drivers.lisp.extensions;
 
+import com.google.common.collect.Maps;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.mapping.addresses.ASMappingAddress;
+import org.onosproject.mapping.addresses.DNMappingAddress;
+import org.onosproject.mapping.addresses.EthMappingAddress;
 import org.onosproject.mapping.addresses.ExtensionMappingAddress;
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
+import org.onosproject.mapping.addresses.IPMappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
 import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.store.serializers.KryoNamespaces;
+
+import java.util.Map;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                                        .ExtensionMappingAddressTypes.AS_ADDRESS;
 
 /**
  * Implementation of LISP Autonomous System (AS) address.
+ * When an AS number is stored in the LISP Mapping Database System for either
+ * policy or documentation reasons, it can be encoded in a LISP Canonical Address.
  */
-public class LispAsAddress extends AbstractExtension
+public final class LispAsAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
+
+    private static final String AS_NUMBER = "asNumber";
+    private static final String ADDRESS = "address";
+
+    private int asNumber;
+    private MappingAddress address;
+
+    private final KryoNamespace appKryo = new KryoNamespace.Builder()
+                                                .register(KryoNamespaces.API)
+                                                .register(MappingAddress.class)
+                                                .register(MappingAddress.Type.class)
+                                                .register(IPMappingAddress.class)
+                                                .register(ASMappingAddress.class)
+                                                .register(DNMappingAddress.class)
+                                                .register(EthMappingAddress.class)
+                                                .build();
+
+    /**
+     * Default constructor.
+     */
+    public LispAsAddress() {
+    }
+
+    /**
+     * Creates an instance with initialized parameters.
+     *
+     * @param asNumber AS number
+     */
+    private LispAsAddress(int asNumber, MappingAddress address) {
+        this.asNumber = asNumber;
+        this.address = address;
+    }
+
+    /**
+     * Obtains AS number.
+     *
+     * @return AS number
+     */
+    public int getAsNumber() {
+        return asNumber;
+    }
+
+    /**
+     * Obtains mapping address.
+     *
+     * @return mapping address
+     */
+    public MappingAddress getAddress() {
+        return address;
+    }
+
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return AS_ADDRESS.type();
     }
 
     @Override
     public byte[] serialize() {
-        return new byte[0];
+        Map<String, Object> parameterMap = Maps.newHashMap();
+
+        parameterMap.put(AS_NUMBER, asNumber);
+        parameterMap.put(ADDRESS, address);
+        return appKryo.serialize(parameterMap);
     }
 
     @Override
     public void deserialize(byte[] data) {
+        Map<String, Object> parameterMap = appKryo.deserialize(data);
 
+        this.asNumber = (int) parameterMap.get(AS_NUMBER);
+        this.address = (MappingAddress) parameterMap.get(ADDRESS);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(asNumber, address);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof LispAsAddress) {
+            final LispAsAddress other = (LispAsAddress) obj;
+            return Objects.equals(asNumber, other.asNumber) &&
+                    Objects.equals(address, other.address);
+        }
+
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("AS number", asNumber)
+                .add("address", address)
+                .toString();
+    }
+
+    /**
+     * A builder for building LispAsAddress.
+     */
+    public static final class Builder {
+        private int asNumber;
+        private MappingAddress address;
+
+        /**
+         * Sets AS number.
+         *
+         * @param asNumber AS number
+         * @return Builder object
+         */
+        public Builder withAsNumber(int asNumber) {
+            this.asNumber = asNumber;
+            return this;
+        }
+
+        /**
+         * Sets mapping address.
+         *
+         * @param address mapping address
+         * @return Builder object
+         */
+        public Builder withAddress(MappingAddress address) {
+            this.address = address;
+            return this;
+        }
+
+        /**
+         * Builds LispAsAddress instance.
+         *
+         * @return LispAsAddress instance
+         */
+        public LispAsAddress build() {
+
+            return new LispAsAddress(asNumber, address);
+        }
     }
 }
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java
index 48f4f4f..8e796be 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java
@@ -20,14 +20,20 @@
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
 import org.onosproject.net.flow.AbstractExtension;
 
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                        .ExtensionMappingAddressTypes.GEO_COORDINATE_ADDRESS;
+
 /**
  * Implementation of LISP Geo Coordinate (GC) address.
+ * If an ETR desires to send a Map-Reply describing the Geo Coordinates for each
+ * locator in its locator-set, it can use the Geo Coordinate Type to convey
+ * physical location information.
  */
 public class LispGcAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return GEO_COORDINATE_ADDRESS.type();
     }
 
     @Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
index 3bc7e46..77beeee 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
@@ -20,14 +20,20 @@
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
 import org.onosproject.net.flow.AbstractExtension;
 
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                                .ExtensionMappingAddressTypes.LIST_ADDRESS;
+
 /**
  * Implementation of LISP list address.
+ * When header translation between IPv4 and IPv6 is desirable a LISP Canonical
+ * Address can use the AFI List Type to carry a variable number of AFIs in one
+ * LCAF AFI.
  */
 public class LispListAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return LIST_ADDRESS.type();
     }
 
     @Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMulticastAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMulticastAddress.java
index fc3e03b..5bbda74 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMulticastAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMulticastAddress.java
@@ -20,14 +20,19 @@
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
 import org.onosproject.net.flow.AbstractExtension;
 
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                            .ExtensionMappingAddressTypes.MULTICAST_ADDRESS;
+
 /**
  * Implementation of LISP multicast address.
+ * The intent of this type of unicast replication is to deliver packets to
+ * multiple ETRs at receiver LISP multicast sites.
  */
 public class LispMulticastAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return MULTICAST_ADDRESS.type();
     }
 
     @Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNatAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNatAddress.java
index a21c83e..a71b684 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNatAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNatAddress.java
@@ -20,14 +20,19 @@
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
 import org.onosproject.net.flow.AbstractExtension;
 
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                                .ExtensionMappingAddressTypes.NAT_ADDRESS;
+
 /**
  * Implementation of LISP Network Address Translation (NAT) address.
+ * When a LISP system is conveying global address and mapped port information
+ * when traversing through a NAT device, the NAT-Traversal Type is used.
  */
 public class LispNatAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return NAT_ADDRESS.type();
     }
 
     @Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNonceAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNonceAddress.java
index b516913..747c5f6 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNonceAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNonceAddress.java
@@ -20,14 +20,19 @@
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
 import org.onosproject.net.flow.AbstractExtension;
 
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                                .ExtensionMappingAddressTypes.NONCE_ADDRESS;
+
 /**
  * Implementation of LISP nonce address.
+ * When a public PETR device wants to verify who is encapsulating to it, it can
+ * check for a specific nonce value in the LISP encapsulated packet.
  */
 public class LispNonceAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return NONCE_ADDRESS.type();
     }
 
     @Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSecurityAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSecurityAddress.java
index 1f10205..c3d13f6 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSecurityAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSecurityAddress.java
@@ -20,6 +20,9 @@
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
 import org.onosproject.net.flow.AbstractExtension;
 
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                            .ExtensionMappingAddressTypes.SECURITY_ADDRESS;
+
 /**
  * Implementation LISP security address.
  */
@@ -27,7 +30,7 @@
                                             implements ExtensionMappingAddress {
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return SECURITY_ADDRESS.type();
     }
 
     @Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSegmentAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSegmentAddress.java
index c48a80c..b251724 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSegmentAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSegmentAddress.java
@@ -20,14 +20,20 @@
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
 import org.onosproject.net.flow.AbstractExtension;
 
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                            .ExtensionMappingAddressTypes.SECURITY_ADDRESS;
+
 /**
  * Implementation of LISP segment address.
+ * When multiple organizations inside of a LISP site are using private addresses
+ * [RFC1918] as EID-prefixes, their address spaces must remain segregated due
+ * to possible address duplication.
  */
 public class LispSegmentAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return SECURITY_ADDRESS.type();
     }
 
     @Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSrcDstAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSrcDstAddress.java
index 5dc892a..1c1dee7 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSrcDstAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSrcDstAddress.java
@@ -20,14 +20,20 @@
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
 import org.onosproject.net.flow.AbstractExtension;
 
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                            .ExtensionMappingAddressTypes.SOURCE_DEST_ADDRESS;
+
 /**
- * Implementation of LISP source and detination address.
+ * Implementation of LISP source and destination address.
+ * When both a source and destination address of a flow need consideration for
+ * different locator-sets, this 2-tuple key is used in EID fields in LISP
+ * control messages.
  */
 public class LispSrcDstAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return SOURCE_DEST_ADDRESS.type();
     }
 
     @Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispTeAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispTeAddress.java
index f5d892b..4415d30 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispTeAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispTeAddress.java
@@ -20,14 +20,19 @@
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
 import org.onosproject.net.flow.AbstractExtension;
 
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+                    .ExtensionMappingAddressTypes.TRAFFIC_ENGINEERING_ADDRESS;
+
 /**
  * Implementation of LISP traffic engineering address.
+ * For a given EID lookup into the mapping database, this LCAF can be returned
+ * to provide a list of locators in an explicit re-encapsulation path.
  */
 public final class LispTeAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
     @Override
     public ExtensionMappingAddressType type() {
-        return null;
+        return TRAFFIC_ENGINEERING_ADDRESS.type();
     }
 
     @Override
diff --git a/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddressTest.java b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddressTest.java
new file mode 100644
index 0000000..bbb3da5
--- /dev/null
+++ b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddressTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.lisp.extensions;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddresses;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for LispAppDataAddress extension class.
+ */
+public class LispAppDataAddressTest {
+
+    private static final IpPrefix IP_ADDRESS_1 = IpPrefix.valueOf("1.2.3.4/24");
+    private static final IpPrefix IP_ADDRESS_2 = IpPrefix.valueOf("5.6.7.8/24");
+
+    private static final byte PROTOCOL_VALUE_1 = 0x01;
+    private static final int IP_TOS_VALUE_1 = 10;
+    private static final short LOCAL_PORT_LOW_VALUE = 1;
+    private static final short LOCAL_PORT_HIGH_VALUE = 255;
+    private static final short REMOTE_PORT_LOW_VALUE = 2;
+    private static final short REMOTE_PORT_HIGH_VALUE = 254;
+
+    private static final byte PROTOCOL_VALUE_2 = 0x02;
+    private static final int IP_TOS_VALUE_2 = 20;
+
+    private LispAppDataAddress address1;
+    private LispAppDataAddress sameAsAddress1;
+    private LispAppDataAddress address2;
+
+    @Before
+    public void setUp() {
+
+        MappingAddress ma1 = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_1);
+
+        address1 = new LispAppDataAddress.Builder()
+                                            .withProtocol(PROTOCOL_VALUE_1)
+                                            .withIpTos(IP_TOS_VALUE_1)
+                                            .withLocalPortLow(LOCAL_PORT_LOW_VALUE)
+                                            .withLocalPortHigh(LOCAL_PORT_HIGH_VALUE)
+                                            .withRemotePortLow(REMOTE_PORT_LOW_VALUE)
+                                            .withRemotePortHigh(REMOTE_PORT_HIGH_VALUE)
+                                            .withAddress(ma1)
+                                            .build();
+
+        sameAsAddress1 = new LispAppDataAddress.Builder()
+                                            .withProtocol(PROTOCOL_VALUE_1)
+                                            .withIpTos(IP_TOS_VALUE_1)
+                                            .withLocalPortLow(LOCAL_PORT_LOW_VALUE)
+                                            .withLocalPortHigh(LOCAL_PORT_HIGH_VALUE)
+                                            .withRemotePortLow(REMOTE_PORT_LOW_VALUE)
+                                            .withRemotePortHigh(REMOTE_PORT_HIGH_VALUE)
+                                            .withAddress(ma1)
+                                            .build();
+
+        MappingAddress ma2 = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_2);
+
+        address2 = new LispAppDataAddress.Builder()
+                                            .withProtocol(PROTOCOL_VALUE_2)
+                                            .withIpTos(IP_TOS_VALUE_2)
+                                            .withLocalPortLow(LOCAL_PORT_LOW_VALUE)
+                                            .withLocalPortHigh(LOCAL_PORT_HIGH_VALUE)
+                                            .withRemotePortLow(REMOTE_PORT_LOW_VALUE)
+                                            .withRemotePortHigh(REMOTE_PORT_HIGH_VALUE)
+                                            .withAddress(ma2)
+                                            .build();
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(address1, sameAsAddress1)
+                .addEqualityGroup(address2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        LispAppDataAddress address = address1;
+
+        MappingAddress ma = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_1);
+
+        assertThat(address.getProtocol(), is(PROTOCOL_VALUE_1));
+        assertThat(address.getIpTos(), is(IP_TOS_VALUE_1));
+        assertThat(address.getLocalPortLow(), is(LOCAL_PORT_LOW_VALUE));
+        assertThat(address.getLocalPortHigh(), is(LOCAL_PORT_HIGH_VALUE));
+        assertThat(address.getRemotePortLow(), is(REMOTE_PORT_LOW_VALUE));
+        assertThat(address.getRemotePortHigh(), is(REMOTE_PORT_HIGH_VALUE));
+        assertThat(address.getAddress(), is(ma));
+    }
+
+    @Test
+    public void testSerialization() {
+        LispAppDataAddress other = new LispAppDataAddress();
+        other.deserialize(address1.serialize());
+
+        new EqualsTester()
+                .addEqualityGroup(address1, other)
+                .testEquals();
+    }
+}
diff --git a/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAsAddressTest.java b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAsAddressTest.java
new file mode 100644
index 0000000..0ba9070
--- /dev/null
+++ b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAsAddressTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.lisp.extensions;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddresses;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for LispAsAddress extension class.
+ */
+public class LispAsAddressTest {
+
+    private static final IpPrefix IP_ADDRESS_1 = IpPrefix.valueOf("1.2.3.4/24");
+    private static final IpPrefix IP_ADDRESS_2 = IpPrefix.valueOf("5.6.7.8/24");
+
+    private static final int AS_NUMBER_1 = 1;
+    private static final int AS_NUMBER_2 = 2;
+
+    private LispAsAddress address1;
+    private LispAsAddress sameAsAddress1;
+    private LispAsAddress address2;
+
+    @Before
+    public void setUp() {
+
+        MappingAddress ma1 = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_1);
+
+        address1 = new LispAsAddress.Builder()
+                                .withAsNumber(AS_NUMBER_1)
+                                .withAddress(ma1)
+                                .build();
+
+        sameAsAddress1 = new LispAsAddress.Builder()
+                                .withAsNumber(AS_NUMBER_1)
+                                .withAddress(ma1)
+                                .build();
+
+        MappingAddress ma2 = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_2);
+
+        address2 = new LispAsAddress.Builder()
+                                .withAsNumber(AS_NUMBER_2)
+                                .withAddress(ma2)
+                                .build();
+
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(address1, sameAsAddress1)
+                .addEqualityGroup(address2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        LispAsAddress address = address1;
+
+        MappingAddress ma = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_1);
+
+        assertThat(address.getAsNumber(), is(AS_NUMBER_1));
+        assertThat(address.getAddress(), is(ma));
+    }
+
+    @Test
+    public void testSerialization() {
+        LispAsAddress other = new LispAsAddress();
+        other.deserialize(address1.serialize());
+
+        new EqualsTester()
+                .addEqualityGroup(address1, other)
+                .testEquals();
+    }
+}
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispAppDataLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispAppDataLcafAddress.java
index 911e0ad..684a6b6 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispAppDataLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispAppDataLcafAddress.java
@@ -34,7 +34,7 @@
  * Application data type LCAF address class.
  * <p>
  * Application data type is defined in draft-ietf-lisp-lcaf-22
- * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-27
+ * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-29
  *
  * <pre>
  * {@literal
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispListLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispListLcafAddress.java
index 1b5983e..3360942 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispListLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispListLcafAddress.java
@@ -39,7 +39,7 @@
  * List type LCAF address class.
  * <p>
  * List type is defined in draft-ietf-lisp-lcaf-22
- * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-22
+ * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-23
  *
  * <pre>
  * {@literal
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispNatLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispNatLcafAddress.java
index 6da6b42..2016f82 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispNatLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispNatLcafAddress.java
@@ -34,7 +34,7 @@
  * Network Address Translation (NAT) address class.
  * <p>
  * Instance ID type is defined in draft-ietf-lisp-lcaf-22
- * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-12
+ * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-13
  *
  * <pre>
  * {@literal
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispNonceLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispNonceLcafAddress.java
index 0930539..db3fd29 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispNonceLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispNonceLcafAddress.java
@@ -32,7 +32,7 @@
  * Nonce locator data type LCAF address class.
  * <p>
  * Nonce locator data type is defined in draft-ietf-lisp-lcaf-22
- * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-30
+ * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-32
  * <p>
  * <pre>
  * {@literal
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispSegmentLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispSegmentLcafAddress.java
index 914664e..f6579ed 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispSegmentLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispSegmentLcafAddress.java
@@ -32,7 +32,7 @@
  * Instance ID type LCAF address class.
  * <p>
  * Instance ID type is defined in draft-ietf-lisp-lcaf-22
- * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-7
+ * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-8
  *
  * <pre>
  * {@literal
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispSourceDestLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispSourceDestLcafAddress.java
index 00accd9..a7c0ae7 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispSourceDestLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispSourceDestLcafAddress.java
@@ -32,7 +32,7 @@
  * Source/Dest key type LCAF address class.
  * <p>
  * Source destination key type is defined in draft-ietf-lisp-lcaf-22
- * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-19
+ * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-20
  *
  * <pre>
  * {@literal
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispTeLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispTeLcafAddress.java
index 6b61305..4906ed3 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispTeLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/lcaf/LispTeLcafAddress.java
@@ -33,7 +33,7 @@
  * Traffic Engineering (TE) type LCAF address class.
  * <p>
  * Traffic Engineering type is defined in draft-ietf-lisp-lcaf-22
- * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-16
+ * https://tools.ietf.org/html/draft-ietf-lisp-lcaf-22#page-17
  *
  * <pre>
  * {@literal