[ONOS-5267] Initial implementation of MapResolver

Change-Id: I1438b0cc71b8fcb88064830d890ffc38ff9abd42
diff --git a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/LispMapResolver.java b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/LispMapResolver.java
index 9f6ab35..5661681 100644
--- a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/LispMapResolver.java
+++ b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/LispMapResolver.java
@@ -15,8 +15,19 @@
  */
 package org.onosproject.lisp.ctl;
 
+import org.onosproject.lisp.msg.protocols.LispEncapsulatedControl;
+import org.onosproject.lisp.msg.protocols.LispMapRecord;
 import org.onosproject.lisp.msg.protocols.LispMapReply;
+import org.onosproject.lisp.msg.protocols.LispMapRequest;
+import org.onosproject.lisp.msg.protocols.DefaultLispMapReply.DefaultReplyBuilder;
+
 import org.onosproject.lisp.msg.protocols.LispMessage;
+import org.onosproject.lisp.msg.types.LispIpAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.InetSocketAddress;
+import java.util.List;
 
 /**
  * LISP map resolver class.
@@ -24,8 +35,54 @@
  */
 public class LispMapResolver {
 
-    public LispMapReply processMapRequest(LispMessage message) {
-        // TODO: need to implement map-request message processing logic
-        return null;
+    private static final Logger log = LoggerFactory.getLogger(LispMapResolver.class);
+
+    private LispEidRlocMap eidRlocMap;
+
+    LispMapResolver() {
+        eidRlocMap = LispEidRlocMap.getInstance();
+    }
+
+    /**
+     * Handles encapsulated control message and replies with map-reply message.
+     *
+     * @param message encapsulated control message
+     * @return map-reply message
+     */
+    public LispMessage processMapRequest(LispMessage message) {
+
+        LispEncapsulatedControl ecm = (LispEncapsulatedControl) message;
+        LispMapRequest request = (LispMapRequest) ecm.getControlMessage();
+
+        // TODO: for now we always generate map-notify message and send to ITR
+        // no matter proxy bit is set or not
+
+        // build map-reply message
+        LispMapReply.ReplyBuilder replyBuilder = new DefaultReplyBuilder();
+        replyBuilder.withNonce(request.getNonce());
+        replyBuilder.withIsEtr(false);
+        replyBuilder.withIsSecurity(false);
+        replyBuilder.withIsProbe(request.isProbe());
+
+        List<LispMapRecord> mapRecords = eidRlocMap.getMapRecordByEidRecords(request.getEids());
+
+        if (mapRecords.size() == 0) {
+            log.warn("Map information is not found.");
+        } else {
+            replyBuilder.withMapRecords(mapRecords);
+        }
+
+        LispMapReply reply = replyBuilder.build();
+
+        if (request.getItrRlocs() != null && request.getItrRlocs().size() > 0) {
+            LispIpAddress itr = (LispIpAddress) request.getItrRlocs().get(0);
+            InetSocketAddress address = new InetSocketAddress(itr.getAddress().toInetAddress(),
+                    ecm.innerUdp().getSourcePort());
+            reply.configSender(address);
+        } else {
+            log.warn("No ITR RLOC is found, cannot respond back to ITR.");
+        }
+
+        return reply;
     }
 }