pupnp (libupnp) snapshot from SourceForge: git clone git://pupnp.git.sourceforge...
[igd2-for-linux:pandonghui1211s-igd2-for-linux.git] / pupnp_branch-1.6.x / upnp / src / inc / ssdplib.h
1 ///////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2000-2003 Intel Corporation 
4 // All rights reserved. 
5 //
6 // Redistribution and use in source and binary forms, with or without 
7 // modification, are permitted provided that the following conditions are met: 
8 //
9 // * Redistributions of source code must retain the above copyright notice, 
10 // this list of conditions and the following disclaimer. 
11 // * Redistributions in binary form must reproduce the above copyright notice, 
12 // this list of conditions and the following disclaimer in the documentation 
13 // and/or other materials provided with the distribution. 
14 // * Neither name of Intel Corporation nor the names of its contributors 
15 // may be used to endorse or promote products derived from this software 
16 // without specific prior written permission.
17 // 
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR 
22 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
23 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
25 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
26 // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
28 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 ///////////////////////////////////////////////////////////////////////////
31
32 #ifndef SSDPLIB_H
33 #define SSDPLIB_H 
34
35 #include <sys/types.h>
36 #include <signal.h>
37 #include <setjmp.h>
38 #include <fcntl.h>
39 #include <errno.h>
40 #include "httpparser.h"
41 #include "httpreadwrite.h"
42 #include "miniserver.h"
43 #ifndef WIN32
44  #include <syslog.h>
45  #include <sys/socket.h>
46  #include <netinet/in.h>
47  #include <netinet/in_systm.h>
48  #include <netinet/ip.h>
49  #include <netinet/ip_icmp.h>
50  #include <sys/time.h>
51  #include <arpa/inet.h>
52 #else
53 #include <winsock2.h>
54 #endif
55
56 //Enumeration to define all different types of ssdp searches
57 typedef enum SsdpSearchType{
58         SSDP_SERROR=-1,
59         SSDP_ALL,SSDP_ROOTDEVICE,
60         SSDP_DEVICEUDN,
61         SSDP_DEVICETYPE,
62         SSDP_SERVICE
63 } SType;
64
65
66 //Enumeration to define all different type of ssdp messages
67 typedef enum SsdpCmdType{SSDP_ERROR=-1,
68         SSDP_OK,
69         SSDP_ALIVE,
70         SSDP_BYEBYE,
71         SSDP_SEARCH,
72         SSDP_NOTIFY,
73         SSDP_TIMEOUT
74 } Cmd;
75
76
77
78 //Constant
79 #define  BUFSIZE   2500
80 #define  SSDP_IP   "239.255.255.250"
81 #define  SSDP_PORT 1900
82 #define  NUM_TRY 3
83 #define  NUM_COPY 1
84 #define  THREAD_LIMIT 50
85 #define  COMMAND_LEN  300
86
87 #ifndef X_USER_AGENT // can be overwritten by configure CFLAGS argument
88 /** @name X_USER_AGENT
89  *  The {\tt X_USER_AGENT} constant specifies the value of the X-User-Agent:
90  *  HTTP header. The value "redsonic" is needed for the DSM-320. See
91  *  https://sourceforge.net/forum/message.php?msg_id=3166856 for more
92  * information
93  */ 
94  #define X_USER_AGENT "redsonic"
95 #endif
96
97 //Error code
98 #define NO_ERROR_FOUND    0
99 #define E_REQUEST_INVALID       -3
100 #define E_RES_EXPIRED           -4
101 #define E_MEM_ALLOC             -5
102 #define E_HTTP_SYNTEX           -6
103 #define E_SOCKET                -7
104 #define RQST_TIMEOUT    20
105
106
107
108 //Structure to store the SSDP information
109 typedef struct SsdpEventStruct
110 {
111   enum SsdpCmdType Cmd;
112   enum SsdpSearchType RequestType;
113   int  ErrCode;
114   int  MaxAge;
115   int  Mx;
116   char UDN[LINE_SIZE];
117   char DeviceType[LINE_SIZE];
118   char ServiceType[LINE_SIZE];  //NT or ST
119   char Location[LINE_SIZE];
120   char HostAddr[LINE_SIZE];
121   char Os[LINE_SIZE];
122   char Ext[LINE_SIZE];
123   char Date[LINE_SIZE];
124   struct sockaddr_in * DestAddr;
125   void * Cookie;
126 } Event;
127
128 typedef void (* SsdpFunPtr)(Event *);
129
130 typedef Event SsdpEvent ;
131
132 //Structure to contain Discovery response
133 typedef struct resultData
134 {
135   struct Upnp_Discovery param;
136   void *cookie;
137   Upnp_FunPtr ctrlpt_callback;
138 }ResultData;
139
140
141 typedef struct TData
142 {
143    int Mx;
144    void * Cookie;
145    char * Data;
146    struct sockaddr_in DestAddr;
147    
148 }ThreadData;
149
150 typedef struct ssdpsearchreply
151 {
152   int MaxAge;
153   UpnpDevice_Handle handle;
154   struct sockaddr_in dest_addr;
155   SsdpEvent event;
156   
157 }SsdpSearchReply;
158
159 typedef struct ssdpsearcharg
160 {
161   int timeoutEventId;
162   char * searchTarget;
163   void *cookie;
164   enum SsdpSearchType requestType;
165 } SsdpSearchArg;
166
167
168 typedef struct 
169 {
170   http_parser_t parser;
171   struct sockaddr_in dest_addr;
172 } ssdp_thread_data;
173
174
175 /* globals */
176
177 CLIENTONLY(extern SOCKET gSsdpReqSocket;);
178
179 typedef int (*ParserFun)(char *, Event *);
180
181
182 //void InitParser();
183
184 //int AnalyzeCommand(char * szCommand, Event * Evt);
185
186 /************************************************************************
187 * Function : Make_Socket_NoBlocking
188 *
189 * Parameters:
190 *       IN int sock: socket
191 *
192 * Description:
193 *       This function to make ssdp socket non-blocking.
194 *
195 * Returns: int
196 *       0 if successful else -1 
197 ***************************************************************************/
198 int Make_Socket_NoBlocking (int sock);
199
200 /************************************************************************
201 * Function : ssdp_handle_device_request
202 *
203 * Parameters:
204 *               IN void *data:
205 *
206 * Description:
207 *       This function handles the search request. It do the sanity checks of
208 *       the request and then schedules a thread to send a random time reply (
209 *       random within maximum time given by the control point to reply).
210 *
211 * Returns: void *
212 *       1 if successful else appropriate error
213 ***************************************************************************/
214 #ifdef INCLUDE_DEVICE_APIS
215 void ssdp_handle_device_request(
216         IN http_message_t* hmsg, 
217         IN struct sockaddr_in* dest_addr );
218 #else
219 static inline void ssdp_handle_device_request(
220         IN http_message_t* hmsg, 
221         IN struct sockaddr_in* dest_addr ) {}
222 #endif
223
224 /************************************************************************
225 * Function : ssdp_handle_ctrlpt_msg
226 *
227 * Parameters:
228 *       IN http_message_t* hmsg: SSDP message from the device
229 *       IN struct sockaddr_in* dest_addr: Address of the device
230 *       IN xboolean timeout: timeout kept by the control point while sending 
231 *               search message
232 *       IN void* cookie: Cookie stored by the control point application. 
233 *               This cookie will be returned to the control point
234 *               in the callback
235 *
236 * Description:
237 *       This function handles the ssdp messages from the devices. These 
238 *       messages includes the search replies, advertisement of device coming 
239 *       alive and bye byes.
240 *
241 * Returns: void
242 *
243 ***************************************************************************/
244 void ssdp_handle_ctrlpt_msg(
245         IN http_message_t* hmsg, 
246         IN struct sockaddr_in* dest_addr,
247         IN xboolean timeout,
248         IN void* cookie );
249
250 /************************************************************************
251 * Function : unique_service_name
252 *
253 * Parameters:
254 *       IN char *cmd: Service Name string
255 *       OUT SsdpEvent *Evt: The SSDP event structure partially filled
256 *               by all the function.
257 *
258 * Description:
259 *       This function fills the fields of the event structure like DeviceType,
260 *       Device UDN and Service Type
261 *
262 * Returns: int
263 *       0 if successful else -1 
264 ***************************************************************************/
265 int unique_service_name(char * cmd, SsdpEvent * Evt);
266
267
268 /************************************************************************
269 * Function : get_ssdp_sockets
270 *
271 * Parameters:
272 *       OUT MiniServerSockArray *out: Arrays of SSDP sockets
273 *
274 * Description:
275 *       This function creates the ssdp sockets. It set their option to listen 
276 *       for multicast traffic.
277 *
278 * Returns: int
279 *       return UPNP_E_SUCCESS if successful else returns appropriate error
280 ***************************************************************************/
281 int get_ssdp_sockets(MiniServerSockArray *out);
282
283
284 /************************************************************************
285 * Function : readFromSSDPSocket 
286 *
287 * Parameters:
288 *       IN SOCKET socket: SSDP socket
289 *
290 * Description:
291 *       This function reads the data from the ssdp socket.
292 *
293 * Returns: void
294 *       
295 ***************************************************************************/
296 void readFromSSDPSocket(SOCKET socket);
297
298
299 /************************************************************************
300 * Function : ssdp_request_type1
301 *
302 * Parameters:
303 *       IN char *cmd: command came in the ssdp request
304 *
305 * Description:
306 *       This function figures out the type of the SSDP search in the
307 *       in the request.
308 *
309 * Returns: enum SsdpSearchType
310 *       return appropriate search type else returns SSDP_ERROR
311 ***************************************************************************/
312 enum SsdpSearchType ssdp_request_type1(IN char *cmd);
313
314
315 /************************************************************************
316 * Function : ssdp_request_type
317 *
318 * Parameters:
319 *       IN char *cmd: command came in the ssdp request
320 *       OUT SsdpEvent *Evt: The event structure partially filled by
321 *                this function.
322 *
323 * Description:
324 *       This function starts filling the SSDP event structure based upon the 
325 *       request received. 
326 *
327 * Returns: int
328 *       0 on success; -1 on error
329 ***************************************************************************/
330 int ssdp_request_type(IN char * cmd, OUT SsdpEvent * Evt);
331
332
333 /************************************************************************
334 * Function : SearchByTarget
335 *
336 * Parameters:
337 *       IN int Mx:Number of seconds to wait, to collect all the responses.
338 *       char *St: Search target.
339 *       void *Cookie: cookie provided by control point application. This
340 *               cokie will be returned to application in the callback.
341 *
342 * Description:
343 *       This function creates and send the search request for a specific URL.
344 *
345 * Returns: int
346 *       1 if successful else appropriate error
347 ***************************************************************************/
348 int SearchByTarget(IN int Mx, IN char *St, IN void *Cookie);
349
350 /************************************************************************
351 * Function : DeviceAdvertisement
352 *
353 * Parameters:
354 *       IN char *DevType : type of the device
355 *       IN int RootDev   : flag to indicate if the device is root device
356 *       IN char *Udn     :
357 *       IN char *Location: Location URL.
358 *       IN int Duration  : Service duration in sec.
359 *
360 * Description:
361 *       This function creates the device advertisement request based on
362 *       the input parameter, and send it to the multicast channel.
363 *
364 * Returns: int
365 *       UPNP_E_SUCCESS if successful else appropriate error
366 ***************************************************************************/
367 int DeviceAdvertisement(
368         IN char *DevType,
369         IN int RootDev,
370         IN char *Udn, 
371         IN char *Location,
372         IN int Duration);
373
374
375 /************************************************************************
376 * Function : DeviceShutdown
377 *
378 * Parameters:   
379 *       IN char *DevType: Device Type.
380 *       IN int RootDev:1 means root device.
381 *       IN char *Udn: Device UDN
382 *       IN char *_Server:
383 *       IN char *Location: Location URL
384 *       IN int Duration :Device duration in sec.
385 *
386 * Description:
387 *       This function creates a HTTP device shutdown request packet 
388 *       and sent it to the multicast channel through RequestHandler.
389 *
390 * Returns: int
391 *       UPNP_E_SUCCESS if successful else appropriate error
392 ***************************************************************************/
393 int DeviceShutdown(
394         IN char *DevType, 
395         IN int RootDev,
396         IN char *Udn, 
397         IN char *_Server, 
398         IN char *Location, 
399         IN int Duration);
400
401 /************************************************************************
402 * Function : DeviceReply
403 *
404 * Parameters:   
405 *       IN struct sockaddr_in * DestAddr:destination IP address.
406 *       IN char *DevType: Device type
407 *       IN int RootDev: 1 means root device 0 means embedded device.
408 *       IN char *Udn: Device UDN
409 *       IN char *Location: Location of Device description document.
410 *       IN int Duration :Life time of this device.
411 *
412 * Description:
413 *       This function creates the reply packet based on the input parameter, 
414 *       and send it to the client address given in its input parameter DestAddr.
415 *
416 * Returns: int
417 *       UPNP_E_SUCCESS if successful else appropriate error
418 ***************************************************************************/
419 int DeviceReply(
420         IN struct sockaddr_in * DestAddr, 
421         IN char *DevType, 
422         IN int RootDev, 
423         IN char *Udn, 
424         IN char *Location, IN int  Duration);
425
426 /************************************************************************
427 * Function : SendReply
428 *
429 * Parameters:   
430 *       IN struct sockaddr_in * DestAddr:destination IP address.
431 *       IN char *DevType: Device type
432 *       IN int RootDev: 1 means root device 0 means embedded device.
433 *       IN char * Udn: Device UDN
434 *       IN char *_Server:
435 *       IN char *Location: Location of Device description document.
436 *       IN int Duration :Life time of this device.
437 *       IN int ByType:
438 *
439 * Description:
440 *       This function creates the reply packet based on the input parameter, 
441 *       and send it to the client addesss given in its input parameter DestAddr.
442 *
443 * Returns: int
444 *       UPNP_E_SUCCESS if successful else appropriate error
445 ***************************************************************************/
446 int SendReply(
447         IN struct sockaddr_in * DestAddr, 
448         IN char *DevType, 
449         IN int RootDev, 
450         IN char *Udn, 
451         IN char *Location, 
452         IN int Duration, 
453         IN int ByType );
454
455 /************************************************************************
456 * Function : ServiceAdvertisement
457 *
458 * Parameters:   
459 *       IN char * Udn: Device UDN
460 *       IN char *ServType: Service Type.
461 *       IN char * Location: Location of Device description document.
462 *       IN int Duration :Life time of this device.
463 *
464 * Description:
465 *       This function creates the advertisement packet based 
466 *       on the input parameter, and send it to the multicast channel.
467 *
468 * Returns: int
469 *       UPNP_E_SUCCESS if successful else appropriate error
470 ***************************************************************************/
471 int ServiceAdvertisement(
472         IN char *Udn, 
473         IN char *ServType,
474         IN char *Location,
475         IN int Duration);
476
477 /************************************************************************
478 * Function : ServiceReply
479 *
480 * Parameters:   
481 *       IN struct sockaddr_in *DestAddr:
482 *       IN char *Udn: Device UDN
483 *       IN char *ServType: Service Type.
484 *       IN char *Server: Not used
485 *       IN char *Location: Location of Device description document.
486 *       IN int Duration :Life time of this device.
487 *
488 * Description:
489 *       This function creates the advertisement packet based 
490 *       on the input parameter, and send it to the multicast channel.
491 *
492 * Returns: int
493 *       UPNP_E_SUCCESS if successful else appropriate error
494 ***************************************************************************/
495 int ServiceReply(
496         IN struct sockaddr_in *DestAddr,  
497         IN char *ServType, 
498         IN char *Udn, 
499         IN char *Location,
500         IN int Duration);
501
502 /************************************************************************
503 * Function : ServiceShutdown
504 *
505 * Parameters:
506 *       IN char *Udn: Device UDN
507 *       IN char *ServType: Service Type.
508 *       IN char *Location: Location of Device description document.
509 *       IN int Duration :Service duration in sec.
510 *
511 * Description:
512 *       This function creates a HTTP service shutdown request packet 
513 *       and sent it to the multicast channel through RequestHandler.
514 *
515 * Returns: int
516 *       UPNP_E_SUCCESS if successful else appropriate error
517 ***************************************************************************/
518 int ServiceShutdown(
519         IN char *Udn,
520         IN char *ServType,
521         IN char *Location,
522         IN int Duration);
523
524
525 /************************************************************************
526 * Function : advertiseAndReplyThread
527 *
528 * Parameters:
529 *       IN void *data: Structure containing the search request
530 *
531 * Description:
532 *       This function is a wrapper function to reply the search request 
533 *       coming from the control point.
534 *
535 * Returns: void *
536 *       always return NULL
537 ***************************************************************************/
538 void *advertiseAndReplyThread(IN void * data);
539
540 /************************************************************************
541 * Function : AdvertiseAndReply
542 *
543 * Parameters:
544 *       IN int AdFlag: -1 = Send shutdown,
545 *                       0 = send reply, 
546 *                       1 = Send Advertisement
547 *       IN UpnpDevice_Handle Hnd: Device handle
548 *       IN enum SsdpSearchType SearchType:Search type for sending replies
549 *       IN struct sockaddr_in *DestAddr:Destination address
550 *       IN char *DeviceType:Device type
551 *       IN char *DeviceUDN:Device UDN
552 *       IN char *ServiceType:Service type
553 *       IN int Exp:Advertisement age
554 *
555 * Description:
556 *       This function to send SSDP advertisements, replies and shutdown messages.
557 *
558 * Returns: int
559 *       UPNP_E_SUCCESS if successful else appropriate error
560 ***************************************************************************/
561 int AdvertiseAndReply(
562         IN int AdFlag, 
563         IN UpnpDevice_Handle Hnd, 
564         IN enum SsdpSearchType SearchType, 
565         IN struct sockaddr_in *DestAddr,
566         IN char *DeviceType, 
567         IN char *DeviceUDN, 
568         IN char *ServiceType, int Exp);
569
570 #endif
571