1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "at_wifi.h"
16
17 #include <stdio.h>
18 #include <stdlib.h>
19
20 #include <hi_at.h>
21
22 #ifndef CONFIG_FACTORY_TEST_MODE
23 #include "lwip/netifapi.h"
24 #endif
25 #include "hi_early_debug.h"
26 #include "hi_stdlib.h"
27 #include "hi_wifi_api.h"
28 #include "hi_wifi_mfg_test_if.h"
29 #ifdef LOSCFG_APP_MESH
30 #include "hi_wifi_mesh_api.h"
31 #include "hi_mesh_autolink_api.h"
32 #endif
33
34 #include "at.h"
35 #ifndef CONFIG_FACTORY_TEST_MODE
36 #include "lwip/netifapi.h"
37 #include "lwip/dns.h"
38 #endif
39 #include "hi_wifi_mfg_test_if.h"
40 #include "at_demo_hks.h"
41 #include "at_general.h"
42
43 #ifdef __cplusplus
44 #if __cplusplus
45 extern "C" {
46 #endif
47 #endif
48
49 hi_wifi_bw g_bw_setup_value = HI_WIFI_BW_LEGACY_20M;
50 #ifdef _PRE_PSK_CALC_USER
51 unsigned char g_psk_calc[HI_WIFI_STA_PSK_LEN] = {0};
52 #endif
53 hi_wifi_sta_psk_config g_set_psk_config = {
54 .ssid = {0},
55 .key = {0}
56 };
57
ssid_prefix_scan(hi_s32 argc,const hi_char * argv[],hi_u32 prefix_flag)58 hi_u32 ssid_prefix_scan(hi_s32 argc, const hi_char *argv[], hi_u32 prefix_flag)
59 {
60 hi_s32 ret;
61 errno_t rc;
62 char *tmp = HI_NULL;
63 size_t ssid_len = 0;
64 hi_wifi_scan_params scan_params = {0};
65
66 if ((argc != 1) || (at_param_null_check(argc, argv) == HI_ERR_FAILURE)) {
67 return HI_ERR_FAILURE;
68 }
69
70 /* get ssid */
71 if (argv[0][0] == 'P') {
72 if (strlen(argv[0]) > HI_WIFI_MAX_SSID_LEN * 4 + 3) { /* ssid length should less than 32*4+3 */
73 return HI_ERR_FAILURE;
74 }
75 } else {
76 if (strlen(argv[0]) > HI_WIFI_MAX_SSID_LEN + 2) { /* ssid length should less than 32+2 */
77 return HI_ERR_FAILURE;
78 }
79 }
80 /* ssid hex to string */
81 tmp = at_parse_string(argv[0], &ssid_len);
82 scan_params.ssid_len = (unsigned char)ssid_len;
83 if (tmp == HI_NULL) {
84 return HI_ERR_FAILURE;
85 }
86 if ((scan_params.ssid_len > HI_WIFI_MAX_SSID_LEN) || (scan_params.ssid_len == 0)) {
87 at_free(tmp);
88 return HI_ERR_FAILURE;
89 }
90 rc = memcpy_s(scan_params.ssid, HI_WIFI_MAX_SSID_LEN + 1, tmp, strlen(tmp) + 1);
91 at_free(tmp);
92 if (rc != EOK) {
93 return HI_ERR_FAILURE;
94 }
95
96 scan_params.ssid[scan_params.ssid_len] = '\0';
97
98 scan_params.scan_type = (prefix_flag == 1) ? HI_WIFI_SSID_PREFIX_SCAN : HI_WIFI_SSID_SCAN;
99
100 ret = hi_wifi_sta_advance_scan(&scan_params);
101 if (ret != HISI_OK) {
102 return HI_ERR_FAILURE;
103 }
104
105 hi_at_printf("OK\r\n");
106 return HI_ERR_SUCCESS;
107 }
108
109
110 /*****************************************************************************
111 * Func description: wpa ssid scan
112 *****************************************************************************/
cmd_wpa_ssid_scan(hi_s32 argc,const hi_char * argv[])113 hi_u32 cmd_wpa_ssid_scan(hi_s32 argc, const hi_char *argv[])
114 {
115 hi_u32 ret = ssid_prefix_scan(argc, argv, 0);
116 return ret;
117 }
118
119 /*****************************************************************************
120 * Func description: wpa channel scan
121 *****************************************************************************/
cmd_wpa_channel_scan(hi_s32 argc,const hi_char * argv[])122 hi_u32 cmd_wpa_channel_scan(hi_s32 argc, const hi_char *argv[])
123 {
124 hi_s32 ret;
125 hi_wifi_scan_params scan_params = {0};
126
127 if ((argc != 1) || (integer_check(argv[0]) != HI_ERR_SUCCESS)) {
128 return HI_ERR_FAILURE;
129 }
130
131 scan_params.channel = (hi_uchar)atoi(argv[0]);
132 if ((scan_params.channel < 1) || (scan_params.channel > 14)) { /* 信道范围1~14 */
133 return HI_ERR_FAILURE;
134 }
135 scan_params.scan_type = HI_WIFI_CHANNEL_SCAN;
136 ret = hi_wifi_sta_advance_scan(&scan_params);
137 if (ret != HISI_OK) {
138 return HI_ERR_FAILURE;
139 }
140
141 hi_at_printf("OK\r\n");
142 return HI_ERR_SUCCESS;
143 }
144
145 /*****************************************************************************
146 * Func description: wpa scan
147 *****************************************************************************/
cmd_wpa_scan(hi_s32 argc,const hi_char * argv[])148 hi_u32 cmd_wpa_scan(hi_s32 argc, const hi_char *argv[])
149 {
150 hi_s32 ret;
151
152 hi_unref_param(argc);
153 hi_unref_param(argv);
154
155 ret = hi_wifi_sta_scan();
156 if (ret != HISI_OK) {
157 return HI_ERR_FAILURE;
158 }
159
160 hi_at_printf("OK\r\n");
161 return HI_ERR_SUCCESS;
162 }
163
164 /*****************************************************************************
165 * Func description: ssid prefix scan
166 * example: AT+SCANPRSSID="hisi"
167 *****************************************************************************/
cmd_ssid_prefix_scan(hi_s32 argc,const hi_char * argv[])168 hi_u32 cmd_ssid_prefix_scan(hi_s32 argc, const hi_char *argv[])
169 {
170 hi_u32 ret = ssid_prefix_scan(argc, argv, 1);
171 return ret;
172 }
173
at_check_ccharacter(const hi_char * tmp)174 hi_u32 at_check_ccharacter(const hi_char *tmp)
175 {
176 if (tmp == HI_NULL) {
177 return HI_ERR_FAILURE;
178 }
179 for (; *tmp != '\0'; tmp++) {
180 if (*tmp == '\\') {
181 if (*(tmp + 1) == '\\') {
182 tmp++;
183 continue;
184 } else if (*(tmp + 1) == 'x') {
185 return HI_ERR_SUCCESS;
186 }
187 }
188 }
189 return HI_ERR_FAILURE;
190 }
191
192 /*****************************************************************************
193 * Func description: wpa get scan results
194 *****************************************************************************/
cmd_wpa_scan_results(hi_s32 argc,const hi_char * argv[])195 hi_u32 cmd_wpa_scan_results(hi_s32 argc, const hi_char *argv[])
196 {
197 hi_u32 num = WIFI_SCAN_AP_LIMIT;
198 hi_char ssid_str[HI_WIFI_MAX_SSID_LEN * 4 + 3]; /* ssid length should less 32*4+3 */
199
200 hi_unref_param(argv);
201 hi_unref_param(argc);
202
203 hi_wifi_ap_info *results = malloc(sizeof(hi_wifi_ap_info) * WIFI_SCAN_AP_LIMIT);
204 if (results == HI_NULL) {
205 return HI_ERR_FAILURE;
206 }
207
208 memset_s(results, sizeof(hi_wifi_ap_info) * WIFI_SCAN_AP_LIMIT, 0, sizeof(hi_wifi_ap_info) * WIFI_SCAN_AP_LIMIT);
209
210 hi_s32 ret = hi_wifi_sta_scan_results(results, &num);
211 if (ret != HISI_OK) {
212 free(results);
213 return HI_ERR_FAILURE;
214 }
215
216 for (hi_u32 ul_loop = 0; (ul_loop < num) && (ul_loop < WIFI_SCAN_AP_LIMIT); ul_loop++) {
217 if ((results[ul_loop].auth < HI_WIFI_SECURITY_OPEN) || (results[ul_loop].auth > HI_WIFI_SECURITY_UNKNOWN)) {
218 results[ul_loop].auth = HI_WIFI_SECURITY_UNKNOWN;
219 }
220
221 hi_u32 service_flag = 0;
222 if (results[ul_loop].wps_flag) {
223 service_flag = 1;
224 } else if (results[ul_loop].hisi_mesh_flag) {
225 service_flag = 2; /* 2:Mesh scenario.CNcomment:Mesh场景 */
226 }
227
228 size_t ssid_len = strlen(results[ul_loop].ssid);
229 const char* tmp = at_ssid_txt((unsigned char*)results[ul_loop].ssid, ssid_len);
230 if (at_check_ccharacter(tmp) == HI_ERR_SUCCESS) {
231 ret = sprintf_s(ssid_str, HI_WIFI_MAX_SSID_LEN * 4 + 3, "P\"%s\"", tmp); /* ssid len should less 32*4+3 */
232 } else {
233 ret = sprintf_s(ssid_str, HI_WIFI_MAX_SSID_LEN * 4 + 3, "%s", results[ul_loop].ssid); /* less 32*4+3 */
234 }
235 if (ret < 0) {
236 free(results);
237 return HI_ERR_FAILURE;
238 }
239
240 if (service_flag != 0) {
241 hi_at_printf("+SCANRESULT:%s,"AT_MACSTR",%d,%d,%d,%d\r\n", ssid_str, at_mac2str(results[ul_loop].bssid),
242 results[ul_loop].channel, results[ul_loop].rssi / 100, results[ul_loop].auth, service_flag);
243 } else {
244 hi_at_printf("+SCANRESULT:%s,"AT_MACSTR",%d,%d,%d\r\n", ssid_str, at_mac2str(results[ul_loop].bssid),
245 results[ul_loop].channel, results[ul_loop].rssi / 100, results[ul_loop].auth);
246 }
247 }
248
249 free(results);
250
251 hi_at_printf("OK\r\n");
252 return HI_ERR_SUCCESS;
253 }
254
255 /*****************************************************************************
256 * Func description: start sta
257 *****************************************************************************/
cmd_sta_start(hi_s32 argc,const hi_char * argv[])258 hi_u32 cmd_sta_start(hi_s32 argc, const hi_char *argv[])
259 {
260 hi_unref_param(argv);
261 hi_unref_param(argc);
262 #ifndef CONFIG_FACTORY_TEST_MODE
263 hi_s32 ret;
264 hi_char ifname[WIFI_IFNAME_MAX_SIZE + 1] = {0};
265 hi_s32 len = sizeof(ifname);
266
267 ret = hi_wifi_sta_start(ifname, &len);
268 if (ret != HISI_OK) {
269 return HI_ERR_FAILURE;
270 }
271 #else
272 if (wal_add_cfg_vap() != HI_ERR_SUCCESS) {
273 return HI_ERR_FAILURE;
274 }
275 #endif
276 hi_at_printf("OK\r\n");
277 return HI_ERR_SUCCESS;
278 }
279
sta_start_adv_param(hi_s32 argc,const hi_char * argv[],hi_wifi_bw * bw)280 hi_u32 sta_start_adv_param(hi_s32 argc, const hi_char *argv[], hi_wifi_bw *bw)
281 {
282 hi_s32 ret, value, i;
283 for (i = 0; i < argc; i++) {
284 if ((argv[i] != HI_NULL) && (integer_check(argv[i]) != HI_ERR_SUCCESS)) {
285 return HI_ERR_FAILURE;
286 }
287 switch (i) {
288 case 0: /* case 0: Protocol Type */
289 value = (argv[i] != HI_NULL) ? atoi(argv[i]) : HI_WIFI_PHY_MODE_11BGN;
290 if ((value == HI_WIFI_PHY_MODE_11B) && (argv[1] != HI_NULL) && (strcmp(argv[1], "20"))) { /* 20:bw */
291 return HI_ERR_FAILURE;
292 }
293 #ifndef CONFIG_FACTORY_TEST_MODE
294 ret = hi_wifi_sta_set_protocol_mode((hi_wifi_protocol_mode)value);
295 #endif
296 break;
297 case 1: /* case 1: Bandwidth */
298 if ((argv[i] == HI_NULL) || !(strcmp(argv[i], "20"))) { /* bw 20M */
299 *bw = HI_WIFI_BW_LEGACY_20M;
300 } else if (!(strcmp(argv[i], "10"))) { /* bw 10M */
301 *bw = HI_WIFI_BW_HIEX_10M;
302 } else if (!(strcmp(argv[i], "5"))) { /* bw 5M */
303 *bw = HI_WIFI_BW_HIEX_5M;
304 } else {
305 return HI_ERR_FAILURE;
306 }
307 ret = HISI_OK;
308 break;
309 case 2: /* case 2: pmf */
310 #ifndef CONFIG_FACTORY_TEST_MODE
311 value = (argv[i] != HI_NULL) ? atoi(argv[i]) : HI_WIFI_MGMT_FRAME_PROTECTION_OPTIONAL;
312 ret = hi_wifi_set_pmf((hi_wifi_pmf_options)value);
313 #endif
314 break;
315 default:
316 return HI_ERR_FAILURE;
317 }
318 #ifndef CONFIG_FACTORY_TEST_MODE
319 if (ret != HISI_OK) {
320 return HI_ERR_FAILURE;
321 }
322 #endif
323 }
324 hi_unref_param(ret);
325 return HI_ERR_SUCCESS;
326 }
327
cmd_sta_start_adv(hi_s32 argc,const hi_char * argv[])328 hi_u32 cmd_sta_start_adv(hi_s32 argc, const hi_char *argv[])
329 {
330 hi_s32 ret;
331 hi_wifi_bw bw = HI_WIFI_BW_LEGACY_20M;
332
333 if (argc != 3) { /* "+STARTSTA" command fix 3 parameters */
334 return HI_ERR_FAILURE;
335 }
336
337 ret = (hi_s32)sta_start_adv_param(argc, argv, &bw);
338 if (ret != HI_ERR_SUCCESS) {
339 return HI_ERR_FAILURE;
340 }
341 #ifndef CONFIG_FACTORY_TEST_MODE
342 hi_char ifname[WIFI_IFNAME_MAX_SIZE + 1] = {0};
343 hi_s32 len = sizeof(ifname);
344 ret = hi_wifi_sta_start(ifname, &len);
345 if (ret != HISI_OK) {
346 return HI_ERR_FAILURE;
347 }
348 #endif
349 ret = hi_wifi_set_bandwidth(DEFAULT_IFNAME_STA, strlen(DEFAULT_IFNAME_STA) + 1, bw);
350 if (ret != HI_ERR_SUCCESS) {
351 #ifndef CONFIG_FACTORY_TEST_MODE
352 hi_wifi_sta_stop();
353 #endif
354 return HI_ERR_FAILURE;
355 }
356
357 hi_at_printf("OK\r\n");
358 return HI_ERR_SUCCESS;
359 }
360
361 /*****************************************************************************
362 * Func description: stop station
363 *****************************************************************************/
cmd_sta_stop(hi_s32 argc,const hi_char * argv[])364 hi_u32 cmd_sta_stop(hi_s32 argc, const hi_char *argv[])
365 {
366 hi_unref_param(argv);
367 hi_unref_param(argc);
368 #ifndef CONFIG_FACTORY_TEST_MODE
369 hi_s32 ret = hi_wifi_sta_stop();
370 if (ret != HISI_OK) {
371 return HI_ERR_FAILURE;
372 }
373
374 for (int index = 0; index < DNS_MAX_SERVERS; index++) {
375 lwip_dns_setserver(index, HI_NULL);
376 }
377 #endif
378 hi_at_printf("OK\r\n");
379 return HI_ERR_SUCCESS;
380 }
381
cmd_sta_connect_get_ssid(const hi_char * argv[],hi_wifi_assoc_request * assoc_req,hi_wifi_fast_assoc_request * fast_assoc_req,hi_u32 fast_flag)382 hi_u32 cmd_sta_connect_get_ssid(const hi_char *argv[], hi_wifi_assoc_request *assoc_req,
383 hi_wifi_fast_assoc_request *fast_assoc_req, hi_u32 fast_flag)
384 {
385 size_t ssid_len = 0;
386 errno_t rc;
387
388 if (argv[0][0] == 'P') {
389 if (strlen(argv[0]) > HI_WIFI_MAX_SSID_LEN * 4 + 3) { /* ssid length should less than 32*4+3 */
390 return HI_ERR_FAILURE;
391 }
392 } else {
393 if (strlen(argv[0]) > HI_WIFI_MAX_SSID_LEN + 2) { /* ssid length should less than 32+2 */
394 return HI_ERR_FAILURE;
395 }
396 }
397
398 /* ssid hex to string */
399 hi_char *tmp = at_parse_string(argv[0], &ssid_len);
400 if (tmp == HI_NULL) {
401 return HI_ERR_FAILURE;
402 }
403 if ((ssid_len > HI_WIFI_MAX_SSID_LEN) || (ssid_len == 0)) {
404 at_free(tmp);
405 return HI_ERR_FAILURE;
406 }
407
408 if ((fast_flag == 0) && (assoc_req != HI_NULL)) {
409 rc = memcpy_s(assoc_req->ssid, HI_WIFI_MAX_SSID_LEN + 1, tmp, strlen(tmp) + 1);
410 at_free(tmp);
411 if (rc != EOK) {
412 return HI_ERR_FAILURE;
413 }
414 } else if ((fast_flag == 1) && (fast_assoc_req != HI_NULL)) {
415 rc = memcpy_s(fast_assoc_req->req.ssid, HI_WIFI_MAX_SSID_LEN + 1, tmp, strlen(tmp) + 1);
416 at_free(tmp);
417 if (rc != EOK) {
418 return HI_ERR_FAILURE;
419 }
420 } else {
421 at_free(tmp);
422 }
423 return HI_ERR_SUCCESS;
424 }
425
cmd_sta_connect_get_key(hi_s32 argc,const hi_char * argv[],hi_wifi_fast_assoc_request * fast_assoc_req)426 hi_u32 cmd_sta_connect_get_key(hi_s32 argc, const hi_char *argv[], hi_wifi_fast_assoc_request *fast_assoc_req)
427 {
428 if ((fast_assoc_req->req.auth != HI_WIFI_SECURITY_OPEN) && (argc == 5)) { /* 5 parameters */
429 if (argv[4] == HI_NULL) { /* 4:key */
430 return HI_ERR_FAILURE;
431 }
432 const hi_char *buf = argv[4]; /* 4:key */
433
434 size_t len = strlen(argv[4]); /* 4:key */
435 if ((atoi(argv[3]) == HI_WIFI_SECURITY_WEP) && (len != 9) && (len != 17) && /* 3:encrypt type, 9 17:len */
436 (len != 12) && (len != 28)) { /* 12 28: password len */
437 return HI_ERR_FAILURE;
438 } else if ((atoi(argv[3]) != HI_WIFI_SECURITY_WEP) && ((len > HI_WIFI_AP_KEY_LEN_MAX + 2) || /* argc 3,2 */
439 (len < HI_WIFI_AP_KEY_LEN_MIN + 2))) { /* len plus 2 */
440 return HI_ERR_FAILURE;
441 }
442 if ((buf == HI_NULL) || (*buf != '\"') || (*(buf + strlen(argv[4]) - 1) != '\"') || /* 4 */
443 (memcpy_s(fast_assoc_req->req.key, HI_WIFI_MAX_KEY_LEN + 1, buf + 1, strlen(argv[4]) - 2) /* 4 2 */
444 != EOK)) {
445 return HI_ERR_FAILURE;
446 }
447 }
448 fast_assoc_req->psk_flag = HI_WIFI_WPA_PSK_NOT_USE;
449
450 return HI_ERR_SUCCESS;
451 }
452
parse_conn_para(hi_s32 argc,const hi_char * argv[],hi_wifi_assoc_request * assoc_req)453 hi_u32 parse_conn_para(hi_s32 argc, const hi_char *argv[], hi_wifi_assoc_request *assoc_req)
454 {
455 if ((argc < 3) || (argc > 4)) { /* The number of "+CONN" command parameters should be 3 or 4 */
456 return HI_ERR_FAILURE;
457 }
458
459 /* get ssid */
460 if ((argv[0] != HI_NULL) && (cmd_sta_connect_get_ssid(argv, assoc_req, HI_NULL, 0) != HI_ERR_SUCCESS)) {
461 return HI_ERR_FAILURE;
462 }
463
464 /* get bssid */
465 if (argv[1] == HI_NULL) {
466 memset_s(assoc_req->bssid, sizeof(assoc_req->bssid), 0, sizeof(assoc_req->bssid));
467 } else if (strlen(argv[1]) == HI_WIFI_TXT_ADDR_LEN) {
468 if (cmd_strtoaddr(argv[1], assoc_req->bssid, HI_WIFI_MAC_LEN) != HISI_OK) {
469 return HI_ERR_FAILURE;
470 }
471 } else {
472 return HI_ERR_FAILURE;
473 }
474
475 /* get auth_type */
476 if ((integer_check(argv[2]) != HI_ERR_SUCCESS) || (atoi(argv[2]) < HI_WIFI_SECURITY_OPEN) || /* 2 */
477 (atoi(argv[2]) > HI_WIFI_SECURITY_WPAPSK_WPA2PSK_MIX) || ((atoi(argv[2]) == HI_WIFI_SECURITY_OPEN) && /* 2 */
478 (argc != 3)) || ((atoi(argv[2]) != HI_WIFI_SECURITY_OPEN) && (argc != 4))) { /* argc 3/2/4 */
479 return HI_ERR_FAILURE;
480 }
481 assoc_req->auth = (hi_wifi_auth_mode)atoi(argv[2]); /* 2 */
482
483 /* The encipher mode is set to 0 by default, that is, HI_WIFI_PARIWISE_UNKNOWN.
484 CNcomment:encipher mode 默认设置为0,即HI_WIFI_PARIWISE_UNKNOWN */
485 assoc_req->pairwise = HI_WIFI_PARIWISE_UNKNOWN;
486
487 /* get key */
488 if (argc == 4) { /* 4 parameters */
489 const hi_char *buf = argv[3]; /* 3:The fourth parameter */
490 if (buf == HI_NULL) {
491 return HI_ERR_FAILURE;
492 }
493 size_t len = strlen(argv[3]); /* 3:key */
494 if ((atoi(argv[2]) == HI_WIFI_SECURITY_WEP) && (len != 9) && (len != 17) && /* argc 2, len 9/17 */
495 (len != 12) && (len != 28)) { /* len 12/28 */
496 return HI_ERR_FAILURE;
497 } else if ((atoi(argv[2]) != HI_WIFI_SECURITY_WEP) && ((len > HI_WIFI_AP_KEY_LEN_MAX + 2) || /* argc 2 */
498 (len < HI_WIFI_AP_KEY_LEN_MIN + 2))) { /* len plus 2 */
499 return HI_ERR_FAILURE;
500 }
501 if ((*buf != '\"') || (*(buf + strlen(argv[3]) - 1) != '\"') || /* argc 3 */
502 (memcpy_s(assoc_req->key, HI_WIFI_MAX_KEY_LEN + 1, buf + 1, strlen(argv[3]) - 2) != EOK)) { /* 3 2 */
503 return HI_ERR_FAILURE;
504 }
505 }
506
507 return HI_ERR_SUCCESS;
508 }
509
510 /*****************************************************************************
511 * Func description: station connect network
512 * example: AT+CONN="hisilicon",,3,"123456789"
513 *****************************************************************************/
cmd_sta_secure_connect(hi_s32 argc,const hi_char * argv[])514 hi_u32 cmd_sta_secure_connect(hi_s32 argc, const hi_char *argv[])
515 {
516 hi_wifi_assoc_request assoc_req = {0};
517
518 if (parse_conn_para(argc, argv, &assoc_req) != HI_ERR_SUCCESS) {
519 return HI_ERR_FAILURE;
520 }
521
522 if (hi_wifi_sta_connect(&assoc_req) != HISI_OK) {
523 return HI_ERR_FAILURE;
524 }
525
526 hi_u32 ret = app_hks_encrypt_conn_para(&assoc_req);
527 if (ret != HI_ERR_SUCCESS) {
528 hi_at_printf("save enc conn param fail:0x%x\r\n", ret);
529 return HI_ERR_FAILURE;
530 }
531
532 hi_at_printf("OK\r\n");
533 return HI_ERR_SUCCESS;
534 }
535
cmd_sta_secure_re_connect(hi_s32 argc,const hi_char * argv[])536 hi_u32 cmd_sta_secure_re_connect(hi_s32 argc, const hi_char *argv[])
537 {
538 hi_unref_param(argc);
539 hi_unref_param(argv);
540
541 hi_wifi_assoc_request assoc_req = {0};
542
543 hi_u32 ret = app_hks_decrypt_conn_param(&assoc_req);
544 if (ret != HI_ERR_SUCCESS) {
545 hi_at_printf("get reconn param fail:0x%x\r\n", ret);
546 return HI_ERR_FAILURE;
547 }
548 hi_at_printf("get reconn param ok\r\n");
549
550 if (hi_wifi_sta_connect(&assoc_req) != HISI_OK) {
551 return HI_ERR_FAILURE;
552 }
553
554 hi_at_printf("OK\r\n");
555 return HI_ERR_SUCCESS;
556 }
557
cmd_generate_save_conn_key(hi_s32 argc,const hi_char * argv[])558 hi_u32 cmd_generate_save_conn_key(hi_s32 argc, const hi_char *argv[])
559 {
560 hi_unref_param(argc);
561 hi_unref_param(argv);
562
563 hi_u32 ret = app_hks_generate_conn_key();
564 if (ret != HI_ERR_SUCCESS) {
565 hi_at_printf("generate conn key fail:0x%x\r\n", ret);
566 return HI_ERR_FAILURE;
567 }
568
569 hi_at_printf("generate conn key ok\r\n");
570 hi_at_printf("OK\r\n");
571 return HI_ERR_SUCCESS;
572 }
573
cmd_generate_save_cert_key(hi_s32 argc,const hi_char * argv[])574 hi_u32 cmd_generate_save_cert_key(hi_s32 argc, const hi_char *argv[])
575 {
576 hi_unref_param(argc);
577 hi_unref_param(argv);
578
579 hi_u32 ret = app_hks_generate_cert_key();
580 if (ret != HI_ERR_SUCCESS) {
581 hi_at_printf("generate cert key fail\r\n");
582 return HI_ERR_FAILURE;
583 }
584
585 hi_at_printf("generate cert key ok\r\n");
586 hi_at_printf("OK\r\n");
587 return HI_ERR_SUCCESS;
588 }
589
cmd_encrypt_cert(hi_s32 argc,const hi_char * argv[])590 hi_u32 cmd_encrypt_cert(hi_s32 argc, const hi_char *argv[])
591 {
592 hi_unref_param(argc);
593 hi_unref_param(argv);
594
595 hi_u32 ret = app_hks_encrypt_cert();
596 if (ret != HI_ERR_SUCCESS) {
597 hi_at_printf("encrpyt cert fail\r\n");
598 return HI_ERR_FAILURE;
599 }
600 hi_at_printf("encrpyt cert success\r\n");
601
602 hi_at_printf("OK\r\n");
603 return HI_ERR_SUCCESS;
604 }
605
606 #define CERT_PLAIN_SIZE (1024*8)
607
cmd_decrypt_cert(hi_s32 argc,const hi_char * argv[])608 hi_u32 cmd_decrypt_cert(hi_s32 argc, const hi_char *argv[])
609 {
610 hi_unref_param(argc);
611 hi_unref_param(argv);
612
613 hi_u32 plain_size = CERT_PLAIN_SIZE;
614 hi_u8 *plain_data = malloc(plain_size);
615 if (plain_data == HI_NULL) {
616 hi_at_printf("plain data malloc fail\r\n");
617 return HI_ERR_FAILURE;
618 }
619
620 hi_u32 ret = app_hks_decrypt_cert(&plain_size, plain_data);
621 if (ret != HI_ERR_SUCCESS) {
622 free(plain_data);
623 hi_at_printf("decrpyt cert fail:0x%x\r\n", ret);
624 return HI_ERR_FAILURE;
625 }
626
627 hi_at_printf("decrpyt cert success, plain_size:%d\r\n", plain_size);
628 hi_u32 print_size = 0x40;
629 if (plain_size < print_size) {
630 print_size = plain_size;
631 }
632 for (hi_u32 i = 1; i <= print_size; i++) {
633 hi_at_printf("0x%x ", plain_data[i - 1]);
634 if (i % 0x4 == 0) {
635 hi_at_printf("\r\n");
636 }
637 }
638
639 free(plain_data);
640
641 hi_at_printf("OK\r\n");
642 return HI_ERR_SUCCESS;
643 }
644
645 /*****************************************************************************
646 * Func description: station connect network
647 * example: AT+CONN="hisilicon",,3,"123456789"
648 *****************************************************************************/
cmd_sta_connect(hi_s32 argc,const hi_char * argv[])649 hi_u32 cmd_sta_connect(hi_s32 argc, const hi_char *argv[])
650 {
651 hi_wifi_assoc_request assoc_req = {0};
652
653 if ((argc < 3) || (argc > 4)) { /* argc 3/4 */
654 return HI_ERR_FAILURE;
655 }
656
657 /* get ssid */
658 if ((argv[0] != HI_NULL) && (cmd_sta_connect_get_ssid(argv, &assoc_req, HI_NULL, 0) != HI_ERR_SUCCESS)) {
659 return HI_ERR_FAILURE;
660 }
661
662 /* get bssid */
663 if (argv[1] == HI_NULL) {
664 memset_s(assoc_req.bssid, sizeof(assoc_req.bssid), 0, sizeof(assoc_req.bssid));
665 } else if (strlen(argv[1]) == HI_WIFI_TXT_ADDR_LEN) {
666 if (cmd_strtoaddr(argv[1], assoc_req.bssid, HI_WIFI_MAC_LEN) != HISI_OK) {
667 return HI_ERR_FAILURE;
668 }
669 } else {
670 return HI_ERR_FAILURE;
671 }
672
673 /* get auth_type */
674 if ((integer_check(argv[2]) != HI_ERR_SUCCESS) || (atoi(argv[2]) < HI_WIFI_SECURITY_OPEN) || /* argc 2 */
675 (atoi(argv[2]) == HI_WIFI_SECURITY_WPA) || (atoi(argv[2]) == HI_WIFI_SECURITY_WPA2) || /* argc 2 */
676 (atoi(argv[2]) == HI_WIFI_SECURITY_WPAPSK) || (atoi(argv[2]) >= HI_WIFI_SECURITY_UNKNOWN) || /* argc 2 */
677 ((atoi(argv[2]) == HI_WIFI_SECURITY_OPEN) && (argc != 3)) || /* argc 2/3/4 */
678 ((atoi(argv[2]) != HI_WIFI_SECURITY_OPEN) && (argc != 4))) { /* argc 2/3/4 */
679 return HI_ERR_FAILURE;
680 }
681 assoc_req.auth = (hi_wifi_auth_mode)atoi(argv[2]); /* 2 */
682
683 assoc_req.pairwise = HI_WIFI_PARIWISE_UNKNOWN;
684
685 /* get key */
686 if (argc == 4) { /* argc 4 */
687 const hi_char *buf = argv[3]; /* argc 3 */
688 if (buf == HI_NULL) {
689 return HI_ERR_FAILURE;
690 }
691 size_t len = strlen(argv[3]); /* 3:key */
692 if ((atoi(argv[2]) == HI_WIFI_SECURITY_WEP) && (len != 9) && (len != 17) && /* argc 2, len 9/17 */
693 (len != 12) && (len != 28)) { /* 12 28: password len */
694 return HI_ERR_FAILURE;
695 } else if ((atoi(argv[2]) != HI_WIFI_SECURITY_WEP) && ((len > HI_WIFI_AP_KEY_LEN_MAX + 2) || /* argc 2 */
696 (len < HI_WIFI_AP_KEY_LEN_MIN + 2))) { /* len plus 2 */
697 return HI_ERR_FAILURE;
698 }
699 if ((*buf != '\"') || (*(buf + strlen(argv[3]) - 1) != '\"') || /* argc 3 */
700 (memcpy_s(assoc_req.key, HI_WIFI_MAX_KEY_LEN + 1, buf + 1, strlen(argv[3]) - 2) != EOK)) { /* 3 2 */
701 return HI_ERR_FAILURE;
702 }
703 }
704
705 if (hi_wifi_sta_connect(&assoc_req) != HISI_OK) {
706 return HI_ERR_FAILURE;
707 }
708
709 hi_at_printf("OK\r\n");
710 return HI_ERR_SUCCESS;
711 }
712
713 /*****************************************************************************
714 * Func description: station quick connect
715 * example: AT+FCONN="hisilicon",,6,2,"123456789"
716 AT+FCONN=,90:2B:D2:E4:CE:28,6,2,"123456789"
717 *****************************************************************************/
cmd_sta_quick_connect(hi_s32 argc,const hi_char * argv[])718 hi_u32 cmd_sta_quick_connect(hi_s32 argc, const hi_char *argv[])
719 {
720 hi_wifi_fast_assoc_request fast_assoc_req = {0};
721 hi_u32 ret;
722
723 if ((argc < 4) || (argc > 5)) { /* argc 4 / 5 */
724 return HI_ERR_FAILURE;
725 }
726
727 /* get ssid */
728 if (argv[0] != HI_NULL) {
729 ret = cmd_sta_connect_get_ssid(argv, HI_NULL, &fast_assoc_req, 1);
730 if (ret != HI_ERR_SUCCESS) {
731 return HI_ERR_FAILURE;
732 }
733 }
734
735 /* get bssid */
736 if (argv[1] == HI_NULL) {
737 memset_s(fast_assoc_req.req.bssid, sizeof(fast_assoc_req.req.bssid), 0, sizeof(fast_assoc_req.req.bssid));
738 } else if (strlen(argv[1]) == HI_WIFI_TXT_ADDR_LEN) {
739 if (cmd_strtoaddr(argv[1], fast_assoc_req.req.bssid, HI_WIFI_MAC_LEN) != HISI_OK) {
740 return HI_ERR_FAILURE;
741 }
742 } else {
743 return HI_ERR_FAILURE;
744 }
745
746 /* get channel,Scope1~14 */
747 if ((integer_check(argv[2]) != HI_ERR_SUCCESS) || (atoi(argv[2]) <= 0) || (atoi(argv[2]) > 14)) { /* 2 14 */
748 return HI_ERR_FAILURE;
749 }
750 fast_assoc_req.channel = (hi_uchar)atoi(argv[2]); /* 2 */
751
752 /* get auth_type */
753 if ((integer_check(argv[3]) != HI_ERR_SUCCESS) || (atoi(argv[3]) < HI_WIFI_SECURITY_OPEN) || /* argv 3 */
754 (atoi(argv[3]) == HI_WIFI_SECURITY_WPA) || (atoi(argv[3]) == HI_WIFI_SECURITY_WPA2) || /* argv 3 */
755 (atoi(argv[3]) == HI_WIFI_SECURITY_WPAPSK) || (atoi(argv[3]) >= HI_WIFI_SECURITY_UNKNOWN) || /* argv 3 */
756 ((atoi(argv[3]) == HI_WIFI_SECURITY_OPEN) && (argc != 4)) || /* argc 3/4/5 */
757 ((atoi(argv[3]) != HI_WIFI_SECURITY_OPEN) && (argc != 5))) { /* argc 3/4/5 */
758 return HI_ERR_FAILURE;
759 }
760
761 fast_assoc_req.req.auth = (hi_wifi_auth_mode)atoi(argv[3]); /* 3 */
762
763 /* get encipher mode 0,HI_WIFI_PARIWISE_UNKNOWN */
764 fast_assoc_req.req.pairwise = HI_WIFI_PARIWISE_UNKNOWN;
765
766 /* get key */
767 ret = cmd_sta_connect_get_key(argc, argv, &fast_assoc_req);
768 if (ret != HI_ERR_SUCCESS) {
769 return HI_ERR_FAILURE;
770 }
771
772 if (hi_wifi_sta_fast_connect(&fast_assoc_req) != HISI_OK) {
773 return HI_ERR_FAILURE;
774 }
775
776 hi_at_printf("OK\r\n");
777 return HI_ERR_SUCCESS;
778 }
779
780 /*****************************************************************************
781 * Func description: sta disconnect network
782 *****************************************************************************/
cmd_sta_disconnect(hi_s32 argc,const hi_char * argv[])783 hi_u32 cmd_sta_disconnect(hi_s32 argc, const hi_char *argv[])
784 {
785 hi_unref_param(argv);
786 hi_unref_param(argc);
787
788 hi_s32 ret = hi_wifi_sta_disconnect();
789 if (ret != HISI_OK) {
790 return HI_ERR_FAILURE;
791 }
792
793 hi_at_printf("OK\r\n");
794 return HI_ERR_SUCCESS;
795 }
796
797 /*****************************************************************************
798 * Func description: get station connection status
799 *****************************************************************************/
cmd_sta_status(hi_s32 argc,const hi_char * argv[])800 hi_u32 cmd_sta_status(hi_s32 argc, const hi_char *argv[])
801 {
802 hi_s32 ret;
803 hi_wifi_status wifi_status;
804
805 hi_unref_param(argv);
806 hi_unref_param(argc);
807
808 memset_s(&wifi_status, sizeof(hi_wifi_status), 0, sizeof(hi_wifi_status));
809
810 ret = hi_wifi_sta_get_connect_info(&wifi_status);
811 if (ret != HISI_OK) {
812 return HI_ERR_FAILURE;
813 }
814 if (wifi_status.status == HI_WIFI_CONNECTED) {
815 const hi_char *tmp = at_ssid_txt((unsigned char*)wifi_status.ssid, strlen(wifi_status.ssid));
816 if (at_check_ccharacter(tmp) == HI_ERR_SUCCESS) {
817 hi_at_printf("+STASTAT:1,P\"%s\","AT_MACSTR",%d\r\n", tmp, at_mac2str(wifi_status.bssid),
818 wifi_status.channel);
819 } else {
820 hi_at_printf("+STASTAT:1,%s,"AT_MACSTR",%d\r\n", wifi_status.ssid, at_mac2str(wifi_status.bssid),
821 wifi_status.channel);
822 }
823 } else {
824 hi_at_printf("+STASTAT:0,0,0,0\r\n");
825 }
826 hi_at_printf("OK\r\n");
827 return HI_ERR_SUCCESS;
828 }
829
830 #ifdef CONFIG_WPS_SUPPORT
831 /*****************************************************************************
832 * Func description: using wps pbc to connect network
833 * example: sta wps_pbc <bssid>
834 *****************************************************************************/
cmd_wpa_wps_pbc(hi_s32 argc,const hi_char * argv[])835 hi_u32 cmd_wpa_wps_pbc(hi_s32 argc, const hi_char *argv[])
836 {
837 hi_unref_param(argv);
838 hi_unref_param(argc);
839
840 hi_s32 ret = hi_wifi_sta_wps_pbc(HI_NULL);
841 if (ret != HISI_OK) {
842 return HI_ERR_FAILURE;
843 }
844
845 hi_at_printf("OK\r\n");
846 return HI_ERR_SUCCESS;
847 }
848
849 /*****************************************************************************
850 * Func description: get wps pin value
851 *****************************************************************************/
cmd_wpa_wps_pin_get(hi_s32 argc,const hi_char * argv[])852 hi_u32 cmd_wpa_wps_pin_get(hi_s32 argc, const hi_char *argv[])
853 {
854 hi_char pin_txt[WIFI_WPS_PIN_LEN + 1] = {0};
855 hi_u32 len = WIFI_WPS_PIN_LEN + 1;
856 hi_s32 ret;
857
858 hi_unref_param(argv);
859 hi_unref_param(argc);
860
861 ret = hi_wifi_sta_wps_pin_get(pin_txt, len);
862 if (ret != HISI_OK) {
863 return HI_ERR_FAILURE;
864 }
865 pin_txt[WIFI_WPS_PIN_LEN] = '\0';
866
867 hi_at_printf("+PINSHOW:%s\r\n", pin_txt);
868 hi_at_printf("OK\r\n");
869 return HI_ERR_SUCCESS;
870 }
871
872 /*****************************************************************************
873 * Func description: using wps pin to connect network
874 * example: AT+PIN=03882368
875 *****************************************************************************/
cmd_wpa_wps_pin(hi_s32 argc,const hi_char * argv[])876 hi_u32 cmd_wpa_wps_pin(hi_s32 argc, const hi_char *argv[])
877 {
878 hi_char pin[WIFI_WPS_PIN_LEN + 1] = {0};
879 hi_char *ppin = pin;
880
881 if ((argc != 1) || (at_param_null_check(argc, argv) == HI_ERR_FAILURE)) {
882 return HI_ERR_FAILURE;
883 }
884
885 hi_u32 len = strlen(argv[0]);
886 if ((len != WIFI_WPS_PIN_LEN) || (memcpy_s(pin, WIFI_WPS_PIN_LEN + 1, argv[0], len) != EOK)) {
887 return HI_ERR_FAILURE;
888 }
889
890 if (hi_wifi_sta_wps_pin(ppin, HI_NULL) != HISI_OK) {
891 return HI_ERR_FAILURE;
892 }
893
894 hi_at_printf("OK\r\n");
895 return HI_ERR_SUCCESS;
896 }
897 #endif /* LOSCFG_APP_WPS */
898
cmd_set_reconn(hi_s32 argc,const hi_char * argv[])899 hi_u32 cmd_set_reconn(hi_s32 argc, const hi_char *argv[])
900 {
901 hi_s32 enable;
902 hi_s32 seconds = RECONN_TIMEOUT_MIN;
903 hi_u32 period = RECONN_PERIOD_MIN;
904 hi_u32 max_try_count = RECONN_COUNT_MIN;
905 if ((argc != 1) && (argc != 4)) { /* argc 1/4 */
906 return HI_ERR_FAILURE;
907 }
908 if (argc == 1) {
909 if ((integer_check(argv[0]) != HI_ERR_SUCCESS) || (atoi(argv[0]) != 0)) {
910 return HI_ERR_FAILURE;
911 }
912 enable = 0;
913 } else {
914 for (hi_s32 i = 0; i < argc - 1; i++) {
915 if (integer_check(argv[i]) != HI_ERR_SUCCESS) {
916 return HI_ERR_FAILURE;
917 }
918 }
919 enable = atoi(argv[0]);
920 if (enable == 0) {
921 return HI_ERR_FAILURE;
922 }
923 period = (hi_u32)atoi(argv[1]); /* argc 1 */
924 max_try_count = (hi_u32)atoi(argv[2]); /* argc 2 */
925 if (argv[3] != HI_NULL) { /* argc 3 */
926 if (integer_check(argv[3]) != HI_ERR_SUCCESS) { /* argc 3 */
927 return HI_ERR_FAILURE;
928 }
929 seconds = atoi(argv[3]); /* argc 3 */
930 }
931
932 if (seconds < RECONN_TIMEOUT_MIN || period < RECONN_PERIOD_MIN || period > RECONN_PERIOD_MAX ||
933 max_try_count < RECONN_COUNT_MIN || max_try_count > RECONN_COUNT_MAX) {
934 return HI_ERR_FAILURE;
935 }
936 }
937 hi_s32 ret = hi_wifi_sta_set_reconnect_policy(enable, seconds, period, max_try_count);
938 if (ret != HISI_OK) {
939 return HI_ERR_FAILURE;
940 }
941
942 hi_at_printf("OK\r\n");
943
944 return HI_ERR_SUCCESS;
945 }
946
947 const at_cmd_func g_sta_func_tbl[] = {
948 {"+STOPSTA", 8, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_sta_stop},
949 {"+SCAN", 5, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_wpa_scan},
950 {"+SCANCHN", 8, HI_NULL, HI_NULL, (at_call_back_func)cmd_wpa_channel_scan, HI_NULL},
951 {"+SCANSSID", 9, HI_NULL, HI_NULL, (at_call_back_func)cmd_wpa_ssid_scan, HI_NULL},
952 {"+SCANPRSSID", 11, HI_NULL, HI_NULL, (at_call_back_func)cmd_ssid_prefix_scan, HI_NULL},
953 {"+SCANRESULT", 11, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_wpa_scan_results},
954 {"+CONN", 5, HI_NULL, HI_NULL, (at_call_back_func)cmd_sta_connect, HI_NULL},
955 {"+FCONN", 6, HI_NULL, HI_NULL, (at_call_back_func)cmd_sta_quick_connect, HI_NULL},
956 {"+DISCONN", 8, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_sta_disconnect},
957 {"+STASTAT", 8, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_sta_status},
958 {"+RECONN", 7, HI_NULL, HI_NULL, (at_call_back_func)cmd_set_reconn, HI_NULL},
959 #ifdef CONFIG_WPS_SUPPORT
960 {"+PBC", 4, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_wpa_wps_pbc},
961 {"+PIN", 4, HI_NULL, HI_NULL, (at_call_back_func)cmd_wpa_wps_pin, HI_NULL},
962 {"+PINSHOW", 8, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_wpa_wps_pin_get},
963 #endif /* LOSCFG_APP_WPS */
964 #ifdef CONFIG_TEE_HUKS_DEMO_SUPPORT
965 {"+GCONNKEY", 9, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_generate_save_conn_key},
966 {"+SCONN", 6, HI_NULL, HI_NULL, (at_call_back_func)cmd_sta_secure_connect, HI_NULL},
967 {"+SRCONN", 7, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_sta_secure_re_connect},
968 #endif
969 };
970
971 #define AT_STA_FUNC_NUM (sizeof(g_sta_func_tbl) / sizeof(g_sta_func_tbl[0]))
972
hi_at_sta_cmd_register(hi_void)973 hi_void hi_at_sta_cmd_register(hi_void)
974 {
975 hi_at_register_cmd(g_sta_func_tbl, AT_STA_FUNC_NUM);
976 }
977
978 const at_cmd_func g_sta_factory_test_func_tbl[] = {
979 {"+STARTSTA", 9, HI_NULL, HI_NULL, (at_call_back_func)cmd_sta_start_adv, (at_call_back_func)cmd_sta_start},
980 #ifdef CONFIG_TEE_HUKS_DEMO_SUPPORT
981 {"+GCERTKEY", 9, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_generate_save_cert_key},
982 {"+CERTENC", 8, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_encrypt_cert},
983 {"+CERTDEC", 8, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_decrypt_cert},
984 #endif
985 };
986
987 #define AT_STA_FACTORY_TEST_FUNC_NUM (sizeof(g_sta_factory_test_func_tbl) / sizeof(g_sta_factory_test_func_tbl[0]))
988
hi_at_sta_factory_test_cmd_register(hi_void)989 hi_void hi_at_sta_factory_test_cmd_register(hi_void)
990 {
991 hi_at_register_cmd(g_sta_factory_test_func_tbl, AT_STA_FACTORY_TEST_FUNC_NUM);
992 }
993
994 /*****************************************************************************
995 * Func description: show mesh or softap connected sta information
996 *****************************************************************************/
cmd_softap_show_sta(hi_s32 argc,const hi_char * argv[])997 hi_u32 cmd_softap_show_sta(hi_s32 argc, const hi_char *argv[])
998 {
999 hi_s32 ret;
1000 hi_u32 sta_index;
1001 hi_u32 sta_num = WIFI_DEFAULT_MAX_NUM_STA;
1002 hi_wifi_ap_sta_info sta_list[WIFI_DEFAULT_MAX_NUM_STA];
1003 hi_wifi_ap_sta_info *sta_list_node = HI_NULL;
1004
1005 hi_unref_param(argc);
1006 hi_unref_param(argv);
1007
1008 ret = hi_wifi_softap_get_connected_sta(sta_list, &sta_num);
1009 if (ret != HISI_OK) {
1010 return HI_ERR_FAILURE;
1011 }
1012
1013 sta_list_node = sta_list;
1014 for (sta_index = 0; sta_index < sta_num; sta_index++, sta_list_node++) {
1015 hi_at_printf("+SHOWSTA:" AT_MACSTR, at_mac2str(sta_list_node->mac));
1016 hi_at_printf("\r\n");
1017 }
1018
1019 hi_at_printf("OK\r\n");
1020 return HI_ERR_SUCCESS;
1021 }
1022
1023 /*****************************************************************************
1024 * Func description: start softap
1025 * example: AT+STARTAP="hisilicon",0,6,1,"123456789"
1026 AT+STARTAP="hisilicon",0,6,0
1027 *****************************************************************************/
cmd_start_softap(hi_s32 argc,const hi_char * argv[])1028 hi_u32 cmd_start_softap(hi_s32 argc, const hi_char *argv[])
1029 {
1030 hi_wifi_softap_config hapd_conf = {0};
1031 hi_char ifname[WIFI_IFNAME_MAX_SIZE + 1] = {0};
1032 hi_s32 ifname_len = sizeof(ifname);
1033 hi_s32 len;
1034
1035 if (((argc != 4) && (argc != 5)) || (at_param_null_check(argc, argv) == HI_ERR_FAILURE)) { /* argc 4/5 */
1036 return HI_ERR_FAILURE;
1037 }
1038
1039 /* get ssid */
1040 if ((argv[0][0] != '\"') || (*(argv[0] + strlen(argv[0]) - 1) != '\"') ||
1041 (memcpy_s(hapd_conf.ssid, HI_WIFI_MAX_SSID_LEN + 1, argv[0] + 1, strlen(argv[0]) - 2) != EOK)) { /* 2 */
1042 return HI_ERR_FAILURE;
1043 }
1044
1045 /* get ssid_hidden,Scope 0~1 */
1046 if ((integer_check(argv[1]) != HI_ERR_SUCCESS) || (atoi(argv[1]) < 0) || (atoi(argv[1]) > 1)) {
1047 return HI_ERR_FAILURE;
1048 }
1049 hapd_conf.ssid_hidden = atoi(argv[1]);
1050
1051 /* get channel,Scope1~14 */
1052 if ((integer_check(argv[2]) != HI_ERR_SUCCESS) || (atoi(argv[2]) <= 0) || (atoi(argv[2]) > 14)) { /* argc 2 */
1053 return HI_ERR_FAILURE;
1054 }
1055 hapd_conf.channel_num = (hi_uchar)atoi(argv[2]); /* 2 */
1056
1057 if ((integer_check(argv[3]) == HI_ERR_FAILURE) || /* 3 */
1058 ((atoi(argv[3]) != HI_WIFI_SECURITY_OPEN) && (atoi(argv[3]) != HI_WIFI_SECURITY_WPA2PSK) && /* 3 */
1059 (atoi(argv[3]) != HI_WIFI_SECURITY_WPAPSK_WPA2PSK_MIX)) || /* 3 */
1060 ((atoi(argv[3]) == HI_WIFI_SECURITY_OPEN) && (argc != 4))) { /* argc 3/4 */
1061 return HI_ERR_FAILURE;
1062 }
1063 hapd_conf.authmode = (hi_wifi_auth_mode)atoi(argv[3]); /* 3 */
1064
1065 /* get authmode */
1066 if ((hapd_conf.authmode != HI_WIFI_SECURITY_OPEN)) {
1067 if ((argc != 5) || (strlen(argv[4]) > HI_WIFI_AP_KEY_LEN_MAX + 2) || /* argc 4/5, len plus 2 */
1068 (strlen(argv[4]) < HI_WIFI_AP_KEY_LEN_MIN + 2)) { /* argc 4, len plus 2 */
1069 return HI_ERR_FAILURE;
1070 }
1071 const hi_char *buf = argv[4]; /* argc 4 */
1072 len = (int)strlen(argv[4]); /* argc 4 */
1073 if ((*buf != '\"') || (*(buf + len - 1) != '\"') ||
1074 (memcpy_s((hi_char*)hapd_conf.key, HI_WIFI_AP_KEY_LEN + 1, buf + 1, len - 2) != EOK)) { /* len minus 2 */
1075 return HI_ERR_FAILURE;
1076 }
1077 }
1078 if (hi_wifi_softap_start(&hapd_conf, ifname, &ifname_len) != HISI_OK) {
1079 return HI_ERR_FAILURE;
1080 }
1081
1082 if (hi_wifi_set_bandwidth(DEFAULT_IFNAME_AP, strlen(DEFAULT_IFNAME_AP) + 1, g_bw_setup_value) != HI_ERR_SUCCESS) {
1083 hi_wifi_softap_stop();
1084 return HI_ERR_FAILURE;
1085 }
1086
1087 hi_at_printf("OK\r\n");
1088 return HI_ERR_SUCCESS;
1089 }
1090
1091 /*****************************************************************************
1092 * Func description: start softap
1093 * example: AT+SETAPADV=2,10,100,2,3600,0
1094 *****************************************************************************/
cmd_set_softap_advance(hi_s32 argc,const hi_char * argv[])1095 hi_u32 cmd_set_softap_advance(hi_s32 argc, const hi_char *argv[])
1096 {
1097 hi_s32 ret, value, i;
1098
1099 if (argc != 6) { /* The command has six fixed parameters.CNcomment:"+SETAPADV"命令固定6个命令参数 */
1100 return HI_ERR_FAILURE;
1101 }
1102 for (i = 0; i < argc; i++) {
1103 if ((argv[i] != HI_NULL) && (integer_check(argv[i]) != HI_ERR_SUCCESS)) {
1104 return HI_ERR_FAILURE;
1105 }
1106
1107 if (i == 0) {
1108 value = (argv[i] != HI_NULL) ? atoi(argv[i]) : HI_WIFI_PHY_MODE_11BGN;
1109 if ((value == HI_WIFI_PHY_MODE_11B) && (argv[1] != HI_NULL) && (strcmp(argv[1], "20"))) { /* 20:bw */
1110 return HI_ERR_FAILURE;
1111 }
1112 ret = hi_wifi_softap_set_protocol_mode((hi_wifi_protocol_mode)value);
1113 } else if (i == 1) {
1114 if ((argv[i] == HI_NULL) || !(strcmp(argv[i], "20"))) { /* 20M */
1115 g_bw_setup_value = HI_WIFI_BW_LEGACY_20M;
1116 } else if (!(strcmp(argv[i], "10"))) { /* 10M */
1117 g_bw_setup_value = HI_WIFI_BW_HIEX_10M;
1118 } else if (!(strcmp(argv[i], "5"))) { /* 5M */
1119 g_bw_setup_value = HI_WIFI_BW_HIEX_5M;
1120 } else {
1121 return HI_ERR_FAILURE;
1122 }
1123 ret = HISI_OK;
1124 } else if (i == 2) { /* i is 2 */
1125 ret = (argv[i] != HI_NULL) ? hi_wifi_softap_set_beacon_period(atoi(argv[i])) : HISI_OK;
1126 } else if (i == 3) { /* i is 3 */
1127 ret = (argv[i] != HI_NULL) ? hi_wifi_softap_set_dtim_period(atoi(argv[i])) : HISI_OK;
1128 } else if (i == 4) { /* i is 4 */
1129 ret = (argv[i] != HI_NULL) ? hi_wifi_softap_set_group_rekey(atoi(argv[i])) : HISI_OK;
1130 } else if (i == 5) { /* i is 5 */
1131 ret = (argv[i] != HI_NULL) ? hi_wifi_softap_set_shortgi(atoi(argv[i])) : HISI_OK;
1132 } else {
1133 return HI_ERR_FAILURE;
1134 }
1135 if (ret != HISI_OK) {
1136 return HI_ERR_FAILURE;
1137 }
1138 }
1139
1140 hi_at_printf("OK\r\n");
1141 return HI_ERR_SUCCESS;
1142 }
1143
1144 /*****************************************************************************
1145 * Func description: stop softap
1146 *****************************************************************************/
cmd_stop_softap(hi_s32 argc,const hi_char * argv[])1147 hi_u32 cmd_stop_softap(hi_s32 argc, const hi_char *argv[])
1148 {
1149 hi_unref_param(argc);
1150 hi_unref_param(argv);
1151
1152 if (hi_wifi_softap_stop() != HISI_OK) {
1153 return HI_ERR_FAILURE;
1154 }
1155
1156 hi_at_printf("OK\r\n");
1157 return HI_ERR_SUCCESS;
1158 }
1159
1160 /*****************************************************************************
1161 * Func description: softap disconnect station
1162 * example: AT+DEAUTHSTA=90:2B:D2:E4:CE:28
1163 *****************************************************************************/
cmd_softap_deauth_sta(hi_s32 argc,const hi_char * argv[])1164 hi_u32 cmd_softap_deauth_sta(hi_s32 argc, const hi_char *argv[])
1165 {
1166 hi_uchar mac_addr[HI_WIFI_MAC_LEN + 1] = {0};
1167 hi_s32 ret;
1168
1169 if ((argc != 1) || (argv[0] == HI_NULL) || (strlen(argv[0]) != HI_WIFI_TXT_ADDR_LEN)) {
1170 return HI_ERR_FAILURE;
1171 }
1172
1173 if (cmd_strtoaddr(argv[0], mac_addr, HI_WIFI_MAC_LEN) != HISI_OK) {
1174 return HI_ERR_FAILURE;
1175 }
1176
1177 ret = hi_wifi_softap_deauth_sta(mac_addr, HI_WIFI_MAC_LEN);
1178 if (ret != HISI_OK) {
1179 return HI_ERR_FAILURE;
1180 }
1181
1182 hi_at_printf("OK\r\n");
1183 return HI_ERR_SUCCESS;
1184 }
1185
at_ap_scan(hi_void)1186 hi_u32 at_ap_scan(hi_void)
1187 {
1188 hi_at_printf("ERROR:TBD\r\n");
1189 return HI_ERR_SUCCESS;
1190 }
1191
1192 const at_cmd_func g_at_ap_func_tbl[] = {
1193 {"+STARTAP", 8, HI_NULL, HI_NULL, (at_call_back_func)cmd_start_softap, HI_NULL},
1194 {"+SETAPADV", 9, HI_NULL, HI_NULL, (at_call_back_func)cmd_set_softap_advance, HI_NULL},
1195 {"+STOPAP", 7, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_stop_softap},
1196 {"+SHOWSTA", 8, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_softap_show_sta},
1197 {"+DEAUTHSTA", 10, HI_NULL, HI_NULL, (at_call_back_func)cmd_softap_deauth_sta, HI_NULL},
1198 {"+APSCAN", 7, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_ap_scan},
1199 };
1200
1201 #define AT_AP_FUNC_NUM (sizeof(g_at_ap_func_tbl) / sizeof(g_at_ap_func_tbl[0]))
1202
hi_at_softap_cmd_register(void)1203 hi_void hi_at_softap_cmd_register(void)
1204 {
1205 hi_at_register_cmd(g_at_ap_func_tbl, AT_AP_FUNC_NUM);
1206 }
1207
1208 #ifdef LOSCFG_APP_MESH
cmd_mesh_auto_get_ssid(const hi_char * argv[],hi_mesh_autolink_config * mesh_auto_config)1209 hi_u32 cmd_mesh_auto_get_ssid(const hi_char *argv[], hi_mesh_autolink_config *mesh_auto_config)
1210 {
1211 size_t ssid_len = 0;
1212 errno_t rc;
1213
1214 /* get ssid */
1215 if (argv[1][0] == 'P') {
1216 if (strlen(argv[1]) > HI_WIFI_MAX_SSID_LEN * 4 + 3) { /* ssid length should less than 32*4+3 */
1217 return HI_ERR_FAILURE;
1218 }
1219 } else if (strlen(argv[1]) > HI_WIFI_MAX_SSID_LEN + 2) { /* ssid length should less than 32+2 */
1220 return HI_ERR_FAILURE;
1221 }
1222
1223 /* ssid hex to string */
1224 hi_char *tmp = at_parse_string(argv[1], &ssid_len);
1225 if (tmp == HI_NULL) {
1226 return HI_ERR_FAILURE;
1227 }
1228 if ((ssid_len > HI_WIFI_MAX_SSID_LEN) || (ssid_len == 0)) {
1229 at_free(tmp);
1230 return HI_ERR_FAILURE;
1231 }
1232
1233 rc = memcpy_s(mesh_auto_config->ssid, HI_WIFI_MAX_SSID_LEN + 1, tmp, strlen(tmp) + 1);
1234 at_free(tmp);
1235 if (rc != EOK) {
1236 return HI_ERR_FAILURE;
1237 }
1238
1239 return HI_ERR_SUCCESS;
1240 }
1241
1242 /*****************************************************************************
1243 * Func description: start mesh auto join
1244 * example: AT+MAUTOJOIN=1,"router_mesh",0
1245 AT+MAUTOJOIN=1,"router_mesh",1,"123456789"
1246 *****************************************************************************/
cmd_mesh_auto_connect(hi_s32 argc,const hi_char * argv[])1247 hi_s32 cmd_mesh_auto_connect(hi_s32 argc, const hi_char* argv[])
1248 {
1249 hi_mesh_autolink_config mesh_auto_config = {0};
1250
1251 if ((argc < 3) || (argc > 4)) { /* argc 3/4 */
1252 return HI_ERR_FAILURE;
1253 }
1254
1255 /* get usr config mesh type */
1256 if ((integer_check(argv[0]) != HI_ERR_SUCCESS) || (atoi(argv[0]) < HI_MESH_USRCONFIG_MBR) ||
1257 (atoi(argv[0]) > HI_MESH_USRCONFIG_AUTO)) {
1258 return HI_ERR_FAILURE;
1259 }
1260 mesh_auto_config.usr_cfg_role = (hi_mesh_autolink_usrcfg_node_type)atoi(argv[0]);
1261
1262 /* get ssid */
1263 if (cmd_mesh_auto_get_ssid(argv, &mesh_auto_config) != HI_ERR_SUCCESS) {
1264 return HI_ERR_FAILURE;
1265 }
1266
1267 /* get auth_type */
1268 if ((integer_check(argv[2]) == HI_ERR_FAILURE) || /* argc 2 */
1269 ((atoi(argv[2]) != HI_MESH_OPEN) && (atoi(argv[2]) != HI_MESH_AUTH)) || /* argc 2 */
1270 ((atoi(argv[2]) == HI_MESH_OPEN) && (argc != 3))) { /* argc 2/3 */
1271 return HI_ERR_FAILURE;
1272 }
1273 mesh_auto_config.auth = (hi_mesh_autolink_auth_type)atoi(argv[2]); /* 2 */
1274
1275 /* get key */
1276 if (mesh_auto_config.auth == HI_MESH_AUTH) {
1277 if ((argc != 4) || (strlen(argv[3]) > HI_WIFI_MS_KEY_LEN_MAX + 2) || /* 4,3,2 */
1278 (strlen(argv[3]) < HI_WIFI_MS_KEY_LEN_MIN + 2)) { /* 3,2 */
1279 return HI_ERR_FAILURE;
1280 }
1281 const hi_char *buf = argv[3]; /* 3 */
1282 size_t len = strlen(argv[3]); /* 3 */
1283 if ((*buf != '\"') || (*(buf + len - 1) != '\"') ||
1284 (memcpy_s((hi_char*)mesh_auto_config.key, HI_WIFI_MESH_KEY_LEN_MAX + 1, buf + 1, len - 2) != EOK)) { /* 2 */
1285 return HI_ERR_FAILURE;
1286 }
1287 }
1288
1289 if (hi_mesh_start_autolink(&mesh_auto_config) != HISI_OK) {
1290 return HI_ERR_FAILURE;
1291 }
1292
1293 hi_at_printf("OK\r\n");
1294 return HI_ERR_SUCCESS;
1295 }
1296
1297 /*****************************************************************************
1298 * Func description: exit mesh network
1299 * example: AT+MEXIT
1300 * AT+MEXIT
1301 *****************************************************************************/
cmd_mesh_exit_network(hi_s32 argc,const hi_char * argv[])1302 hi_s32 cmd_mesh_exit_network(hi_s32 argc, const hi_char* argv[])
1303 {
1304 hi_s32 ret;
1305
1306 hi_unref_param(argv);
1307 hi_unref_param(argc);
1308
1309 ret = hi_mesh_exit_autolink();
1310 if (ret != HISI_OK) {
1311 return HI_ERR_FAILURE;
1312 }
1313
1314 hi_at_printf("OK\r\n");
1315 return HI_ERR_SUCCESS;
1316 }
1317
1318 /*****************************************************************************
1319 * Func description: set mesh router rssi threshold
1320 * example: AT+MSETRSSI=-50
1321 *****************************************************************************/
cmd_mesh_set_rssi_threshold(hi_s32 argc,const hi_char * argv[])1322 hi_s32 cmd_mesh_set_rssi_threshold(hi_s32 argc, const hi_char* argv[])
1323 {
1324 hi_s32 ret;
1325 hi_s32 usr_rssi_config;
1326
1327 if ((argc != 1) || (argv[0] == HI_NULL)) {
1328 return HI_ERR_FAILURE;
1329 }
1330
1331 usr_rssi_config = atoi(argv[0]);
1332 if ((usr_rssi_config < -127) || (usr_rssi_config > 10)) { /* range -127,10 */
1333 return HI_ERR_FAILURE;
1334 }
1335 ret = hi_mesh_autolink_set_router_rssi_threshold(usr_rssi_config);
1336 if (ret != HISI_OK) {
1337 return HI_ERR_FAILURE;
1338 }
1339
1340 hi_at_printf("OK\r\n");
1341 return HI_ERR_SUCCESS;
1342 }
1343
1344 /*****************************************************************************
1345 * Func description: set mesh autonetwork bw value
1346 * example: AT+MSETBW=5
1347 *****************************************************************************/
cmd_mesh_set_autonetwork_bw(hi_s32 argc,const hi_char * argv[])1348 hi_s32 cmd_mesh_set_autonetwork_bw(hi_s32 argc, const hi_char* argv[])
1349 {
1350 hi_wifi_bw bw_value;
1351 if (argc != 1) { /* "+MSETBW"命令固定1个命令参数 */
1352 return HI_ERR_FAILURE;
1353 }
1354
1355 if ((argv[0] != HI_NULL) && (integer_check(argv[0]) != HI_ERR_SUCCESS)) {
1356 return HI_ERR_FAILURE;
1357 }
1358
1359 if ((argv[0] != HI_NULL) && (atoi(argv[0]) == 5)) { /* bw 5 */
1360 bw_value = HI_WIFI_BW_HIEX_5M;
1361 } else if ((argv[0] != HI_NULL) && (atoi(argv[0]) == 10)) { /* bw 10 */
1362 bw_value = HI_WIFI_BW_HIEX_10M;
1363 } else {
1364 bw_value = HI_WIFI_BW_LEGACY_20M;
1365 }
1366
1367 hi_mesh_autolink_set_bw(bw_value);
1368 hi_at_printf("OK\r\n");
1369 return HI_ERR_SUCCESS;
1370 }
1371
1372 const at_cmd_func g_at_mesh_func_tbl[] = {
1373 {"+MAUTOJOIN", 10, HI_NULL, HI_NULL, (at_call_back_func)cmd_mesh_auto_connect, HI_NULL},
1374 {"+MEXIT", 6, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)cmd_mesh_exit_network},
1375 {"+MSETRSSI", 9, HI_NULL, HI_NULL, (at_call_back_func)cmd_mesh_set_rssi_threshold, HI_NULL},
1376 {"+MSETBW", 7, HI_NULL, HI_NULL, (at_call_back_func)cmd_mesh_set_autonetwork_bw, HI_NULL},
1377 };
1378
1379 #define AT_MESH_FUNC_NUM (sizeof(g_at_mesh_func_tbl) / sizeof(g_at_mesh_func_tbl[0]))
1380
hi_at_mesh_cmd_register(void)1381 hi_void hi_at_mesh_cmd_register(void)
1382 {
1383 hi_at_register_cmd(g_at_mesh_func_tbl, AT_MESH_FUNC_NUM);
1384 }
1385 #endif
1386 #ifdef __cplusplus
1387 #if __cplusplus
1388 }
1389 #endif
1390 #endif
1391