xref: /openbmc/slpd-lite/slp.hpp (revision 537ff140250973ac20dcd392f5b1610637a7d734)
1309ac445SRatan Gupta #pragma once
2309ac445SRatan Gupta 
3*537ff140SPatrick Venture #include "slp_service_info.hpp"
4*537ff140SPatrick Venture 
5309ac445SRatan Gupta #include <stdio.h>
6309ac445SRatan Gupta 
7309ac445SRatan Gupta #include <array>
87435de04SBrad Bishop #include <functional>
9309ac445SRatan Gupta #include <list>
10309ac445SRatan Gupta #include <map>
11309ac445SRatan Gupta #include <memory>
12309ac445SRatan Gupta #include <string>
13309ac445SRatan Gupta #include <tuple>
14309ac445SRatan Gupta #include <vector>
15309ac445SRatan Gupta 
16309ac445SRatan Gupta namespace slp
17309ac445SRatan Gupta {
18309ac445SRatan Gupta 
19309ac445SRatan Gupta using buffer = std::vector<uint8_t>;
20309ac445SRatan Gupta 
21309ac445SRatan Gupta template <typename T>
22309ac445SRatan Gupta using deleted_unique_ptr = std::unique_ptr<T, std::function<void(T*)>>;
23309ac445SRatan Gupta 
24309ac445SRatan Gupta namespace request
25309ac445SRatan Gupta {
26309ac445SRatan Gupta 
27309ac445SRatan Gupta /*
28309ac445SRatan Gupta  * @struct ServiceType
29309ac445SRatan Gupta  *
30309ac445SRatan Gupta  * SLP Message structure for ServiceType Request.
31309ac445SRatan Gupta  */
32309ac445SRatan Gupta struct ServiceType
33309ac445SRatan Gupta {
34309ac445SRatan Gupta     std::string prList;
35309ac445SRatan Gupta     std::string namingAuth;
36309ac445SRatan Gupta     std::string scopeList;
37309ac445SRatan Gupta };
38309ac445SRatan Gupta 
39309ac445SRatan Gupta /*
40309ac445SRatan Gupta  * @struct Service
41309ac445SRatan Gupta  *
42309ac445SRatan Gupta  * SLP Message structure for Service Request.
43309ac445SRatan Gupta  */
44309ac445SRatan Gupta struct Service
45309ac445SRatan Gupta {
46309ac445SRatan Gupta     std::string prList;
47309ac445SRatan Gupta     std::string srvType;
48309ac445SRatan Gupta     std::string scopeList;
49309ac445SRatan Gupta     std::string predicate;
50309ac445SRatan Gupta     std::string spistr;
51309ac445SRatan Gupta };
52309ac445SRatan Gupta } // namespace request
53309ac445SRatan Gupta 
54309ac445SRatan Gupta /*
55309ac445SRatan Gupta  * @enum FunctionType
56309ac445SRatan Gupta  *
57309ac445SRatan Gupta  * SLP Protocol supported Message types.
58309ac445SRatan Gupta  */
59309ac445SRatan Gupta enum class FunctionType : uint8_t
60309ac445SRatan Gupta {
61309ac445SRatan Gupta     SRVRQST = 0x01,
62309ac445SRatan Gupta     SRVRPLY = 0x02,
63309ac445SRatan Gupta     ATTRRQST = 0x06,
64309ac445SRatan Gupta     ATTRRPLY = 0x07,
65309ac445SRatan Gupta     SRVTYPERQST = 0x09,
66309ac445SRatan Gupta     SRVTYPERPLY = 0x0A,
67309ac445SRatan Gupta     SAADV = 0x0B,
68309ac445SRatan Gupta };
69309ac445SRatan Gupta 
70309ac445SRatan Gupta /*
71309ac445SRatan Gupta  * @enum Error
72309ac445SRatan Gupta  *
73309ac445SRatan Gupta  * SLP Protocol defined Error Codes.
74309ac445SRatan Gupta  */
75309ac445SRatan Gupta enum class Error : uint8_t
76309ac445SRatan Gupta {
77309ac445SRatan Gupta     LANGUAGE_NOT_SUPPORTED = 0x01,
78309ac445SRatan Gupta     PARSE_ERROR = 0x02,
79309ac445SRatan Gupta     INVALID_REGISTRATION = 0x03,
80309ac445SRatan Gupta     SCOPE_NOT_SUPPORTED = 0x04,
81309ac445SRatan Gupta     AUTHENTICATION_UNKNOWN = 0x05,
82309ac445SRatan Gupta     AUTHENTICATION_ABSENT = 0x06,
83309ac445SRatan Gupta     AUTHENTICATION_FAILED = 0x07,
84309ac445SRatan Gupta     VER_NOT_SUPPORTED = 0x09,
85309ac445SRatan Gupta     INTERNAL_ERROR = 0x0A,
86309ac445SRatan Gupta     DA_BUSY_NOW = 0x0B,
87309ac445SRatan Gupta     OPTION_NOT_UNDERSTOOD = 0x0C,
88309ac445SRatan Gupta     INVALID_UPDATE = 0x0D,
89309ac445SRatan Gupta     MSG_NOT_SUPPORTED = 0x0E,
90309ac445SRatan Gupta };
91309ac445SRatan Gupta 
92309ac445SRatan Gupta /*
93309ac445SRatan Gupta  * @struct Header
94309ac445SRatan Gupta  *
95309ac445SRatan Gupta  * SLP Protocol Header
96309ac445SRatan Gupta  */
97309ac445SRatan Gupta struct Header
98309ac445SRatan Gupta {
99309ac445SRatan Gupta     uint8_t version = 0;
100309ac445SRatan Gupta     uint8_t functionID = 0;
101309ac445SRatan Gupta     std::array<uint8_t, 3> length;
102309ac445SRatan Gupta     uint16_t flags = 0;
103309ac445SRatan Gupta     std::array<uint8_t, 3> extOffset;
104309ac445SRatan Gupta     uint16_t xid = 0;
105309ac445SRatan Gupta     uint16_t langtagLen = 0;
106309ac445SRatan Gupta     std::string langtag;
107309ac445SRatan Gupta };
108309ac445SRatan Gupta 
109309ac445SRatan Gupta /*
110309ac445SRatan Gupta  * @struct Payload
111309ac445SRatan Gupta  * This is a payload of the SLP Message currently
112309ac445SRatan Gupta  * we are supporting two request.
113309ac445SRatan Gupta  *
114309ac445SRatan Gupta  */
115309ac445SRatan Gupta struct Payload
116309ac445SRatan Gupta {
117309ac445SRatan Gupta     request::ServiceType srvtyperqst;
118309ac445SRatan Gupta     request::Service srvrqst;
119309ac445SRatan Gupta };
120309ac445SRatan Gupta 
121309ac445SRatan Gupta /*
1221f12e380SGunnar Mills  * @struct Message
123309ac445SRatan Gupta  *
124309ac445SRatan Gupta  * This will denote the slp Message.
125309ac445SRatan Gupta  */
126309ac445SRatan Gupta struct Message
127309ac445SRatan Gupta {
128309ac445SRatan Gupta     Header header;
129309ac445SRatan Gupta     Payload body;
130309ac445SRatan Gupta };
131309ac445SRatan Gupta 
132309ac445SRatan Gupta namespace parser
133309ac445SRatan Gupta {
134309ac445SRatan Gupta 
135309ac445SRatan Gupta /** Parse a buffer and fill the header and the body of the message.
136309ac445SRatan Gupta  *
137309ac445SRatan Gupta  * @param[in] buffer - The buffer from which data should be parsed.
138309ac445SRatan Gupta  *
139309ac445SRatan Gupta  * @return Zero on success and parsed msg object,
140309ac445SRatan Gupta  *         non-zero on failure and empty msg object.
141309ac445SRatan Gupta  *
142309ac445SRatan Gupta  */
143309ac445SRatan Gupta 
144309ac445SRatan Gupta std::tuple<int, Message> parseBuffer(const buffer& buf);
145309ac445SRatan Gupta 
146309ac445SRatan Gupta namespace internal
147309ac445SRatan Gupta {
148309ac445SRatan Gupta 
149309ac445SRatan Gupta /** Parse header data from the buffer.
150309ac445SRatan Gupta  *
151309ac445SRatan Gupta  * @param[in] buffer - The buffer from which data should be parsed.
152309ac445SRatan Gupta  *
153309ac445SRatan Gupta  * @return Zero on success and fills header object inside message,
154309ac445SRatan Gupta  *         non-zero on failure and empty msg object.
155309ac445SRatan Gupta  *
156309ac445SRatan Gupta  * @internal
157309ac445SRatan Gupta  */
158309ac445SRatan Gupta 
159309ac445SRatan Gupta std::tuple<int, Message> parseHeader(const buffer& buf);
160309ac445SRatan Gupta 
161309ac445SRatan Gupta /** Parse a srvType request
162309ac445SRatan Gupta  *
163309ac445SRatan Gupta  * @param[in] buffer - The buffer from which data should be parsed.
164309ac445SRatan Gupta  *
165309ac445SRatan Gupta  * @return Zero on success,and fills the body object inside message.
166309ac445SRatan Gupta  *         non-zero on failure and empty msg object.
167309ac445SRatan Gupta  *
168309ac445SRatan Gupta  * @internal
169309ac445SRatan Gupta  */
170309ac445SRatan Gupta 
171309ac445SRatan Gupta int parseSrvTypeRqst(const buffer& buf, Message& req);
172309ac445SRatan Gupta 
173309ac445SRatan Gupta /** Parse a service request.
174309ac445SRatan Gupta  *
175309ac445SRatan Gupta  * @param[in] buffer - The buffer from which data should be parsed.
176309ac445SRatan Gupta  *
177309ac445SRatan Gupta  * @return Zero on success,and fills the body object inside message.
178309ac445SRatan Gupta  *         non-zero on failure and empty msg object.
179309ac445SRatan Gupta  *
180309ac445SRatan Gupta  * @internal
181309ac445SRatan Gupta  */
182309ac445SRatan Gupta 
183309ac445SRatan Gupta int parseSrvRqst(const buffer& buf, Message& req);
184309ac445SRatan Gupta 
185309ac445SRatan Gupta } // namespace internal
186*537ff140SPatrick Venture } // namespace parser
187309ac445SRatan Gupta 
188309ac445SRatan Gupta namespace handler
189309ac445SRatan Gupta {
190309ac445SRatan Gupta 
191309ac445SRatan Gupta /** Handle the  request  message.
192309ac445SRatan Gupta  *
193309ac445SRatan Gupta  * @param[in] msg - The message to process.
194309ac445SRatan Gupta  *
195309ac445SRatan Gupta  * @return In case of success, the vector is populated with the data
196309ac445SRatan Gupta  *         available on the socket and return code is 0.
197309ac445SRatan Gupta  *         In case of error, nonzero code and vector is set to size 0.
198309ac445SRatan Gupta  *
199309ac445SRatan Gupta  */
200309ac445SRatan Gupta 
201309ac445SRatan Gupta std::tuple<int, buffer> processRequest(const Message& msg);
202309ac445SRatan Gupta 
203309ac445SRatan Gupta /** Handle the error
204309ac445SRatan Gupta  *
205309ac445SRatan Gupta  * @param[in] msg - Req message.
206309ac445SRatan Gupta  * @param[in] err - Error code.
207309ac445SRatan Gupta  *
208309ac445SRatan Gupta  * @return the vector populated with the error data
209309ac445SRatan Gupta  */
210309ac445SRatan Gupta 
211*537ff140SPatrick Venture buffer processError(const Message& req, const uint8_t err);
212309ac445SRatan Gupta namespace internal
213309ac445SRatan Gupta {
214309ac445SRatan Gupta 
215309ac445SRatan Gupta using ServiceList = std::map<std::string, slp::ConfigData>;
216309ac445SRatan Gupta /** Handle the  SrvRequest message.
217309ac445SRatan Gupta  *
218309ac445SRatan Gupta  * @param[in] msg - The message to process
219309ac445SRatan Gupta  *
220309ac445SRatan Gupta  * @return In case of success, the vector is populated with the data
221309ac445SRatan Gupta  *         available on the socket and return code is 0.
222309ac445SRatan Gupta  *         In case of error, nonzero code and vector is set to size 0.
223309ac445SRatan Gupta  *
224309ac445SRatan Gupta  * @internal
225309ac445SRatan Gupta  */
226309ac445SRatan Gupta 
227309ac445SRatan Gupta std::tuple<int, buffer> processSrvRequest(const Message& msg);
228309ac445SRatan Gupta 
229309ac445SRatan Gupta /** Handle the  SrvTypeRequest message.
230309ac445SRatan Gupta  *
231309ac445SRatan Gupta  * @param[in] msg - The message to process
232309ac445SRatan Gupta  *
233309ac445SRatan Gupta  * @return In case of success, the vector is populated with the data
234309ac445SRatan Gupta  *         available on the socket and return code is 0.
235309ac445SRatan Gupta  *         In case of error, nonzero code and vector is set to size 0.
236309ac445SRatan Gupta  *
237309ac445SRatan Gupta  * @internal
238309ac445SRatan Gupta  *
239309ac445SRatan Gupta  */
240309ac445SRatan Gupta 
241309ac445SRatan Gupta std::tuple<int, buffer> processSrvTypeRequest(const Message& msg);
242309ac445SRatan Gupta 
243309ac445SRatan Gupta /**  Read the SLPinfo from the configuration.
244309ac445SRatan Gupta  *
245309ac445SRatan Gupta  * @param[in] filename - Name of the conf file
246309ac445SRatan Gupta  *
247309ac445SRatan Gupta  * @return the list of the services
248309ac445SRatan Gupta  *
249309ac445SRatan Gupta  * @internal
250309ac445SRatan Gupta  *
251309ac445SRatan Gupta  */
252ead7a3caSRatan Gupta ServiceList readSLPServiceInfo();
253309ac445SRatan Gupta 
254309ac445SRatan Gupta /**  Get all the interface address
255309ac445SRatan Gupta  *
256309ac445SRatan Gupta  * @return the list of the interface address.
257309ac445SRatan Gupta  *
258309ac445SRatan Gupta  * @internal
259309ac445SRatan Gupta  *
260309ac445SRatan Gupta  */
261309ac445SRatan Gupta 
262309ac445SRatan Gupta std::list<std::string> getIntfAddrs();
263309ac445SRatan Gupta 
264309ac445SRatan Gupta /** Fill the buffer with the header data from the request object
265309ac445SRatan Gupta  *
266309ac445SRatan Gupta  * @param[in] req - Header data will be copied from
267309ac445SRatan Gupta  *
268309ac445SRatan Gupta  * @return the vector is populated with the data
269309ac445SRatan Gupta  *
270309ac445SRatan Gupta  * @internal
271309ac445SRatan Gupta  */
272309ac445SRatan Gupta buffer prepareHeader(const Message& req);
273309ac445SRatan Gupta 
274309ac445SRatan Gupta } // namespace internal
275*537ff140SPatrick Venture } // namespace handler
276*537ff140SPatrick Venture } // namespace slp
277