blob: 6a5aaacea3eee204b3a89ce5d0908f4152cca83a [file] [log] [blame]
Ratan Gupta309ac442016-12-13 20:40:06 +05301#include "slp.hpp"
2#include "slp_meta.hpp"
3#include "slp_server.hpp"
4#include "sock_channel.hpp"
5
Patrick Venture537ff142018-11-01 16:37:09 -07006#include <algorithm>
7#include <iomanip>
Ratan Gupta309ac442016-12-13 20:40:06 +05308
9/* Call Back for the sd event loop */
10static int requestHandler(sd_event_source* es, int fd, uint32_t revents,
11 void* userdata)
12{
13 int rc = slp::SUCCESS;
14 timeval tv{slp::TIMEOUT, 0};
15 udpsocket::Channel channel(fd, tv);
16 std::vector<uint8_t> recvBuff;
17 slp::Message req;
18 std::vector<uint8_t> resp;
19 // Read the packet
20 std::tie(rc, recvBuff) = channel.read();
21
22 if (rc < 0)
23 {
Ratan Gupta0d3e9e32017-02-10 22:27:12 +053024 std::cerr << "SLP Error in Read : " << std::hex << rc << "\n";
Ratan Gupta309ac442016-12-13 20:40:06 +053025 return rc;
26 }
27
28 switch (recvBuff[0])
29 {
30 case slp::VERSION_2:
31 {
Patrick Venture537ff142018-11-01 16:37:09 -070032 // Parse the buffer and construct the req object
Ratan Gupta309ac442016-12-13 20:40:06 +053033 std::tie(rc, req) = slp::parser::parseBuffer(recvBuff);
34 if (!rc)
35 {
Patrick Venture537ff142018-11-01 16:37:09 -070036 // Passing the req object to handler to serve it
Ratan Gupta309ac442016-12-13 20:40:06 +053037 std::tie(rc, resp) = slp::handler::processRequest(req);
38 }
39 break;
40 }
41 default:
Patrick Venture537ff142018-11-01 16:37:09 -070042 std::cout << "SLP Unsupported Request Version=" << (int)recvBuff[0]
43 << "\n";
Ratan Gupta0d3e9e32017-02-10 22:27:12 +053044
Ratan Gupta309ac442016-12-13 20:40:06 +053045 rc = static_cast<uint8_t>(slp::Error::VER_NOT_SUPPORTED);
46 break;
47 }
48
Patrick Venture537ff142018-11-01 16:37:09 -070049 // if there was error during Parsing of request
50 // or processing of request then handle the error.
Ratan Gupta309ac442016-12-13 20:40:06 +053051 if (rc)
52 {
Ratan Gupta309ac442016-12-13 20:40:06 +053053 resp = slp::handler::processError(req, rc);
54 }
55
Ratan Gupta309ac442016-12-13 20:40:06 +053056 channel.write(resp);
57 return slp::SUCCESS;
58}
59
Ratan Gupta309ac442016-12-13 20:40:06 +053060int main(int argc, char* argv[])
61{
62 slp::udp::Server svr(slp::PORT, requestHandler);
63 return svr.run();
64}