xref: /openbmc/slpd-lite/main.cpp (revision 3964d552)
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     switch (recvBuff[0])
29     {
30         case slp::VERSION_2:
31         {
32             // Parse the buffer and construct the req object
33             std::tie(rc, req) = slp::parser::parseBuffer(recvBuff);
34             if (!rc)
35             {
36                 // Passing the req object to handler to serve it
37                 std::tie(rc, resp) = slp::handler::processRequest(req);
38             }
39             break;
40         }
41         default:
42             std::cout << "SLP Unsupported Request Version=" << (int)recvBuff[0]
43                       << "\n";
44 
45             rc = static_cast<uint8_t>(slp::Error::VER_NOT_SUPPORTED);
46             break;
47     }
48 
49     // if there was error during Parsing of request
50     // or processing of request then handle the error.
51     if (rc)
52     {
53         resp = slp::handler::processError(req, rc);
54     }
55 
56     channel.write(resp);
57     return slp::SUCCESS;
58 }
59 
60 int main()
61 {
62     slp::udp::Server svr(slp::PORT, requestHandler);
63     return svr.run();
64 }
65