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