blob: 6df25ecd1625bc103779ecabf14a24bf39bf9c89 [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 */
Patrick Williams3964d552023-04-04 20:48:49 -050010static int requestHandler(sd_event_source* /*es*/, int fd, uint32_t /*revents*/,
11 void* /*userdata*/)
Ratan Gupta309ac442016-12-13 20:40:06 +053012{
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
Patrick Williams3964d552023-04-04 20:48:49 -050060int main()
Ratan Gupta309ac442016-12-13 20:40:06 +053061{
62 slp::udp::Server svr(slp::PORT, requestHandler);
63 return svr.run();
64}