libUPnP  1.6.17
Data Structures | Files | Defines | Typedefs | Enumerations | Functions | Variables
SSDP Library

Data Structures

struct  SsdpEventStruct
struct  TData
struct  ssdpsearchreply
struct  ssdpsearcharg
struct  ssdp_thread_data
struct  resultData
struct  SSDPSockArray

Files

file  ssdplib.h
file  ssdp_ctrlpt.c
file  ssdp_device.c
file  ssdp_ResultData.h
 

SSDPResultData object declararion.


file  ssdp_server.c

Defines

#define BUFSIZE   (size_t)2500
#define SSDP_IP   "239.255.255.250"
#define SSDP_IPV6_LINKLOCAL   "FF02::C"
#define SSDP_IPV6_SITELOCAL   "FF05::C"
#define SSDP_PORT   1900
#define NUM_TRY   3
#define THREAD_LIMIT   50
#define COMMAND_LEN   300
#define MSGTYPE_SHUTDOWN   0
#define MSGTYPE_ADVERTISEMENT   1
#define MSGTYPE_REPLY   2
#define MAX_TIME_TOREAD   45

Typedefs

typedef enum SsdpSearchType SType
typedef struct resultData ResultData

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 (IN void *data)
 Sends a callback to the control point application with a SEARCH result.
static int CreateClientRequestPacket (INOUT char *RqstBuf, IN size_t RqstBufSize, IN int Mx, IN char *SearchTarget, IN 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.

Variables

SOCKET gSsdpReqSocket4 = INVALID_SOCKET
static const char SERVICELIST_STR [] = "serviceList"

X_USER_AGENT

can be overwritten by configure CFLAGS argument.

The { 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 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.
void 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, void *cookie)
 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 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 Documentation

#define NO_ERROR_FOUND   0

Error codes.

Referenced by ssdp_request_type().


Typedef Documentation

typedef struct resultData ResultData

Structure to contain Discovery response.

typedef struct SsdpEventStruct SsdpEvent

Structure to store the SSDP information

typedef enum SsdpSearchType SType

Enumeration to define all different types of ssdp searches


Enumeration Type Documentation

Enumeration to define all different types of ssdp searches

Enumerator:
SSDP_SERROR 

Unknown search command.


Function Documentation

int AdvertiseAndReply ( int  AdFlag,
UpnpDevice_Handle  Hnd,
enum SsdpSearchType  SearchType,
struct sockaddr *  DestAddr,
char *  DeviceType,
char *  DeviceUDN,
char *  ServiceType,
int  Exp 
)
void * advertiseAndReplyThread ( void *  data)

Wrapper function to reply the search request coming from the control point.

Returns:
always return NULL

References AdvertiseAndReply().

Referenced by ssdp_handle_device_request().

static int create_ssdp_sock_reqv4 ( SOCKET ssdpReqSock) [static]

Creates the SSDP IPv4 socket to be used by the control point.

Returns:
UPNP_E_SUCCESS on successful socket creation.
Parameters:
[out]ssdpReqSockSSDP 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 int create_ssdp_sock_v4 ( SOCKET ssdpSock) [static]
Parameters:
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 int CreateClientRequestPacket ( INOUT char *  RqstBuf,
IN size_t  RqstBufSize,
IN int  Mx,
IN char *  SearchTarget,
IN int  AddressFamily 
) [static]

Creates a HTTP search request packet depending on the input parameter.

Parameters:
[in,out]RqstBufOutput string in HTTP format.
[in]RqstBufSizeRqstBuf size.
[in]MxSearch Target.
[in]SearchTargetNumber of seconds to wait to collect all the responses.
[in]AddressFamilysearch address family.

References UPNP_E_INTERNAL_ERROR, UPNP_E_INVALID_ARGUMENT, and UPNP_E_SUCCESS.

Referenced by SearchByTarget().

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 
) [static]

Creates a HTTP request packet. Depending on the input parameter, it either creates a service advertisement request or service shutdown request etc.

Parameters:
[in]msg_typetype of the message (Search Reply, Advertisement or Shutdown).
[in]ntssdp type.
[in]usnunique service name ( go in the HTTP Header).
[in]locationLocation URL.
[in]durationService duration in sec.
[out]packetOutput buffer filled with HTTP statement.
[in]AddressFamilyAddress family of the HTTP request.
[in]PowerStatePowerState as defined by UPnP Low Power.
[in]SleepPeriodSleepPeriod as defined by UPnP Low Power.
[in]RegistrationStateRegistrationState 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.

Returns:
UPNP_E_SUCCESS if successful else appropriate error.

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.

Returns:
UPNP_E_SUCCESS if successful else appropriate error.

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.

Returns:
UPNP_E_SUCCESS if successful else appropriate error.

References CreateServicePacket(), gIF_INDEX, isUrlV6UlaGua(), NewRequestHandler(), UPNP_E_OUTOF_MEMORY, and UpnpPrintf().

Referenced by AdvertiseAndReply().

static int extractIPv6address ( char *  url,
char *  address 
) [static]
Returns:
1 if an inet6 @ has been found.

Referenced by isUrlV6UlaGua().

static void free_ssdp_event_handler_data ( void *  the_data) [static]

Frees the ssdp request.

Parameters:
[in]the_datassdp_thread_data structure. This structure contains SSDP request message.

Referenced by readFromSSDPSocket(), ssdp_event_handler_thread(), and start_event_handler().

Creates the IPv4 and IPv6 ssdp sockets required by the control point and device operation.

Creates the SSDP IPv6 socket to be used by the control point.

Returns:
UPNP_E_SUCCESS if successful else returns appropriate error.

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 int isUrlV6UlaGua ( char *  descdocUrl) [static]
Returns:
1 if the Url contains an ULA or GUA IPv6 address, 0 otherwise.

References extractIPv6address().

Referenced by CreateServicePacket(), DeviceAdvertisement(), DeviceShutdown(), ServiceAdvertisement(), and ServiceShutdown().

static int NewRequestHandler ( struct sockaddr *  DestAddr,
int  NumPacket,
char **  RqPacket 
) [static]

Works as a request handler which passes the HTTP request string to multicast channel.

Returns:
1 if successful else appropriate error.
Parameters:
[in]DestAddrIp address, to send the reply.
[in]NumPacketNumber of packet to be sent.
[in]RqPacket.

References gIF_INDEX, gIF_IPV4, INVALID_SOCKET, 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().

void readFromSSDPSocket ( SOCKET  socket)
int SearchByTarget ( 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:

  • "ssdp:all" : Search for all devices and services.
  • "ssdp:rootdevice" : Search for root devices only.
  • "uuid:<device-uuid>" : Search for a particular device.
  • "urn:schemas-upnp-org:device:<deviceType:v>"
  • "urn:schemas-upnp-org:service:<serviceType:v>"
  • "urn:<domain-name>:device:<deviceType:v>"
  • "urn:<domain-name>:service:<serviceType:v>"
Returns:
1 if successful else appropriate error.

References Handle_Info::Cookie, CreateClientRequestPacket(), GetClientHandleInfo(), gIF_INDEX, gIF_IPV4, gTimerThread, INVALID_SOCKET, ListAddTail(), 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 void send_search_result ( IN void *  data) [static]

Sends a callback to the control point application with a SEARCH result.

References UPNP_DISCOVERY_SEARCH_RESULT.

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.

Returns:
UPNP_E_SUCCESS if successful else appropriate error.

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.

Returns:
UPNP_E_SUCCESS if successful else appropriate error.

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.

Returns:
UPNP_E_SUCCESS if successful else appropriate error.

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.

Returns:
UPNP_E_SUCCESS if successful else appropriate error.

References CreateServicePacket(), gIF_INDEX, isUrlV6UlaGua(), NewRequestHandler(), UPNP_E_OUTOF_MEMORY, and UpnpPrintf().

Referenced by AdvertiseAndReply().

static void ssdp_event_handler_thread ( void *  the_data) [static]

This function is a thread that handles SSDP requests.

Parameters:
the_data[] ssdp_thread_data structure. This structure contains SSDP request message.

References FALSE, 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,
void *  cookie 
)
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.

Returns:
0 on success; -1 on error.

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.

Returns:
enum SsdpSearchType. Returns appropriate search type, else returns SSDP_ERROR

References SSDP_SERROR.

Referenced by SearchByTarget(), and ssdp_request_type().

static UPNP_INLINE int start_event_handler ( void *  Data) [static]

Parses the message and dispatches it to a handler which handles the ssdp request msg.

Returns:
0 if successful, -1 if error.
Parameters:
[in]Datassdp_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.

Returns:
0 if successful else -1.

Referenced by ssdp_handle_ctrlpt_msg(), and ssdp_request_type().

static UPNP_INLINE int valid_ssdp_msg ( http_message_t hmsg) [static]

Does some quick checking of the ssdp msg.

Returns:
TRUE if msg is valid, else FALSE.
Parameters:
[in]hmsgssdp_thread_data structure. This structure contains SSDP request message.

References FALSE, http_message_t::method, http_message_t::request_method, UpnpPrintf(), and http_message_t::uri.

Referenced by start_event_handler().