[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/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