ssdplib.h
/**************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
**************************************************************************/
#ifndef SSDPLIB_H
#define SSDPLIB_H
#include "httpparser.h"
#include "httpreadwrite.h"
#include "miniserver.h"
#include "UpnpInet.h"
#include <sys/types.h>
#include <signal.h>
#include <setjmp.h>
#include <fcntl.h>
#include <errno.h>
#ifdef WIN32
#else
#include <syslog.h>
#include <sys/socket.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <sys/time.h>
#include <arpa/inet.h>
#endif
/* Enumeration to define all different types of ssdp searches */
typedef enum SsdpSearchType{
SSDP_SERROR=-1,
SSDP_ALL,SSDP_ROOTDEVICE,
SSDP_DEVICEUDN,
SSDP_DEVICETYPE,
SSDP_SERVICE
} SType;
/* Enumeration to define all different type of ssdp messages */
typedef enum SsdpCmdType{
SSDP_ERROR=-1,
SSDP_OK,
SSDP_ALIVE,
SSDP_BYEBYE,
SSDP_SEARCH,
SSDP_NOTIFY,
SSDP_TIMEOUT
} Cmd;
/* Constant */
#define BUFSIZE 2500
#define SSDP_IP "239.255.255.250"
#define SSDP_IPV6_LINKLOCAL "FF02::C"
#define SSDP_PORT 1900
#define NUM_TRY 3
#define NUM_COPY 1
#define THREAD_LIMIT 50
#define COMMAND_LEN 300
/* can be overwritten by configure CFLAGS argument */
#ifndef X_USER_AGENT
#define X_USER_AGENT "redsonic"
#endif
/* Error code */
#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
/* Structure to store the SSDP information */
typedef struct SsdpEventStruct
{
enum SsdpCmdType Cmd;
enum SsdpSearchType RequestType;
int ErrCode;
int MaxAge;
int Mx;
char UDN[LINE_SIZE];
char DeviceType[LINE_SIZE];
char ServiceType[LINE_SIZE]; //NT or ST
char Location[LINE_SIZE];
char HostAddr[LINE_SIZE];
char Os[LINE_SIZE];
char Ext[LINE_SIZE];
char Date[LINE_SIZE];
struct sockaddr *DestAddr;
void * Cookie;
} Event;
typedef void (* SsdpFunPtr)(Event *);
typedef Event SsdpEvent ;
typedef struct TData
{
int Mx;
void * Cookie;
char * Data;
struct sockaddr_storage DestAddr;
}ThreadData;
typedef struct ssdpsearchreply
{
int MaxAge;
UpnpDevice_Handle handle;
struct sockaddr_storage dest_addr;
SsdpEvent event;
}SsdpSearchReply;
typedef struct ssdpsearcharg
{
int timeoutEventId;
char * searchTarget;
void *cookie;
enum SsdpSearchType requestType;
} SsdpSearchArg;
typedef struct
{
http_parser_t parser;
struct sockaddr_storage dest_addr;
} ssdp_thread_data;
/* globals */
CLIENTONLY(extern SOCKET gSsdpReqSocket4;);
CLIENTONLY(extern SOCKET gSsdpReqSocket6;);
typedef int (*ParserFun)(char *, Event *);
/************************************************************************
* Function : Make_Socket_NoBlocking
*
* Parameters:
* IN int sock: socket
*
* Description:
* This function to make ssdp socket non-blocking.
*
* Returns: int
* 0 if successful else -1
***************************************************************************/
int Make_Socket_NoBlocking (int sock);
/************************************************************************
* Function : ssdp_handle_device_request
*
* Parameters:
* IN void *data:
*
* Description:
* This function handles the search request. It do 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).
*
* Returns: void *
* 1 if successful else appropriate error
***************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
void ssdp_handle_device_request(
IN http_message_t* hmsg,
IN struct sockaddr* dest_addr );
#else
static inline void ssdp_handle_device_request(
IN http_message_t* hmsg,
IN struct sockaddr* dest_addr ) {}
#endif
/************************************************************************
* Function : ssdp_handle_ctrlpt_msg
*
* Parameters:
* IN http_message_t* hmsg: SSDP message from the device
* IN struct sockaddr* dest_addr: Address of the device
* IN xboolean timeout: timeout kept by the control point while sending
* search message
* IN void* cookie: Cookie stored by the control point application.
* This cookie will be returned to the control point
* in the callback
*
* Description:
* This function handles the ssdp messages from the devices. These
* messages includes the search replies, advertisement of device coming
* alive and bye byes.
*
* Returns: void
*
***************************************************************************/
void ssdp_handle_ctrlpt_msg(
IN http_message_t* hmsg,
IN struct sockaddr* dest_addr,
IN xboolean timeout,
IN void* cookie );
/************************************************************************
* Function : unique_service_name
*
* Parameters:
* IN char *cmd: Service Name string
* OUT SsdpEvent *Evt: The SSDP event structure partially filled
* by all the function.
*
* Description:
* This function fills the fields of the event structure like DeviceType,
* Device UDN and Service Type
*
* Returns: int
* 0 if successful else -1
***************************************************************************/
int unique_service_name(char * cmd, SsdpEvent * Evt);
/************************************************************************
* Function : get_ssdp_sockets
*
* Parameters:
* OUT MiniServerSockArray *out: Arrays of SSDP sockets
*
* Description:
* This function creates the ssdp sockets. It set their option to listen
* for multicast traffic.
*
* Returns: int
* return UPNP_E_SUCCESS if successful else returns appropriate error
***************************************************************************/
int get_ssdp_sockets(MiniServerSockArray *out);
/************************************************************************
* Function : readFromSSDPSocket
*
* Parameters:
* IN SOCKET socket: SSDP socket
*
* Description:
* This function reads the data from the ssdp socket.
*
* Returns: void
*
***************************************************************************/
void readFromSSDPSocket(SOCKET socket);
/************************************************************************
* Function : ssdp_request_type1
*
* Parameters:
* IN char *cmd: command came in the ssdp request
*
* Description:
* This function figures out the type of the SSDP search in the
* in the request.
*
* Returns: enum SsdpSearchType
* return appropriate search type else returns SSDP_ERROR
***************************************************************************/
enum SsdpSearchType ssdp_request_type1(IN char *cmd);
/************************************************************************
* Function : ssdp_request_type
*
* Parameters:
* IN char *cmd: command came in the ssdp request
* OUT SsdpEvent *Evt: The event structure partially filled by
* this function.
*
* Description:
* This function starts filling the SSDP event structure based upon the
* request received.
*
* Returns: int
* 0 on success; -1 on error
***************************************************************************/
int ssdp_request_type(IN char * cmd, OUT SsdpEvent * Evt);
/************************************************************************
* Function : SearchByTarget
*
* Parameters:
* IN int Mx:Number of seconds to wait, to collect all the responses.
* char *St: Search target.
* void *Cookie: cookie provided by control point application. This
* cokie will be returned to application in the callback.
*
* Description:
* This function creates and send the search request for a specific URL.
*
* Returns: int
* 1 if successful else appropriate error
***************************************************************************/
int SearchByTarget(IN int Mx, IN char *St, IN void *Cookie);
/************************************************************************
* Function : DeviceAdvertisement
*
* Parameters:
* IN char *DevType : type of the device
* IN int RootDev : flag to indicate if the device is root device
* IN char *Udn :
* IN char *Location: Location URL.
* IN int Duration : Service duration in sec.
* IN int AddressFamily: Device address family.
*
* Description:
* This function creates the device advertisement request based on
* the input parameter, and send it to the multicast channel.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int DeviceAdvertisement(
IN char *DevType,
IN int RootDev,
IN char *Udn,
IN char *Location,
IN int Duration,
IN int AddressFamily);
/************************************************************************
* Function : DeviceShutdown
*
* Parameters:
* IN char *DevType: Device Type.
* IN int RootDev:1 means root device.
* IN char *Udn: Device UDN
* IN char *_Server:
* IN char *Location: Location URL
* IN int Duration :Device duration in sec.
* IN int AddressFamily: Device address family.
*
* Description:
* This function creates a HTTP device shutdown request packet
* and sent it to the multicast channel through RequestHandler.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int DeviceShutdown(
IN char *DevType,
IN int RootDev,
IN char *Udn,
IN char *_Server,
IN char *Location,
IN int Duration,
IN int AddressFamily);
/************************************************************************
* Function : DeviceReply
*
* Parameters:
* IN struct sockaddr *DestAddr: destination IP address.
* IN char *DevType: Device type
* IN int RootDev: 1 means root device 0 means embedded device.
* IN char *Udn: Device UDN
* IN char *Location: Location of Device description document.
* IN int Duration :Life time of this device.
*
* Description:
* This function creates the reply packet based on the input parameter,
* and send it to the client address given in its input parameter DestAddr.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int DeviceReply(
IN struct sockaddr *DestAddr,
IN char *DevType,
IN int RootDev,
IN char *Udn,
IN char *Location,
IN int Duration);
/************************************************************************
* Function : SendReply
*
* Parameters:
* IN struct sockaddr *DestAddr: destination IP address.
* IN char *DevType: Device type
* IN int RootDev: 1 means root device 0 means embedded device.
* IN char * Udn: Device UDN
* IN char *_Server:
* IN char *Location: Location of Device description document.
* IN int Duration :Life time of this device.
* IN int ByType:
*
* Description:
* This function creates the reply packet based on the input parameter,
* and send it to the client addesss given in its input parameter DestAddr.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int SendReply(
IN struct sockaddr *DestAddr,
IN char *DevType,
IN int RootDev,
IN char *Udn,
IN char *Location,
IN int Duration,
IN int ByType );
/************************************************************************
* Function : ServiceAdvertisement
*
* Parameters:
* IN char * Udn: Device UDN
* IN char *ServType: Service Type.
* IN char * Location: Location of Device description document.
* IN int Duration: Life time of this device.
* IN int AddressFamily: Device address family
*
* Description:
* This function creates the advertisement packet based
* on the input parameter, and send it to the multicast channel.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int ServiceAdvertisement(
IN char *Udn,
IN char *ServType,
IN char *Location,
IN int Duration,
IN int AddressFamily);
/************************************************************************
* Function : ServiceReply
*
* Parameters:
* IN struct sockaddr *DestAddr:
* IN char *Udn: Device UDN
* IN char *ServType: Service Type.
* IN char *Server: Not used
* IN char *Location: Location of Device description document.
* IN int Duration :Life time of this device.
*
* Description:
* This function creates the advertisement packet based
* on the input parameter, and send it to the multicast channel.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int ServiceReply(
IN struct sockaddr *DestAddr,
IN char *ServType,
IN char *Udn,
IN char *Location,
IN int Duration);
/************************************************************************
* Function : ServiceShutdown
*
* Parameters:
* IN char *Udn: Device UDN
* IN char *ServType: Service Type.
* IN char *Location: Location of Device description document.
* IN int Duration :Service duration in sec.
* IN int AddressFamily: Device address family
*
* Description:
* This function creates a HTTP service shutdown request packet
* and sent it to the multicast channel through RequestHandler.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int ServiceShutdown(
IN char *Udn,
IN char *ServType,
IN char *Location,
IN int Duration,
IN int AddressFamily);
/************************************************************************
* Function : advertiseAndReplyThread
*
* Parameters:
* IN void *data: Structure containing the search request
*
* Description:
* This function is a wrapper function to reply the search request
* coming from the control point.
*
* Returns: void *
* always return NULL
***************************************************************************/
void *advertiseAndReplyThread(IN void * data);
/************************************************************************
* Function : AdvertiseAndReply
*
* Parameters:
* IN int AdFlag: -1 = Send shutdown,
* 0 = send reply,
* 1 = Send Advertisement
* IN UpnpDevice_Handle Hnd: Device handle
* IN enum SsdpSearchType SearchType:Search type for sending replies
* IN struct sockaddr *DestAddr:Destination address
* IN char *DeviceType:Device type
* IN char *DeviceUDN:Device UDN
* IN char *ServiceType:Service type
* IN int Exp:Advertisement age
*
* Description:
* This function to send SSDP advertisements, replies and shutdown messages.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int AdvertiseAndReply(
IN int AdFlag,
IN UpnpDevice_Handle Hnd,
IN enum SsdpSearchType SearchType,
IN struct sockaddr *DestAddr,
IN char *DeviceType,
IN char *DeviceUDN,
IN char *ServiceType, int Exp);
#endif /* SSDPLIB_H */