xref: /openbmc/slpd-lite/main.cpp (revision 6f01edce)
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 */
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 
72 int main()
73 {
74     slp::udp::Server svr(slp::PORT, requestHandler);
75     return svr.run();
76 }
77