wifi_interactive_mode.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559
  1. #include <stdint.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "rtwlan_config.h"
  5. #if !defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  6. #include "FreeRTOS.h"
  7. #include "task.h"
  8. #include "semphr.h"
  9. #include "main.h"
  10. #include <lwip_netconf.h>
  11. #include "tcpip.h"
  12. #include <wlan_test_inc.h>
  13. #include <dhcp/dhcps.h>
  14. #else
  15. #include "FreeRTOS.h"
  16. #include "task.h"
  17. #include "semphr.h"
  18. #endif
  19. #include <osdep_service.h>
  20. #include <wifi/wifi_conf.h>
  21. #include <wifi/wifi_util.h>
  22. #include <basic_types.h>
  23. #ifndef CONFIG_INTERACTIVE_EXT
  24. #define CONFIG_INTERACTIVE_EXT 0
  25. #endif
  26. #ifndef CONFIG_SSL_CLIENT
  27. #define CONFIG_SSL_CLIENT 0
  28. #endif
  29. #ifndef CONFIG_GOOGLENEST
  30. #define CONFIG_GOOGLENEST 0
  31. #endif
  32. #if CONFIG_LWIP_LAYER
  33. #ifndef CONFIG_WEBSERVER
  34. #define CONFIG_WEBSERVER 0
  35. #endif
  36. #endif
  37. #ifndef CONFIG_OTA_UPDATE
  38. #define CONFIG_OTA_UPDATE 0
  39. #endif
  40. #ifndef CONFIG_BSD_TCP
  41. #define CONFIG_BSD_TCP 0
  42. #endif
  43. #ifndef CONFIG_ENABLE_P2P
  44. #define CONFIG_ENABLE_P2P 0
  45. #endif
  46. #define SCAN_WITH_SSID 1
  47. #if CONFIG_WPS
  48. #define STACKSIZE 1280
  49. #else
  50. #define STACKSIZE 1024
  51. #endif
  52. #ifndef WLAN0_NAME
  53. #define WLAN0_NAME "wlan0"
  54. #endif
  55. #ifndef WLAN1_NAME
  56. #define WLAN1_NAME "wlan1"
  57. #endif
  58. /* Give default value if not defined */
  59. #ifndef NET_IF_NUM
  60. #if CONFIG_CONCURRENT_MODE
  61. #define NET_IF_NUM 2
  62. #else
  63. #define NET_IF_NUM 1
  64. #endif
  65. #endif
  66. /*Static IP ADDRESS*/
  67. #ifndef IP_ADDR0
  68. #define IP_ADDR0 192
  69. #define IP_ADDR1 168
  70. #define IP_ADDR2 1
  71. #define IP_ADDR3 80
  72. #endif
  73. /*NETMASK*/
  74. #ifndef NETMASK_ADDR0
  75. #define NETMASK_ADDR0 255
  76. #define NETMASK_ADDR1 255
  77. #define NETMASK_ADDR2 255
  78. #define NETMASK_ADDR3 0
  79. #endif
  80. /*Gateway Address*/
  81. #ifndef GW_ADDR0
  82. #define GW_ADDR0 192
  83. #define GW_ADDR1 168
  84. #define GW_ADDR2 1
  85. #define GW_ADDR3 1
  86. #endif
  87. /*Static IP ADDRESS*/
  88. #ifndef AP_IP_ADDR0
  89. #define AP_IP_ADDR0 192
  90. #define AP_IP_ADDR1 168
  91. #define AP_IP_ADDR2 43
  92. #define AP_IP_ADDR3 1
  93. #endif
  94. /*NETMASK*/
  95. #ifndef AP_NETMASK_ADDR0
  96. #define AP_NETMASK_ADDR0 255
  97. #define AP_NETMASK_ADDR1 255
  98. #define AP_NETMASK_ADDR2 255
  99. #define AP_NETMASK_ADDR3 0
  100. #endif
  101. /*Gateway Address*/
  102. #ifndef AP_GW_ADDR0
  103. #define AP_GW_ADDR0 192
  104. #define AP_GW_ADDR1 168
  105. #define AP_GW_ADDR2 43
  106. #define AP_GW_ADDR3 1
  107. #endif
  108. static void cmd_help(int argc, char **argv);
  109. #if CONFIG_SSL_CLIENT
  110. extern void cmd_ssl_client(int argc, char **argv);
  111. #endif
  112. #if CONFIG_GOOGLENEST
  113. extern void cmd_googlenest(int argc, char **argv);
  114. #endif
  115. #if CONFIG_BSD_TCP
  116. extern void cmd_tcp(int argc, char **argv);
  117. extern void cmd_udp(int argc, char **argv);
  118. #endif
  119. #if CONFIG_WLAN
  120. static void cmd_wifi_on(int argc, char **argv);
  121. static void cmd_wifi_off(int argc, char **argv);
  122. static void cmd_wifi_disconnect(int argc, char **argv);
  123. extern void cmd_promisc(int argc, char **argv);
  124. extern void cmd_simple_config(int argc, char **argv);
  125. #if CONFIG_OTA_UPDATE
  126. extern void cmd_update(int argc, char **argv);
  127. #endif
  128. #if CONFIG_WEBSERVER
  129. extern void start_web_server(void);
  130. extern void stop_web_server(void);
  131. #endif
  132. extern void cmd_app(int argc, char **argv);
  133. #if CONFIG_ENABLE_WPS
  134. extern void cmd_wps(int argc, char **argv);
  135. #endif
  136. #if defined(CONFIG_ENABLE_WPS_AP) && CONFIG_ENABLE_WPS_AP
  137. extern void cmd_ap_wps(int argc, char **argv);
  138. extern int wpas_wps_dev_config(u8 *dev_addr, u8 bregistrar);
  139. #endif //CONFIG_ENABLE_WPS_AP
  140. #if CONFIG_ENABLE_P2P
  141. extern void cmd_wifi_p2p_start(int argc, char **argv);
  142. extern void cmd_wifi_p2p_stop(int argc, char **argv);
  143. extern void cmd_p2p_listen(int argc, char **argv);
  144. extern void cmd_p2p_find(int argc, char **argv);
  145. extern void cmd_p2p_peers(int argc, char **argv);
  146. extern void cmd_p2p_info(int argc, char **argv);
  147. extern void cmd_p2p_disconnect(int argc, char **argv);
  148. extern void cmd_p2p_connect(int argc, char **argv);
  149. #endif //CONFIG_ENABLE_P2P
  150. #if defined(CONFIG_RTL8195A) || defined(CONFIG_RTL8711B) || defined(CONFIG_RTL8721D)
  151. extern u32 CmdDumpWord(IN u16 argc, IN u8 *argv[]);
  152. extern u32 CmdWriteWord(IN u16 argc, IN u8 *argv[]);
  153. #endif
  154. #if CONFIG_LWIP_LAYER
  155. extern struct netif xnetif[NET_IF_NUM];
  156. #endif
  157. #if CONFIG_CONCURRENT_MODE
  158. static void cmd_wifi_sta_and_ap(int argc, char **argv)
  159. {
  160. int timeout = 20;//, mode;
  161. #if CONFIG_LWIP_LAYER
  162. #if !defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  163. struct netif * pnetiff = (struct netif *)&xnetif[1];
  164. #endif
  165. #endif
  166. int channel;
  167. if((argc != 3) && (argc != 4)) {
  168. DBG_INFO("Usage: wifi_ap SSID CHANNEL [PASSWORD]");
  169. return;
  170. }
  171. if(atoi((const char *)argv[2]) > 14){
  172. DBG_INFO("bad channel!Usage: wifi_ap SSID CHANNEL [PASSWORD]");
  173. return;
  174. }
  175. if(strlen((const char *)argv[1]) > 32){
  176. DBG_INFO("Usage: wifi_ap SSID length can't exceed 32\n\r");
  177. return;
  178. }
  179. #if CONFIG_LWIP_LAYER
  180. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  181. //TODO
  182. #else
  183. dhcps_deinit();
  184. #endif
  185. #endif
  186. #if 0
  187. //Check mode
  188. wext_get_mode(WLAN0_NAME, &mode);
  189. switch(mode) {
  190. case IW_MODE_MASTER: //In AP mode
  191. cmd_wifi_off(0, NULL);
  192. cmd_wifi_on(0, NULL);
  193. break;
  194. case IW_MODE_INFRA: //In STA mode
  195. if(wext_get_ssid(WLAN0_NAME, ssid) > 0)
  196. cmd_wifi_disconnect(0, NULL);
  197. }
  198. #endif
  199. wifi_off();
  200. rtw_mdelay_os(20);
  201. if (wifi_on(RTW_MODE_STA_AP) < 0){
  202. DBG_INFO("ERROR: Wifi on failed!");
  203. return;
  204. }
  205. DBG_INFO("Starting AP ...");
  206. channel = atoi((const char *)argv[2]);
  207. if(channel > 13){
  208. DBG_INFO("Channel is from 1 to 13. Set channel 1 as default!\n");
  209. channel = 1;
  210. }
  211. if(argc == 4) {
  212. if(wifi_start_ap(argv[1],
  213. RTW_SECURITY_WPA2_AES_PSK,
  214. argv[3],
  215. strlen((const char *)argv[1]),
  216. strlen((const char *)argv[3]),
  217. channel
  218. ) != RTW_SUCCESS) {
  219. DBG_INFO("ERROR: Operation failed!");
  220. return;
  221. }
  222. }
  223. else {
  224. if(wifi_start_ap(argv[1],
  225. RTW_SECURITY_OPEN,
  226. NULL,
  227. strlen((const char *)argv[1]),
  228. 0,
  229. channel
  230. ) != RTW_SUCCESS) {
  231. DBG_INFO("ERROR: Operation failed!");
  232. return;
  233. }
  234. }
  235. while(1) {
  236. char essid[33];
  237. if(wext_get_ssid(WLAN1_NAME, (unsigned char *) essid) > 0) {
  238. if(strcmp((const char *) essid, (const char *)argv[1]) == 0) {
  239. DBG_INFO("%s started", argv[1]);
  240. break;
  241. }
  242. }
  243. if(timeout == 0) {
  244. DBG_INFO("ERROR: Start AP timeout!");
  245. break;
  246. }
  247. rtw_mdelay_os(1000);
  248. timeout --;
  249. }
  250. #if CONFIG_LWIP_LAYER
  251. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  252. //TODO
  253. #else
  254. LwIP_UseStaticIP(&xnetif[1]);
  255. dhcps_init(pnetiff);
  256. #endif
  257. #endif
  258. }
  259. #endif
  260. static void cmd_wifi_ap(int argc, char **argv)
  261. {
  262. int timeout = 20;
  263. #if CONFIG_LWIP_LAYER
  264. #if !defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  265. struct ip_addr ipaddr;
  266. struct ip_addr netmask;
  267. struct ip_addr gw;
  268. struct netif * pnetif = &xnetif[0];
  269. #endif
  270. #endif
  271. int channel;
  272. #if CONFIG_IEEE80211W
  273. if((argc != 3) && (argc != 4) && (argc != 5)) {
  274. DBG_INFO("Usage: wifi_ap SSID CHANNEL [PASSWORD] [MFP_SUPPORT]");
  275. return;
  276. }
  277. #else
  278. if((argc != 3) && (argc != 4)) {
  279. DBG_INFO("Usage: wifi_ap SSID CHANNEL [PASSWORD]");
  280. return;
  281. }
  282. #endif
  283. if(strlen((const char *)argv[1]) > 32){
  284. DBG_INFO("Usage: wifi_ap SSID length can't exceed 32\n\r");
  285. return;
  286. }
  287. #if CONFIG_LWIP_LAYER
  288. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  289. //TODO
  290. #else
  291. dhcps_deinit();
  292. #if LWIP_VERSION_MAJOR >= 2
  293. IP4_ADDR(ip_2_ip4(&ipaddr), GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
  294. IP4_ADDR(ip_2_ip4(&netmask), NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3);
  295. IP4_ADDR(ip_2_ip4(&gw), GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
  296. netif_set_addr(pnetif, ip_2_ip4(&ipaddr), ip_2_ip4(&netmask),ip_2_ip4(&gw));
  297. #else
  298. IP4_ADDR(&ipaddr, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
  299. IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3);
  300. IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
  301. netif_set_addr(pnetif, &ipaddr, &netmask,&gw);
  302. #endif
  303. #endif
  304. #endif
  305. #if 0
  306. //Check mode
  307. wext_get_mode(WLAN0_NAME, &mode);
  308. switch(mode) {
  309. case IW_MODE_MASTER: //In AP mode
  310. wifi_off();
  311. wifi_on(1);
  312. break;
  313. case IW_MODE_INFRA: //In STA mode
  314. if(wext_get_ssid(WLAN0_NAME, ssid) > 0)
  315. cmd_wifi_disconnect(0, NULL);
  316. }
  317. #else
  318. wifi_off();
  319. rtw_mdelay_os(20);
  320. if (wifi_on(RTW_MODE_AP) < 0){
  321. DBG_INFO("ERROR: Wifi on failed!");
  322. return;
  323. }
  324. #endif
  325. DBG_INFO("Starting AP ...");
  326. channel = atoi((const char *)argv[2]);
  327. DBG_INFO("Set Channel is %d\n", channel);
  328. #if NOT_SUPPORT_5G
  329. if(channel > 13){
  330. DBG_INFO("Channel is from 1 to 13. Set channel 1 as default!\n");
  331. channel = 1;
  332. }
  333. #endif
  334. #if defined(CONFIG_ENABLE_WPS_AP) && CONFIG_ENABLE_WPS_AP
  335. //wpas_wps_dev_config(pnetif->hwaddr, 1);
  336. #endif
  337. if(argc == 4) {
  338. if(wifi_start_ap(argv[1],
  339. RTW_SECURITY_WPA2_AES_PSK,
  340. argv[3],
  341. strlen((const char *)argv[1]),
  342. strlen((const char *)argv[3]),
  343. channel
  344. ) != RTW_SUCCESS) {
  345. DBG_INFO("ERROR: Operation failed!");
  346. return;
  347. }
  348. }
  349. #if CONFIG_IEEE80211W
  350. else if(argc == 5) {
  351. rtw_security_t alg = RTW_SECURITY_WPA2_AES_CMAC;
  352. u8 mfp = atoi((const char *)argv[4]);
  353. if (mfp == 0 || mfp > 2) {// not support
  354. alg = RTW_SECURITY_WPA2_AES_PSK;
  355. mfp = 0;
  356. }
  357. wifi_set_mfp_support(mfp);
  358. if (wifi_start_ap(argv[1],
  359. alg,
  360. argv[3],
  361. strlen((const char *)argv[1]),
  362. strlen((const char *)argv[3]),
  363. channel
  364. ) != RTW_SUCCESS) {
  365. DBG_INFO("ERROR: Operation failed!");
  366. return;
  367. }
  368. }
  369. #endif
  370. else {
  371. if(wifi_start_ap(argv[1],
  372. RTW_SECURITY_OPEN,
  373. NULL,
  374. strlen((const char *)argv[1]),
  375. 0,
  376. channel
  377. ) != RTW_SUCCESS) {
  378. DBG_INFO("ERROR: Operation failed!");
  379. return;
  380. }
  381. }
  382. while(1) {
  383. char essid[33];
  384. if(wext_get_ssid(WLAN0_NAME, (unsigned char *) essid) > 0) {
  385. if(strcmp((const char *) essid, (const char *)argv[1]) == 0) {
  386. DBG_INFO("%s started\n", argv[1]);
  387. break;
  388. }
  389. }
  390. if(timeout == 0) {
  391. DBG_INFO("ERROR: Start AP timeout!");
  392. break;
  393. }
  394. rtw_mdelay_os(1000);
  395. timeout --;
  396. }
  397. #if CONFIG_LWIP_LAYER
  398. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  399. //TODO
  400. #else
  401. //LwIP_UseStaticIP(pnetif);
  402. dhcps_init(pnetif);
  403. #endif
  404. #endif
  405. }
  406. static void cmd_wifi_connect(int argc, char **argv)
  407. {
  408. int ret = RTW_ERROR;
  409. unsigned long tick1 = xTaskGetTickCount();
  410. unsigned long tick2, tick3;
  411. int mode;
  412. char *ssid;
  413. rtw_security_t security_type;
  414. char *password;
  415. int ssid_len;
  416. int password_len;
  417. int key_id;
  418. void *semaphore;
  419. if((argc != 2) && (argc != 3) && (argc != 4)) {
  420. DBG_INFO("Usage: wifi_connect SSID [WPA PASSWORD / (5 or 13) ASCII WEP KEY] [WEP KEY ID 0/1/2/3]");
  421. return;
  422. }
  423. //Check if in AP mode
  424. wext_get_mode(WLAN0_NAME, &mode);
  425. if(mode == IW_MODE_MASTER) {
  426. #if CONFIG_LWIP_LAYER
  427. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  428. //TODO
  429. #else
  430. dhcps_deinit();
  431. #endif
  432. #endif
  433. wifi_off();
  434. vTaskDelay(20);
  435. if (wifi_on(RTW_MODE_STA) < 0){
  436. DBG_INFO("ERROR: Wifi on failed!");
  437. return;
  438. }
  439. }
  440. ssid = argv[1];
  441. if(argc == 2){
  442. security_type = RTW_SECURITY_OPEN;
  443. password = NULL;
  444. ssid_len = strlen((const char *)argv[1]);
  445. password_len = 0;
  446. key_id = 0;
  447. semaphore = NULL;
  448. }else if(argc ==3){
  449. security_type = RTW_SECURITY_WPA2_AES_PSK;
  450. password = argv[2];
  451. ssid_len = strlen((const char *)argv[1]);
  452. password_len = strlen((const char *)argv[2]);
  453. key_id = 0;
  454. semaphore = NULL;
  455. }else{
  456. security_type = RTW_SECURITY_WEP_PSK;
  457. password = argv[2];
  458. ssid_len = strlen((const char *)argv[1]);
  459. password_len = strlen((const char *)argv[2]);
  460. key_id = atoi(argv[3]);
  461. if(( password_len != 5) && (password_len != 13)&&( password_len != 10) && (password_len != 26)) {
  462. DBG_INFO("Wrong WEP key length. Must be 5 or 13 ASCII characters or 10 or 26 hex.");
  463. return;
  464. }
  465. if((key_id < 0) || (key_id > 3)) {
  466. DBG_INFO("Wrong WEP key id. Must be one of 0,1,2, or 3.");
  467. return;
  468. }
  469. semaphore = NULL;
  470. }
  471. ret = wifi_connect(ssid,
  472. security_type,
  473. password,
  474. ssid_len,
  475. password_len,
  476. key_id,
  477. semaphore);
  478. if(ret != RTW_SUCCESS) {
  479. DBG_INFO("ERROR: Operation failed!");
  480. return;
  481. } else {
  482. tick2 = xTaskGetTickCount();
  483. DBG_INFO("Connected after %dms.\n", (tick2-tick1));
  484. #if CONFIG_LWIP_LAYER
  485. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  486. //TODO
  487. #else
  488. /* Start DHCPClient */
  489. LwIP_DHCP(0, DHCP_START);
  490. #endif
  491. #endif
  492. }
  493. tick3 = xTaskGetTickCount();
  494. DBG_INFO("Got IP after %dms.\n", (tick3-tick1));
  495. }
  496. static void cmd_wifi_connect_bssid(int argc, char **argv)
  497. {
  498. int ret = RTW_ERROR;
  499. unsigned long tick1 = xTaskGetTickCount();
  500. unsigned long tick2, tick3;
  501. int mode;
  502. unsigned char bssid[ETH_ALEN];
  503. char *ssid = NULL;
  504. rtw_security_t security_type;
  505. char *password;
  506. int bssid_len;
  507. int ssid_len = 0;
  508. int password_len;
  509. int key_id;
  510. void *semaphore;
  511. u32 mac[ETH_ALEN];
  512. u32 i;
  513. u32 index = 0;
  514. if((argc != 3) && (argc != 4) && (argc != 5) && (argc != 6)) {
  515. DBG_INFO("Usage: wifi_connect_bssid 0/1 [SSID] BSSID / xx:xx:xx:xx:xx:xx [WPA PASSWORD / (5 or 13) ASCII WEP KEY] [WEP KEY ID 0/1/2/3]");
  516. return;
  517. }
  518. //Check if in AP mode
  519. wext_get_mode(WLAN0_NAME, &mode);
  520. if(mode == IW_MODE_MASTER) {
  521. #if CONFIG_LWIP_LAYER
  522. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  523. //TODO
  524. #else
  525. dhcps_deinit();
  526. #endif
  527. #endif
  528. wifi_off();
  529. vTaskDelay(20);
  530. if (wifi_on(RTW_MODE_STA) < 0){
  531. DBG_INFO("ERROR: Wifi on failed!");
  532. return;
  533. }
  534. }
  535. //check ssid
  536. if(memcmp(argv[1], "0", 1)){
  537. index = 1;
  538. ssid_len = strlen((const char *)argv[2]);
  539. if((ssid_len <= 0) || (ssid_len > 32)) {
  540. DBG_INFO("Wrong ssid. Length must be less than 32.");
  541. return;
  542. }
  543. ssid = argv[2];
  544. }
  545. sscanf(argv[2 + index], MAC_FMT, mac, mac + 1, mac + 2, mac + 3, mac + 4, mac + 5);
  546. for(i=0; i<ETH_ALEN; i++)
  547. bssid[i] = (u8)mac[i]&0xFF;
  548. if(argc == 3 + index){
  549. security_type = RTW_SECURITY_OPEN;
  550. password = NULL;
  551. bssid_len = ETH_ALEN;
  552. password_len = 0;
  553. key_id = 0;
  554. semaphore = NULL;
  555. }else if(argc ==4 + index){
  556. security_type = RTW_SECURITY_WPA2_AES_PSK;
  557. password = argv[3 + index];
  558. bssid_len = ETH_ALEN;
  559. password_len = strlen((const char *)argv[3 + index]);
  560. key_id = 0;
  561. semaphore = NULL;
  562. }else{
  563. security_type = RTW_SECURITY_WEP_PSK;
  564. password = argv[3 + index];
  565. bssid_len = ETH_ALEN;
  566. password_len = strlen((const char *)argv[3 + index]);
  567. key_id = atoi(argv[4 + index]);
  568. if(( password_len != 5) && (password_len != 13)&&( password_len != 10) && (password_len != 26)) {
  569. DBG_INFO("Wrong WEP key length. Must be 5 or 13 ASCII characters or 10 or 26 hex.");
  570. return;
  571. }
  572. if((key_id < 0) || (key_id > 3)) {
  573. DBG_INFO("Wrong WEP key id. Must be one of 0,1,2, or 3.");
  574. return;
  575. }
  576. semaphore = NULL;
  577. }
  578. ret = wifi_connect_bssid(bssid,
  579. ssid,
  580. security_type,
  581. password,
  582. bssid_len,
  583. ssid_len,
  584. password_len,
  585. key_id,
  586. semaphore);
  587. if(ret != RTW_SUCCESS) {
  588. DBG_INFO("ERROR: Operation failed!");
  589. return;
  590. } else {
  591. tick2 = xTaskGetTickCount();
  592. DBG_INFO("Connected after %dms.\n", (tick2-tick1));
  593. #if CONFIG_LWIP_LAYER
  594. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  595. //TODO
  596. #else
  597. /* Start DHCPClient */
  598. LwIP_DHCP(0, DHCP_START);
  599. #endif
  600. #endif
  601. }
  602. tick3 = xTaskGetTickCount();
  603. DBG_INFO("Got IP after %dms.\n", (tick3-tick1));
  604. }
  605. static void cmd_wifi_disconnect(int argc, char **argv)
  606. {
  607. int timeout = 20;
  608. char essid[33];
  609. DBG_INFO("Deassociating AP ...");
  610. if(wext_get_ssid(WLAN0_NAME, (unsigned char *) essid) < 0) {
  611. DBG_INFO("WIFI disconnected");
  612. return;
  613. }
  614. if(wifi_disconnect() < 0) {
  615. DBG_INFO("ERROR: Operation failed!");
  616. return;
  617. }
  618. while(1) {
  619. if(wext_get_ssid(WLAN0_NAME, (unsigned char *) essid) < 0) {
  620. DBG_INFO("WIFI disconnected");
  621. break;
  622. }
  623. if(timeout == 0) {
  624. DBG_INFO("ERROR: Deassoc timeout!");
  625. break;
  626. }
  627. rtw_mdelay_os(1000);
  628. timeout --;
  629. }
  630. }
  631. extern void dump_drv_version();
  632. static void cmd_wifi_info(int argc, char **argv)
  633. {
  634. int i = 0;
  635. #if CONFIG_LWIP_LAYER
  636. #if !defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  637. u8 *mac = LwIP_GetMAC(&xnetif[0]);
  638. u8 *ip = LwIP_GetIP(&xnetif[0]);
  639. u8 *gw = LwIP_GetGW(&xnetif[0]);
  640. #endif
  641. #endif
  642. u8 *ifname[2] = {WLAN0_NAME,WLAN1_NAME};
  643. #ifdef CONFIG_MEM_MONITOR
  644. extern int min_free_heap_size;
  645. #endif
  646. dump_drv_version();
  647. rtw_wifi_setting_t setting;
  648. for(i=0;i<NET_IF_NUM;i++){
  649. if(rltk_wlan_running(i)){
  650. #if CONFIG_LWIP_LAYER
  651. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  652. //TODO
  653. #else
  654. mac = LwIP_GetMAC(&xnetif[i]);
  655. ip = LwIP_GetIP(&xnetif[i]);
  656. gw = LwIP_GetGW(&xnetif[i]);
  657. #endif
  658. #endif
  659. DBG_INFO("WIFI %s Status: Running", ifname[i]);
  660. DBG_INFO("==============================");
  661. rltk_wlan_statistic(i);
  662. wifi_get_setting((const char*)ifname[i],&setting);
  663. wifi_show_setting((const char*)ifname[i],&setting);
  664. #if CONFIG_LWIP_LAYER
  665. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  666. //TODO
  667. #else
  668. DBG_INFO("Interface (%s)", ifname[i]);
  669. DBG_INFO("==============================");
  670. DBG_INFO("\tMAC => %02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]) ;
  671. DBG_INFO("\tIP => %d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
  672. DBG_INFO("\tGW => %d.%d.%d.%d\n\r", gw[0], gw[1], gw[2], gw[3]);
  673. #endif
  674. #endif
  675. if(setting.mode == RTW_MODE_AP || i == 1)
  676. {
  677. int client_number;
  678. struct {
  679. int count;
  680. rtw_mac_t mac_list[AP_STA_NUM];
  681. } client_info;
  682. client_info.count = AP_STA_NUM;
  683. wifi_get_associated_client_list(&client_info, sizeof(client_info));
  684. DBG_INFO("Associated Client List:");
  685. DBG_INFO("==============================");
  686. if(client_info.count == 0)
  687. DBG_INFO("Client Num: 0\n\r");
  688. else
  689. {
  690. DBG_INFO("Client Num: %d", client_info.count);
  691. for( client_number=0; client_number < client_info.count; client_number++ )
  692. {
  693. DBG_INFO("Client [%d]:", client_number);
  694. DBG_INFO("\tMAC => "MAC_FMT"",
  695. MAC_ARG(client_info.mac_list[client_number].octet));
  696. }
  697. DBG_INFO("");
  698. }
  699. }
  700. {
  701. int error = wifi_get_last_error();
  702. DBG_INFO("Last Link Error");
  703. DBG_INFO("==============================");
  704. switch(error)
  705. {
  706. case RTW_NO_ERROR:
  707. DBG_INFO("\tNo Error");
  708. break;
  709. case RTW_NONE_NETWORK:
  710. DBG_INFO("\tTarget AP Not Found");
  711. break;
  712. case RTW_CONNECT_FAIL:
  713. DBG_INFO("\tAssociation Failed");
  714. break;
  715. case RTW_WRONG_PASSWORD:
  716. DBG_INFO("\tWrong Password");
  717. break;
  718. case RTW_DHCP_FAIL:
  719. DBG_INFO("\tDHCP Failed");
  720. break;
  721. default:
  722. DBG_INFO("\tUnknown Error(%d)", error);
  723. }
  724. DBG_INFO("");
  725. }
  726. }
  727. }
  728. #if defined(configUSE_TRACE_FACILITY) && (configUSE_TRACE_FACILITY == 1)
  729. {
  730. signed char pcWriteBuffer[1024];
  731. vTaskList((char*)pcWriteBuffer);
  732. DBG_INFO("Task List: \n%s", pcWriteBuffer);
  733. }
  734. #endif
  735. #ifdef CONFIG_MEM_MONITOR
  736. DBG_INFO("Memory Usage");
  737. DBG_INFO("==============================");
  738. DBG_INFO("Min Free Heap Size: %d", min_free_heap_size);
  739. DBG_INFO("Cur Free Heap Size: %d\n", xPortGetFreeHeapSize());
  740. #endif
  741. }
  742. static void cmd_wifi_on(int argc, char **argv)
  743. {
  744. if(wifi_on(RTW_MODE_STA)<0){
  745. DBG_INFO("ERROR: Wifi on failed!\n");
  746. }
  747. }
  748. static void cmd_wifi_off(int argc, char **argv)
  749. {
  750. #if CONFIG_WEBSERVER
  751. stop_web_server();
  752. #endif
  753. #if CONFIG_ENABLE_P2P
  754. cmd_wifi_p2p_stop(0, NULL);
  755. #else
  756. wifi_off();
  757. #endif
  758. }
  759. static void print_scan_result( rtw_scan_result_t* record )
  760. {
  761. printk( "%s\t ", ( record->bss_type == RTW_BSS_TYPE_ADHOC ) ? "Adhoc" : "Infra" );
  762. printk( MAC_FMT, MAC_ARG(record->BSSID.octet) );
  763. printk( " %d\t ", record->signal_strength );
  764. printk( " %d\t ", record->channel );
  765. printk( " %d\t ", record->wps_type );
  766. printk( "%s\t\t ", ( record->security == RTW_SECURITY_OPEN ) ? "Open" :
  767. ( record->security == RTW_SECURITY_WEP_PSK ) ? "WEP" :
  768. ( record->security == RTW_SECURITY_WPA_TKIP_PSK ) ? "WPA TKIP PSK" :
  769. ( record->security == RTW_SECURITY_WPA_TKIP_8021X ) ? "WPA TKIP 8021X" :
  770. ( record->security == RTW_SECURITY_WPA_AES_PSK ) ? "WPA AES PSK" :
  771. ( record->security == RTW_SECURITY_WPA_AES_8021X ) ? "WPA AES 8021X" :
  772. ( record->security == RTW_SECURITY_WPA2_AES_PSK ) ? "WPA2 AES PSK" :
  773. ( record->security == RTW_SECURITY_WPA2_AES_8021X ) ? "WPA2 AES 8021X" :
  774. ( record->security == RTW_SECURITY_WPA2_TKIP_PSK ) ? "WPA2 TKIP PSK" :
  775. ( record->security == RTW_SECURITY_WPA2_TKIP_8021X ) ? "WPA2 TKIP 8021X" :
  776. ( record->security == RTW_SECURITY_WPA2_MIXED_PSK ) ? "WPA2 Mixed PSK" :
  777. ( record->security == RTW_SECURITY_WPA_WPA2_MIXED_PSK ) ? "WPA/WPA2 PSK" :
  778. ( record->security == RTW_SECURITY_WPA_WPA2_MIXED_8021X ) ? "WPA/WPA2 8021X" :
  779. #if CONFIG_SAE_SUPPORT
  780. ( record->security == RTW_SECURITY_WPA3_AES_PSK) ? "WP3-SAE AES" :
  781. #endif
  782. "Unknown" );
  783. printk( " %s ", record->SSID.val );
  784. }
  785. static rtw_result_t app_scan_result_handler( rtw_scan_handler_result_t* malloced_scan_result )
  786. {
  787. static int ApNum = 0;
  788. if (malloced_scan_result->scan_complete != RTW_TRUE) {
  789. rtw_scan_result_t* record = &malloced_scan_result->ap_details;
  790. record->SSID.val[record->SSID.len] = 0; /* Ensure the SSID is null terminated */
  791. printk( "\r\n%d\t ", ++ApNum );
  792. print_scan_result(record);
  793. } else{
  794. ApNum = 0;
  795. }
  796. return RTW_SUCCESS;
  797. }
  798. #if SCAN_WITH_SSID
  799. static void cmd_wifi_scan_with_multiple_ssid(int argc,char **argv)
  800. {
  801. int num_ssid,scan_buflen,i;
  802. scan_ssid Ssid[3];
  803. if(argc < 2||argc>4){
  804. DBG_INFO("For Scan all channel Usage: wifi_scan_with_multissid ssid... (num<=3!)");
  805. return ;
  806. }
  807. for(i = 1;i<argc;i++){
  808. Ssid[i-1].ssidlength = strlen((const char *)argv[i]);
  809. memcpy(&(Ssid[i-1].ssid), argv[i], Ssid[i-1].ssidlength);
  810. DBG_INFO("%s: Ssid[%d].Ssid = %s, Ssid[%d].SsidLength = %d",__FUNCTION__,i-1,Ssid[i-1].ssid,i-1,Ssid[i-1].ssidlength);
  811. }
  812. scan_buflen = 200;
  813. num_ssid = argc -1;
  814. if(wifi_scan_networks_with_multissid(NULL,NULL, scan_buflen, Ssid ,num_ssid) != RTW_SUCCESS){
  815. DBG_INFO("ERROR: wifi scan failed");
  816. }
  817. return ;
  818. }
  819. static void cmd_wifi_scan_with_ssid(int argc, char **argv)
  820. {
  821. u8 *channel_list = NULL;
  822. u8 *pscan_config = NULL;
  823. char *ssid = NULL;
  824. int ssid_len = 0;
  825. //Fully scan
  826. int scan_buf_len = 500;
  827. if(argc == 3 && argv[1] && argv[2]){
  828. ssid = argv[1];
  829. ssid_len = strlen((const char *)argv[1]);
  830. if((ssid_len <= 0) || (ssid_len > 32)) {
  831. DBG_INFO("Wrong ssid. Length must be less than 32.");
  832. goto exit;
  833. }
  834. scan_buf_len = atoi(argv[2]);
  835. if(scan_buf_len < 36){
  836. DBG_INFO("BUFFER_LENGTH too short\n\r");
  837. goto exit;
  838. }
  839. }else if(argc > 3){
  840. int i = 0;
  841. int num_channel = atoi(argv[2]);
  842. ssid = argv[1];
  843. ssid_len = strlen((const char *)argv[1]);
  844. if((ssid_len <= 0) || (ssid_len > 32)) {
  845. DBG_INFO("Wrong ssid. Length must be less than 32.");
  846. goto exit;
  847. }
  848. channel_list = (u8*)pvPortMalloc(num_channel);
  849. if(!channel_list){
  850. DBG_INFO("ERROR: Can't malloc memory for channel list");
  851. goto exit;
  852. }
  853. pscan_config = (u8*)pvPortMalloc(num_channel);
  854. if(!pscan_config){
  855. DBG_INFO("ERROR: Can't malloc memory for pscan_config");
  856. goto exit;
  857. }
  858. //parse command channel list
  859. for(i = 3; i <= argc -1 ; i++){
  860. *(channel_list + i - 3) = (u8)atoi(argv[i]);
  861. *(pscan_config + i - 3) = PSCAN_ENABLE;
  862. }
  863. if(wifi_set_pscan_chan(channel_list, pscan_config, num_channel) < 0){
  864. DBG_INFO("ERROR: wifi set partial scan channel fail");
  865. goto exit;
  866. }
  867. }else{
  868. DBG_INFO("For Scan all channel Usage: wifi_scan_with_ssid ssid BUFFER_LENGTH");
  869. DBG_INFO("For Scan partial channel Usage: wifi_scan_with_ssid ssid num_channels channel_num1 ...");
  870. return;
  871. }
  872. if(wifi_scan_networks_with_ssid(NULL, NULL, scan_buf_len, ssid, ssid_len) != RTW_SUCCESS){
  873. DBG_INFO("ERROR: wifi scan failed");
  874. goto exit;
  875. }
  876. exit:
  877. if(argc > 2 && channel_list)
  878. vPortFree(channel_list);
  879. if(argc > 2 && pscan_config)
  880. vPortFree(pscan_config);
  881. }
  882. #endif
  883. static void cmd_wifi_scan(int argc, char **argv)
  884. {
  885. u8 *channel_list = NULL;
  886. u8 *pscan_config = NULL;
  887. if(argc > 2){
  888. int i = 0;
  889. int num_channel = atoi(argv[1]);
  890. channel_list = (u8*)pvPortMalloc(num_channel);
  891. if(!channel_list){
  892. DBG_INFO("ERROR: Can't malloc memory for channel list");
  893. goto exit;
  894. }
  895. pscan_config = (u8*)pvPortMalloc(num_channel);
  896. if(!pscan_config){
  897. DBG_INFO("ERROR: Can't malloc memory for pscan_config");
  898. goto exit;
  899. }
  900. //parse command channel list
  901. for(i = 2; i <= argc -1 ; i++){
  902. *(channel_list + i - 2) = (u8)atoi(argv[i]);
  903. *(pscan_config + i - 2) = PSCAN_ENABLE;
  904. }
  905. if(wifi_set_pscan_chan(channel_list, pscan_config, num_channel) < 0){
  906. DBG_INFO("ERROR: wifi set partial scan channel fail");
  907. goto exit;
  908. }
  909. }
  910. if(wifi_scan_networks(app_scan_result_handler, NULL ) != RTW_SUCCESS){
  911. DBG_INFO("ERROR: wifi scan failed");
  912. goto exit;
  913. }
  914. exit:
  915. if(argc > 2 && channel_list)
  916. vPortFree(channel_list);
  917. if(argc > 2 && pscan_config)
  918. vPortFree(pscan_config);
  919. }
  920. static void cmd_wifi_reorder_scan(int argc, char **argv)
  921. {
  922. u8 *channel_list = NULL;
  923. int i = 0;
  924. int num_channel = 13;
  925. char channel_reorder[]= {1,3,5,7,9,2,4,6,8,10,11,12,13};//set channel order
  926. channel_list = (u8*)pvPortMalloc(num_channel);
  927. if(!channel_list){
  928. DBG_INFO("ERROR: Can't malloc memory for channel_list");
  929. goto exit;
  930. }
  931. for(i=0;i<num_channel;i++)
  932. *(channel_list+i) = channel_reorder[i];
  933. if(wifi_set_scan_reorderchan(channel_list, num_channel) < 0){
  934. DBG_INFO("ERROR: wifi set reoder scan channel fail");
  935. goto exit;
  936. }
  937. if(wifi_scan_networks(app_scan_result_handler, NULL ) != RTW_SUCCESS){
  938. DBG_INFO("ERROR: wifi scan failed");
  939. goto exit;
  940. }
  941. exit:
  942. if(channel_list)
  943. vPortFree(channel_list);
  944. }
  945. #if CONFIG_WEBSERVER
  946. static void cmd_wifi_start_webserver(int argc, char **argv)
  947. {
  948. start_web_server();
  949. }
  950. #endif
  951. static void cmd_wifi_iwpriv(int argc, char **argv)
  952. {
  953. if(argc == 2 && argv[1]) {
  954. wext_private_command(WLAN0_NAME, argv[1], 1);
  955. }
  956. else {
  957. if (argc == 3) {
  958. char cmd_buf[32] = {0};
  959. sprintf(cmd_buf, "%s %s", argv[1], argv[2]);
  960. wext_private_command(WLAN0_NAME, cmd_buf, 1);
  961. } else
  962. DBG_INFO("Usage: iwpriv COMMAND PARAMETERS");
  963. }
  964. }
  965. #endif //#if CONFIG_WLAN
  966. #if CONFIG_LWIP_LAYER
  967. static void cmd_ping(int argc, char **argv)
  968. {
  969. #if !defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  970. if(argc == 2) {
  971. do_ping_call(argv[1], 0, 5); //Not loop, count=5
  972. }
  973. else if(argc == 3) {
  974. if(strcmp(argv[2], "loop") == 0)
  975. do_ping_call(argv[1], 1, 0); //loop, no count
  976. else
  977. do_ping_call(argv[1], 0, atoi(argv[2])); //Not loop, with count
  978. }
  979. else {
  980. DBG_INFO("Usage: ping IP [COUNT/loop]");
  981. }
  982. #else
  983. DBG_INFO("unsupported cmd for customer platform!!!!!!!!");
  984. #endif
  985. }
  986. #endif
  987. #if ( configGENERATE_RUN_TIME_STATS == 1 )
  988. static char cBuffer[ 512 ];
  989. static void cmd_cpustat(int argc, char **argv)
  990. {
  991. vTaskGetRunTimeStats( ( char * ) cBuffer );
  992. DBG_INFO("%s",cBuffer);
  993. }
  994. #endif
  995. #if defined(CONFIG_RTL8195A) || defined(CONFIG_RTL8711B) || defined(CONFIG_RTL8721D)
  996. static void cmd_dump_reg(int argc, char **argv)
  997. {
  998. CmdDumpWord(argc-1, (u8**)(argv+1));
  999. }
  1000. static void cmd_edit_reg(int argc, char **argv)
  1001. {
  1002. CmdWriteWord(argc-1, (u8**)(argv+1));
  1003. }
  1004. #endif
  1005. static void cmd_exit(int argc, char **argv)
  1006. {
  1007. DBG_INFO("Leave INTERACTIVE MODE");
  1008. vTaskDelete(NULL);
  1009. }
  1010. static void cmd_debug(int argc, char **argv)
  1011. {
  1012. if(strcmp(argv[1], "ready_trx") == 0) {
  1013. DBG_INFO("%d", wifi_is_ready_to_transceive((rtw_interface_t)rtw_atoi((u8*)argv[2])));
  1014. } else if(strcmp(argv[1], "is_up") == 0) {
  1015. DBG_INFO("%d", wifi_is_up((rtw_interface_t)rtw_atoi((u8*)argv[2])));
  1016. } else if(strcmp(argv[1], "set_mac") == 0) {
  1017. DBG_INFO("%d", wifi_set_mac_address(argv[2]));
  1018. } else if(strcmp(argv[1], "get_mac") == 0) {
  1019. u8 mac[18] = {0};
  1020. wifi_get_mac_address((char*)mac);
  1021. DBG_INFO("%s", mac);
  1022. } else if(strcmp(argv[1], "set_bt_mac") == 0){
  1023. DBG_INFO("%d", bt_set_mac_address(argv[2]));
  1024. }else if(strcmp(argv[1], "get_bt_mac") == 0){
  1025. u8 mac[18] = {0};
  1026. bt_get_mac_address((char*)mac);
  1027. DBG_INFO("%s", mac);
  1028. }else if(strcmp(argv[1], "ps_on") == 0) {
  1029. DBG_INFO("%d", wifi_enable_powersave());
  1030. } else if(strcmp(argv[1], "ps_off") == 0) {
  1031. DBG_INFO("%d", wifi_disable_powersave());
  1032. #if 0 //TODO
  1033. } else if(strcmp(argv[1], "get_txpwr") == 0) {
  1034. int idx;
  1035. wifi_get_txpower(&idx);
  1036. DBG_INFO("%d", idx);
  1037. } else if(strcmp(argv[1], "set_txpwr") == 0) {
  1038. DBG_INFO("%d", wifi_set_txpower(rtw_atoi((u8*)argv[2])));
  1039. #endif
  1040. } else if(strcmp(argv[1], "get_clientlist") == 0) {
  1041. int client_number;
  1042. struct {
  1043. int count;
  1044. rtw_mac_t mac_list[3];
  1045. } client_info;
  1046. client_info.count = 3;
  1047. DBG_INFO("%d\r\n", wifi_get_associated_client_list(&client_info, sizeof(client_info)));
  1048. if( client_info.count == 0 )
  1049. {
  1050. DBG_INFO("Clients connected 0..\r\n");
  1051. }
  1052. else
  1053. {
  1054. DBG_INFO("Clients connected %d..\r\n", client_info.count);
  1055. for( client_number=0; client_number < client_info.count; client_number++ )
  1056. {
  1057. DBG_INFO("------------------------------------\r\n");
  1058. DBG_INFO("| %d | "MAC_FMT" |\r\n",
  1059. client_number,
  1060. MAC_ARG(client_info.mac_list[client_number].octet)
  1061. );
  1062. }
  1063. DBG_INFO("------------------------------------\r\n");
  1064. }
  1065. } else if(strcmp(argv[1], "get_apinfo") == 0) {
  1066. rtw_bss_info_t ap_info;
  1067. rtw_security_t sec;
  1068. if(wifi_get_ap_info(&ap_info, &sec) == RTW_SUCCESS) {
  1069. DBG_INFO("SSID : %s\r\n", (char*)ap_info.SSID);
  1070. DBG_INFO("BSSID : "MAC_FMT"\r\n", MAC_ARG(ap_info.BSSID.octet));
  1071. DBG_INFO("RSSI : %d\r\n", ap_info.RSSI);
  1072. //DBG_INFO("SNR : %d\r\n", ap_info.SNR);
  1073. DBG_INFO("Beacon period : %d\r\n", ap_info.beacon_period);
  1074. DBG_INFO("Security : %s\r\n", ( sec == RTW_SECURITY_OPEN ) ? "Open" :
  1075. ( sec == RTW_SECURITY_WEP_PSK ) ? "WEP" :
  1076. ( sec == RTW_SECURITY_WPA_TKIP_PSK ) ? "WPA TKIP" :
  1077. ( sec == RTW_SECURITY_WPA_AES_PSK ) ? "WPA AES" :
  1078. ( sec == RTW_SECURITY_WPA2_AES_PSK ) ? "WPA2 AES" :
  1079. ( sec == RTW_SECURITY_WPA2_TKIP_PSK ) ? "WPA2 TKIP" :
  1080. ( sec == RTW_SECURITY_WPA2_MIXED_PSK ) ? "WPA2 Mixed" :
  1081. "Unknown");
  1082. }
  1083. }
  1084. #if CONFIG_MULTICAST
  1085. else if(strcmp(argv[1], "reg_mc") == 0) {
  1086. rtw_mac_t mac;
  1087. sscanf(argv[2], MAC_FMT, (int*)(mac.octet+0), (int*)(mac.octet+1), (int*)(mac.octet+2), (int*)(mac.octet+3), (int*)(mac.octet+4), (int*)(mac.octet+5));
  1088. DBG_INFO("%d", wifi_register_multicast_address(&mac));
  1089. } else if(strcmp(argv[1], "unreg_mc") == 0) {
  1090. rtw_mac_t mac;
  1091. sscanf(argv[2], MAC_FMT, (int*)(mac.octet+0), (int*)(mac.octet+1), (int*)(mac.octet+2), (int*)(mac.octet+3), (int*)(mac.octet+4), (int*)(mac.octet+5));
  1092. DBG_INFO("%d", wifi_unregister_multicast_address(&mac));
  1093. }
  1094. #endif
  1095. else if(strcmp(argv[1], "get_rssi") == 0) {
  1096. int rssi = 0;
  1097. wifi_get_rssi(&rssi);
  1098. DBG_INFO("wifi_get_rssi: rssi = %d", rssi);
  1099. }else if(strcmp(argv[1], "dbg") == 0) {
  1100. char buf[32] = {0};
  1101. char * copy = buf;
  1102. int i = 0;
  1103. int len = 0;
  1104. for(i=1;i<argc;i++){
  1105. strcpy(&buf[len], argv[i]);
  1106. len = strlen(copy);
  1107. buf[len++] = ' ';
  1108. buf[len] = '\0';
  1109. }
  1110. wext_private_command(WLAN0_NAME, copy, 1);
  1111. #if CONFIG_IEEE80211W
  1112. } else if(strcmp(argv[1], "11w_sa") == 0) {
  1113. rltk_wlan_tx_sa_query(atoi((const char *)argv[2]));
  1114. } else if(strcmp(argv[1], "11w_deauth") == 0) {
  1115. rltk_wlan_tx_deauth(atoi((const char *)argv[2]), atoi((const char *)argv[3]));
  1116. } else if(strcmp(argv[1], "11w_auth") == 0) {
  1117. rltk_wlan_tx_auth();
  1118. #endif
  1119. } else if(strcmp(argv[1], "log") == 0) {
  1120. extern void rtlk_wlan_set_wifi_log(u8 enable);
  1121. extern void rtlk_wlan_set_btco_log(u8 enable);
  1122. if(strcmp(argv[2], "wifi") == 0){//open close almost all wifi log
  1123. if(strcmp(argv[3], "on") == 0)
  1124. rtlk_wlan_set_wifi_log(1);
  1125. if(strcmp(argv[3], "off") == 0)
  1126. rtlk_wlan_set_wifi_log(0);
  1127. }else if(strcmp(argv[2], "btco") == 0){//open close btco log
  1128. if(strcmp(argv[3], "on") == 0)
  1129. rtlk_wlan_set_btco_log(1);
  1130. if(strcmp(argv[3], "off") == 0)
  1131. rtlk_wlan_set_btco_log(0);
  1132. }
  1133. } else {
  1134. DBG_INFO("Unknown CMD\r\n");
  1135. }
  1136. }
  1137. #if CONFIG_SUSPEND
  1138. extern int rtw_suspend(rtw_mode_t mode);
  1139. extern int rtw_resume(rtw_mode_t mode);
  1140. static void cmd_suspend(int argc, char **argv)
  1141. {
  1142. rtw_suspend(NULL);
  1143. }
  1144. static void cmd_resume(int argc, char **argv)
  1145. {
  1146. rtw_resume(NULL);
  1147. }
  1148. #endif
  1149. int frame_handler(const unsigned char* frame_buf, unsigned int frame_len)
  1150. {
  1151. DBG_INFO("%s----received raw data and print lenfgth is %d!\n",__FUNCTION__,frame_len);
  1152. int i = 0;
  1153. for(;i<frame_len;i++){
  1154. printk("%0x ",*frame_buf);
  1155. frame_buf++;
  1156. if((i+1)%12 == 0)
  1157. printk("\r\n");
  1158. }
  1159. return 0;
  1160. }
  1161. #ifdef CONFIG_CMW500_TEST
  1162. static void cmd_testcmw500_enable(int argc, char **argv)
  1163. {
  1164. int i = 0;
  1165. u8 fix_rate = 0;
  1166. u8 txpower = 0;
  1167. u8 pwrtrack_en = 2;//default open, 0:disable 1:enable
  1168. DBG_INFO("start test for CMW500!\r\n");
  1169. if((1 != argc)&&(3 != argc)&&(5 != argc)&&(7 != argc)) {
  1170. DBG_INFO("Usage: open_test_cmw500 -r fixrate -t txpower -p pwrtrack_en[0/1]\r\n");
  1171. return;
  1172. }
  1173. for(i=1;i<argc;i++){
  1174. if(strcmp(argv[i], "-r") == 0){
  1175. fix_rate = atoi((const char *)argv[i+1]);
  1176. }
  1177. if(strcmp(argv[i], "-t") == 0){
  1178. txpower = atoi((const char *)argv[i+1]);
  1179. }
  1180. if(strcmp(argv[i], "-p") == 0){
  1181. pwrtrack_en = atoi((const char *)argv[i+1]);
  1182. }
  1183. }
  1184. wext_enable_testcmw500(WLAN0_NAME, fix_rate, txpower, pwrtrack_en);
  1185. }
  1186. static void cmd_testcmw500_disable(int argc, char **argv)
  1187. {
  1188. char* fix_rate = NULL;
  1189. DBG_INFO("stop test for CMW500!\r\n");
  1190. if(argc != 1) {
  1191. DBG_INFO("Usage: error");
  1192. return;
  1193. }
  1194. wext_disable_testcmw500(WLAN0_NAME);//modified
  1195. }
  1196. #endif
  1197. #if CONFIG_SET_PRIORITY
  1198. static void cmd_set_priority(int argc, char **argv)
  1199. {
  1200. int priority;
  1201. if(2 != argc) {
  1202. DBG_INFO("Usage: set_pri num\r\n");
  1203. return;
  1204. }
  1205. priority = atoi((const char *)argv[1]);
  1206. DBG_INFO("set_pri num = %d \r\n",priority);
  1207. rltk_wlan_set_priority(priority);
  1208. }
  1209. #endif
  1210. static void cmd_rawdata_enable(int argc, char **argv)
  1211. {
  1212. DBG_INFO("Enable the receive raw data!");
  1213. DBG_INFO("the callback function pointer is 0x%0x",frame_handler);
  1214. wext_enable_rawdata_recv(WLAN0_NAME, (void*)frame_handler);
  1215. }
  1216. static void cmd_rawdata_disable(int argc, char **argv)
  1217. {
  1218. DBG_INFO("Disable the receive raw data!");
  1219. wext_disable_rawdata_recv(WLAN0_NAME);
  1220. }
  1221. char Frame_buf[] = {0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0x4c, 0x87, 0x13, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0x0,0x0,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd};
  1222. static void cmd_rawdata_sendData(int argc, char **argv)
  1223. {
  1224. DBG_INFO("Send management frame and the length is %d!",sizeof(Frame_buf));
  1225. wext_send_rawdata(WLAN0_NAME,(const unsigned char*)Frame_buf, sizeof(Frame_buf));
  1226. }
  1227. typedef struct _cmd_entry {
  1228. char *command;
  1229. void (*function)(int, char **);
  1230. } cmd_entry;
  1231. static const cmd_entry cmd_table[] = {
  1232. #if CONFIG_WLAN
  1233. {"wifi_connect", cmd_wifi_connect},
  1234. {"wifi_connect_bssid", cmd_wifi_connect_bssid},
  1235. {"wifi_disconnect", cmd_wifi_disconnect},
  1236. {"wifi_info", cmd_wifi_info},
  1237. {"wifi_on", cmd_wifi_on},
  1238. {"wifi_off", cmd_wifi_off},
  1239. {"wifi_ap", cmd_wifi_ap},
  1240. {"wifi_scan", cmd_wifi_scan},
  1241. {"wifi_reoder_scan", cmd_wifi_reorder_scan},
  1242. #if SCAN_WITH_SSID
  1243. {"wifi_scan_with_ssid", cmd_wifi_scan_with_ssid},
  1244. {"wifi_scan_with_multissid", cmd_wifi_scan_with_multiple_ssid},
  1245. #endif
  1246. {"iwpriv", cmd_wifi_iwpriv},
  1247. {"wifi_promisc", cmd_promisc},
  1248. #if (CONFIG_INCLUDE_SIMPLE_CONFIG)
  1249. {"wifi_simple_config", cmd_simple_config},
  1250. #endif
  1251. #if CONFIG_WPS
  1252. #if CONFIG_ENABLE_WPS
  1253. {"wifi_wps", cmd_wps},
  1254. #endif
  1255. #if defined(CONFIG_ENABLE_WPS_AP) && CONFIG_ENABLE_WPS_AP
  1256. {"wifi_ap_wps", cmd_ap_wps},
  1257. #endif
  1258. #if CONFIG_ENABLE_P2P
  1259. {"wifi_p2p_start", cmd_wifi_p2p_start},
  1260. {"wifi_p2p_stop", cmd_wifi_p2p_stop},
  1261. {"p2p_find", cmd_p2p_find},
  1262. {"p2p_info", cmd_p2p_info},
  1263. {"p2p_disconnect", cmd_p2p_disconnect},
  1264. {"p2p_connect", cmd_p2p_connect},
  1265. #endif
  1266. #endif
  1267. #if CONFIG_CONCURRENT_MODE
  1268. {"wifi_sta_ap",cmd_wifi_sta_and_ap},
  1269. #endif
  1270. {"wifi_debug", cmd_debug},
  1271. #endif
  1272. #if CONFIG_LWIP_LAYER
  1273. // {"app", cmd_app},
  1274. #if CONFIG_BSD_TCP
  1275. {"tcp", cmd_tcp},
  1276. {"udp", cmd_udp},
  1277. #endif
  1278. {"ping", cmd_ping},
  1279. #endif
  1280. #if ( configGENERATE_RUN_TIME_STATS == 1 )
  1281. {"cpu", cmd_cpustat},
  1282. #endif
  1283. #if CONFIG_SUSPEND
  1284. {"wifi_suspend",cmd_suspend},
  1285. {"wifi_resume",cmd_resume},
  1286. #endif
  1287. {"rawdata_enable",cmd_rawdata_enable},
  1288. {"rawdata_disable",cmd_rawdata_disable},
  1289. {"rawdata_send",cmd_rawdata_sendData},
  1290. #ifdef CONFIG_CMW500_TEST
  1291. {"open_test_cmw500", cmd_testcmw500_enable},
  1292. {"close_test_cmw500", cmd_testcmw500_disable},
  1293. #endif
  1294. #if CONFIG_SET_PRIORITY
  1295. {"set_pri", cmd_set_priority},
  1296. #endif
  1297. {"exit", cmd_exit},
  1298. {"help", cmd_help}
  1299. };
  1300. #if CONFIG_INTERACTIVE_EXT
  1301. /* must include here, ext_cmd_table in wifi_interactive_ext.h uses struct cmd_entry */
  1302. #include <wifi_interactive_ext.h>
  1303. #endif
  1304. static void cmd_help(int argc, char **argv)
  1305. {
  1306. int i;
  1307. DBG_INFO("COMMAND LIST:");
  1308. DBG_INFO("==============================");
  1309. for(i = 0; i < sizeof(cmd_table) / sizeof(cmd_table[0]); i ++)
  1310. DBG_INFO(" %s", cmd_table[i].command);
  1311. #if CONFIG_INTERACTIVE_EXT
  1312. for(i = 0; i < sizeof(ext_cmd_table) / sizeof(ext_cmd_table[0]); i ++)
  1313. DBG_INFO(" %s", ext_cmd_table[i].command);
  1314. #endif
  1315. }
  1316. #define MAX_ARGC 10
  1317. static int parse_cmd(char *buf, char **argv)
  1318. {
  1319. int argc = 0;
  1320. memset(argv, 0, sizeof(argv)*MAX_ARGC);
  1321. while((argc < MAX_ARGC) && (*buf != '\0')) {
  1322. argv[argc] = buf;
  1323. argc ++;
  1324. buf ++;
  1325. while((*buf != ' ') && (*buf != '\0'))
  1326. buf ++;
  1327. while(*buf == ' ') {
  1328. *buf = '\0';
  1329. buf ++;
  1330. }
  1331. // Don't replace space
  1332. if(argc == 1){
  1333. if(strcmp(argv[0], "iwpriv") == 0){
  1334. if(*buf != '\0'){
  1335. argv[1] = buf;
  1336. argc ++;
  1337. }
  1338. break;
  1339. }
  1340. }
  1341. }
  1342. return argc;
  1343. }
  1344. char uart_buf[100];
  1345. void interactive_mode(void *param)
  1346. {
  1347. //int i, argc;
  1348. //char *argv[MAX_ARGC];
  1349. //char temp_uart_buf[100];
  1350. #if defined(CONFIG_PLATFOMR_CUSTOMER_RTOS)
  1351. //TODO
  1352. //Get content from uart
  1353. #else
  1354. extern xSemaphoreHandle uart_rx_interrupt_sema;
  1355. DBG_INFO("Enter INTERACTIVE MODE\n\r");
  1356. DBG_INFO("# ");
  1357. while(1){
  1358. while(rtw_down_sema((_sema *)&uart_rx_interrupt_sema) != _TRUE);
  1359. rtw_memcpy(temp_uart_buf,uart_buf,100);
  1360. if((argc = parse_cmd(temp_uart_buf, argv)) > 0) {
  1361. int found = 0;
  1362. for(i = 0; i < sizeof(cmd_table) / sizeof(cmd_table[0]); i ++) {
  1363. if(strcmp((const char *)argv[0], (const char *)(cmd_table[i].command)) == 0) {
  1364. cmd_table[i].function(argc, argv);
  1365. found = 1;
  1366. break;
  1367. }
  1368. }
  1369. #if CONFIG_INTERACTIVE_EXT
  1370. if(!found) {
  1371. for(i = 0; i < sizeof(ext_cmd_table) / sizeof(ext_cmd_table[0]); i ++) {
  1372. if(strcmp(argv[0], ext_cmd_table[i].command) == 0) {
  1373. ext_cmd_table[i].function(argc, argv);
  1374. found = 1;
  1375. break;
  1376. }
  1377. }
  1378. }
  1379. #endif
  1380. if(!found)
  1381. DBG_INFO("unknown command '%s'", argv[0]);
  1382. DBG_INFO("[MEM] After do cmd, available heap %d\n\r", xPortGetFreeHeapSize());
  1383. }
  1384. printk("\r\n\n# ");
  1385. uart_buf[0] = '\0';
  1386. temp_uart_buf[0] = '\0';
  1387. }
  1388. #endif
  1389. }
  1390. void start_interactive_mode(void)
  1391. {
  1392. #ifdef SERIAL_DEBUG_RX
  1393. struct task_struct interactive_mode_task;
  1394. interactive_mode_task.task = NULL;
  1395. //if(xTaskCreate(interactive_mode, (char const *)"interactive_mode", STACKSIZE, NULL, tskIDLE_PRIORITY + 4, NULL) != pdPASS)
  1396. if(rtw_create_task(&interactive_mode_task, (char const *)"interactive_mode", STACKSIZE, tskIDLE_PRIORITY + 5, interactive_mode, NULL) != pdPASS)
  1397. DBG_INFO("%s xTaskCreate failed", __FUNCTION__);
  1398. #else
  1399. DBG_INFO("ERROR: No SERIAL_DEBUG_RX to support interactive mode!");
  1400. #endif
  1401. }
  1402. void cmd_test(const char* temp_uart_buf)
  1403. {
  1404. int i, argc;
  1405. char *argv[MAX_ARGC];
  1406. //char temp_uart_buf[100] = "wifi_info";
  1407. if((argc = parse_cmd((char *)temp_uart_buf, argv)) > 0) {
  1408. int found = 0;
  1409. for(i = 0; i < sizeof(cmd_table) / sizeof(cmd_table[0]); i ++) {
  1410. if(strcmp((const char *)argv[0], (const char *)(cmd_table[i].command)) == 0) {
  1411. cmd_table[i].function(argc, argv);
  1412. found = 1;
  1413. break;
  1414. }
  1415. }
  1416. if(!found)
  1417. DBG_INFO("unknown command '%s'", argv[0]);
  1418. DBG_INFO("[MEM] After do cmd, available heap %d\n\r", xPortGetFreeHeapSize());
  1419. }
  1420. }