lssdp.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #ifndef __LSSDP_H
  2. #define __LSSDP_H
  3. #include <stdbool.h> // bool, true, false
  4. #include <stdint.h> // uint32_t
  5. // LSSDP Log Level
  6. enum LSSDP_LOG {
  7. LSSDP_LOG_DEBUG = 1 << 0,
  8. LSSDP_LOG_INFO = 1 << 1,
  9. LSSDP_LOG_WARN = 1 << 2,
  10. LSSDP_LOG_ERROR = 1 << 3
  11. };
  12. /* Struct : lssdp_nbr */
  13. #define LSSDP_FIELD_LEN 64
  14. #define LSSDP_LOCATION_LEN 128
  15. typedef struct lssdp_nbr {
  16. char usn [LSSDP_FIELD_LEN]; // Unique Service Name (Device Name or MAC)
  17. char location [LSSDP_LOCATION_LEN]; // URL or IP(:Port)
  18. /* Additional SSDP Header Fields */
  19. char sm_id [LSSDP_FIELD_LEN];
  20. char device_type [LSSDP_FIELD_LEN];
  21. long long update_time;
  22. struct lssdp_nbr * next;
  23. } lssdp_nbr;
  24. /* Struct : lssdp_ctx */
  25. #define LSSDP_INTERFACE_NAME_LEN 16 // IFNAMSIZ
  26. #define LSSDP_INTERFACE_LIST_SIZE 1
  27. #define LSSDP_IP_LEN 16
  28. typedef struct lssdp_ctx {
  29. int sock; // SSDP socket
  30. unsigned short port; // SSDP port (0x0000 ~ 0xFFFF)
  31. lssdp_nbr * neighbor_list; // SSDP neighbor list
  32. long neighbor_timeout; // milliseconds
  33. bool debug; // show debug log
  34. /* Network Interface */
  35. size_t interface_num; // interface number
  36. struct lssdp_interface {
  37. char name [LSSDP_INTERFACE_NAME_LEN]; // name[16]
  38. char ip [LSSDP_IP_LEN]; // ip[16] = "xxx.xxx.xxx.xxx"
  39. uint32_t addr; // address in network byte order
  40. uint32_t netmask; // mask in network byte order
  41. } interface[LSSDP_INTERFACE_LIST_SIZE]; // interface[16]
  42. /* SSDP Header Fields */
  43. struct {
  44. /* SSDP Standard Header Fields */
  45. char search_target [LSSDP_FIELD_LEN]; // Search Target
  46. char unique_service_name [LSSDP_FIELD_LEN]; // Unique Service Name: MAC or User Name
  47. /* Additional SSDP Header Fields */
  48. char sm_id [LSSDP_FIELD_LEN];
  49. char device_type [LSSDP_FIELD_LEN];
  50. struct { // Location (optional):
  51. char prefix [LSSDP_FIELD_LEN]; // Protocal: "https://" or "http://"
  52. char domain [LSSDP_FIELD_LEN]; // if domain is empty, using Interface IP as default
  53. char suffix [LSSDP_FIELD_LEN]; // URI or Port: "/index.html" or ":80"
  54. } location;
  55. } header;
  56. /* Callback Function */
  57. int (* network_interface_changed_callback) (struct lssdp_ctx * lssdp);
  58. int (* neighbor_list_changed_callback) (struct lssdp_ctx * lssdp);
  59. int (* packet_received_callback) (struct lssdp_ctx * lssdp, const char * packet, size_t packet_len);
  60. } lssdp_ctx;
  61. /*
  62. * 01. lssdp_network_interface_update
  63. *
  64. * update network interface.
  65. *
  66. * Note:
  67. * - lssdp.interface, lssdp.interface_num will be updated.
  68. *
  69. * @param lssdp
  70. * @return = 0 success
  71. * < 0 failed
  72. */
  73. int lssdp_network_interface_update(lssdp_ctx * lssdp);
  74. /*
  75. * 02. lssdp_socket_create
  76. *
  77. * create SSDP socket.
  78. *
  79. * Note:
  80. * - SSDP port must be setup ready before call this function. (lssdp.port > 0)
  81. * - if SSDP socket is already exist (lssdp.sock > 0),
  82. * the socket will be closed, and create a new one.
  83. * - SSDP neighbor list will be force clean up.
  84. *
  85. * @param lssdp
  86. * @return = 0 success
  87. * < 0 failed
  88. */
  89. int lssdp_socket_create(lssdp_ctx * lssdp);
  90. /*
  91. * 03. lssdp_socket_close
  92. *
  93. * close SSDP socket.
  94. *
  95. * Note:
  96. * - if SSDP socket <= 0, will be ignore, and lssdp.sock will be set to -1.
  97. * - SSDP neighbor list will be force clean up.
  98. *
  99. * @param lssdp
  100. * @return = 0 success
  101. * < 0 failed
  102. */
  103. int lssdp_socket_close(lssdp_ctx * lssdp);
  104. /*
  105. * 04. lssdp_socket_read
  106. *
  107. * read SSDP socket.
  108. *
  109. * 1. if read success, packet_received_callback will be invoked.
  110. * 2. if received SSDP packet is match to Search Target (lssdp.header.search_target),
  111. * - M-SEARCH: send RESPONSE back
  112. * - NOTIFY/RESPONSE: add/update to SSDP neighbor list
  113. *
  114. * Note:
  115. * - SSDP socket and port must be setup ready before call this function. (sock, port > 0)
  116. * - if SSDP neighbor list has been changed, neighbor_list_changed_callback will be invoked.
  117. *
  118. * @param lssdp
  119. * @return = 0 success
  120. * < 0 failed
  121. */
  122. int lssdp_socket_read(lssdp_ctx * lssdp);
  123. /*
  124. * 05. lssdp_send_msearch
  125. *
  126. * send SSDP M-SEARCH packet to multicast address (239.255.255.250)
  127. *
  128. * Note:
  129. * - SSDP port must be setup ready before call this function. (lssdp.port > 0)
  130. *
  131. * @param lssdp
  132. * @return = 0 success
  133. * < 0 failed
  134. */
  135. int lssdp_send_msearch(lssdp_ctx * lssdp);
  136. /*
  137. * 06. lssdp_send_notify
  138. *
  139. * send SSDP NOTIFY packet to multicast address (239.255.255.250)
  140. *
  141. * Note:
  142. * - SSDP port must be setup ready before call this function. (lssdp.port > 0)
  143. *
  144. * @param lssdp
  145. * @return = 0 success
  146. * < 0 failed
  147. */
  148. int lssdp_send_notify(lssdp_ctx * lssdp);
  149. /*
  150. * 07. lssdp_neighbor_check_timeout
  151. *
  152. * check neighbor in list is timeout or not. (lssdp.neighbor_timeout)
  153. * the timeout neighbor will be remove from the list.
  154. *
  155. * Note:
  156. * - if neighbor be removed, neighbor_list_changed_callback will be invoked.
  157. *
  158. * @param lssdp
  159. * @return = 0 success
  160. * < 0 failed
  161. */
  162. int lssdp_neighbor_check_timeout(lssdp_ctx * lssdp);
  163. /*
  164. * 08. lssdp_set_log_callback
  165. *
  166. * setup SSDP log callback. All SSDP library log will be forward to here.
  167. *
  168. * @param callback
  169. */
  170. void lssdp_set_log_callback(void (* callback)(const char * file, const char * tag, int level, int line, const char * func, const char * message));
  171. #endif