tls_sys.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. /**************************************************************************
  2. * File Name : tls_sys.c
  3. * Author :
  4. * Version :
  5. * Date :
  6. * Description :
  7. *
  8. * Copyright (c) 2014 Winner Microelectronics Co., Ltd.
  9. * All rights reserved.
  10. *
  11. ***************************************************************************/
  12. #include "wm_config.h"
  13. #include "wm_osal.h"
  14. #include "tls_sys.h"
  15. #include "wm_mem.h"
  16. #include "wm_debug.h"
  17. #include "wm_params.h"
  18. #include "wm_regs.h"
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include "wm_wifi.h"
  23. #include "wm_netif.h"
  24. #include "wm_sockets.h"
  25. #include "wm_include.h"
  26. #if TLS_CONFIG_AP
  27. #include "wm_dhcp_server.h"
  28. #include "wm_dns_server.h"
  29. #include "wm_cpu.h"
  30. #endif
  31. #include "wm_wl_task.h"
  32. #if TLS_CONFIG_RMMS
  33. #if (GCC_COMPILE==1)
  34. #include "wm_cmdp_hostif_gcc.h"
  35. #else
  36. #include "wm_cmdp_hostif.h"
  37. #endif
  38. #endif
  39. struct tls_sys_msg
  40. {
  41. u32 msg;
  42. void *data;
  43. };
  44. #define SYS_TASK_STK_SIZE 384//256
  45. static tls_os_queue_t *msg_queue = NULL;
  46. static tls_os_sem_t *sys_task_sem = NULL;
  47. void tls_sys_task_del(void);
  48. int tls_sys_task_init(void);
  49. #if TLS_DBG_LEVEL_DUMP
  50. void TLS_DBGPRT_DUMP(char *p, u32 len)
  51. {
  52. int i;
  53. if (TLS_DBG_LEVEL_DUMP)
  54. {
  55. printf("dump length : %d\n", len);
  56. for (i = 0; i < len; i++)
  57. {
  58. printf("%02X ", p[i]);
  59. if ((i + 1) % 16 == 0 && (i + 1) % 32 != 0)
  60. {
  61. printf("- ");
  62. }
  63. if ((i + 1) % 32 == 0)
  64. {
  65. printf("\n");
  66. }
  67. if (i == 2000)
  68. {
  69. printf("\n");
  70. break;
  71. }
  72. }
  73. printf("\n");
  74. }
  75. }
  76. //-------------------------------------------------------------------------
  77. #endif
  78. static void sys_net_up()
  79. {
  80. ip_addr_t ip_addr, net_mask, gateway, dns1, dns2;
  81. struct tls_param_ip ip_param;
  82. bool enable = FALSE;
  83. tls_param_get(TLS_PARAM_ID_IP, &ip_param, FALSE);
  84. if (ip_param.dhcp_enable)
  85. {
  86. ip_addr_set_zero(&ip_addr);
  87. ip_addr_set_zero(&net_mask);
  88. ip_addr_set_zero(&gateway);
  89. tls_netif_set_addr( &ip_addr, &net_mask, &gateway);
  90. tls_netif_set_up();
  91. tls_dhcp_start();
  92. }
  93. else
  94. {
  95. tls_dhcp_stop();
  96. tls_netif_set_up();
  97. MEMCPY((char*)ip_2_ip4(&ip_addr), &ip_param.ip, 4);
  98. MEMCPY((char*)ip_2_ip4(&net_mask), &ip_param.netmask, 4);
  99. MEMCPY((char*)ip_2_ip4(&gateway), &ip_param.gateway, 4);
  100. tls_netif_set_addr( &ip_addr, &net_mask, &gateway);
  101. MEMCPY((char*)ip_2_ip4(&dns1), &ip_param.dns1, 4);
  102. MEMCPY((char*)ip_2_ip4(&dns2), &ip_param.dns2, 4);
  103. //tls_netif_dns_setserver(0, &dns1);
  104. //tls_netif_dns_setserver(1, &dns2);
  105. /*when DHCP is disabled, Use static IP without IP_NET_UP Reporting,
  106. set wifi powersaving flag according to TLS_PARAM_ID_PSM here.*/
  107. tls_param_get(TLS_PARAM_ID_PSM, &enable, TRUE);
  108. tls_wifi_set_psflag(enable, FALSE);
  109. tls_netif_set_status(1);
  110. }
  111. return ;
  112. }
  113. //-------------------------------------------------------------------------
  114. #if TLS_CONFIG_AP
  115. static void sys_net2_up()
  116. {
  117. ip_addr_t ip_addr, net_mask, gateway;
  118. struct tls_param_ip ip_param;
  119. // u8 dnsname[32];
  120. // dnsname[0] = '\0';
  121. // tls_param_get(TLS_PARAM_ID_DNSNAME, dnsname, 0);
  122. tls_param_get(TLS_PARAM_ID_SOFTAP_IP, &ip_param, FALSE);
  123. tls_netif2_set_up();
  124. MEMCPY((char*)ip_2_ip4(&ip_addr), &ip_param.ip, 4);
  125. MEMCPY((char*)ip_2_ip4(&net_mask), &ip_param.netmask, 4);
  126. MEMCPY((char*)ip_2_ip4(&gateway), &ip_param.gateway, 4);
  127. tls_netif2_set_addr(&ip_addr, &net_mask, &gateway);
  128. if (ip_param.dhcp_enable)
  129. {
  130. tls_dhcps_start();
  131. }
  132. // if ('\0' != dnsname[0])
  133. // {
  134. // tls_dnss_start(dnsname);
  135. // }
  136. return ;
  137. }
  138. //-------------------------------------------------------------------------
  139. static void sys_net2_down()
  140. {
  141. //tls_dnss_stop();
  142. tls_dhcps_stop();
  143. tls_netif2_set_down();
  144. return ;
  145. }
  146. #endif
  147. static void sys_net_down()
  148. {
  149. struct tls_param_ip ip_param;
  150. #if TLS_CONFIG_RMMS
  151. tls_rmms_stop();
  152. #endif
  153. tls_param_get(TLS_PARAM_ID_IP, &ip_param, FALSE);
  154. if (ip_param.dhcp_enable)
  155. {
  156. tls_dhcp_stop();
  157. }
  158. tls_netif_set_status(0);
  159. tls_netif_set_down();
  160. /* Try to reconnect if auto_connect is set*/
  161. tls_auto_reconnect(1);
  162. return ;
  163. }
  164. //-------------------------------------------------------------------------
  165. #if TLS_CONFIG_AP
  166. static void tls_auto_reconnect_softap(void)
  167. {
  168. struct tls_param_ssid ssid;
  169. struct tls_softap_info_t *apinfo;
  170. struct tls_ip_info_t *ipinfo;
  171. struct tls_param_ip ip_param;
  172. struct tls_param_key key;
  173. apinfo = tls_mem_alloc(sizeof(struct tls_softap_info_t));
  174. if (apinfo == NULL)
  175. {
  176. return ;
  177. }
  178. ipinfo = tls_mem_alloc(sizeof(struct tls_ip_info_t));
  179. if (ipinfo == NULL)
  180. {
  181. tls_mem_free(apinfo);
  182. return ;
  183. }
  184. tls_param_get(TLS_PARAM_ID_SOFTAP_SSID, (void*) &ssid, TRUE);
  185. memcpy(apinfo->ssid, ssid.ssid, ssid.ssid_len);
  186. apinfo->ssid[ssid.ssid_len] = '\0';
  187. tls_param_get(TLS_PARAM_ID_SOFTAP_ENCRY, (void*) &apinfo->encrypt, TRUE);
  188. tls_param_get(TLS_PARAM_ID_SOFTAP_CHANNEL, (void*) &apinfo->channel, TRUE);
  189. tls_param_get(TLS_PARAM_ID_SOFTAP_KEY, (void*) &key, TRUE);
  190. apinfo->keyinfo.key_len = key.key_length;
  191. apinfo->keyinfo.format = key.key_format;
  192. apinfo->keyinfo.index = key.key_index;
  193. memcpy(apinfo->keyinfo.key, key.psk, key.key_length);
  194. tls_param_get(TLS_PARAM_ID_SOFTAP_IP, &ip_param, TRUE);
  195. /*ip������Ϣ:ip��ַ�����룬dns����*/
  196. memcpy(ipinfo->ip_addr, ip_param.ip, 4);
  197. memcpy(ipinfo->netmask, ip_param.netmask, 4);
  198. tls_param_get(TLS_PARAM_ID_DNSNAME, ipinfo->dnsname, FALSE);
  199. tls_wifi_softap_create(apinfo, ipinfo);
  200. tls_mem_free(apinfo);
  201. tls_mem_free(ipinfo);
  202. return ;
  203. }
  204. //-------------------------------------------------------------------------
  205. #endif
  206. void tls_auto_reconnect(u8 delayflag)
  207. {
  208. struct tls_param_ssid ssid;
  209. u8 auto_reconnect = 0xff;
  210. u8 wireless_protocol = 0;
  211. #if 0
  212. u8 i = 0;
  213. while (i < 200)
  214. {
  215. if (tls_wifi_get_oneshot_flag())
  216. {
  217. /*oneshot config ongoing,do not reconnect WiFi*/
  218. return ;
  219. } tls_os_time_delay(1);
  220. i++;
  221. }
  222. #endif
  223. tls_wifi_auto_connect_flag(WIFI_AUTO_CNT_FLAG_GET, &auto_reconnect);
  224. if (auto_reconnect == WIFI_AUTO_CNT_OFF)
  225. {
  226. return ;
  227. }
  228. else if (auto_reconnect == WIFI_AUTO_CNT_TMP_OFF)
  229. {
  230. auto_reconnect = WIFI_AUTO_CNT_ON;
  231. tls_wifi_auto_connect_flag(WIFI_AUTO_CNT_FLAG_SET, &auto_reconnect);
  232. return ; //tmparary return, for active "DISCONNECT" , such as AT CMD
  233. }
  234. if (delayflag)
  235. {
  236. tls_os_time_delay(1500);
  237. }
  238. tls_param_get(TLS_PARAM_ID_WPROTOCOL, (void*) &wireless_protocol, TRUE);
  239. switch (wireless_protocol)
  240. {
  241. case TLS_PARAM_IEEE80211_INFRA:
  242. #if TLS_CONFIG_AP
  243. case (TLS_PARAM_IEEE80211_INFRA | TLS_PARAM_IEEE80211_SOFTAP):
  244. #endif
  245. {
  246. struct tls_param_original_key origin_key;
  247. struct tls_param_bssid bssid;
  248. tls_param_get(TLS_PARAM_ID_BSSID, (void*) &bssid, TRUE);
  249. tls_param_get(TLS_PARAM_ID_SSID, (void*) &ssid, TRUE);
  250. tls_param_get(TLS_PARAM_ID_ORIGIN_KEY, (void*) &origin_key, TRUE);
  251. if (bssid.bssid_enable)
  252. {
  253. if (ssid.ssid_len && (ssid.ssid_len <= 32))
  254. {
  255. tls_wifi_connect_by_ssid_bssid(ssid.ssid, ssid.ssid_len, bssid.bssid, origin_key.psk,
  256. origin_key.key_length);
  257. }
  258. else
  259. {
  260. tls_wifi_connect_by_bssid(bssid.bssid, origin_key.psk, origin_key.key_length);
  261. }
  262. }
  263. else
  264. {
  265. if (ssid.ssid_len && (ssid.ssid_len <= 32))
  266. {
  267. tls_wifi_connect(ssid.ssid, ssid.ssid_len, origin_key.psk, origin_key.key_length);
  268. }
  269. }
  270. }
  271. break;
  272. #if TLS_CONFIG_AP
  273. case TLS_PARAM_IEEE80211_SOFTAP:
  274. {
  275. tls_auto_reconnect_softap();
  276. }
  277. break;
  278. #endif
  279. default:
  280. break;
  281. }
  282. return ;
  283. }
  284. //-------------------------------------------------------------------------
  285. #if TLS_CONFIG_RMMS
  286. static void tls_proc_rmms(struct rmms_msg *msg)
  287. {
  288. int err;
  289. struct tls_hostif *hif = tls_get_hostif();
  290. if (0 == hif->rmms_status)
  291. {
  292. hif->rmms_status = 1;
  293. err = tls_hostif_cmd_handler(HOSTIF_RMMS_AT_CMD, (char*)msg, 6+strlen(
  294. (char*)(msg->CmdStr)));
  295. if (0 != err)
  296. {
  297. tls_mem_free(msg);
  298. hif->rmms_status = 0;
  299. }
  300. }
  301. return ;
  302. }
  303. //-------------------------------------------------------------------------
  304. #endif
  305. /*
  306. * sys task stack
  307. */
  308. static u32 *sys_task_stk = NULL;
  309. tls_os_task_t sys_task_hdl = NULL;
  310. void tls_sys_task(void *data)
  311. {
  312. u8 err;
  313. struct tls_sys_msg *msg;
  314. u8 auto_reconnect = WIFI_AUTO_CNT_OFF;
  315. //u8 oneshotflag = 0;
  316. //u8 auto_mode = 0;
  317. for (;;)
  318. {
  319. err = tls_os_queue_receive(msg_queue, (void **) &msg, 0, 0);
  320. if (!err)
  321. {
  322. switch (msg->msg)
  323. {
  324. case SYS_MSG_NET_UP:
  325. sys_net_up();
  326. break;
  327. #if TLS_CONFIG_AP
  328. case SYS_MSG_NET2_UP:
  329. sys_net2_up();
  330. break;
  331. case SYS_MSG_NET2_DOWN:
  332. sys_net2_down();
  333. break;
  334. case SYS_MSG_NET2_FAIL:
  335. sys_net2_down();
  336. tls_auto_reconnect(1);
  337. break;
  338. #endif
  339. case SYS_MSG_NET_DOWN:
  340. sys_net_down();
  341. break;
  342. case SYS_MSG_CONNECT_FAILED:
  343. sys_net_down();
  344. break;
  345. case SYS_MSG_AUTO_MODE_RUN:
  346. /*restore WiFi auto reconnect Tmp OFF*/
  347. tls_wifi_auto_connect_flag(WIFI_AUTO_CNT_FLAG_GET,
  348. &auto_reconnect);
  349. if (auto_reconnect == WIFI_AUTO_CNT_TMP_OFF)
  350. {
  351. auto_reconnect = WIFI_AUTO_CNT_ON;
  352. tls_wifi_auto_connect_flag(WIFI_AUTO_CNT_FLAG_SET,
  353. &auto_reconnect);
  354. }
  355. tls_auto_reconnect(0);
  356. break;
  357. #if TLS_CONFIG_RMMS
  358. case SYS_MSG_RMMS:
  359. tls_proc_rmms(msg->data);
  360. break;
  361. #endif
  362. default:
  363. break;
  364. }
  365. tls_mem_free(msg);
  366. }
  367. else
  368. {
  369. }
  370. tls_os_sem_acquire(sys_task_sem, 0);
  371. if (tls_os_queue_is_empty(msg_queue))
  372. {
  373. tls_sys_task_del();
  374. }
  375. else
  376. {
  377. tls_os_sem_release(sys_task_sem);
  378. }
  379. }
  380. }
  381. //-------------------------------------------------------------------------
  382. void tls_sys_send_msg(u32 msg, void *data)
  383. {
  384. struct tls_sys_msg *pmsg = NULL;
  385. tls_os_status_t os_status = TLS_OS_ERROR;
  386. pmsg = tls_mem_alloc(sizeof(struct tls_sys_msg));
  387. if (NULL != pmsg)
  388. {
  389. tls_os_sem_acquire(sys_task_sem, 0);
  390. if (0 == tls_sys_task_init())
  391. {
  392. memset(pmsg, 0, sizeof(struct tls_sys_msg));
  393. pmsg->msg = msg;
  394. pmsg->data = data;
  395. os_status = tls_os_queue_send(msg_queue, pmsg, 0);
  396. if (os_status != TLS_OS_SUCCESS)
  397. {
  398. tls_mem_free(pmsg);
  399. pmsg = NULL;
  400. }
  401. }
  402. else
  403. {
  404. tls_mem_free(pmsg);
  405. pmsg = NULL;
  406. }
  407. tls_os_sem_release(sys_task_sem);
  408. }
  409. return ;
  410. }
  411. //-------------------------------------------------------------------------
  412. void tls_sys_auto_mode_run(void)
  413. {
  414. tls_sys_send_msg(SYS_MSG_AUTO_MODE_RUN, NULL);
  415. }
  416. //-------------------------------------------------------------------------
  417. static void tls_sys_net_up(void)
  418. {
  419. tls_sys_send_msg(SYS_MSG_NET_UP, NULL);
  420. }
  421. //-------------------------------------------------------------------------
  422. #if TLS_CONFIG_AP
  423. static void tls_sys_net2_up(void)
  424. {
  425. tls_sys_send_msg(SYS_MSG_NET2_UP, NULL);
  426. }
  427. //-------------------------------------------------------------------------
  428. static void tls_sys_net2_down(void)
  429. {
  430. tls_sys_send_msg(SYS_MSG_NET2_DOWN, NULL);
  431. }
  432. static void tls_sys_net2_fail(void)
  433. {
  434. tls_sys_send_msg(SYS_MSG_NET2_FAIL, NULL);
  435. }
  436. #endif
  437. static void tls_sys_net_down(void)
  438. {
  439. tls_sys_send_msg(SYS_MSG_NET_DOWN, NULL);
  440. }
  441. //-------------------------------------------------------------------------
  442. static void tls_sys_connect_failed(void)
  443. {
  444. tls_sys_send_msg(SYS_MSG_CONNECT_FAILED, NULL);
  445. }
  446. //-------------------------------------------------------------------------
  447. static void sys_net_status_changed(u8 status)
  448. {
  449. #if TLS_CONFIG_TLS_DEBUG
  450. struct tls_ethif *ethif;
  451. #endif
  452. #if TLS_CONFIG_AP
  453. u8 wireless_protocol = 0;
  454. #endif
  455. bool enable = FALSE;
  456. switch (status)
  457. {
  458. case NETIF_WIFI_JOIN_SUCCESS:
  459. TLS_DBGPRT_INFO("join net success\n");
  460. tls_sys_net_up();
  461. break;
  462. case NETIF_WIFI_JOIN_FAILED:
  463. {
  464. TLS_DBGPRT_INFO("join net failed\n");
  465. }
  466. tls_sys_connect_failed();
  467. break;
  468. case NETIF_WIFI_DISCONNECTED:
  469. {
  470. TLS_DBGPRT_INFO("net disconnected\n");
  471. }
  472. tls_sys_net_down();
  473. break;
  474. case NETIF_IP_NET_UP:
  475. tls_netif_set_status(1);
  476. /*when DHCP enable, IP_NET_UP Report, set wifi powersaving flag according to TLS_PARAM_ID_PSM*/
  477. tls_param_get(TLS_PARAM_ID_PSM, &enable, TRUE);
  478. tls_wifi_set_psflag(enable, FALSE);
  479. #if TLS_CONFIG_TLS_DEBUG
  480. ethif = tls_netif_get_ethif();
  481. TLS_DBGPRT_INFO("net up ==> ip = %x\n", ethif->ip_addr.addr);
  482. #endif
  483. #if TLS_CONFIG_AP
  484. tls_param_get(TLS_PARAM_ID_WPROTOCOL, (void*) &wireless_protocol,
  485. TRUE);
  486. if ((TLS_PARAM_IEEE80211_SOFTAP &wireless_protocol) &&
  487. (WM_WIFI_JOINED != tls_wifi_softap_get_state()))
  488. {
  489. tls_auto_reconnect_softap();
  490. }
  491. #endif
  492. //#if TLS_CONFIG_RMMS
  493. // tls_rmms_start();
  494. //#endif
  495. break;
  496. #if TLS_CONFIG_AP
  497. case NETIF_WIFI_SOFTAP_SUCCESS:
  498. TLS_DBGPRT_INFO("softap create success.\n");
  499. tls_sys_net2_up();
  500. break;
  501. case NETIF_WIFI_SOFTAP_FAILED:
  502. TLS_DBGPRT_INFO("softap create failed.\n");
  503. tls_sys_net2_fail();
  504. break;
  505. case NETIF_WIFI_SOFTAP_CLOSED:
  506. TLS_DBGPRT_INFO("softap closed.\n");
  507. tls_sys_net2_down();
  508. break;
  509. case NETIF_IP_NET2_UP:
  510. #if TLS_CONFIG_TLS_DEBUG
  511. ethif = tls_netif_get_ethif2();
  512. TLS_DBGPRT_INFO("net up ==> ip = %d.%d.%d.%d\n" ip4_addr1(ip_2_ip4
  513. (&ethif->ip_addr)), ip4_addr2(ip_2_ip4(&ethif->ip_addr)),
  514. ip4_addr3(ip_2_ip4(&ethif->ip_addr)), ip4_addr4(ip_2_ip4(&ethif
  515. ->ip_addr)));
  516. #endif
  517. break;
  518. #endif
  519. default:
  520. break;
  521. }
  522. }
  523. //-------------------------------------------------------------------------
  524. int tls_sys_init()
  525. {
  526. int err;
  527. /* create messge queue */
  528. #define SYS_MSG_SIZE 20
  529. err = tls_os_queue_create(&msg_queue, SYS_MSG_SIZE);
  530. if (err)
  531. {
  532. return - 1;
  533. }
  534. err = tls_os_sem_create(&sys_task_sem, 1);
  535. if (err)
  536. {
  537. tls_os_queue_delete(msg_queue);
  538. return -2;
  539. }
  540. tls_netif_add_status_event(sys_net_status_changed);
  541. return 0;
  542. }
  543. static void tls_sys_task_free(void)
  544. {
  545. if (sys_task_stk)
  546. {
  547. tls_mem_free(sys_task_stk);
  548. sys_task_stk = NULL;
  549. tls_os_sem_release(sys_task_sem);
  550. }
  551. }
  552. void tls_sys_task_del(void)
  553. {
  554. if (sys_task_hdl)
  555. {
  556. tls_os_task_del_by_task_handle(sys_task_hdl,tls_sys_task_free);
  557. }
  558. }
  559. int tls_sys_task_init(void)
  560. {
  561. int err;
  562. if ((sys_task_stk == NULL) && sys_task_sem && msg_queue)
  563. {
  564. sys_task_stk = (u32 *)tls_mem_alloc(SYS_TASK_STK_SIZE *sizeof(u32));
  565. if (sys_task_stk)
  566. {
  567. /* create task */
  568. err = tls_os_task_create(&sys_task_hdl, "Sys Task", \
  569. tls_sys_task, (void*)0, \
  570. (void *)sys_task_stk, /* task's stack start address */
  571. SYS_TASK_STK_SIZE *sizeof(u32), /* task's stack size, unit:byte */
  572. TLS_SYS_TASK_PRIO, 0);
  573. if (err != TLS_OS_SUCCESS)
  574. {
  575. tls_mem_free(sys_task_stk);
  576. sys_task_stk = NULL;
  577. return -2;
  578. }
  579. }
  580. else
  581. {
  582. return -3;
  583. }
  584. return 0;
  585. }
  586. else
  587. {
  588. return 0;
  589. }
  590. }