1 #include "slp.hpp"
2 #include "slp_meta.hpp"
3 #include "slp_server.hpp"
4 #include "sock_channel.hpp"
5
6 #include <algorithm>
7 #include <iomanip>
8
9 /* Call Back for the sd event loop */
requestHandler(sd_event_source *,int fd,uint32_t,void *)10 static 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 {
24 std::cerr << "SLP Error in Read : " << std::hex << rc << "\n";
25 return rc;
26 }
27
28 // This code currently assume a maximum of 255 bytes in a receive
29 // or response message. Enforce that here.
30 if (recvBuff.size() > slp::MAX_LEN)
31 {
32 std::cerr << "Message size exceeds maximum allowed: " << recvBuff.size()
33 << " / " << slp::MAX_LEN << std::endl;
34
35 rc = static_cast<uint8_t>(slp::Error::PARSE_ERROR);
36 }
37 else
38 {
39 switch (recvBuff[0])
40 {
41 case slp::VERSION_2:
42 {
43 // Parse the buffer and construct the req object
44 std::tie(rc, req) = slp::parser::parseBuffer(recvBuff);
45 if (!rc)
46 {
47 // Passing the req object to handler to serve it
48 std::tie(rc, resp) = slp::handler::processRequest(req);
49 }
50 break;
51 }
52 default:
53 std::cout << "SLP Unsupported Request Version="
54 << (int)recvBuff[0] << "\n";
55
56 rc = static_cast<uint8_t>(slp::Error::VER_NOT_SUPPORTED);
57 break;
58 }
59 }
60
61 // if there was error during Parsing of request
62 // or processing of request then handle the error.
63 if (rc)
64 {
65 resp = slp::handler::processError(req, rc);
66 }
67
68 channel.write(resp);
69 return slp::SUCCESS;
70 }
71
main()72 int main()
73 {
74 slp::udp::Server svr(slp::PORT, requestHandler);
75 return svr.run();
76 }
77