tls_sys.c 16 KB

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