wlan_prot.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-08-14 tyx the first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <wlan_dev.h>
  13. #include <wlan_prot.h>
  14. #define DBG_TAG "WLAN.prot"
  15. #ifdef RT_WLAN_PROT_DEBUG
  16. #define DBG_LVL DBG_LOG
  17. #else
  18. #define DBG_LVL DBG_INFO
  19. #endif /* RT_WLAN_PROT_DEBUG */
  20. #include <rtdbg.h>
  21. #ifdef RT_WLAN_PROT_ENABLE
  22. #if RT_WLAN_PROT_NAME_LEN < 4
  23. #error "The name is too short"
  24. #endif
  25. struct rt_wlan_prot_event_des
  26. {
  27. rt_wlan_prot_event_handler handler;
  28. struct rt_wlan_prot *prot;
  29. };
  30. static struct rt_wlan_prot *_prot[RT_WLAN_PROT_MAX];
  31. static struct rt_wlan_prot_event_des prot_event_tab[RT_WLAN_PROT_EVT_MAX][RT_WLAN_PROT_MAX];
  32. static void rt_wlan_prot_event_handle(struct rt_wlan_device *wlan, rt_wlan_dev_event_t event, struct rt_wlan_buff *buff, void *parameter)
  33. {
  34. int i;
  35. struct rt_wlan_prot *wlan_prot;
  36. struct rt_wlan_prot *prot;
  37. rt_wlan_prot_event_handler handler;
  38. rt_wlan_prot_event_t prot_event;
  39. LOG_D("F:%s L:%d event:%d", __FUNCTION__, __LINE__, event);
  40. wlan_prot = wlan->prot;
  41. handler = RT_NULL;
  42. prot = RT_NULL;
  43. switch (event)
  44. {
  45. case RT_WLAN_DEV_EVT_INIT_DONE:
  46. {
  47. LOG_D("L%d event: INIT_DONE", __LINE__);
  48. prot_event = RT_WLAN_PROT_EVT_INIT_DONE;
  49. break;
  50. }
  51. case RT_WLAN_DEV_EVT_CONNECT:
  52. {
  53. LOG_D("L%d event: CONNECT", __LINE__);
  54. prot_event = RT_WLAN_PROT_EVT_CONNECT;
  55. break;
  56. }
  57. case RT_WLAN_DEV_EVT_DISCONNECT:
  58. {
  59. LOG_D("L%d event: DISCONNECT", __LINE__);
  60. prot_event = RT_WLAN_PROT_EVT_DISCONNECT;
  61. break;
  62. }
  63. case RT_WLAN_DEV_EVT_AP_START:
  64. {
  65. LOG_D("L%d event: AP_START", __LINE__);
  66. prot_event = RT_WLAN_PROT_EVT_AP_START;
  67. break;
  68. }
  69. case RT_WLAN_DEV_EVT_AP_STOP:
  70. {
  71. LOG_D("L%d event: AP_STOP", __LINE__);
  72. prot_event = RT_WLAN_PROT_EVT_AP_STOP;
  73. break;
  74. }
  75. case RT_WLAN_DEV_EVT_AP_ASSOCIATED:
  76. {
  77. LOG_D("L%d event: AP_ASSOCIATED", __LINE__);
  78. prot_event = RT_WLAN_PROT_EVT_AP_ASSOCIATED;
  79. break;
  80. }
  81. case RT_WLAN_DEV_EVT_AP_DISASSOCIATED:
  82. {
  83. LOG_D("L%d event: AP_DISASSOCIATED", __LINE__);
  84. prot_event = RT_WLAN_PROT_EVT_AP_DISASSOCIATED;
  85. break;
  86. }
  87. default:
  88. {
  89. return;
  90. }
  91. }
  92. for (i = 0; i < RT_WLAN_PROT_MAX; i++)
  93. {
  94. if ((prot_event_tab[prot_event][i].handler != RT_NULL) &&
  95. (prot_event_tab[prot_event][i].prot->id == wlan_prot->id))
  96. {
  97. handler = prot_event_tab[prot_event][i].handler;
  98. prot = prot_event_tab[prot_event][i].prot;
  99. break;
  100. }
  101. }
  102. if (handler != RT_NULL)
  103. {
  104. handler(prot, wlan, prot_event);
  105. }
  106. }
  107. static struct rt_wlan_device *rt_wlan_prot_find_by_name(const char *name)
  108. {
  109. rt_device_t device;
  110. if (name == RT_NULL)
  111. {
  112. LOG_E("F:%s L:%d Parameter Wrongful", __FUNCTION__, __LINE__);
  113. return RT_NULL;
  114. }
  115. device = rt_device_find(name);
  116. if (device == RT_NULL)
  117. {
  118. LOG_E("F:%s L:%d not find wlan dev!! name:%s", __FUNCTION__, __LINE__, name);
  119. return RT_NULL;
  120. }
  121. return (struct rt_wlan_device *)device;
  122. }
  123. rt_err_t rt_wlan_prot_attach(const char *dev_name, const char *prot_name)
  124. {
  125. struct rt_wlan_device *wlan;
  126. wlan = rt_wlan_prot_find_by_name(dev_name);
  127. if (wlan == RT_NULL)
  128. {
  129. return -RT_ERROR;
  130. }
  131. return rt_wlan_prot_attach_dev(wlan, prot_name);
  132. }
  133. rt_err_t rt_wlan_prot_detach(const char *name)
  134. {
  135. struct rt_wlan_device *wlan;
  136. wlan = rt_wlan_prot_find_by_name(name);
  137. if (wlan == RT_NULL)
  138. {
  139. return -RT_ERROR;
  140. }
  141. return rt_wlan_prot_detach_dev(wlan);
  142. }
  143. rt_err_t rt_wlan_prot_attach_dev(struct rt_wlan_device *wlan, const char *prot_name)
  144. {
  145. int i = 0;
  146. struct rt_wlan_prot *prot = wlan->prot;
  147. rt_wlan_dev_event_handler handler = rt_wlan_prot_event_handle;
  148. if (wlan == RT_NULL)
  149. {
  150. LOG_E("F:%s L:%d wlan is null", __FUNCTION__, __LINE__);
  151. return -RT_ERROR;
  152. }
  153. if (prot != RT_NULL &&
  154. (rt_strcmp(prot->name, prot_name) == 0))
  155. {
  156. LOG_D("prot is register");
  157. return RT_EOK;
  158. }
  159. /* if prot not NULL */
  160. if (prot != RT_NULL)
  161. rt_wlan_prot_detach_dev(wlan);
  162. #ifdef RT_WLAN_PROT_LWIP_PBUF_FORCE
  163. if (rt_strcmp(RT_WLAN_PROT_LWIP_NAME, prot_name) != 0)
  164. {
  165. return -RT_ERROR;
  166. }
  167. #endif
  168. /* find prot */
  169. for (i = 0; i < RT_WLAN_PROT_MAX; i++)
  170. {
  171. if ((_prot[i] != RT_NULL) && (rt_strcmp(_prot[i]->name, prot_name) == 0))
  172. {
  173. /* attach prot */
  174. wlan->prot = _prot[i]->ops->dev_reg_callback(_prot[i], wlan);
  175. break;
  176. }
  177. }
  178. if (i >= RT_WLAN_PROT_MAX)
  179. {
  180. LOG_E("F:%s L:%d not find wlan protocol", __FUNCTION__, __LINE__);
  181. return -RT_ERROR;
  182. }
  183. rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_CONNECT, handler, RT_NULL);
  184. rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_DISCONNECT, handler, RT_NULL);
  185. rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_AP_START, handler, RT_NULL);
  186. rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_AP_STOP, handler, RT_NULL);
  187. rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_AP_ASSOCIATED, handler, RT_NULL);
  188. rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_AP_DISASSOCIATED, handler, RT_NULL);
  189. return RT_EOK;
  190. }
  191. rt_err_t rt_wlan_prot_detach_dev(struct rt_wlan_device *wlan)
  192. {
  193. struct rt_wlan_prot *prot = wlan->prot;
  194. rt_wlan_dev_event_t event;
  195. if (prot == RT_NULL)
  196. return RT_EOK;
  197. for (event = RT_WLAN_DEV_EVT_INIT_DONE; event < RT_WLAN_DEV_EVT_MAX; event ++)
  198. {
  199. rt_wlan_dev_unregister_event_handler(wlan, event, rt_wlan_prot_event_handle);
  200. }
  201. /* detach prot */
  202. prot->ops->dev_unreg_callback(prot, wlan);
  203. wlan->prot = RT_NULL;
  204. return RT_EOK;
  205. }
  206. rt_err_t rt_wlan_prot_regisetr(struct rt_wlan_prot *prot)
  207. {
  208. int i;
  209. rt_uint32_t id;
  210. static rt_uint8_t num;
  211. /* Parameter checking */
  212. if ((prot == RT_NULL) ||
  213. (prot->ops->prot_recv == RT_NULL) ||
  214. (prot->ops->dev_reg_callback == RT_NULL))
  215. {
  216. LOG_E("F:%s L:%d Parameter Wrongful", __FUNCTION__, __LINE__);
  217. return -RT_EINVAL;
  218. }
  219. /* save prot */
  220. for (i = 0; i < RT_WLAN_PROT_MAX; i++)
  221. {
  222. if (_prot[i] == RT_NULL)
  223. {
  224. id = (RT_LWAN_ID_PREFIX << 16) | num;
  225. prot->id = id;
  226. _prot[i] = prot;
  227. num ++;
  228. break;
  229. }
  230. else if (rt_strcmp(_prot[i]->name, prot->name) == 0)
  231. {
  232. break;
  233. }
  234. }
  235. /* is full */
  236. if (i >= RT_WLAN_PROT_MAX)
  237. {
  238. LOG_E("F:%s L:%d Space full", __FUNCTION__, __LINE__);
  239. return -RT_ERROR;
  240. }
  241. return RT_EOK;
  242. }
  243. rt_err_t rt_wlan_prot_event_register(struct rt_wlan_prot *prot, rt_wlan_prot_event_t event, rt_wlan_prot_event_handler handler)
  244. {
  245. int i;
  246. if ((prot == RT_NULL) || (handler == RT_NULL))
  247. {
  248. return -RT_EINVAL;
  249. }
  250. for (i = 0; i < RT_WLAN_PROT_MAX; i++)
  251. {
  252. if (prot_event_tab[event][i].handler == RT_NULL)
  253. {
  254. prot_event_tab[event][i].handler = handler;
  255. prot_event_tab[event][i].prot = prot;
  256. return RT_EOK;
  257. }
  258. }
  259. return -RT_ERROR;
  260. }
  261. rt_err_t rt_wlan_prot_event_unregister(struct rt_wlan_prot *prot, rt_wlan_prot_event_t event)
  262. {
  263. int i;
  264. if (prot == RT_NULL)
  265. {
  266. return -RT_EINVAL;
  267. }
  268. for (i = 0; i < RT_WLAN_PROT_MAX; i++)
  269. {
  270. if ((prot_event_tab[event][i].handler != RT_NULL) &&
  271. (prot_event_tab[event][i].prot == prot))
  272. {
  273. rt_memset(&prot_event_tab[event][i], 0, sizeof(struct rt_wlan_prot_event_des));
  274. return RT_EOK;
  275. }
  276. }
  277. return -RT_ERROR;
  278. }
  279. rt_err_t rt_wlan_prot_transfer_dev(struct rt_wlan_device *wlan, void *buff, int len)
  280. {
  281. if (wlan->ops->wlan_send != RT_NULL)
  282. {
  283. return wlan->ops->wlan_send(wlan, buff, len);
  284. }
  285. return -RT_ERROR;
  286. }
  287. rt_err_t rt_wlan_dev_transfer_prot(struct rt_wlan_device *wlan, void *buff, int len)
  288. {
  289. struct rt_wlan_prot *prot = wlan->prot;
  290. if (prot != RT_NULL)
  291. {
  292. return prot->ops->prot_recv(wlan, buff, len);
  293. }
  294. return -RT_ERROR;
  295. }
  296. extern int rt_wlan_prot_ready_event(struct rt_wlan_device *wlan, struct rt_wlan_buff *buff);
  297. int rt_wlan_prot_ready(struct rt_wlan_device *wlan, struct rt_wlan_buff *buff)
  298. {
  299. return rt_wlan_prot_ready_event(wlan, buff);
  300. }
  301. void rt_wlan_prot_dump(void)
  302. {
  303. int i;
  304. rt_kprintf(" name id \n");
  305. rt_kprintf("-------- --------\n");
  306. for (i = 0; i < RT_WLAN_PROT_MAX; i++)
  307. {
  308. if (_prot[i] != RT_NULL)
  309. {
  310. rt_kprintf("%-8.8s ", _prot[i]->name);
  311. rt_kprintf("%08x\n", _prot[i]->id);
  312. }
  313. }
  314. }
  315. #endif