SSDP Library

## Files

file | ssdplib.h
file | ssdp_ctrlpt.c
file | ssdp_device.c
file | ssdp_ResultData.h
| SSDPResultData object declararion.
file | ssdp_server.c

## Data Structures

struct | SsdpEventStruct
struct | TData
struct | ssdpsearchreply
struct | ssdpsearcharg
struct | ssdpsearchexparg
struct | ssdp_thread_data
struct | SSDPSockArray

## Macros

#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 | CLASS SSDPResultData
#define | EXPAND_CLASS_MEMBERS(CLASS)
#define | MAX_TIME_TOREAD 45

## 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 (IN void *data)
| Sends a callback to the control point application with a SEARCH result. More...
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. More...
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. More...
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. More...
void | SSDPResultData_Callback (const SSDPResultData *p)
void | RequestHandler ()
static void | free_ssdp_event_handler_data (void *the_data)
| Frees the ssdp request. More...
static UPNP_INLINE int | valid_ssdp_msg (http_message_t *hmsg)
| Does some quick checking of the ssdp msg. More...
static UPNP_INLINE int | start_event_handler (void *Data)
| Parses the message and dispatches it to a handler which handles the ssdp request msg. More...
static void | ssdp_event_handler_thread (void *the_data)
| This function is a thread that handles SSDP requests. More...
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. More...

## 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 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. More...
int | unique_service_name (char *cmd, SsdpEvent *Evt)
| Fills the fields of the event structure like DeviceType, Device UDN and Service Type. More...
enum SsdpSearchType | ssdp_request_type1 (char *cmd)
| This function figures out the type of the SSDP search in the in the request. More...
int | ssdp_request_type (char *cmd, SsdpEvent *Evt)
| Starts filling the SSDP event structure based upon the request received. More...
void | readFromSSDPSocket (SOCKET socket)
| This function reads the data from the ssdp socket. More...
int | get_ssdp_sockets (MiniServerSockArray *out)
| Creates the IPv4 and IPv6 ssdp sockets required by the control point and device operation. More...

## 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. More...
int | SearchByTarget (int Hnd, int Mx, char *St, void *Cookie)
| Creates and send the search request for a specific URL. More...

## SSDP Device Functions

void | advertiseAndReplyThread (void *data)
| Wrapper function to reply the search request coming from the control point. More...
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). More...
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. More...
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. More...
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. More...
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. More...
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. More...
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. More...
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. More...

## Detailed Description

## Macro Definition Documentation

## EXPAND_CLASS_MEMBERS

#define EXPAND_CLASS_MEMBERS | ( |  | CLASS | ) |

Value:
EXPAND_CLASS_MEMBER_OBJECT(CLASS, Param, UpnpDiscovery) \
EXPAND_CLASS_MEMBER_INT(CLASS, Cookie, void *) \
EXPAND_CLASS_MEMBER_INT(CLASS, CtrlptCallback, Upnp_FunPtr) \
CLASS
struct s_CLASS CLASS
Definition: TemplateInclude.h:138
Upnp_FunPtr
int(* Upnp_FunPtr)(Upnp_EventType EventType, const void *Event, void *Cookie)
Definition: Callback.h:145

## NO_ERROR_FOUND

#define NO_ERROR_FOUND 0

Error codes.

Referenced by ssdp_request_type().

## Typedef Documentation

## SsdpEvent

typedef struct SsdpEventStruct SsdpEvent

Structure to store the SSDP information

## SType

typedef enum SsdpSearchType SType

Enumeration to define all different types of ssdp searches

## Enumeration Type Documentation

## SsdpSearchType

enum SsdpSearchType

Enumeration to define all different types of ssdp searches

Enumerator
SSDP_SERROR | Unknown search command.

## Function Documentation

## AdvertiseAndReply()

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.

Returns
  UPNP_E_SUCCESS if successful else appropriate error.

References UPNP_E_SUCCESS.

Referenced by advertiseAndReplyThread().

## advertiseAndReplyThread()

void advertiseAndReplyThread | ( | void * | data | ) |

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

References AdvertiseAndReply().

## create_ssdp_sock_reqv4()

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] | ssdpReqSock | SSDP IPv4 request socket to be created.

Referenced by get_ssdp_sockets().

## create_ssdp_sock_v4()

static int create_ssdp_sock_v4 | ( | SOCKET * | ssdpSock | ) |

static

Parameters

  ssdpSock | [] SSDP IPv4 socket to be created.

## CreateClientRequestPacket()

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] | 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.

## CreateServicePacket()

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_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 membuffer_init(), and membuffer::size_inc.

## DeviceAdvertisement()

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.

## DeviceReply()

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.

## DeviceShutdown()

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.

## extractIPv6address()

static int extractIPv6address | ( | char * | url,
|  | char * | address
| ) |  |

static

Returns
  1 if an inet6 @ has been found.

Referenced by isUrlV6UlaGua().

## free_ssdp_event_handler_data()

static void free_ssdp_event_handler_data | ( | void * | the_data | ) |

static

Frees the ssdp request.

Parameters

  [in] | the_data | ssdp_thread_data structure. This structure contains SSDP request message.

## get_ssdp_sockets()

int get_ssdp_sockets | ( | MiniServerSockArray * | out | ) |

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(), gIF_IPV4, INVALID_SOCKET, MServerSockArray::ssdpReqSock4, MServerSockArray::ssdpReqSock6, and UPNP_E_SUCCESS.

## isUrlV6UlaGua()

static int isUrlV6UlaGua | ( | char * | descdocUrl | ) |

static

Returns
  1 if the Url contains an ULA or GUA IPv6 address, 0 otherwise.

References extractIPv6address().

## NewRequestHandler()

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
  UPNP_E_SUCCESS if successful else appropriate error.

Parameters

  [in] | DestAddr | Ip address, to send the reply.
  [in] | NumPacket | Number of packet to be sent.
  [in] | RqPacket | .

## readFromSSDPSocket()

void readFromSSDPSocket | ( | SOCKET | socket | ) |

This function reads the data from the ssdp socket.

## SearchByTarget()

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:

- "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.

## send_search_result()

static void send_search_result | ( | IN void * | data | ) |

static

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

## SendReply()

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 UPNP_E_OUTOF_MEMORY.

## ServiceAdvertisement()

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.

## ServiceReply()

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.

## ServiceShutdown()

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.

## ssdp_event_handler_thread()

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 http_message_t::method, and start_event_handler().

## ssdp_handle_ctrlpt_msg()

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.

## ssdp_handle_device_request()

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).

## ssdp_request_type()

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().

## ssdp_request_type1()

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

Referenced by ssdp_request_type().

## start_event_handler()

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] | Data | ssdp_thread_data structure. This structure contains SSDP request message.

Referenced by ssdp_event_handler_thread().

## unique_service_name()

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_request_type().

## valid_ssdp_msg()

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] | hmsg | ssdp_thread_data structure. This structure contains SSDP request message.

References http_message_t::method.