ql_wifi_net.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /**
  2. @file
  3. ql_wifi_net.c
  4. @brief
  5. Quectel wifi net api.
  6. */
  7. /*============================================================================
  8. Copyright (c) 2020 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
  9. Quectel Wireless Solution Proprietary and Confidential.
  10. =============================================================================*/
  11. /*===========================================================================
  12. EDIT HISTORY FOR MODULE
  13. This section contains comments describing changes made to the module.
  14. Notice that changes are listed in reverse chronological order.
  15. WHEN WHO WHAT, WHERE, WHY
  16. ---------- ------------ ----------------------------------------------------
  17. =============================================================================*/
  18. /*===========================================================================
  19. * include files
  20. ===========================================================================*/
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include "ql_api_osi.h"
  25. #include "ql_osi_def.h"
  26. #include "ql_log.h"
  27. #include "ql_api_wifi.h"
  28. #include "quec_common.h"
  29. #include "ql_wifi_msg.h"
  30. #include "ql_wifi_net.h"
  31. /*========================================================================
  32. * Macro Definition
  33. *========================================================================*/
  34. #define QL_WIFI_LOG_LEVEL QL_LOG_LEVEL_INFO
  35. #define QL_WIFI_NET_LOG(msg, ...) QL_LOG(QL_WIFI_LOG_LEVEL, "wifi_net", msg, ##__VA_ARGS__)
  36. #define QL_WIFI_NET_TASK_EVENT_CNT 5
  37. #define QL_WIFI_NET_MSG_QUEUE_CNT 100
  38. /*========================================================================
  39. * Enumeration Definition
  40. *========================================================================*/
  41. /*========================================================================
  42. * Type Definition
  43. *=========================================================================*/
  44. typedef struct
  45. {
  46. ql_queue_t msg_queue;
  47. ql_task_t task;
  48. ql_wifi_net_app_notify_cb app_notify_cb;
  49. } ql_wifi_net_manager_s;
  50. /*========================================================================
  51. * Global Variable
  52. *========================================================================*/
  53. ql_wifi_net_manager_s ql_wifi_net_manager = {0};
  54. ql_mutex_t ql_wifi_net_mutex = NULL;
  55. /*========================================================================
  56. * function Definition
  57. *========================================================================*/
  58. void ql_wifi_net_recv(void *ctx)
  59. {
  60. // Message from MSG engine.It needs to be registered to MSG engine.
  61. // Once we get data from MSG engine,it will be passed to NET engine.
  62. ql_wifi_msg_cmd_info_s *info = (ql_wifi_msg_cmd_info_s *)ctx;
  63. QuecOSStatus err;
  64. ql_wifi_msg_cmd_info_s msg_cmd_info = {0};
  65. ql_wifi_net_manager_s *manager = &ql_wifi_net_manager;
  66. msg_cmd_info.msg_id = info->msg_id;
  67. msg_cmd_info.msg_info = info->msg_info;
  68. QL_WIFI_NET_LOG("net msg %x/%p", info->msg_id, info->msg_info);
  69. ql_rtos_mutex_try_lock(ql_wifi_net_mutex);
  70. err = ql_rtos_queue_release(manager->msg_queue, sizeof(ql_wifi_msg_cmd_info_s), (uint8 *)&msg_cmd_info, QL_NO_WAIT);
  71. if (err)
  72. {
  73. QL_WIFI_NET_LOG("net msg rel failed");
  74. }
  75. ql_rtos_mutex_unlock(ql_wifi_net_mutex);
  76. return;
  77. }
  78. static void ql_wifi_net_state_notify(void *ctx)
  79. {
  80. ql_wifi_state_e state = *((ql_wifi_state_e*)ctx);
  81. char *p = NULL;
  82. ql_wifi_net_manager_s *manager = &ql_wifi_net_manager;
  83. p = malloc(2);
  84. if (p == NULL)
  85. {
  86. return;
  87. }
  88. p[0] = (char)state;
  89. p[1] = '\0';
  90. // Nofity Wi-Fi connect status to APP engine.
  91. ql_rtos_mutex_try_lock(ql_wifi_net_mutex);
  92. if (manager->app_notify_cb)
  93. {
  94. ql_wifi_msg_cmd_info_s info = {.msg_id = QL_WIFI_APP_STA_STATUS_CMD,.msg_info = p};
  95. manager->app_notify_cb(&info);
  96. }
  97. ql_rtos_mutex_unlock(ql_wifi_net_mutex);
  98. }
  99. ql_wifi_net_errcode_e ql_wifi_net_app_notify_cb_register(ql_wifi_net_app_notify_cb cb)
  100. {
  101. // APP engine notification cb for notifying app status.
  102. // Use ql_wifi_net_state_notify to calling this callback.
  103. ql_wifi_net_manager_s *manager = &ql_wifi_net_manager;
  104. ql_rtos_mutex_try_lock(ql_wifi_net_mutex);
  105. manager->app_notify_cb = cb;
  106. ql_rtos_mutex_unlock(ql_wifi_net_mutex);
  107. return QL_WIFI_NET_SUCCESS;
  108. }
  109. void ql_wifi_net_thread(void *argv)
  110. {
  111. QuecOSStatus err;
  112. ql_wifi_msg_cmd_info_s cmd_info = {0};
  113. ql_wifi_net_manager_s *manager = &ql_wifi_net_manager;
  114. QL_WIFI_NET_LOG("wifi net init");
  115. err = ql_rtos_queue_create(&(manager->msg_queue), sizeof(ql_wifi_msg_cmd_info_s), QL_WIFI_NET_MSG_QUEUE_CNT);
  116. if (err)
  117. {
  118. QL_WIFI_NET_LOG("create queue faild!");
  119. goto exit;
  120. }
  121. if (QL_WIFI_MSG_SUCCESS != ql_wifi_msg_net_notify_cb_register(ql_wifi_net_recv))
  122. {
  123. QL_WIFI_NET_LOG("msg net cb reg err");
  124. goto exit;
  125. }
  126. // from net to app
  127. if (QL_WIFI_SUCCESS != ql_wifi_status_notify_cb_register(ql_wifi_net_state_notify))
  128. {
  129. QL_WIFI_NET_LOG("wifi status notify cb reg err");
  130. goto exit;
  131. }
  132. while (1)
  133. {
  134. memset(&cmd_info, 0, sizeof(ql_wifi_msg_cmd_info_s));
  135. QL_WIFI_NET_LOG("");
  136. err = ql_rtos_queue_wait(manager->msg_queue, (uint8 *)&cmd_info, sizeof(ql_wifi_msg_cmd_info_s), QL_WAIT_FOREVER);
  137. if (err != kNoErr)
  138. {
  139. QL_WIFI_NET_LOG("wait error err= %d", err);
  140. goto exit;
  141. }
  142. QL_WIFI_NET_LOG("cmd_info.msg_id=%d", cmd_info.msg_id);
  143. switch (cmd_info.msg_id)
  144. {
  145. case QL_WIFI_NPTO_802_3_STREAM: {
  146. // Undefined net command
  147. // ql_wifi_msg_info_s *msg_ptr = (ql_wifi_msg_info_s *)(cmd_info.msg_info);
  148. // ql_wifi_data_input(msg_ptr->data,msg_ptr->data_len);
  149. break;
  150. }
  151. case QL_WIFI_NPTO_STA_IP_START_CMD: {
  152. ql_wifi_sta_ip_start(cmd_info.msg_info);
  153. break;
  154. }
  155. case QL_WIFI_NPTO_STA_IP_DOWN_CMD: {
  156. ql_wifi_sta_ip_down(cmd_info.msg_info);
  157. break;
  158. }
  159. case QL_WIFI_NPTO_WLAN_CREATE_CMD: {
  160. ql_wifi_wlan_create(cmd_info.msg_info);
  161. break;
  162. }
  163. case QL_WIFI_NPTO_WLAN_DESTROY_CMD: {
  164. ql_wifi_wlan_destroy(cmd_info.msg_info);
  165. break;
  166. }
  167. case QL_WIFI_NPTO_UAP_IP_START_CMD:
  168. case QL_WIFI_NPTO_UAP_IP_DOWN_CMD:
  169. case QL_WIFI_NPTO_IP_ADDR_SET_CMD:
  170. default: {
  171. QL_WIFI_NET_LOG("cmd_info.msg_id=%d ERROR", cmd_info.msg_id);
  172. break;
  173. }
  174. }
  175. QL_WIFI_NET_LOG("cmd_info.msg_info=%p", cmd_info.msg_info);
  176. if (cmd_info.msg_info != NULL)
  177. {
  178. free(cmd_info.msg_info);
  179. cmd_info.msg_info = NULL;
  180. }
  181. }
  182. exit:
  183. ql_rtos_mutex_try_lock(ql_wifi_net_mutex);
  184. memset(manager, 0, sizeof(ql_wifi_net_manager_s));
  185. ql_rtos_mutex_unlock(ql_wifi_net_mutex);
  186. ql_rtos_task_delete(NULL);
  187. return;
  188. }
  189. ql_wifi_net_errcode_e ql_wifi_net_init(void *argv)
  190. {
  191. ql_wifi_net_errcode_e ret = QL_WIFI_NET_SUCCESS;
  192. ql_wifi_net_manager_s *manager = &ql_wifi_net_manager;
  193. QL_WIFI_NET_LOG("ql_wifi_net_init");
  194. // Create mutex.Never delete.
  195. if (NULL == ql_wifi_net_mutex)
  196. {
  197. if (QL_OSI_SUCCESS != ql_rtos_mutex_create(&(ql_wifi_net_mutex)))
  198. {
  199. ret = QL_WIFI_NET_MUTEX_CREATE_ERR;
  200. return ret;
  201. }
  202. }
  203. ql_rtos_mutex_try_lock(ql_wifi_net_mutex);
  204. if(manager->task)
  205. {
  206. return QL_WIFI_NET_SUCCESS;
  207. }
  208. if (QL_OSI_SUCCESS != ql_rtos_task_create(&(manager->task), 4096, APP_PRIORITY_REALTIME, "ql_wifi_net", ql_wifi_net_thread, NULL, QL_WIFI_NET_TASK_EVENT_CNT))
  209. {
  210. QL_WIFI_NET_LOG("ql_wifi_net_init err");
  211. ret = QL_WIFI_NET_TASK_CREATE_ERR;
  212. }
  213. ql_rtos_mutex_unlock(ql_wifi_net_mutex);
  214. return ret;
  215. }
  216. ql_wifi_net_errcode_e ql_wifi_net_deint(void *argv)
  217. {
  218. return QL_WIFI_NET_SUCCESS;
  219. }