Fix the LispMessageEncoder to reply with UDP message sender

- Add AbstractLispMessage to store sender IP address per message
- Fix the LispMacAuthentication class to accept byte array as input
- Rename LispMessageEncoderTest class
- Try to use MessageToMessageEncoder to result in UDP message

Change-Id: I977302cdadf5c96c60c889be291ad5d90e3bc7cf
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/authentication/LispAuthenticationFactory.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/authentication/LispAuthenticationFactory.java
index 5866e3d..5224aee 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/authentication/LispAuthenticationFactory.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/authentication/LispAuthenticationFactory.java
@@ -35,18 +35,17 @@
      *
      * @param authType authentication key type
      * @param authKey  authentication key string
+     * @param data     authentication data
      * @return authentication data
      */
     public byte[] createAuthenticationData(LispAuthenticationKeyEnum authType,
-                                           String authKey) {
+                                           String authKey, byte[] data) {
         LispMacAuthentication macAuth = new LispMacAuthentication(authType);
-        int authLength;
         byte[] authData;
         switch (authType) {
             case SHA1:
             case SHA256:
-                authLength = macAuth.getAuthenticationLength();
-                authData = macAuth.getAuthenticationData(authKey, new byte[authLength]);
+                authData = macAuth.getAuthenticationData(authKey, data);
                 break;
             case NONE:
             case UNKNOWN:
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/AbstractLispMessage.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/AbstractLispMessage.java
new file mode 100644
index 0000000..2cc0480
--- /dev/null
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/AbstractLispMessage.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2016-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.lisp.msg.protocols;
+
+import io.netty.buffer.ByteBuf;
+import org.onosproject.lisp.msg.exceptions.LispWriterException;
+
+import java.net.InetSocketAddress;
+
+/**
+ * Abstract LISP message.
+ */
+public abstract class AbstractLispMessage implements LispMessage {
+
+    protected InetSocketAddress sender;
+
+    @Override
+    public LispType getType() {
+        return null;
+    }
+
+    @Override
+    public void configSender(InetSocketAddress sender) {
+        this.sender = sender;
+    }
+
+    @Override
+    public InetSocketAddress getSender() {
+        return sender;
+    }
+
+    @Override
+    public void writeTo(ByteBuf byteBuf) throws LispWriterException {
+    }
+
+    @Override
+    public Builder createBuilder() {
+        return null;
+    }
+}
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispEncapsulatedControl.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispEncapsulatedControl.java
index 36782c2..e615810 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispEncapsulatedControl.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispEncapsulatedControl.java
@@ -34,7 +34,7 @@
 /**
  * Default LISP Encapsulated Control message class.
  */
-public final class DefaultLispEncapsulatedControl
+public final class DefaultLispEncapsulatedControl extends AbstractLispMessage
         implements LispEncapsulatedControl {
 
     private final boolean isSecurity;
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfo.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfo.java
index 7413245..1f8f771 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfo.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispInfo.java
@@ -29,7 +29,7 @@
 /**
  * A class that contains a set of helper methods for LISP info request and reply.
  */
-public class DefaultLispInfo implements LispInfo {
+public class DefaultLispInfo extends AbstractLispMessage implements LispInfo {
 
     protected final boolean infoReply;
     protected final long nonce;
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java
index cb18b8f..248d118 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java
@@ -33,7 +33,8 @@
 /**
  * Default LISP map notify message class.
  */
-public final class DefaultLispMapNotify implements LispMapNotify {
+public final class DefaultLispMapNotify extends AbstractLispMessage
+        implements LispMapNotify {
 
     private final long nonce;
     private final short keyId;
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java
index e044c34..a3166c1 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java
@@ -36,7 +36,8 @@
 /**
  * Default LISP map register message class.
  */
-public final class DefaultLispMapRegister implements LispMapRegister {
+public final class DefaultLispMapRegister extends AbstractLispMessage
+        implements LispMapRegister {
 
     private final long nonce;
     private final short keyId;
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java
index 5773be8..fea7f52 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java
@@ -32,7 +32,8 @@
 /**
  * Default LISP map reply message class.
  */
-public final class DefaultLispMapReply implements LispMapReply {
+public final class DefaultLispMapReply extends AbstractLispMessage
+        implements LispMapReply {
 
     private final long nonce;
     private final boolean probe;
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java
index 110fe3e..21b0c38 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java
@@ -35,7 +35,8 @@
 /**
  * Default LISP map request message class.
  */
-public final class DefaultLispMapRequest implements LispMapRequest {
+public final class DefaultLispMapRequest extends AbstractLispMessage
+        implements LispMapRequest {
 
     private final long nonce;
     private final LispAfiAddress sourceEid;
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMessage.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMessage.java
index 4e3cdfa..77ebfb6 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMessage.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispMessage.java
@@ -18,6 +18,8 @@
 import io.netty.buffer.ByteBuf;
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
 
+import java.net.InetSocketAddress;
+
 /**
  * LISP message interface.
  */
@@ -31,6 +33,22 @@
     LispType getType();
 
     /**
+     * Configures the sender's IP address with port number.
+     * Note that this information is used to make the UDP datagram packet.
+     *
+     * @param sender LISP message sender
+     */
+    void configSender(InetSocketAddress sender);
+
+    /**
+     * Obtains the sender's IP address with port number.
+     * Note that this information is used to make the UDP datagram packet.
+     *
+     * @return send's IP address with port number
+     */
+    InetSocketAddress getSender();
+
+    /**
      * Writes LISP message object into communication channel.
      *
      * @param byteBuf byte buffer
diff --git a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/authentication/LispAuthenticationTest.java b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/authentication/LispAuthenticationTest.java
index a68d529..2e994b6 100644
--- a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/authentication/LispAuthenticationTest.java
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/authentication/LispAuthenticationTest.java
@@ -38,10 +38,10 @@
     public void testAuthData() {
 
         String authKey = "testKey";
-        byte[] noneAuthData = factory.createAuthenticationData(NONE, authKey);
-        byte[] unknownAuthData = factory.createAuthenticationData(UNKNOWN, authKey);
-        byte[] sha1AuthData = factory.createAuthenticationData(SHA1, authKey);
-        byte[] sha256AuthData = factory.createAuthenticationData(SHA256, authKey);
+        byte[] noneAuthData = factory.createAuthenticationData(NONE, authKey, new byte[0]);
+        byte[] unknownAuthData = factory.createAuthenticationData(UNKNOWN, authKey, new byte[0]);
+        byte[] sha1AuthData = factory.createAuthenticationData(SHA1, authKey, new byte[0]);
+        byte[] sha256AuthData = factory.createAuthenticationData(SHA256, authKey, new byte[0]);
 
         assertThat(noneAuthData, is(new byte[0]));
         assertThat(unknownAuthData, is(new byte[0]));