libUPnP 1.14.19
|
Files | |
file | ssdplib.h |
file | ssdp_ctrlpt.c |
file | ssdp_device.c |
file | ssdp_server.c |
file | SSDPResultDataCallback.h |
SSDPResultData object declararion. | |
Data Structures | |
struct | SsdpEventStruct |
struct | TData |
struct | ssdpsearchreply |
struct | ssdpsearcharg |
struct | ssdpsearchexparg |
struct | ssdp_thread_data |
struct | SSDPSockArray |
Typedefs | |
typedef enum SsdpSearchType | SType |
Enumerations | |
enum | SsdpSearchType { SSDP_SERROR = -1 , SSDP_ALL , SSDP_ROOTDEVICE , SSDP_DEVICEUDN , SSDP_DEVICETYPE , SSDP_SERVICE } |
enum | Listener { Idle , Stopping , Running } |
Functions | |
static void | send_search_result (void *data) |
Sends a callback to the control point application with a SEARCH result. | |
static int | CreateClientRequestPacket (char *RqstBuf, size_t RqstBufSize, int Mx, char *SearchTarget, int AddressFamily) |
Creates a HTTP search request packet depending on the input parameter. | |
static void | searchExpired (void *arg) |
static int | NewRequestHandler (struct sockaddr *DestAddr, int NumPacket, char **RqPacket) |
Works as a request handler which passes the HTTP request string to multicast channel. | |
static int | extractIPv6address (char *url, char *address) |
static int | isUrlV6UlaGua (char *descdocUrl) |
static void | CreateServicePacket (int msg_type, const char *nt, char *usn, char *location, int duration, char **packet, int AddressFamily, int PowerState, int SleepPeriod, int RegistrationState) |
Creates a HTTP request packet. Depending on the input parameter, it either creates a service advertisement request or service shutdown request etc. | |
void | RequestHandler () |
static void | free_ssdp_event_handler_data (void *the_data) |
Frees the ssdp request. | |
static UPNP_INLINE int | valid_ssdp_msg (http_message_t *hmsg) |
Does some quick checking of the ssdp msg. | |
static UPNP_INLINE int | start_event_handler (void *Data) |
Parses the message and dispatches it to a handler which handles the ssdp request msg. | |
static void | ssdp_event_handler_thread (void *the_data) |
This function is a thread that handles SSDP requests. | |
static int | create_ssdp_sock_v4 (SOCKET *ssdpSock) |
static int | create_ssdp_sock_reqv4 (SOCKET *ssdpReqSock) |
Creates the SSDP IPv4 socket to be used by the control point. | |
void | SSDPResultData_Callback (const SSDPResultData *p) |
Variables | |
enum SsdpSearchType | SsdpEventStruct::RequestType |
int | SsdpEventStruct::ErrCode |
int | SsdpEventStruct::MaxAge |
int | SsdpEventStruct::Mx |
char | SsdpEventStruct::UDN [LINE_SIZE] |
char | SsdpEventStruct::DeviceType [LINE_SIZE] |
char | SsdpEventStruct::ServiceType [LINE_SIZE] |
char | SsdpEventStruct::Location [LINE_SIZE] |
char | SsdpEventStruct::HostAddr [LINE_SIZE] |
char | SsdpEventStruct::Os [LINE_SIZE] |
char | SsdpEventStruct::Ext [LINE_SIZE] |
char | SsdpEventStruct::Date [LINE_SIZE] |
struct sockaddr * | SsdpEventStruct::DestAddr |
void * | SsdpEventStruct::Cookie |
int | TData::Mx |
void * | TData::Cookie |
char * | TData::Data |
struct sockaddr_storage | TData::DestAddr |
int | ssdpsearchreply::MaxAge |
UpnpDevice_Handle | ssdpsearchreply::handle |
struct sockaddr_storage | ssdpsearchreply::dest_addr |
SsdpEvent | ssdpsearchreply::event |
int | ssdpsearcharg::timeoutEventId |
char * | ssdpsearcharg::searchTarget |
void * | ssdpsearcharg::cookie |
enum SsdpSearchType | ssdpsearcharg::requestType |
int | ssdpsearchexparg::handle |
int | ssdpsearchexparg::timeoutEventId |
http_parser_t | ssdp_thread_data::parser |
struct sockaddr_storage | ssdp_thread_data::dest_addr |
SOCKET | gSsdpReqSocket4 = INVALID_SOCKET |
SOCKET | SSDPSockArray::ssdpSock |
int | SSDPSockArray::ssdpReqSock |
static const char | SERVICELIST_STR [] = "serviceList" |
X_USER_AGENT | |
can be overwritten by configure CFLAGS argument. The {\tt X_USER_AGENT} constant specifies the value of the X-User-Agent: HTTP header. The value "redsonic" is needed for the DSM-320. See https://sourceforge.net/forum/message.php?msg_id=3166856 for more information | |
typedef struct SsdpEventStruct | SsdpEvent |
typedef void(* | SsdpFunPtr) (SsdpEvent *) |
typedef struct TData | ThreadData |
typedef struct ssdpsearchreply | SsdpSearchReply |
typedef struct ssdpsearcharg | SsdpSearchArg |
typedef struct ssdpsearchexparg | SsdpSearchExpArg |
typedef int(* | ParserFun) (char *, SsdpEvent *) |
SOCKET | gSsdpReqSocket4 |
#define | X_USER_AGENT "redsonic" |
#define | NO_ERROR_FOUND 0 |
#define | E_REQUEST_INVALID -3 |
#define | E_RES_EXPIRED -4 |
#define | E_MEM_ALLOC -5 |
#define | E_HTTP_SYNTEX -6 |
#define | E_SOCKET -7 |
#define | RQST_TIMEOUT 20 |
SSDP Server Functions | |
int | AdvertiseAndReply (int AdFlag, UpnpDevice_Handle Hnd, enum SsdpSearchType SearchType, struct sockaddr *DestAddr, char *DeviceType, char *DeviceUDN, char *ServiceType, int Exp) |
Sends SSDP advertisements, replies and shutdown messages. | |
int | unique_service_name (char *cmd, SsdpEvent *Evt) |
Fills the fields of the event structure like DeviceType, Device UDN and Service Type. | |
enum SsdpSearchType | ssdp_request_type1 (char *cmd) |
This function figures out the type of the SSDP search in the in the request. | |
int | ssdp_request_type (char *cmd, SsdpEvent *Evt) |
Starts filling the SSDP event structure based upon the request received. | |
int | readFromSSDPSocket (SOCKET socket) |
This function reads the data from the ssdp socket. | |
int | get_ssdp_sockets (MiniServerSockArray *out) |
Creates the IPv4 and IPv6 ssdp sockets required by the control point and device operation. | |
SSDP Control Point Functions | |
void | ssdp_handle_ctrlpt_msg (http_message_t *hmsg, struct sockaddr_storage *dest_addr, int timeout) |
This function handles the ssdp messages from the devices. These messages includes the search replies, advertisement of device coming alive and bye byes. | |
int | SearchByTarget (int Hnd, int Mx, char *St, void *Cookie) |
Creates and send the search request for a specific URL. | |
SSDP Device Functions | |
void | advertiseAndReplyThread (void *data) |
Wrapper function to reply the search request coming from the control point. | |
void | ssdp_handle_device_request (http_message_t *hmsg, struct sockaddr_storage *dest_addr) |
Handles the search request. It does the sanity checks of the request and then schedules a thread to send a random time reply (random within maximum time given by the control point to reply). | |
int | DeviceAdvertisement (char *DevType, int RootDev, char *Udn, char *Location, int Duration, int AddressFamily, int PowerState, int SleepPeriod, int RegistrationState) |
Creates the device advertisement request based on the input parameter, and send it to the multicast channel. | |
int | SendReply (struct sockaddr *DestAddr, char *DevType, int RootDev, char *Udn, char *Location, int Duration, int ByType, int PowerState, int SleepPeriod, int RegistrationState) |
Creates the reply packet based on the input parameter, and send it to the client addesss given in its input parameter DestAddr. | |
int | DeviceReply (struct sockaddr *DestAddr, char *DevType, int RootDev, char *Udn, char *Location, int Duration, int PowerState, int SleepPeriod, int RegistrationState) |
Creates the reply packet based on the input parameter, and send it to the client address given in its input parameter DestAddr. | |
int | ServiceAdvertisement (char *Udn, char *ServType, char *Location, int Duration, int AddressFamily, int PowerState, int SleepPeriod, int RegistrationState) |
Creates the advertisement packet based on the input parameter, and send it to the multicast channel. | |
int | ServiceReply (struct sockaddr *DestAddr, char *ServType, char *Udn, char *Location, int Duration, int PowerState, int SleepPeriod, int RegistrationState) |
Creates the advertisement packet based on the input parameter, and send it to the multicast channel. | |
int | ServiceShutdown (char *Udn, char *ServType, char *Location, int Duration, int AddressFamily, int PowerState, int SleepPeriod, int RegistrationState) |
Creates a HTTP service shutdown request packet and sends it to the multicast channel through RequestHandler. | |
int | DeviceShutdown (char *DevType, int RootDev, char *Udn, char *Location, int Duration, int AddressFamily, int PowerState, int SleepPeriod, int RegistrationState) |
Creates a HTTP device shutdown request packet and send it to the multicast channel through RequestHandler. | |
#define NO_ERROR_FOUND 0 |
Error codes.
typedef struct SsdpEventStruct SsdpEvent |
Structure to store the SSDP information
typedef enum SsdpSearchType SType |
Enumeration to define all different types of ssdp searches
enum SsdpSearchType |
int AdvertiseAndReply | ( | int | AdFlag, |
UpnpDevice_Handle | Hnd, | ||
enum SsdpSearchType | SearchType, | ||
struct sockaddr * | DestAddr, | ||
char * | DeviceType, | ||
char * | DeviceUDN, | ||
char * | ServiceType, | ||
int | Exp | ||
) |
Sends SSDP advertisements, replies and shutdown messages.
References Handle_Info::DescURL, DeviceAdvertisement(), Handle_Info::DeviceAf, Handle_Info::DeviceList, DeviceReply(), DeviceShutdown(), DOMString, GetHandleInfo(), ixmlElement_getElementsByTagName(), ixmlNode_getFirstChild(), ixmlNode_getNextSibling(), ixmlNode_getNodeName(), ixmlNode_getNodeValue(), ixmlNodeList_free(), ixmlNodeList_item(), Handle_Info::LowerDescURL, SendReply(), ServiceAdvertisement(), ServiceReply(), ServiceShutdown(), UPNP_E_INVALID_HANDLE, UPNP_E_SUCCESS, and UpnpPrintf().
Referenced by advertiseAndReplyThread(), UpnpSendAdvertisementLowPower(), and UpnpUnRegisterRootDeviceLowPower().
void advertiseAndReplyThread | ( | void * | data | ) |
Wrapper function to reply the search request coming from the control point.
References AdvertiseAndReply().
Referenced by ssdp_handle_device_request().
|
static |
Creates the SSDP IPv4 socket to be used by the control point.
[out] | ssdpReqSock | SSDP IPv4 request socket to be created. |
References INVALID_SOCKET, sock_make_no_blocking(), UPNP_E_OUTOF_SOCKET, UPNP_E_SUCCESS, and UpnpPrintf().
Referenced by get_ssdp_sockets().
|
static |
ssdpSock | [] SSDP IPv4 socket to be created. |
References gIF_IPV4, INVALID_SOCKET, UPNP_E_NETWORK_ERROR, UPNP_E_OUTOF_SOCKET, UPNP_E_SOCKET_BIND, UPNP_E_SOCKET_ERROR, UPNP_E_SUCCESS, UpnpCloseSocket, and UpnpPrintf().
Referenced by get_ssdp_sockets().
|
static |
Creates a HTTP search request packet depending on the input parameter.
[in,out] | RqstBuf | Output string in HTTP format. |
[in] | RqstBufSize | RqstBuf size. |
[in] | Mx | Search Target. |
[in] | SearchTarget | Number of seconds to wait to collect all the responses. |
[in] | AddressFamily | search address family. |
References UPNP_E_INTERNAL_ERROR, UPNP_E_INVALID_ARGUMENT, and UPNP_E_SUCCESS.
Referenced by SearchByTarget().
|
static |
Creates a HTTP request packet. Depending on the input parameter, it either creates a service advertisement request or service shutdown request etc.
[in] | msg_type | type of the message (Search Reply, Advertisement or Shutdown). |
[in] | nt | ssdp type. |
[in] | usn | unique service name ( go in the HTTP Header). |
[in] | location | Location URL. |
[in] | duration | Service duration in sec. |
[out] | packet | Output buffer filled with HTTP statement. |
[in] | AddressFamily | Address family of the HTTP request. |
[in] | PowerState | PowerState as defined by UPnP Low Power. |
[in] | SleepPeriod | SleepPeriod as defined by UPnP Low Power. |
[in] | RegistrationState | RegistrationState as defined by UPnP Low Power. |
References gUpnpSdkNLSuuid, http_MakeMessage(), isUrlV6UlaGua(), and membuffer::size_inc.
Referenced by DeviceAdvertisement(), DeviceReply(), DeviceShutdown(), SendReply(), ServiceAdvertisement(), ServiceReply(), and ServiceShutdown().
int DeviceAdvertisement | ( | char * | DevType, |
int | RootDev, | ||
char * | Udn, | ||
char * | Location, | ||
int | Duration, | ||
int | AddressFamily, | ||
int | PowerState, | ||
int | SleepPeriod, | ||
int | RegistrationState | ||
) |
Creates the device advertisement request based on the input parameter, and send it to the multicast channel.
References CreateServicePacket(), gIF_INDEX, isUrlV6UlaGua(), NewRequestHandler(), UPNP_E_OUTOF_MEMORY, and UpnpPrintf().
Referenced by AdvertiseAndReply().
int DeviceReply | ( | struct sockaddr * | DestAddr, |
char * | DevType, | ||
int | RootDev, | ||
char * | Udn, | ||
char * | Location, | ||
int | Duration, | ||
int | PowerState, | ||
int | SleepPeriod, | ||
int | RegistrationState | ||
) |
Creates the reply packet based on the input parameter, and send it to the client address given in its input parameter DestAddr.
References CreateServicePacket(), NewRequestHandler(), and UPNP_E_OUTOF_MEMORY.
Referenced by AdvertiseAndReply().
int DeviceShutdown | ( | char * | DevType, |
int | RootDev, | ||
char * | Udn, | ||
char * | Location, | ||
int | Duration, | ||
int | AddressFamily, | ||
int | PowerState, | ||
int | SleepPeriod, | ||
int | RegistrationState | ||
) |
Creates a HTTP device shutdown request packet and send it to the multicast channel through RequestHandler.
References CreateServicePacket(), gIF_INDEX, isUrlV6UlaGua(), NewRequestHandler(), UPNP_E_OUTOF_MEMORY, and UpnpPrintf().
Referenced by AdvertiseAndReply().
|
static |
Referenced by isUrlV6UlaGua().
|
static |
Frees the ssdp request.
[in] | the_data | ssdp_thread_data structure. This structure contains SSDP request message. |
Referenced by readFromSSDPSocket(), ssdp_event_handler_thread(), and start_event_handler().
int get_ssdp_sockets | ( | MiniServerSockArray * | out | ) |
Creates the IPv4 and IPv6 ssdp sockets required by the control point and device operation.
References create_ssdp_sock_reqv4(), create_ssdp_sock_v4(), gIF_IPV4, gIF_IPV6, gIF_IPV6_ULA_GUA, INVALID_SOCKET, MServerSockArray::ssdpReqSock4, MServerSockArray::ssdpReqSock6, MServerSockArray::ssdpSock4, MServerSockArray::ssdpSock6, MServerSockArray::ssdpSock6UlaGua, UPNP_E_SUCCESS, and UpnpCloseSocket.
Referenced by StartMiniServer().
|
static |
References extractIPv6address().
Referenced by CreateServicePacket(), DeviceAdvertisement(), DeviceShutdown(), ServiceAdvertisement(), and ServiceShutdown().
|
static |
Works as a request handler which passes the HTTP request string to multicast channel.
[in] | DestAddr | Ip address, to send the reply. |
[in] | NumPacket | Number of packet to be sent. |
[in] | RqPacket | . |
References gIF_INDEX, gIF_IPV4, INVALID_SOCKET, UPNP_E_INVALID_PARAM, UPNP_E_NETWORK_ERROR, UPNP_E_OUTOF_SOCKET, UPNP_E_SOCKET_WRITE, UPNP_E_SUCCESS, UpnpCloseSocket, and UpnpPrintf().
Referenced by DeviceAdvertisement(), DeviceReply(), DeviceShutdown(), SendReply(), ServiceAdvertisement(), ServiceReply(), and ServiceShutdown().
int readFromSSDPSocket | ( | SOCKET | socket | ) |
This function reads the data from the ssdp socket.
References membuffer::buf, free_ssdp_event_handler_data(), gRecvThreadPool, membuffer::length, http_message_t::msg, ssdp_event_handler_thread(), ThreadPoolAdd(), TPJobInit(), TPJobSetFreeFunction(), TPJobSetPriority(), and UpnpPrintf().
int SearchByTarget | ( | int | Hnd, |
int | Mx, | ||
char * | St, | ||
void * | Cookie | ||
) |
Creates and send the search request for a specific URL.
This function implements the search request of the discovery phase. A M-SEARCH request is sent on the SSDP channel for both IPv4 and IPv6 addresses. The search target(ST) is required and must be one of the following:
References CreateClientRequestPacket(), GetHandleInfo(), gIF_INDEX, gIF_IPV4, gTimerThread, INVALID_SOCKET, REL_SEC, ssdp_request_type1(), SSDP_SERROR, Handle_Info::SsdpSearchList, TimerThreadSchedule(), TPJobInit(), TPJobSetFreeFunction(), TPJobSetPriority(), UPNP_E_INTERNAL_ERROR, UPNP_E_INVALID_PARAM, UPNP_E_SUCCESS, UpnpCloseSocket, and UpnpPrintf().
Referenced by UpnpSearchAsync().
|
static |
Sends a callback to the control point application with a SEARCH result.
References SSDPResultData_delete().
Referenced by ssdp_handle_ctrlpt_msg().
int SendReply | ( | struct sockaddr * | DestAddr, |
char * | DevType, | ||
int | RootDev, | ||
char * | Udn, | ||
char * | Location, | ||
int | Duration, | ||
int | ByType, | ||
int | PowerState, | ||
int | SleepPeriod, | ||
int | RegistrationState | ||
) |
Creates the reply packet based on the input parameter, and send it to the client addesss given in its input parameter DestAddr.
References CreateServicePacket(), NewRequestHandler(), and UPNP_E_OUTOF_MEMORY.
Referenced by AdvertiseAndReply().
int ServiceAdvertisement | ( | char * | Udn, |
char * | ServType, | ||
char * | Location, | ||
int | Duration, | ||
int | AddressFamily, | ||
int | PowerState, | ||
int | SleepPeriod, | ||
int | RegistrationState | ||
) |
Creates the advertisement packet based on the input parameter, and send it to the multicast channel.
References CreateServicePacket(), gIF_INDEX, isUrlV6UlaGua(), NewRequestHandler(), UPNP_E_OUTOF_MEMORY, and UpnpPrintf().
Referenced by AdvertiseAndReply().
int ServiceReply | ( | struct sockaddr * | DestAddr, |
char * | ServType, | ||
char * | Udn, | ||
char * | Location, | ||
int | Duration, | ||
int | PowerState, | ||
int | SleepPeriod, | ||
int | RegistrationState | ||
) |
Creates the advertisement packet based on the input parameter, and send it to the multicast channel.
References CreateServicePacket(), NewRequestHandler(), and UPNP_E_OUTOF_MEMORY.
Referenced by AdvertiseAndReply().
int ServiceShutdown | ( | char * | Udn, |
char * | ServType, | ||
char * | Location, | ||
int | Duration, | ||
int | AddressFamily, | ||
int | PowerState, | ||
int | SleepPeriod, | ||
int | RegistrationState | ||
) |
Creates a HTTP service shutdown request packet and sends it to the multicast channel through RequestHandler.
References CreateServicePacket(), gIF_INDEX, isUrlV6UlaGua(), NewRequestHandler(), UPNP_E_OUTOF_MEMORY, and UpnpPrintf().
Referenced by AdvertiseAndReply().
|
static |
This function is a thread that handles SSDP requests.
the_data | [] ssdp_thread_data structure. This structure contains SSDP request message. |
References free_ssdp_event_handler_data(), http_message_t::method, http_message_t::request_method, ssdp_handle_ctrlpt_msg(), ssdp_handle_device_request(), and start_event_handler().
Referenced by readFromSSDPSocket().
void ssdp_handle_ctrlpt_msg | ( | http_message_t * | hmsg, |
struct sockaddr_storage * | dest_addr, | ||
int | timeout | ||
) |
This function handles the ssdp messages from the devices. These messages includes the search replies, advertisement of device coming alive and bye byes.
References memptr::buf, Handle_Info::Callback, Handle_Info::Cookie, GetClientHandleInfo(), GetHandleInfo(), gRecvThreadPool, http_message_t::is_request, memptr::length, PARSE_OK, send_search_result(), ssdp_request_type(), SSDPResultData_delete(), SSDPResultData_new(), SSDPResultData_set_Cookie(), SSDPResultData_set_CtrlptCallback(), SSDPResultData_set_Param(), Handle_Info::SsdpSearchList, http_message_t::status_code, ThreadPoolAdd(), TPJobInit(), TPJobSetFreeFunction(), TPJobSetPriority(), unique_service_name(), UPNP_DISCOVERY_ADVERTISEMENT_ALIVE, UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE, UPNP_DISCOVERY_SEARCH_TIMEOUT, UPNP_E_SUCCESS, UpnpDiscovery_delete(), UpnpDiscovery_get_Expires(), UpnpDiscovery_get_Location(), UpnpDiscovery_new(), UpnpDiscovery_set_DestAddr(), UpnpDiscovery_set_ErrCode(), UpnpDiscovery_set_Expires(), UpnpDiscovery_strcpy_Date(), UpnpDiscovery_strcpy_DeviceID(), UpnpDiscovery_strcpy_DeviceType(), UpnpDiscovery_strcpy_ServiceType(), UpnpDiscovery_strncpy_Ext(), UpnpDiscovery_strncpy_Location(), UpnpDiscovery_strncpy_Os(), and UpnpString_get_Length().
Referenced by ssdp_event_handler_thread().
void ssdp_handle_device_request | ( | http_message_t * | hmsg, |
struct sockaddr_storage * | dest_addr | ||
) |
Handles the search request. It does the sanity checks of the request and then schedules a thread to send a random time reply (random within maximum time given by the control point to reply).
References advertiseAndReplyThread(), memptr::buf, GetDeviceHandleInfo(), gTimerThread, memptr::length, REL_SEC, ssdp_request_type(), TimerThreadSchedule(), TPJobInit(), TPJobSetFreeFunction(), and UpnpPrintf().
Referenced by ssdp_event_handler_thread().
int ssdp_request_type | ( | char * | cmd, |
SsdpEvent * | Evt | ||
) |
Starts filling the SSDP event structure based upon the request received.
References NO_ERROR_FOUND, ssdp_request_type1(), SSDP_SERROR, and unique_service_name().
Referenced by ssdp_handle_ctrlpt_msg(), and ssdp_handle_device_request().
enum SsdpSearchType ssdp_request_type1 | ( | char * | cmd | ) |
This function figures out the type of the SSDP search in the in the request.
References SSDP_SERROR.
Referenced by SearchByTarget(), and ssdp_request_type().
|
static |
Parses the message and dispatches it to a handler which handles the ssdp request msg.
[in] | Data | ssdp_thread_data structure. This structure contains SSDP request message. |
References free_ssdp_event_handler_data(), http_message_t::method, PARSE_FAILURE, PARSE_SUCCESS, UpnpPrintf(), valid_ssdp_msg(), and http_parser_t::valid_ssdp_notify_hack.
Referenced by ssdp_event_handler_thread().
int unique_service_name | ( | char * | cmd, |
SsdpEvent * | Evt | ||
) |
Fills the fields of the event structure like DeviceType, Device UDN and Service Type.
Referenced by ssdp_handle_ctrlpt_msg(), and ssdp_request_type().
|
static |
Does some quick checking of the ssdp msg.
[in] | hmsg | ssdp_thread_data structure. This structure contains SSDP request message. |
References http_message_t::method, http_message_t::request_method, UpnpPrintf(), and http_message_t::uri.
Referenced by start_event_handler().
int SSDPSockArray::ssdpReqSock |
socket for sending search requests and receiving search replies
SOCKET SSDPSockArray::ssdpSock |
socket for incoming advertisments and search requests