SLP Server

This contains the entry point for the SLP
and starts the SLP Server.

Change-Id: I5976c8168a1af2703143c9bead61583197949115
Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000..13da385
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,82 @@
+#include <algorithm>
+#include <iomanip>
+
+#include "slp.hpp"
+#include "slp_meta.hpp"
+#include "slp_server.hpp"
+#include "sock_channel.hpp"
+
+
+/* Call Back for the sd event loop */
+static int requestHandler(sd_event_source* es, int fd, uint32_t revents,
+                          void* userdata)
+{
+    int rc = slp::SUCCESS;
+    timeval tv{slp::TIMEOUT, 0};
+    udpsocket::Channel channel(fd, tv);
+    std::vector<uint8_t> recvBuff;
+    slp::Message req;
+    std::vector<uint8_t> resp;
+    // Read the packet
+    std::tie(rc, recvBuff) = channel.read();
+
+    if (rc < 0)
+    {
+        std::cerr << "E> SLP Error in Read : " << std::hex << rc << "\n";
+        return rc;
+    }
+
+    switch (recvBuff[0])
+    {
+        case slp::VERSION_2:
+        {
+            std::cout << "SLP Request" << "\n";
+            //print the buffer
+            std::for_each(recvBuff.begin(), recvBuff.end(),
+                          [](uint8_t & ch)
+            {
+                std::cout << std::hex << std::setfill('0')
+                          << std::setw(2) << (int)ch << ' ' ;
+            });
+            std::cout << "\n";
+            //Parse the buffer and construct the req object
+            std::tie(rc, req) = slp::parser::parseBuffer(recvBuff);
+            if (!rc)
+            {
+                //Passing the req object to handler to serve it
+                std::tie(rc, resp) = slp::handler::processRequest(req);
+            }
+            break;
+        }
+        default:
+            rc = static_cast<uint8_t>(slp::Error::VER_NOT_SUPPORTED);
+            break;
+    }
+
+    //if there was error during Parsing of request
+    //or processing of request then handle the error.
+    if (rc)
+    {
+        std::cerr << "E> SLP Error rc=" << rc << "\n";
+        resp = slp::handler::processError(req, rc);
+    }
+
+    //print and send the response
+    std::cout << "SLP Response" << "\n";
+    std::for_each(resp.begin(), resp.end(),
+                  [](uint8_t & ch)
+    {
+        std::cout << std::hex << std::setfill('0')
+                  << std::setw(2) << (int)ch << ' ' ;
+    });
+
+    channel.write(resp);
+    return slp::SUCCESS;
+}
+
+
+int main(int argc, char* argv[])
+{
+    slp::udp::Server svr(slp::PORT, requestHandler);
+    return svr.run();
+}