• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Winner Microelectronics Co., Ltd. All rights reserved.
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 
16 #include <string.h>
17 #include <ctype.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include "wm_debug.h"
21 #if (GCC_COMPILE == 1)
22 #include "wm_cmdp_hostif_gcc.h"
23 #else
24 #include "wm_cmdp_hostif.h"
25 #endif
26 #include "list.h"
27 #include "wm_mem.h"
28 #include "wm_regs.h"
29 #include "wm_params.h"
30 #include "wm_wl_task.h"
31 #include "utils.h"
32 #include "wm_efuse.h"
33 #include "wm_fwup.h"
34 #include "wm_flash.h"
35 #include "litepoint.h"
36 #include "wm_irq.h"
37 #include "wm_config.h"
38 #include "wm_http_client.h"
39 #include "wm_rmms.h"
40 #include "wm_cpu.h"
41 #include "wm_internal_flash.h"
42 #include "wm_cmdp.h"
43 #include "wm_bt_config.h"
44 #include "wm_bt_def.h"
45 
46 const u8 SysCreatedDate[] = __DATE__;
47 const u8 SysCreatedTime[] = __TIME__;
48 
49 #define TWO 2
50 #define THREE 3
51 #define FOUR 4
52 #define FIVE 5
53 #define SIX 6
54 #define SEVEN 7
55 #define EIGHT 8
56 #define NINE 9
57 #define TEN 10
58 #define TWENTY 20
59 #define THIRTY 30
60 #define FORTY  40
61 #define FIFTY  50
62 #define SIXTY  60
63 #define SEVENTY 70
64 #define EIGHTY 80
65 #define ONE_HUNDRED 100
66 #define TWO_HUNDRED 200
67 #define TWO_HUNDRED_AND_FIFTY_FIVE 255
68 #define TWO_HUNDRED_AND_FIFTY_SIX 256
69 #define FIVE_HUNDRED_AND_TWELVE 512
70 #define ONE_THOUSAND 1000
71 #define ONE_THOUSAND_AND_TWENTY_FOUR 1024
72 #define ONE_THOUSAND_FOUR_HUNRED_AND_FIFTY 1450
73 #define TWO_THOUSAND                       2000
74 #define TWO_THOUSAND_AND_FIVE_HUNRED       2500
75 #define TEN_THOUSAND                       10000
76 #define TEN_HUNDRED_AND_FIFTEEN_THOUSAND_AND_TWO_HUNDRED         115200
77 #define SIXTY_FIVE_THOUSAND_FIVE_HUNDRED_AND_THIRTY_FIVE       65535
78 #define ONE_MILLION       1000000
79 #define TEN_MILLION       10000000
80 #define FOUR_HUNRED_AND_EIGHTY_MILLION       480000000
81 
82 #if TLS_CONFIG_HOSTIF
83 #include "wm_osal.h"
84 #include "wm_uart.h"
85 #include "wm_sockets.h"
86 
87 #define RFR_REG_MAX_NUM (28)
88 
89 struct tls_hostif g_hostif;
tls_get_hostif(void)90 struct tls_hostif *tls_get_hostif(void)
91 {
92     return &g_hostif;
93 }
94 
95 u8 default_socket = 0;
96 #if TLS_CONFIG_CMD_USE_RAW_SOCKET
97 struct tls_uart_circ_buf *sockrecvmit[TLS_MAX_NETCONN_NUM];
98 #else
99 #define SOCK_RECV_TIMEOUT    100
100 struct tls_uart_circ_buf *sockrecvmit[MEMP_NUM_NETCONN];
101 fd_set fdatsockets;
102 static struct sockaddr  sock_cmdp_addrs[MEMP_NUM_NETCONN];
103 static u32 sock_cmdp_timeouts[MEMP_NUM_NETCONN] = {0};
104 #endif
105 
tls_hostif_get_recvmit(int socket_num)106 struct tls_uart_circ_buf *tls_hostif_get_recvmit(int socket_num)
107 {
108 #if TLS_CONFIG_CMD_USE_RAW_SOCKET
109     TLS_DBGPRT_INFO("socket_num=%d, precvmit=0x%x\n", socket_num, (u32)sockrecvmit[socket_num - 1]);
110     return sockrecvmit[socket_num - 1];
111 #else
112     return sockrecvmit[socket_num-LWIP_SOCKET_OFFSET];
113 #endif
114 }
115 
tls_hostif_fill_cmdrsp_hdr(struct tls_hostif_cmdrsp * cmdrsp,u8 code,u8 err,u8 ext)116 void tls_hostif_fill_cmdrsp_hdr(struct tls_hostif_cmdrsp *cmdrsp,
117     u8 code, u8 err, u8 ext)
118 {
119     cmdrsp->cmd_hdr.code = code;
120     cmdrsp->cmd_hdr.err = err;
121     cmdrsp->cmd_hdr.ext = ext;
122     cmdrsp->cmd_hdr.msg_type = HOSTIF_MSG_TYPE_RSP;
123 }
124 
tls_hostif_fill_event_hdr(struct tls_hostif_event * event,u8 code,u8 err,u8 ext)125 void tls_hostif_fill_event_hdr(struct tls_hostif_event *event,
126     u8 code, u8 err, u8 ext)
127 {
128     event->cmd_hdr.code = code;
129     event->cmd_hdr.err = err;
130     event->cmd_hdr.ext = ext;
131     event->cmd_hdr.msg_type = HOSTIF_MSG_TYPE_EVENT;
132 }
133 
tls_hostif_fill_hdr(struct tls_hostif * hif,struct tls_hostif_hdr * hdr,u8 type,u16 length,u8 flag,u8 dest_addr,u8 chk)134 void tls_hostif_fill_hdr(struct tls_hostif *hif,
135     struct tls_hostif_hdr *hdr, u8 type, u16 length, u8 flag, u8 dest_addr, u8 chk)
136 {
137     hdr->sync = 0xAA;
138     hdr->type = type;
139     hdr->length = host_to_be16(length);
140     hdr->seq_num = hif->hspi_tx_seq++;
141     hdr->flag = flag;
142     hdr->dest_addr = dest_addr;
143     hdr->chk = chk;
144 }
145 
tls_hostif_get_tx_msg(void)146 struct tls_hostif_tx_msg *tls_hostif_get_tx_msg(void)
147 {
148     struct tls_hostif_tx_msg *tx_msg = tls_mem_alloc(sizeof(struct tls_hostif_tx_msg));
149     return tx_msg;
150 }
151 
tls_hostif_get_tx_event_msg(struct tls_hostif * hif)152 struct tls_hostif_tx_msg *tls_hostif_get_tx_event_msg(struct tls_hostif *hif)
153 {
154     return tls_hostif_get_tx_msg();
155 }
156 
free_tx_msg_buffer(struct tls_hostif_tx_msg * tx_msg)157 void free_tx_msg_buffer(struct tls_hostif_tx_msg *tx_msg)
158 {
159     switch (tx_msg->type) {
160         case HOSTIF_TX_MSG_TYPE_EVENT:
161         case HOSTIF_TX_MSG_TYPE_CMDRSP:
162             tls_mem_free(tx_msg->u.msg_event.buf);
163             break;
164 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
165         /* Tcp and Udp both use the below case. */
166         case HOSTIF_TX_MSG_TYPE_UDP:
167         case HOSTIF_TX_MSG_TYPE_TCP:
168             pbuf_free(tx_msg->u.msg_tcp.p);
169             break;
170 #endif /* TLS_CONFIG_SOCKET_RAW */
171         default:
172             break;
173     }
174 }
175 
tls_hostif_atcmd_loopback(u8 hostif_type,char * buf,u32 buflen)176 int tls_hostif_atcmd_loopback(u8 hostif_type,
177     char *buf, u32 buflen)
178 {
179     struct tls_hostif_tx_msg *tx_msg;
180     struct tls_hostif *hif = tls_get_hostif();
181 
182     if (buf == NULL || buflen == 0) {
183         return -1;
184     }
185     switch (hostif_type) {
186         case HOSTIF_MODE_UART0:
187             tx_msg = tls_hostif_get_tx_event_msg(hif);
188             if (tx_msg == NULL) {
189                 return -1;
190             }
191             tx_msg->offset = 0;
192             tx_msg->u.msg_cmdrsp.buf = buf;
193             tx_msg->type = HOSTIF_TX_MSG_TYPE_CMDRSP;
194             tx_msg->u.msg_cmdrsp.buflen = buflen;
195 
196             if (hif->uart_send_tx_msg_callback != NULL) {
197                 hif->uart_send_tx_msg_callback(hostif_type, tx_msg, FALSE);
198             }
199             break;
200         case HOSTIF_MODE_UART1_LS:
201             tx_msg = tls_hostif_get_tx_event_msg(hif);
202             if (tx_msg == NULL) {
203                 return -1;
204             }
205             tx_msg->offset = 0;
206             tx_msg->u.msg_cmdrsp.buf = buf;
207             tx_msg->type = HOSTIF_TX_MSG_TYPE_CMDRSP;
208             tx_msg->u.msg_cmdrsp.buflen = buflen;
209 
210             if (hif->uart_send_tx_msg_callback != NULL) {
211                 hif->uart_send_tx_msg_callback(hostif_type, tx_msg, FALSE);
212             }
213             break;
214 #if TLS_CONFIG_RMMS
215         case HOSTIF_MODE_RMMS_AT:
216             /* rmms do nothing */
217             break;
218 #endif
219         default:
220             break;
221     }
222     return 0;
223 }
224 
225 extern struct tls_uart_port uart_port[FOUR];
tls_hostif_process_cmdrsp(u8 hostif_type,char * cmdrsp,u32 cmdrsp_size)226 int tls_hostif_process_cmdrsp(u8 hostif_type, char *cmdrsp, u32 cmdrsp_size)
227 {
228     struct tls_hostif_tx_msg *tx_msg;
229     struct tls_hostif *hif = tls_get_hostif();
230     u16 remain_len = 0;
231     extern int tls_uart_tx_remain_len(struct tls_uart_port *port);
232 
233     if (cmdrsp == NULL || cmdrsp_size == 0) {
234         return -1;
235     }
236     switch (hostif_type) {
237         case HOSTIF_MODE_HSPI:
238             tx_msg = tls_hostif_get_tx_event_msg(hif);
239             if (tx_msg == NULL) {
240                 return -1;
241             }
242             tx_msg->offset = 0;
243             tx_msg->u.msg_cmdrsp.buf = cmdrsp;
244             tx_msg->type = HOSTIF_TX_MSG_TYPE_CMDRSP;
245             tx_msg->u.msg_cmdrsp.buflen = cmdrsp_size;
246             if (hif->hspi_send_tx_msg_callback != NULL) {
247                 hif->hspi_send_tx_msg_callback(hostif_type, tx_msg, FALSE);
248             }
249             break;
250         case HOSTIF_MODE_UART0:
251         case HOSTIF_MODE_UART1_LS:
252         case HOSTIF_MODE_UART1_HS:
253             tx_msg = tls_hostif_get_tx_event_msg(hif);
254             if (tx_msg == NULL) {
255                 return -1;
256             }
257             tx_msg->offset = 0;
258             tx_msg->u.msg_cmdrsp.buf = cmdrsp;
259             tx_msg->type = HOSTIF_TX_MSG_TYPE_CMDRSP;
260             tx_msg->u.msg_cmdrsp.buflen = cmdrsp_size;
261 
262             if (hif->uart_send_tx_msg_callback != NULL) {
263                 while (tx_msg->u.msg_cmdrsp.buflen > remain_len) {
264                     if (hostif_type == HOSTIF_MODE_UART0) {
265                         remain_len = tls_uart_tx_remain_len(&uart_port[0]);
266                     } else {
267                         remain_len = tls_uart_tx_remain_len(&uart_port[1]);
268                     }
269                     tls_os_time_delay(TWO);
270                 }
271                 hif->uart_send_tx_msg_callback(hostif_type, tx_msg, FALSE);
272             }
273             break;
274 #if TLS_CONFIG_RMMS
275         case HOSTIF_MODE_RMMS_AT:
276             RMMS_SendHedAtRsp((struct rmms_msg *)cmdrsp);
277             break;
278 #endif
279         default:
280             break;
281     }
282     return 0;
283 }
284 
tls_hostif_cmd_handler(u8 hostif_cmd_type,char * buf,u32 length)285 int tls_hostif_cmd_handler(u8 hostif_cmd_type, char *buf, u32 length)
286 {
287 #define CMD_RSP_BUF_SIZE    600  // 256
288     char *cmdrsp_buf;
289     u32 cmdrsp_size;
290     struct tls_atcmd_token_t *atcmd_tok = NULL;
291     int err;
292     int i, name_len;
293     struct tls_hostif_hdr *hdr = (struct tls_hostif_hdr *)buf;
294     u8 hostif_type;
295     struct tls_hostif *hif = tls_get_hostif();
296 
297     cmdrsp_size = CMD_RSP_BUF_SIZE;
298     atcmd_tok = tls_mem_alloc(sizeof(struct tls_atcmd_token_t));
299     if (atcmd_tok == NULL) {
300         return -1;
301     }
302 
303     switch (hostif_cmd_type) {
304         case HOSTIF_UART1_AT_CMD:
305         case HOSTIF_UART0_AT_CMD:
306             if (hostif_cmd_type == HOSTIF_UART1_AT_CMD) {
307                 hostif_type = HOSTIF_MODE_UART1_LS;
308             } else {
309                 hostif_type = HOSTIF_MODE_UART0;
310             }
311 
312             /* at cmd loopback */
313             if (hif->uart_insdisp) {
314                 u8 *atcmd_loopback_buf = tls_mem_alloc(length + 1);
315                 if (!atcmd_loopback_buf) {
316                     tls_mem_free(atcmd_tok);
317                     return -1;
318                 }
319                 MEMCPY(atcmd_loopback_buf, buf, length);
320                 atcmd_loopback_buf[length - 1] = '\r';
321                 atcmd_loopback_buf[length] = '\n';
322                 err = tls_hostif_atcmd_loopback(hostif_type, (char *)atcmd_loopback_buf,
323                                                 length + 1);
324                 if (err) {
325                     tls_mem_free(atcmd_loopback_buf);
326                 }
327             }
328 
329             cmdrsp_buf = tls_mem_alloc(CMD_RSP_BUF_SIZE);
330             if (!cmdrsp_buf) {
331                 tls_mem_free(atcmd_tok);
332                 return -1;
333             }
334             memset(atcmd_tok, 0, sizeof(struct tls_atcmd_token_t));
335             if (hostif_cmd_type == HOSTIF_UART0_AT_CMD) {
336                 atcmd_tok->cmd_mode = CMD_MODE_UART0_ATCMD;
337             } else {
338                 atcmd_tok->cmd_mode = CMD_MODE_UART1_ATCMD;
339             }
340 #if TLS_CONFIG_RMMS
341             if (hostif_cmd_type == HOSTIF_RMMS_AT_CMD) {
342                 err = tls_atcmd_parse(atcmd_tok, buf + SIX + THREE, length - THREE - SIX);
343             } else {
344 #endif
345                 err = tls_atcmd_parse(atcmd_tok, buf + THREE, length - THREE);
346             }
347 
348             if (err) {
349                 TLS_DBGPRT_INFO("err parse cmd, code = %d\n", err);
350                 cmdrsp_size = sprintf(cmdrsp_buf, "+ERR=%d\r\n", err);
351             } else {
352                 name_len = strlen(atcmd_tok->name);
353                 for (i = 0; i < name_len; i++) {
354                     atcmd_tok->name[i] = toupper(atcmd_tok->name[i]);
355                 }
356                 cmdrsp_size = CMD_RSP_BUF_SIZE;
357                 err = tls_hostif_atcmd_exec(atcmd_tok, cmdrsp_buf, &cmdrsp_size);
358                 if (err != -CMD_ERR_SKT_RPT && err != -CMD_ERR_SKT_SND) {
359                     cmdrsp_buf[cmdrsp_size] = '\r';
360                     cmdrsp_buf[cmdrsp_size + 1] = '\n';
361                     cmdrsp_buf[cmdrsp_size + TWO] = '\r';
362                     cmdrsp_buf[cmdrsp_size + THREE] = '\n';
363                     cmdrsp_buf[cmdrsp_size + FOUR] = '\0';
364                     cmdrsp_size += FOUR;
365                 }
366             }
367             break;
368         default:
369             TLS_DBGPRT_ERR("illegal command type\n");
370             tls_mem_free(atcmd_tok);
371             return -1;
372     }
373 
374     err = tls_hostif_process_cmdrsp(hostif_type, cmdrsp_buf, cmdrsp_size);
375     if (err) {
376         tls_mem_free(cmdrsp_buf);
377     }
378 
379     tls_mem_free(atcmd_tok);
380     return err;
381 }
382 
tls_hostif_hdr_check(u8 * buf,u32 length)383 int tls_hostif_hdr_check(u8 *buf, u32 length)
384 {
385     if (!buf) {
386         return -1;
387     }
388     return 0;
389 }
390 
tls_hostif_send_event_port_check(void)391 int tls_hostif_send_event_port_check(void)
392 {
393     struct tls_hostif *hif = tls_get_hostif();
394 
395     if (hif->hostif_mode == HOSTIF_MODE_UART1_HS) {
396         return 0;
397     }
398     if (hif->hostif_mode == HOSTIF_MODE_HSPI) {
399         return 0;
400     }
401 
402     return -1;
403 }
404 
tls_hostif_send_event(char * buf,u32 buflen,u8 type)405 int tls_hostif_send_event(char *buf, u32 buflen, u8 type)
406 {
407     struct tls_hostif_tx_msg *tx_msg;
408     struct tls_hostif *hif = tls_get_hostif();
409     u8 ext;
410     struct tls_hostif_event *event = (struct tls_hostif_event *)buf;
411 
412     tx_msg = tls_hostif_get_tx_event_msg(hif);
413     if (!tx_msg) {
414         return -1;
415     }
416 
417     tls_hostif_fill_hdr(hif, &event->hdr, PACKET_TYPE_RI_CMD, buflen - EIGHT, 0, 0, 0);
418     if (buflen == (TEN + TWO)) {
419         ext = 0;
420     } else {
421         ext = 1;
422     }
423     tls_hostif_fill_event_hdr(event, type, 0, ext);
424 
425     tx_msg->u.msg_event.buf = buf;
426     tx_msg->u.msg_event.buflen = buflen;
427     tx_msg->type = HOSTIF_TX_MSG_TYPE_EVENT;
428 
429     if (hif->hostif_mode == HOSTIF_MODE_HSPI) {
430         if (hif->hspi_send_tx_msg_callback != NULL) {
431             hif->hspi_send_tx_msg_callback(HOSTIF_MODE_HSPI, tx_msg, TRUE);
432         }
433     } else if (hif->hostif_mode == HOSTIF_MODE_UART1_HS) {
434         if (hif->uart_send_tx_msg_callback != NULL) {
435             hif->uart_send_tx_msg_callback(HOSTIF_MODE_UART1_HS, tx_msg, TRUE);
436         }
437     } else {
438         return -1;
439     }
440     return 0;
441 }
442 
tls_hostif_send_event_init_cmplt(void)443 int tls_hostif_send_event_init_cmplt(void)
444 {
445     char *buf;
446     u16 buflen;
447     int err;
448 
449     err = tls_hostif_send_event_port_check();
450     if (err) {
451         return 0;
452     }
453     buflen = sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr);
454     buf = (char *)tls_mem_alloc(buflen);
455     if (!buf) {
456         return 0;
457     }
458     err = tls_hostif_send_event(buf, buflen, HOSTIF_EVENT_INIT_END);
459     if (err) {
460         tls_mem_free(buf);
461     }
462     return 0;
463 }
464 
tls_hostif_send_event_linkup(void)465 static int tls_hostif_send_event_linkup(void)
466 {
467     char *buf;
468     u16 buflen;
469     int err;
470 
471     err = tls_hostif_send_event_port_check();
472     if (err) {
473         return 0;
474     }
475     buflen = sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr);
476     buf = (char *)tls_mem_alloc(buflen);
477     if (!buf) {
478         return 0;
479     }
480     err = tls_hostif_send_event(buf, buflen, HOSTIF_EVENT_LINKUP);
481     if (err) {
482         tls_mem_free(buf);
483     }
484     return 0;
485 }
486 
tls_hostif_send_event_wjoin_success(void)487 int tls_hostif_send_event_wjoin_success(void)
488 {
489     char *buf;
490     u16 buflen;
491     int err;
492     char *p;
493     struct tls_curr_bss_t bss;
494 
495     err = tls_hostif_send_event_port_check();
496     if (err) {
497         return 0;
498     }
499     tls_wifi_get_current_bss(&bss);
500 
501     buflen = sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr)
502              + TEN + TWO + bss.ssid_len;
503     buf = (char *)tls_mem_alloc(buflen);
504     if (!buf) {
505         return 0;
506     }
507     p = &buf[(TEN + TWO)];
508     *p++ = 1;
509 
510     MEMCPY(p, bss.bssid, ETH_ALEN);
511     p += ETH_ALEN;
512     *p++ = (char)bss.type;
513     *p++ = (char)bss.channel;
514     *p++ = (char)bss.encryptype;
515     *p++ = (char)bss.ssid_len;
516     MEMCPY(p, bss.ssid, bss.ssid_len);
517     p += bss.ssid_len;
518     *p = bss.rssi;
519     err = tls_hostif_send_event(buf, buflen, HOSTIF_EVENT_JOIN_RES);
520     if (err) {
521         tls_mem_free(buf);
522     }
523     return 0;
524 }
525 
tls_hostif_send_event_wjoin_failed(void)526 int tls_hostif_send_event_wjoin_failed(void)
527 {
528     char *buf;
529     u16 buflen;
530     int err;
531 
532     err = tls_hostif_send_event_port_check();
533     if (err) {
534         return 0;
535     }
536     buflen = sizeof(struct tls_hostif_hdr) +
537         sizeof(struct tls_hostif_cmd_hdr) + 1;
538     buf = (char *)tls_mem_alloc(buflen);
539     if (!buf) {
540         return 0;
541     }
542     buf[TEN + TWO] = 0;
543     err = tls_hostif_send_event(buf, buflen,
544             HOSTIF_EVENT_JOIN_RES);
545     if (err) {
546         tls_mem_free(buf);
547     }
548     return 0;
549 }
550 
tls_hostif_send_event_linkdown(void)551 int tls_hostif_send_event_linkdown(void)
552 {
553     char *buf;
554     u16 buflen;
555     int err;
556 
557     err = tls_hostif_send_event_port_check();
558     if (err) {
559         return 0;
560     }
561     buflen = sizeof(struct tls_hostif_hdr) +
562         sizeof(struct tls_hostif_cmd_hdr);
563     buf = (char *)tls_mem_alloc(buflen);
564     if (!buf) {
565         return 0;
566     }
567     err = tls_hostif_send_event(buf, buflen,
568             HOSTIF_EVENT_LINKDOWN);
569     if (err) {
570         tls_mem_free(buf);
571     }
572     return 0;
573 }
574 
tls_hostif_send_event_sta_join(void)575 int tls_hostif_send_event_sta_join(void)
576 {
577     char *buf;
578     u16 buflen;
579     int err;
580 
581     err = tls_hostif_send_event_port_check();
582     if (err) {
583         return 0;
584     }
585     buflen = sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr);
586     buf = (char *)tls_mem_alloc(buflen);
587     if (!buf) {
588         return 0;
589     }
590     err = tls_hostif_send_event(buf, buflen, HOSTIF_EVENT_STA_JOIN);
591     if (err) {
592         tls_mem_free(buf);
593     }
594     return 0;
595 }
596 
tls_hostif_send_event_sta_leave(void)597 int tls_hostif_send_event_sta_leave(void)
598 {
599     char *buf;
600     u16 buflen;
601     int err;
602 
603     err = tls_hostif_send_event_port_check();
604     if (err) {
605         return 0;
606     }
607     buflen = sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr);
608     buf = (char *)tls_mem_alloc(buflen);
609     if (!buf) {
610         return 0;
611     }
612     err = tls_hostif_send_event(buf, buflen, HOSTIF_EVENT_STA_LEAVE);
613     if (err) {
614         tls_mem_free(buf);
615     }
616     return 0;
617 }
618 
tls_hostif_send_event_crc_err(void)619 int tls_hostif_send_event_crc_err(void)
620 {
621     char *buf;
622     u16 buflen;
623     int err;
624 
625     err = tls_hostif_send_event_port_check();
626     if (err) {
627         return 0;
628     }
629     buflen = sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr);
630     buf = (char *)tls_mem_alloc(buflen);
631     if (!buf) {
632         return 0;
633     }
634     err = tls_hostif_send_event(buf, buflen, HOSTIF_EVENT_CRC_ERR);
635     if (err) {
636         tls_mem_free(buf);
637     }
638     return 0;
639 }
640 
tls_hostif_send_event_tx_fail(void)641 int tls_hostif_send_event_tx_fail(void)
642 {
643     char *buf;
644     u16 buflen;
645     int err;
646 
647     err = tls_hostif_send_event_port_check();
648     if (err) {
649         return 0;
650     }
651     buflen = sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr);
652     buf = (char *)tls_mem_alloc(buflen);
653     if (!buf) {
654         return 0;
655     }
656     err = tls_hostif_send_event(buf, buflen, HOSTIF_EVENT_TX_ERR);
657     if (err) {
658         tls_mem_free(buf);
659     }
660     return 0;
661 }
662 
tls_hostif_send_event_tcp_conn(u8 socket,u8 res)663 int tls_hostif_send_event_tcp_conn(u8 socket, u8 res)
664 {
665     char *buf;
666     u16 buflen;
667     int err;
668 
669     err = tls_hostif_send_event_port_check();
670     if (err) {
671         return 0;
672     }
673     buflen = sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr) + TWO;
674     buf = (char *)tls_mem_alloc(buflen);
675     if (!buf) {
676         return 0;
677     }
678     buf[TEN + TWO] = socket;
679     buf[TEN + THREE] = res;
680 
681     err = tls_hostif_send_event(buf, buflen, HOSTIF_EVENT_TCP_CONN);
682     if (err) {
683         tls_mem_free(buf);
684     }
685     return 0;
686 }
687 
tls_hostif_send_event_tcp_join(u8 socket)688 int tls_hostif_send_event_tcp_join(u8 socket)
689 {
690     char *buf;
691     u16 buflen;
692     int err;
693 
694     err = tls_hostif_send_event_port_check();
695     if (err) {
696         return 0;
697     }
698     buflen = sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr) + 1;
699     buf = (char *)tls_mem_alloc(buflen);
700     if (!buf) {
701         return 0;
702     }
703     buf[TEN + TWO] = socket;
704 
705     err = tls_hostif_send_event(buf, buflen, HOSTIF_EVENT_TCP_JOIN);
706     if (err) {
707         tls_mem_free(buf);
708     }
709     return 0;
710 }
711 
tls_hostif_send_event_tcp_dis(u8 socket)712 int tls_hostif_send_event_tcp_dis(u8 socket)
713 {
714     char *buf;
715     u16 buflen;
716     int err;
717 
718     err = tls_hostif_send_event_port_check();
719     if (err) {
720         return 0;
721     }
722     buflen = sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr) + 1;
723     buf = (char *)tls_mem_alloc(buflen);
724     if (!buf) {
725         return 0;
726     }
727     buf[TEN + TWO] = socket;
728 
729     err = tls_hostif_send_event(buf, buflen, HOSTIF_EVENT_TCP_DIS);
730     if (err) {
731         tls_mem_free(buf);
732     }
733     return 0;
734 }
735 
tls_hostif_send_event_scan_cmplt(struct tls_scan_bss_t * scan_res,enum tls_cmd_mode cmd_mode)736 int tls_hostif_send_event_scan_cmplt(struct tls_scan_bss_t *scan_res,
737     enum tls_cmd_mode cmd_mode)
738 {
739     char *buf = NULL;
740     u32 buflen, remain_len;
741     int err = 0;
742     int i, j;
743     struct tls_bss_info_t *bss_info;
744     char *p;
745     u8 hostif_type;
746     u32 strlen;
747 
748     if (scan_res == NULL) {
749         return -1;
750     }
751 
752     switch (cmd_mode) {
753         case CMD_MODE_UART0_ATCMD:
754         case CMD_MODE_UART1_ATCMD:
755             buf = (char *)tls_mem_alloc(TWO_THOUSAND_AND_FIVE_HUNRED);
756             if (!buf) {
757                 return 0;
758             }
759             p = buf;
760             buflen = sprintf(p, "+OK=");
761             p += buflen;
762             bss_info = scan_res->bss;
763             for (i = 0; i < scan_res->count; i++) {
764                 strlen = sprintf(p, "%02X%02X%02X%02X%02X%02X, %u, %u, %u,\"",
765                         bss_info->bssid[0], bss_info->bssid[1], bss_info->bssid[TWO],
766                         bss_info->bssid[THREE], bss_info->bssid[FOUR], bss_info->bssid[FIVE],
767                         bss_info->mode, bss_info->channel, bss_info->privacy);
768                 buflen += strlen;
769                 p = buf + buflen;
770                 for (j = 0; j < bss_info->ssid_len; j++) {
771                     strlen = sprintf(p, "%c", bss_info->ssid[j]);
772                     buflen += strlen;
773                     p = buf + buflen;
774                 }
775                 strlen = sprintf(p, "\",%d\r\n", (signed char)bss_info->rssi);
776                 buflen += strlen;
777                 p = buf + buflen;
778                 bss_info++;
779             }
780             if (cmd_mode == CMD_MODE_UART0_ATCMD) {
781                 hostif_type = HOSTIF_MODE_UART0;
782             } else {
783                 hostif_type = HOSTIF_MODE_UART1_LS;
784             }
785             err = tls_hostif_process_cmdrsp(hostif_type, buf, buflen);
786             break;
787         default:
788             break;
789     }
790     if (err && buf) {
791         tls_mem_free(buf);
792     }
793 
794     return 0;
795 }
796 
tls_hostif_tx_timeout(void * ptmr,void * parg)797 void tls_hostif_tx_timeout(void *ptmr, void *parg)
798 {
799     struct tls_hostif *hif = (struct tls_hostif *)parg;
800 
801     if (hif->hostif_mode == HOSTIF_MODE_HSPI) {
802         if (hif->uart_send_tx_msg_callback != NULL) {
803             hif->uart_send_tx_msg_callback(HOSTIF_MODE_HSPI, NULL, FALSE);
804         }
805     } else if (hif->hostif_mode == HOSTIF_MODE_UART0) {
806         if (hif->uart_send_tx_msg_callback != NULL) {
807             hif->uart_send_tx_msg_callback(HOSTIF_MODE_UART0, NULL, FALSE);
808         }
809     } else if ((hif->hostif_mode == HOSTIF_MODE_UART1_LS) ||
810                 (hif->hostif_mode == HOSTIF_MODE_UART1_HS)) {
811         if (hif->uart_send_tx_msg_callback != NULL) {
812             hif->uart_send_tx_msg_callback(hif->hostif_mode, NULL, FALSE);
813         }
814     } else {
815         ;
816     }
817 }
818 
hostif_wscan_cmplt(void)819 void hostif_wscan_cmplt(void)
820 {
821     char *buf;
822     u32 buflen;
823     int err;
824     enum tls_cmd_mode cmd_mode;
825     struct tls_hostif *hif = tls_get_hostif();
826 
827     if (hif->last_scan) {
828         cmd_mode = hif->last_scan_cmd_mode;
829         hif->last_scan = 0;
830 
831         buflen = TWO_THOUSAND;
832         buf = tls_mem_alloc(buflen);
833         if (!buf) {
834             return;
835         }
836         err = tls_wifi_get_scan_rslt((u8 *)buf, buflen);
837         if (err) {
838             tls_mem_free(buf);
839             return;
840         }
841         switch (cmd_mode) {
842             case CMD_MODE_HSPI_RICMD:
843             case CMD_MODE_UART1_RICMD:
844                 tls_hostif_send_event_scan_cmplt((struct tls_scan_bss_t *)buf, cmd_mode);
845                 tls_mem_free(buf);
846                 break;
847             case CMD_MODE_UART0_ATCMD:
848             case CMD_MODE_UART1_ATCMD:
849 #if TLS_CONFIG_RMMS
850             case CMD_MODE_RMMS_ATCMD:
851 #endif
852                 tls_hostif_send_event_scan_cmplt((struct tls_scan_bss_t *)buf, cmd_mode);
853                 tls_mem_free(buf);
854                 hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_WSCAN);
855                 tls_os_sem_release(hif->uart_atcmd_sem);
856                 break;
857             default:
858                 tls_mem_free(buf);
859         }
860     }
861 }
862 #if TLS_CONFIG_UART
863 
864 #define HOSTIF_TASK_STK_SIZE    800
865 #if TLS_OS_FREERTOS
866 u32 hostif_stk[HOSTIF_TASK_STK_SIZE];
867 struct task_parameter wl_task_param_hostif = {
868     .mbox_size = THIRTY + TWO,
869     .name = "uart spi task",
870     .stk_size = HOSTIF_TASK_STK_SIZE,
871     .stk_start = (u8 *)hostif_stk,
872     .task_id = TLS_HOSTIF_TASK_PRIO,
873     .mbox_id = TLS_MBOX_ID_HOSTIF_TASK,
874     .timeo_id = TLS_TIMEO_ID_HOSTIF_TASK,
875 };
876 #elif TLS_OS_LITEOS
877 struct task_parameter wl_task_param_hostif = {
878     .mbox_size = THIRTY + TWO,
879     .name = "uart spi task",
880     .stk_size = HOSTIF_TASK_STK_SIZE,
881     .stk_start = (u8 *)NULL,
882     .task_id = TLS_HOSTIF_TASK_PRIO,
883     .mbox_id = TLS_MBOX_ID_HOSTIF_TASK,
884     .timeo_id = TLS_TIMEO_ID_HOSTIF_TASK,
885 };
886 #endif
887 
tls_hostif_task_init(void)888 int tls_hostif_task_init(void)
889 {
890     return tls_wl_task_run(&wl_task_param_hostif);
891 }
892 #endif
893 
tls_hostif_init(void)894 int tls_hostif_init(void)
895 {
896     struct tls_hostif *hif;
897     int err;
898 
899     u16 transparent_trigger_length;
900     u8 mode;
901 
902     hif= &g_hostif;
903     memset(hif, 0, sizeof(struct tls_hostif));
904     tls_param_get(TLS_PARAM_ID_AUTO_TRIGGER_LENGTH, &transparent_trigger_length, FALSE);
905     hif->uart_atlt = transparent_trigger_length;
906 
907     tls_param_get(TLS_PARAM_ID_USRINTF, (void *)&mode, TRUE);
908     if ((mode == TLS_PARAM_USR_INTF_HSPI) || (mode == TLS_PARAM_USR_INTF_HSDIO)) {
909         hif->hostif_mode = HOSTIF_MODE_HSPI;
910     } else if (mode == TLS_PARAM_USR_INTF_HUART) {
911         hif->hostif_mode = HOSTIF_MODE_UART1_HS;
912     } else if (mode == TLS_PARAM_USR_INTF_LUART) {
913         hif->hostif_mode = HOSTIF_MODE_UART1_LS;
914     } else {
915         hif->hostif_mode = HOSTIF_MODE_HSPI;
916     }
917     err = tls_os_sem_create(&hif->uart_atcmd_sem, 0);
918     if (err) {
919         return err;
920     }
921     err = tls_os_timer_create(&hif->tx_timer,
922                               tls_hostif_tx_timeout,
923                               hif,
924                               SIXTY * HZ,  /* 60 seconds */
925                               TRUE,
926                               NULL);
927     if (!err) {
928         tls_os_timer_start(hif->tx_timer);
929     }
930 #if TLS_CONFIG_UART
931     err = tls_hostif_task_init();
932 #endif
933 
934     return err;
935 }
936 
937 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
tls_hostif_set_recvmit(int socket_num,struct tls_uart_circ_buf * precvmit)938 static void tls_hostif_set_recvmit(int socket_num, struct tls_uart_circ_buf *precvmit)
939 {
940 #if TLS_CONFIG_CMD_USE_RAW_SOCKET
941     TLS_DBGPRT_INFO("socket_num=%d, precvmit=0x%x\n", socket_num, (u32)precvmit);
942     sockrecvmit[socket_num - 1] = precvmit;
943 #else
944     sockrecvmit[socket_num - LWIP_SOCKET_OFFSET] = precvmit;
945 #endif
946 }
947 
alloc_recvmit(int socket_num)948 static void alloc_recvmit(int socket_num)
949 {
950     char *buf;
951     struct tls_uart_circ_buf *precvmit = tls_hostif_get_recvmit(socket_num);
952     if (precvmit != NULL) {
953         return;
954     }
955     precvmit = tls_mem_alloc(sizeof(struct tls_uart_circ_buf));
956     if (precvmit == NULL) {
957         return;
958     }
959     memset(precvmit, 0, sizeof(struct tls_uart_circ_buf));
960     buf = tls_mem_alloc(TLS_SOCKET_RECV_BUF_SIZE);
961     if (buf == NULL) {
962         tls_mem_free(precvmit);
963         precvmit = NULL;
964         tls_hostif_set_recvmit(socket_num, precvmit);
965         return;
966     }
967     precvmit->buf = (u8 *)buf;
968     tls_hostif_set_recvmit(socket_num, precvmit);
969 }
970 
free_recvmit(int socket_num)971 static void free_recvmit(int socket_num)
972 {
973     struct tls_uart_circ_buf *precvmit = tls_hostif_get_recvmit(socket_num);
974     if (precvmit == NULL) {
975         return;
976     }
977     if (precvmit->buf != NULL) {
978         tls_mem_free((void *)precvmit->buf);
979     }
980     tls_mem_free(precvmit);
981     precvmit = NULL;
982     tls_hostif_set_recvmit(socket_num, precvmit);
983 }
984 
tls_hostif_recv_data(struct tls_hostif_tx_msg * tx_msg)985 int tls_hostif_recv_data(struct tls_hostif_tx_msg *tx_msg)
986 {
987     struct tls_hostif *hif = &g_hostif;
988 
989     if (hif->hostif_mode == HOSTIF_MODE_UART0) {
990         if (hif->uart_send_tx_msg_callback != NULL) {
991             hif->uart_send_tx_msg_callback(HOSTIF_MODE_UART0, tx_msg, FALSE);
992         }
993     } else if ((hif->hostif_mode == HOSTIF_MODE_UART1_LS) ||
994             (hif->hostif_mode == HOSTIF_MODE_UART1_HS)) {
995         if (hif->uart_send_tx_msg_callback != NULL) {
996             hif->uart_send_tx_msg_callback(hif->hostif_mode, tx_msg, FALSE);
997         }
998     } else {
999         /* HSPI */
1000         if (hif->hspi_send_tx_msg_callback != NULL) {
1001             hif->hspi_send_tx_msg_callback(HOSTIF_MODE_HSPI, tx_msg, FALSE);
1002         }
1003     }
1004 
1005     return 0;
1006 }
1007 
hostif_default_socket_setup(void * ptmr,void * parg)1008 static void hostif_default_socket_setup(void *ptmr, void *parg)
1009 {
1010     tls_hostif_close_default_socket();
1011     default_socket = 0;
1012     tls_hostif_create_default_socket();
1013 }
1014 
hostif_socket_rpt(u8 skt_num,u16 datalen,u8 * ipaddr,u16 port,s8 err)1015 static s8 hostif_socket_rpt(u8 skt_num, u16 datalen, u8 *ipaddr, u16 port, s8 err)
1016 {
1017     #undef CMDIND_BUF_SIZE
1018     #define CMDIND_BUF_SIZE 600  // 128
1019     char *cmdind_buf = NULL;
1020     u32 cmdind_size = 0;
1021     struct tls_hostif *hif = tls_get_hostif();
1022 
1023     if (hif->rptmode) {
1024         cmdind_buf = tls_mem_alloc(CMDIND_BUF_SIZE);
1025         if (cmdind_buf) {
1026             cmdind_size = sprintf(cmdind_buf, "+SKTRPT=%d,%d,%d.%d.%d.%d,%d\r\n\r\n",
1027                                   skt_num, datalen, ipaddr[0], ipaddr[1], ipaddr[TWO],
1028                                   ipaddr[THREE], port);
1029             if (tls_hostif_process_cmdrsp(hif->hostif_mode, cmdind_buf, cmdind_size)) {
1030                 tls_mem_free(cmdind_buf);
1031             }
1032         }
1033     }
1034     return ERR_OK;
1035 }
1036 
hostif_socket_recv(u8 skt_num,struct pbuf * p,s8 err)1037 static s8 hostif_socket_recv(u8 skt_num, struct pbuf *p, s8 err)
1038 {
1039     struct tls_hostif_tx_msg *tx_msg;
1040     u8 state;
1041     struct tls_skt_status_ext_t skt_ext;
1042 
1043     tx_msg = tls_hostif_get_tx_msg();
1044     err = tls_cmd_get_socket_state(skt_num, &state, &skt_ext);
1045     if (tx_msg == NULL || err || NETCONN_STATE_NONE == state) {
1046         pbuf_free(p);
1047         return ERR_OK;
1048     } else {
1049         tx_msg->type = HOSTIF_TX_MSG_TYPE_TCP;
1050         tx_msg->u.msg_tcp.p = p;
1051         tx_msg->u.msg_tcp.sock = skt_num;
1052         if (skt_ext.protocol == SOCKET_PROTO_UDP) {
1053             tx_msg->type = HOSTIF_TX_MSG_TYPE_UDP;
1054             tx_msg->u.msg_udp.p = p;
1055             tx_msg->u.msg_udp.sock = skt_num;
1056             tx_msg->u.msg_udp.port = skt_ext.remote_port;
1057             tx_msg->u.msg_udp.localport = skt_ext.local_port;
1058             MEMCPY(ip_2_ip4(&tx_msg->u.msg_udp.ip_addr), &skt_ext.host_ipaddr[0], FOUR);
1059         }
1060         tx_msg->offset = 0;
1061         tx_msg->time = tls_os_get_time();
1062     }
1063 
1064     tls_hostif_recv_data(tx_msg);
1065     return ERR_OK;
1066 }
1067 
1068 #if TLS_CONFIG_CMD_USE_RAW_SOCKET
hostif_default_socket_state_changed(u8 skt_num,u8 event,u8 state)1069 static void  hostif_default_socket_state_changed(u8 skt_num, u8 event, u8 state)
1070 {
1071     TLS_DBGPRT_INFO("event=%d, state=%d\n", event, state);
1072     switch (event) {
1073         case NET_EVENT_TCP_JOINED:
1074             alloc_recvmit(skt_num);
1075             break;
1076         case NET_EVENT_TCP_DISCONNECT:
1077             free_recvmit(skt_num);
1078             break;
1079         case NET_EVENT_TCP_CONNECTED:
1080             alloc_recvmit(skt_num);
1081             break;
1082         case NET_EVENT_TCP_CONNECT_FAILED:
1083             free_recvmit(skt_num);
1084             break;
1085         case NET_EVENT_UDP_START:
1086             alloc_recvmit(skt_num);
1087         default:
1088             break;
1089     }
1090 }
1091 
1092 struct tls_socket_desc skt_desc_def;
1093 #endif
1094 
tls_hostif_create_default_socket(void)1095 int tls_hostif_create_default_socket(void)
1096 {
1097     return;
1098 }
1099 
tls_hostif_close_default_socket(void)1100 int tls_hostif_close_default_socket(void)
1101 {
1102     return;
1103 }
1104 
1105 #if TLS_CONFIG_CMD_USE_RAW_SOCKET
hostif_socket_state_changed_ATCMD(u8 skt_num,u8 event,u8 state)1106 static void  hostif_socket_state_changed_ATCMD(u8 skt_num, u8 event, u8 state)
1107 {
1108     struct tls_hostif *hif = tls_get_hostif();
1109     TLS_DBGPRT_INFO("event=%d, state=%d\n", event, state);
1110     switch (event) {
1111         case NET_EVENT_TCP_JOINED:
1112             alloc_recvmit(skt_num);
1113             tls_hostif_send_event_tcp_join(skt_num);
1114             break;
1115         case NET_EVENT_TCP_DISCONNECT:
1116             free_recvmit(skt_num);
1117             tls_hostif_send_event_tcp_dis(skt_num);
1118             break;
1119         case NET_EVENT_TCP_CONNECTED:
1120             alloc_recvmit(skt_num);
1121             hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_SKCT);
1122             tls_os_sem_release(hif->uart_atcmd_sem);
1123             break;
1124         case NET_EVENT_TCP_CONNECT_FAILED:
1125             free_recvmit(skt_num);
1126             hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_SKCT);
1127             tls_os_sem_release(hif->uart_atcmd_sem);
1128             break;
1129         case NET_EVENT_UDP_START:
1130             alloc_recvmit(skt_num);
1131             hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_SKCT);
1132             tls_os_sem_release(hif->uart_atcmd_sem);
1133             break;
1134         case NET_EVENT_UDP_START_FAILED:
1135             hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_SKCT);
1136             tls_os_sem_release(hif->uart_atcmd_sem);
1137             break;
1138         default:
1139             break;
1140     }
1141 }
1142 
hostif_socket_state_changed_RICMD(u8 skt_num,u8 event,u8 state)1143 static void  hostif_socket_state_changed_RICMD(u8 skt_num, u8 event, u8 state)
1144 {
1145     TLS_DBGPRT_INFO("event=%d, state=%d\n", event, state);
1146     switch (event) {
1147         case NET_EVENT_TCP_JOINED:
1148             tls_hostif_send_event_tcp_join(skt_num);
1149             break;
1150         case NET_EVENT_TCP_DISCONNECT:
1151             tls_hostif_send_event_tcp_dis(skt_num);
1152             break;
1153         case NET_EVENT_TCP_CONNECTED:
1154             tls_hostif_send_event_tcp_conn(skt_num, 1);
1155             break;
1156         case NET_EVENT_TCP_CONNECT_FAILED:
1157             tls_hostif_send_event_tcp_conn(skt_num, 0);
1158             break;
1159         default:
1160             break;
1161     }
1162 }
1163 
1164 struct tls_socket_desc skt_desc;
1165 #endif
1166 
tls_cmd_close_socket(u8 skt_num)1167 int tls_cmd_close_socket(u8 skt_num)
1168 {
1169     int err;
1170 #if TLS_CONFIG_CMD_USE_RAW_SOCKET
1171     err = tls_socket_close(skt_num);
1172 #else
1173     err = closesocket(skt_num);
1174     if (!err) {
1175         FD_CLR(skt_num, &fdatsockets);
1176     }
1177 #endif
1178     if (!err) {
1179         free_recvmit(skt_num);
1180     }
1181 
1182     return err;
1183 }
1184 
tls_cmd_get_socket_status(u8 socket,u8 * buf,u32 bufsize)1185 int tls_cmd_get_socket_status(u8 socket, u8 *buf, u32 bufsize)
1186 {
1187     int err;
1188 #if !TLS_CONFIG_CMD_USE_RAW_SOCKET
1189     struct tls_skt_status_t *skt_status;
1190     struct tls_skt_status_ext_t *skts_ext;
1191     struct sockaddr_in sock_addr;
1192     struct sockaddr_in *peer_addr = (struct sockaddr_in *)&sock_cmdp_addrs[socket - LWIP_SOCKET_OFFSET];
1193     int optval;
1194     int optlen = sizeof(int);
1195     int remain_len;
1196     int s;
1197     socklen_t namelen = sizeof(struct sockaddr_in);
1198 
1199     skt_status = (struct tls_skt_status_t *)buf;
1200     if (bufsize < sizeof(struct tls_skt_status_t)) {
1201         TLS_DBGPRT_ERR("bufsize = %d\n", bufsize);
1202         return ERR_VAL;
1203     }
1204     memset(buf, 0, bufsize);
1205 
1206     remain_len = bufsize - sizeof(u32);
1207     skts_ext = (struct tls_skt_status_ext_t *)(buf + sizeof(u32));
1208     if (!FD_ISSET(socket, &fdatsockets) || getsockname(socket, (struct sockaddr *)&sock_addr, &namelen)) {
1209         TLS_DBGPRT_ERR("skt num = %d\n", socket);
1210         skt_status->socket_cnt = 1;
1211         skts_ext->protocol = SOCKET_PROTO_TCP;
1212         skts_ext->status = NETCONN_STATE_NONE;
1213         skts_ext->socket = socket;
1214         skts_ext->host_ipaddr[0] = 0;
1215         skts_ext->host_ipaddr[1] = 0;
1216         skts_ext->host_ipaddr[TWO] = 0;
1217         skts_ext->host_ipaddr[THREE] = 0;
1218         return ERR_OK;
1219     }
1220     getsockopt(socket, SOL_SOCKET, SO_TYPE, &optval, (socklen_t *)&optlen);
1221     skts_ext->protocol = optval == SOCK_STREAM ? SOCKET_PROTO_TCP : SOCKET_PROTO_UDP;
1222     if (optval == SOCK_STREAM) {    /* tcp */
1223         err = getsockopt(socket, SOL_SOCKET, SO_ACCEPTCONN, &optval, (socklen_t *)&optlen);
1224         if (err) {
1225             optval = 0;
1226         }
1227     }
1228 
1229     if (optval != 1) {    // is udp or tcp client
1230         skt_status->socket_cnt = 1;
1231         skts_ext->socket = socket;
1232         skts_ext->status = NETCONN_STATE_CONNECTED;
1233         if (SOCK_DGRAM == optval) {
1234             err = 0;
1235         } else {
1236             namelen = sizeof(struct sockaddr_in);
1237             err = getpeername(socket, (struct sockaddr *)peer_addr, &namelen);
1238         }
1239 
1240         if (err) {
1241             memset(skts_ext->host_ipaddr, 0, FOUR);
1242             skts_ext->remote_port = 0;
1243             skts_ext->status = NETCONN_STATE_NONE;
1244         } else {
1245             MEMCPY(skts_ext->host_ipaddr, (u8 *)ip_2_ip4(&peer_addr->sin_addr), FOUR);
1246             skts_ext->remote_port = htons(peer_addr->sin_port);
1247         }
1248         skts_ext->local_port = htons(sock_addr.sin_port);
1249     } else {
1250         struct tls_ethif *ethif;
1251         u16 listen_port;
1252         ethif = tls_netif_get_ethif();
1253         skt_status->socket_cnt = 1;
1254         skts_ext->socket = socket;
1255         skts_ext->status = NETCONN_STATE_WAITING;    /* listen */
1256         MEMCPY(skts_ext->host_ipaddr, (char *)(ip_2_ip4(&ethif->ip_addr)), FOUR);
1257         skts_ext->remote_port = 0;
1258         skts_ext->local_port = htons(sock_addr.sin_port);
1259         listen_port = sock_addr.sin_port;
1260         remain_len -= sizeof(struct tls_skt_status_ext_t);
1261 
1262         for (s = LWIP_SOCKET_OFFSET; s < (MEMP_NUM_NETCONN + LWIP_SOCKET_OFFSET); s++) {
1263             if (remain_len < sizeof(struct tls_skt_status_ext_t)) {
1264                 break;
1265             }
1266             if (s == socket) {
1267                 continue;
1268             }
1269             namelen = sizeof(struct sockaddr_in);
1270             err = getsockname(s, (struct sockaddr *)&sock_addr, &namelen);
1271             if (err) {
1272                 continue;
1273             }
1274             getsockopt(s, SOL_SOCKET, SO_TYPE, &optval, (socklen_t *)&optlen);
1275             if (optval != SOCK_STREAM) {
1276                 continue;
1277             }
1278             err = getsockopt(s, SOL_SOCKET, SO_ACCEPTCONN, &optval, (socklen_t *)&optlen);
1279             if (err || optval) {
1280                 continue;
1281             }
1282             if (listen_port != sock_addr.sin_port) {
1283                 continue;
1284             }
1285             skts_ext++;
1286             skts_ext->status = NETCONN_STATE_CONNECTED; /* connect */
1287             skt_status->socket_cnt++;
1288             namelen = sizeof(struct sockaddr_in);
1289             err = getpeername(s, (struct sockaddr *)peer_addr, &namelen);
1290             if (err) {
1291                 memset(skts_ext->host_ipaddr, 0, FOUR);
1292                 skts_ext->remote_port = 0;
1293                 skts_ext->status = NETCONN_STATE_NONE;
1294             } else {
1295                 MEMCPY(skts_ext->host_ipaddr, (u8 *)ip_2_ip4(&peer_addr->sin_addr), FOUR);
1296                 skts_ext->remote_port = htons(peer_addr->sin_port);
1297             }
1298             skts_ext->local_port = htons(listen_port);
1299             skts_ext->socket = s;
1300             skts_ext->protocol = SOCKET_PROTO_TCP;
1301             remain_len -= sizeof(struct tls_skt_status_ext_t);
1302         }
1303     }
1304     err = 0;
1305 #else
1306 #endif
1307     return err;
1308 }
1309 
tls_cmd_get_socket_state(u8 socket,u8 * state,struct tls_skt_status_ext_t * skt_ext)1310 int tls_cmd_get_socket_state(u8 socket, u8 *state, struct tls_skt_status_ext_t *skt_ext)
1311 {
1312     struct tls_skt_status_t *skt_status = 0;
1313     struct tls_skt_status_ext_t *ext;
1314     int err;
1315     u32 buflen;
1316     buflen = sizeof(struct tls_skt_status_ext_t) * FIVE + sizeof(u32);
1317     skt_status = (struct tls_skt_status_t *)tls_mem_alloc(buflen);
1318     if (skt_status == NULL) {
1319         return NETCONN_STATE_NONE;
1320     }
1321     memset(skt_status, 0, buflen);
1322     err = tls_cmd_get_socket_status(socket, (u8 *)skt_status, buflen);
1323     if (err) {
1324         *state = NETCONN_STATE_NONE;
1325     } else {
1326         ext = &skt_status->skts_ext[0];
1327         if (skt_ext != NULL) {
1328             MEMCPY(skt_ext, ext, sizeof(struct tls_skt_status_ext_t));
1329         }
1330         *state = ext->status;
1331     }
1332     tls_mem_free(skt_status);
1333     return err;
1334 }
1335 
tls_cmd_get_default_socket(void)1336 u8 tls_cmd_get_default_socket(void)
1337 {
1338     return default_socket;
1339 }
1340 
tls_cmd_set_default_socket(u8 socket)1341 int tls_cmd_set_default_socket(u8 socket)
1342 {
1343 #if TLS_CONFIG_CMD_USE_RAW_SOCKET
1344     if (socket < 1 || socket > TWENTY) {
1345         return -1;
1346     }
1347 #endif
1348     default_socket = socket;
1349     return 0;
1350 }
1351 
1352 #endif /* TLS_CONFIG_SOCKET_RAW */
1353 
tls_hostif_wjoin_success(void)1354 static void tls_hostif_wjoin_success(void)
1355 {
1356     struct tls_hostif *hif = tls_get_hostif();
1357     if (hif->last_join) {
1358         hif->last_join = 0;
1359         if ((hif->last_join_cmd_mode == CMD_MODE_HSPI_RICMD) ||
1360                 (hif->last_join_cmd_mode == CMD_MODE_UART1_RICMD)) {
1361             tls_hostif_send_event_wjoin_success();
1362         } else if (hif->last_join_cmd_mode == CMD_MODE_UART1_ATCMD) {
1363             hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_WJOIN);
1364             tls_os_sem_release(hif->uart_atcmd_sem);
1365         } else if (hif->last_join_cmd_mode == CMD_MODE_UART0_ATCMD) {
1366             hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_WJOIN);
1367             tls_os_sem_release(hif->uart_atcmd_sem);
1368 #if TLS_CONFIG_RMMS
1369         } else if (hif->last_join_cmd_mode == CMD_MODE_RMMS_ATCMD) {
1370             hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_WJOIN);
1371             tls_os_sem_release(hif->uart_atcmd_sem);
1372 #endif
1373         } else {
1374             ;
1375         }
1376     }
1377 }
1378 
tls_hostif_wjoin_failed(void)1379 static void tls_hostif_wjoin_failed(void)
1380 {
1381     struct tls_hostif *hif = tls_get_hostif();
1382     if (hif->last_join) {
1383         if ((hif->last_join_cmd_mode == CMD_MODE_HSPI_RICMD) ||
1384             (hif->last_join_cmd_mode == CMD_MODE_UART1_RICMD)) {
1385             tls_hostif_send_event_wjoin_failed();
1386         } else if (hif->last_join_cmd_mode == CMD_MODE_UART1_ATCMD) {
1387             hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_WJOIN);
1388             tls_os_sem_release(hif->uart_atcmd_sem);
1389         } else if (hif->last_join_cmd_mode == CMD_MODE_UART0_ATCMD) {
1390             hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_WJOIN);
1391             tls_os_sem_release(hif->uart_atcmd_sem);
1392 #if TLS_CONFIG_RMMS
1393         } else if (hif->last_join_cmd_mode == CMD_MODE_RMMS_ATCMD) {
1394             hif->uart_atcmd_bits |= (1 << UART_ATCMD_BIT_WJOIN);
1395             tls_os_sem_release(hif->uart_atcmd_sem);
1396 #endif
1397         } else {
1398             ;
1399         }
1400         hif->last_join = 0;
1401     }
1402 }
1403 
tls_hostif_net_status_changed(u8 status)1404 static void tls_hostif_net_status_changed(u8 status)
1405 {
1406     return;
1407 }
1408 
1409 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
tls_hostif_set_net_status_callback(void)1410 int tls_hostif_set_net_status_callback(void)
1411 {
1412     return;
1413 }
1414 #endif
1415 
1416 #if TLS_CONFIG_HTTP_CLIENT_TASK
1417 u8  pSession_flag = 0;
tls_hostif_http_client_recv_callback(HTTP_SESSION_HANDLE pSession,CHAR * data,u32 totallen,u32 datalen)1418 void tls_hostif_http_client_recv_callback(HTTP_SESSION_HANDLE pSession, CHAR *data,
1419     u32 totallen, u32 datalen)
1420 {
1421     #undef CMDIND_BUF_SIZE
1422     #define CMDIND_BUF_SIZE 64
1423     char *cmdind_buf = NULL;
1424     int err1 = 0;
1425     u32 cmdind_size = 0;
1426 
1427     struct tls_hostif *hif = tls_get_hostif();
1428     if ((hif->rptmode) || (HOSTIF_MODE_HSPI == hif->hostif_mode)) {
1429         if (pSession_flag == 0) {
1430             cmdind_buf = tls_mem_alloc(CMDIND_BUF_SIZE);
1431             if (cmdind_buf) {
1432                 cmdind_size = sprintf(cmdind_buf, "+HTTPCRPT=%d,%d\r\n\r\n", pSession, totallen);
1433                 err1 = tls_hostif_process_cmdrsp(hif->hostif_mode, cmdind_buf, cmdind_size);
1434                 if (err1) {
1435                     tls_mem_free(cmdind_buf);
1436                     cmdind_buf = NULL;
1437                     tls_mem_free(data);
1438                     return;
1439                 }
1440                 pSession_flag = 1;
1441             } else {
1442                 tls_mem_free(data);
1443             }
1444         }
1445         err1 = tls_hostif_process_cmdrsp(hif->hostif_mode, (char *)data, datalen);
1446         if (err1) {
1447             tls_mem_free(data);
1448         }
1449     } else {
1450         tls_mem_free(data);
1451     }
1452 }
1453 
tls_hostif_http_client_err_callback(HTTP_SESSION_HANDLE pSession,int err)1454 void tls_hostif_http_client_err_callback(HTTP_SESSION_HANDLE pSession, int err)
1455 {
1456     #undef CMDIND_BUF_SIZE
1457     #define CMDIND_BUF_SIZE 64
1458     char *cmdind_buf = NULL;
1459     int err1 = 0;
1460     u32 cmdind_size = 0;
1461 
1462     struct tls_hostif *hif = tls_get_hostif();
1463 
1464     if ((hif->rptmode) || (HOSTIF_MODE_HSPI == hif->hostif_mode)) {
1465         cmdind_buf = tls_mem_alloc(CMDIND_BUF_SIZE);
1466         if (cmdind_buf) {
1467             cmdind_size = sprintf(cmdind_buf, "+HTTPCERRRPT=%d,%d\r\n\r\n", pSession, err);
1468             err1 = tls_hostif_process_cmdrsp(hif->hostif_mode, cmdind_buf, cmdind_size);
1469             if (err1) {
1470                 tls_mem_free(cmdind_buf);
1471                 cmdind_buf = NULL;
1472             }
1473         }
1474     }
1475 }
1476 #endif
1477 
atcmd_filter_quotation(u8 ** keyInfo,u8 * inbuf)1478 int atcmd_filter_quotation(u8 **keyInfo, u8 *inbuf)
1479 {
1480     u8 len = strlen((char *)inbuf);
1481     int i;
1482     if (*inbuf == '"') {    /* argument such as "xxxx" */
1483         inbuf++;     /* skip 1st <"> */
1484         len -= 1;
1485         *keyInfo = inbuf;
1486         if ((*(inbuf + len - 1) == '"') && (*(inbuf + len) == '\0')) {
1487             *(inbuf + len - 1) = '\0';
1488             len -= 1;
1489             for (i = 0; i < len; i++) {
1490                 if (inbuf[i] == '\\') {
1491                     len -= 1;
1492                     memcpy(inbuf + i, inbuf + i + 1, len - i);
1493                 }
1494             }
1495             inbuf[len] = '\0';
1496         } else {
1497             return 1;
1498         }
1499     } else {
1500         *keyInfo = inbuf;
1501     }
1502 
1503     return 0;
1504 }
1505 
1506 #if 1
z_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1507 int z_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1508     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1509 {
1510     tls_cmd_reset_sys();
1511     return 0;
1512 }
1513 
e_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1514 int e_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1515     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1516 {
1517     struct tls_hostif *hif = tls_get_hostif();
1518     if (hif->uart_insdisp) {
1519         hif->uart_insdisp = 0;
1520     } else {
1521         hif->uart_insdisp = 1;
1522     }
1523     return 0;
1524 }
1525 
ents_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1526 int ents_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1527     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1528 {
1529     int ret = 0;
1530     struct tls_cmd_ps_t ps;
1531 
1532     if (cmd->ps.ps_type > TWO || (cmd->ps.wake_type > 1)) {
1533         return -CMD_ERR_INV_PARAMS;
1534     }
1535 
1536     if ((cmd->ps.ps_type == 1 || cmd->ps.ps_type == TWO)
1537         && (((cmd->ps.wake_type == 1)
1538         && (cmd->ps.wake_time > SIXTY_FIVE_THOUSAND_FIVE_HUNDRED_AND_THIRTY_FIVE
1539         || cmd->ps.wake_time < ONE_THOUSAND))
1540         || (cmd->ps.delay_time < ONE_HUNDRED || cmd->ps.delay_time > TEN_THOUSAND))) {
1541         return -CMD_ERR_INV_PARAMS;
1542     }
1543 
1544     ps.ps_type=cmd->ps.ps_type;
1545     ps.wake_type = cmd->ps.wake_type;
1546     ps.delay_time=cmd->ps.delay_time;
1547     ps.wake_time = cmd->ps.wake_time;
1548     ret = tls_cmd_ps(&ps);
1549     return ret ? -CMD_ERR_OPS : 0;
1550 }
1551 
rstf_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1552 int rstf_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1553     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1554 {
1555     return;
1556 }
1557 
pmtf_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1558 int pmtf_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1559     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1560 {
1561     int ret = 0;
1562     ret = tls_cmd_pmtf();
1563     return ret ? -CMD_ERR_OPS : 0;
1564 }
1565 
ioc_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1566 int ioc_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1567     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1568 {
1569     return 0;
1570 }
1571 
wleav_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1572 int wleav_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1573     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1574 {
1575     int ret = 0;
1576     if (cmd->wreg.region == TWO) {
1577         ret = tls_cmd_disconnect_network(IEEE80211_MODE_AP);
1578     } else {
1579         ret = tls_cmd_disconnect_network(IEEE80211_MODE_INFRA);
1580     }
1581     return ret ? -CMD_ERR_FLASH : 0;
1582 }
1583 
1584 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
lkstt_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1585 int lkstt_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1586     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1587 {
1588     struct tls_cmd_link_status_t lk;
1589 
1590     memset(&lk, 0, sizeof(struct tls_cmd_link_status_t));
1591     tls_cmd_get_link_status(&lk);
1592     cmdrsp->lkstt.status = lk.status;
1593     if (cmdrsp->lkstt.status == 0) {
1594         return 0;
1595     } else {
1596         memcpy(cmdrsp->lkstt.ip, lk.ip, FOUR);
1597         memcpy(cmdrsp->lkstt.nm, lk.netmask, FOUR);
1598         memcpy(cmdrsp->lkstt.gw, lk.gw, FOUR);
1599         memcpy(cmdrsp->lkstt.dns1, lk.dns1, FOUR);
1600         memcpy(cmdrsp->lkstt.dns2, lk.dns2, FOUR);
1601     }
1602     return 0;
1603 }
1604 
skstt_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1605 int skstt_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1606     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1607 {
1608     int ret = 0, i = 0;
1609     u32 buflen;
1610     u8 socket = cmd->skstt.socket;
1611     struct tls_skt_status_t *skt_status = 0;
1612     if (set_opt) {
1613 #if TLS_CONFIG_CMD_USE_RAW_SOCKET
1614         if (cmd->skclose.socket < 1 || cmd->skclose.socket > TLS_MAX_NETCONN_NUM) {
1615             return -CMD_ERR_INV_PARAMS;
1616         }
1617 #endif
1618         buflen = sizeof(struct tls_skt_status_ext_t) * FIVE + sizeof(u32);
1619         skt_status = (struct tls_skt_status_t *)tls_mem_alloc(buflen);
1620         if (!skt_status) {
1621             return -CMD_ERR_MEM;
1622         } else {
1623             memset(skt_status, 0, buflen);
1624             ret = tls_cmd_get_socket_status(socket, (u8 *)skt_status, buflen);
1625             if (ret) {
1626                 return -CMD_ERR_INV_PARAMS;
1627             }
1628             cmdrsp->skstt.number = skt_status->socket_cnt;
1629             for (i = 0; i < skt_status->socket_cnt; i++) {
1630                 cmdrsp->skstt.ext[i].status = skt_status->skts_ext[i].status;
1631                 cmdrsp->skstt.ext[i].socket= skt_status->skts_ext[i].socket;
1632                 memcpy(cmdrsp->skstt.ext[i].host_ipaddr, skt_status->skts_ext[i].host_ipaddr, FOUR);
1633                 cmdrsp->skstt.ext[i].remote_port = skt_status->skts_ext[i].remote_port;
1634                 cmdrsp->skstt.ext[i].local_port = skt_status->skts_ext[i].local_port;
1635             }
1636             if (skt_status) {
1637                 tls_mem_free(skt_status);
1638             }
1639         }
1640     }
1641 
1642     return ret ? -CMD_ERR_OPS : 0;
1643 }
1644 
skcls_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1645 int skcls_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1646     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1647 {
1648     int ret = 0;
1649     if (set_opt) {
1650 #if TLS_CONFIG_CMD_USE_RAW_SOCKET
1651         if (cmd->skclose.socket < 1 || cmd->skclose.socket>TLS_MAX_NETCONN_NUM) {
1652             return -CMD_ERR_INV_PARAMS;
1653         }
1654 #endif
1655         ret = tls_cmd_close_socket(cmd->skclose.socket);
1656     }
1657 
1658     return ret ? -CMD_ERR_OPS : 0;
1659 }
1660 
sksdf_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1661 int sksdf_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1662     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1663 {
1664     if (set_opt) {
1665         if (cmd->sksdf.socket < 1 || cmd->sksdf.socket > TWENTY) {
1666             return -CMD_ERR_INV_PARAMS;
1667         }
1668         tls_cmd_set_default_socket(cmd->sksdf.socket);
1669     }
1670 
1671     return 0;
1672 }
1673 
skrcv_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1674 int skrcv_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1675     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1676 {
1677     u32 socket = 0, size = 0, maxsize;
1678     u8 state;
1679     if (set_opt) {
1680         socket = cmd->skrcv.socket;
1681         size = cmd->skrcv.size;
1682 #if TLS_CONFIG_CMD_USE_RAW_SOCKET
1683         if (socket < 1 || socket > TLS_MAX_NETCONN_NUM) {
1684             return -CMD_ERR_INV_PARAMS;
1685         }
1686 #endif
1687         if (size > ONE_THOUSAND_AND_TWENTY_FOUR) {
1688             size = ONE_THOUSAND_AND_TWENTY_FOUR;
1689         }
1690         tls_cmd_get_socket_state(socket, &state, NULL);
1691         if (state != NETCONN_STATE_CONNECTED) {
1692             return -CMD_ERR_INV_PARAMS;
1693         } else {
1694             maxsize = size;
1695             cmdrsp->skrcv.socket = socket;
1696             cmdrsp->skrcv.size = maxsize;
1697         }
1698     }
1699 
1700     return 0;
1701 }
1702 
skrptm_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1703 int skrptm_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1704     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1705 {
1706     int ret = 0;
1707     struct tls_hostif *hif = tls_get_hostif();
1708     if (set_opt) {
1709         if (cmd->skrptm.mode > 1) {
1710             return -CMD_ERR_INV_PARAMS;
1711         }
1712         hif->rptmode = cmd->skrptm.mode;
1713     } else {
1714         cmdrsp->skrptm.mode = hif->rptmode;
1715     }
1716 
1717     return ret ? -CMD_ERR_OPS : 0;
1718 }
1719 
sksrcip_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1720 int sksrcip_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1721     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1722 {
1723     return;
1724 }
1725 
skghbn_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1726 int skghbn_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1727     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1728 {
1729     u8 *ipstr = NULL;
1730     int i = 0;
1731     struct hostent* HostEntry;
1732     if (set_opt) {
1733         ipstr = cmd->skghbn.ipstr;
1734         HostEntry = gethostbyname((char *)ipstr);
1735         if (HostEntry) {
1736             for (i = 0; i < FOUR; i++) {
1737                 cmdrsp->skghbn.h_addr_list[i] = *(HostEntry->h_addr_list[0] + i);
1738             }
1739         } else {
1740             return -CMD_ERR_INV_PARAMS;
1741         }
1742     }
1743 
1744     return 0;
1745 }
1746 
1747 #endif
1748 
wprt_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1749 int wprt_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1750     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1751 {
1752     int ret = 0;
1753     if (set_opt) {
1754         if (cmd->wprt.type > THREE) {
1755             return -CMD_ERR_INV_PARAMS;
1756         }
1757         ret = tls_cmd_set_wireless_mode(cmd->wprt.type, update_flash);
1758     } else {
1759         ret = tls_cmd_get_wireless_mode(&cmdrsp->wprt.type);
1760     }
1761     return ret ? -CMD_ERR_OPS : 0;
1762 }
1763 
ssid_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1764 int ssid_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1765     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1766 {
1767     int ret = 0;
1768     struct tls_cmd_ssid_t ssid;
1769 
1770     memset(&ssid, 0, sizeof(struct tls_cmd_ssid_t));
1771     if (set_opt) {
1772         if ((cmd->ssid.ssid_len > (THIRTY + TWO)) || (cmd->ssid.ssid_len == 0)) {
1773             return -CMD_ERR_INV_PARAMS;
1774         }
1775         ssid.ssid_len = cmd->ssid.ssid_len;
1776         MEMCPY(ssid.ssid, cmd->ssid.ssid, ssid.ssid_len);
1777         ret = tls_cmd_set_ssid(&ssid, update_flash);
1778     } else {
1779         ret = tls_cmd_get_ssid(&ssid);
1780         if (!ret) {
1781             cmdrsp->ssid.ssid_len = ssid.ssid_len;
1782             MEMCPY(cmdrsp->ssid.ssid, ssid.ssid, ssid.ssid_len);
1783         }
1784     }
1785     return ret ? -CMD_ERR_OPS : 0;
1786 }
1787 
key_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1788 int key_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1789     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1790 {
1791     int ret = 0;
1792     struct tls_cmd_key_t key;
1793     if (set_opt) {
1794         if (cmd->key.format > 1 || cmd->key.index > FOUR || cmd->key.key_len > (SIXTY + FOUR)) {
1795             return -CMD_ERR_INV_PARAMS;
1796         }
1797         key.format = cmd->key.format;
1798         key.index = cmd->key.index;
1799         memcpy(key.key, cmd->key.key, cmd->key.key_len);
1800         key.key_len = cmd->key.key_len;
1801         ret = tls_cmd_set_key(&key, update_flash);
1802     } else {
1803         ret = tls_cmd_get_key(&key);
1804         if (!ret) {
1805             cmdrsp->key.format = key.format;
1806             cmdrsp->key.index = key.index;
1807             cmdrsp->key.key_len = key.key_len;
1808             memcpy(cmdrsp->key.key, key.key, cmdrsp->key.key_len);
1809         }
1810     }
1811 
1812     return ret ? -CMD_ERR_OPS : 0;
1813 }
1814 
encry_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1815 int encry_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1816     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1817 {
1818     int ret = 0;
1819     if (set_opt) {
1820         if (cmd->encrypt.mode > EIGHT) {
1821             return -CMD_ERR_INV_PARAMS;
1822         }
1823         ret = tls_cmd_set_encrypt(cmd->encrypt.mode, update_flash);
1824     } else {
1825         ret = tls_cmd_get_encrypt(&cmdrsp->encrypt.mode);
1826     }
1827 
1828     return ret ? -CMD_ERR_OPS : 0;
1829 }
1830 
bssid_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1831 int bssid_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1832     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1833 {
1834     int ret = 0;
1835     struct tls_cmd_bssid_t bssid;
1836     if (set_opt) {
1837         if (cmd->bssid.enable > 1) {
1838             return -CMD_ERR_INV_PARAMS;
1839         }
1840         bssid.enable = cmd->bssid.enable;
1841         if (bssid.enable == 1) {
1842             memcpy(bssid.bssid, cmd->bssid.bssid, SIX);
1843         }
1844         ret = tls_cmd_set_bssid(&bssid, update_flash);
1845     } else {
1846         ret = tls_cmd_get_bssid(&bssid);
1847         cmdrsp->bssid.enable = bssid.enable;
1848         memcpy(cmdrsp->bssid.bssid, bssid.bssid, SIX);
1849     }
1850 
1851     return ret ? -CMD_ERR_OPS : 0;
1852 }
1853 
brdssid_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1854 int brdssid_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1855     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1856 {
1857     int ret = 0;
1858     if (set_opt) {
1859         if (cmd->brd_ssid.enable > 1) {
1860             return -CMD_ERR_INV_PARAMS;
1861         }
1862         ret = tls_cmd_set_hide_ssid(cmd->brd_ssid.enable, update_flash);
1863     } else {
1864         ret = tls_cmd_get_hide_ssid(&cmdrsp->brd_ssid.enable);
1865     }
1866 
1867     return ret ? -CMD_ERR_OPS : 0;
1868 }
1869 
cntparam_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1870 int cntparam_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1871     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1872 {
1873     struct tls_param_ssid original_ssid;
1874     struct tls_param_original_key original_key;
1875     struct tls_cmd_bssid_t bssid;
1876 
1877     memset(&original_ssid, 0, sizeof(struct tls_param_ssid));
1878     memset(&original_key, 0, sizeof(struct tls_param_original_key));
1879     memset(&bssid, 0, sizeof(struct tls_cmd_bssid_t));
1880     tls_cmd_get_bssid(&bssid);
1881     tls_cmd_get_original_key(&original_key);
1882     if (bssid.enable) {
1883         cmdrsp->cntparam_bssid_en.bssid_enable = bssid.enable;
1884         memcpy(cmdrsp->cntparam_bssid_en.bssid, bssid.bssid, SIX);
1885         cmdrsp->cntparam_bssid_en.key_len = original_key.key_length;
1886         memcpy(cmdrsp->cntparam_bssid_en.key, original_key.psk, original_key.key_length);
1887     } else {
1888         tls_cmd_get_original_ssid(&original_ssid);
1889         cmdrsp->cntparam_bssid_dis.bssid_enable = bssid.enable;
1890         cmdrsp->cntparam_bssid_dis.ssid_len = original_ssid.ssid_len;
1891         memcpy(cmdrsp->cntparam_bssid_dis.ssid_key, original_ssid.ssid, original_ssid.ssid_len);
1892         cmdrsp->cntparam_bssid_dis.key_len = original_key.key_length;
1893         memcpy(cmdrsp->cntparam_bssid_dis.ssid_key+cmdrsp->cntparam_bssid_dis.ssid_len,
1894                original_key.psk, original_key.key_length);
1895     }
1896     return 0;
1897 }
1898 
chl_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1899 int chl_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1900     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1901 {
1902     int ret = 0;
1903     if (set_opt) {
1904         if ((cmd->channel.enable > 1) || ((cmd->channel.enable == 1)
1905            && ((cmd->channel.channel > (TEN + FOUR))
1906            || (cmd->channel.channel < 1)))) {
1907             return -CMD_ERR_INV_PARAMS;
1908         }
1909         if (cmd->channel.enable == 0) {
1910             cmd->channel.channel = 1;
1911         }
1912         ret = tls_cmd_set_channel(cmd->channel.channel, cmd->channel.enable, update_flash);
1913     } else {
1914         ret = tls_cmd_get_channel(&cmdrsp->channel.channel, &cmdrsp->channel.enable);
1915     }
1916 
1917     return ret ? -CMD_ERR_OPS : 0;
1918 }
1919 
chll_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1920 int chll_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1921     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1922 {
1923     if (set_opt) {
1924         if ((cmd->channel_list.channellist & (~0x3fff)) || (cmd->channel_list.channellist == 0)) {
1925             return -CMD_ERR_INV_PARAMS;
1926         }
1927         tls_cmd_set_channellist(cmd->channel_list.channellist, update_flash);
1928     } else {
1929         tls_cmd_get_channellist((u16 *)&(cmdrsp->channel_list.channellist));
1930     }
1931 
1932     return 0;
1933 }
1934 
wreg_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1935 int wreg_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1936     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1937 {
1938     if (set_opt) {
1939         tls_cmd_set_region(cmd->wreg.region, update_flash);
1940     } else {
1941         tls_cmd_get_region((u16 *)&cmdrsp->wreg.region);
1942     }
1943     return 0;
1944 }
1945 
wbgr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1946 int wbgr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1947     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1948 {
1949     int ret = 0;
1950     int limit_rate;
1951     struct tls_cmd_wl_hw_mode_t hw_mode;
1952     memset(&hw_mode, 0, sizeof(struct tls_cmd_wl_hw_mode_t));
1953 
1954     if (set_opt) {
1955         if (cmd->wbgr.mode > THREE || cmd->wbgr.rate > (TWENTY + EIGHT)) {
1956             return -CMD_ERR_INV_PARAMS;
1957         }
1958         limit_rate = (cmd->wbgr.mode == 1) ? THREE : ((cmd->wbgr.mode == TWO)
1959                      ? (TWENTY + EIGHT) : (TEN + 1));
1960         hw_mode.max_rate = (cmd->wbgr.rate > limit_rate) ? limit_rate: cmd->wbgr.rate;
1961         hw_mode.hw_mode = cmd->wbgr.mode;
1962         ret = tls_cmd_set_hw_mode(&hw_mode, update_flash);
1963     } else {
1964         ret = tls_cmd_get_hw_mode(&hw_mode);
1965         cmdrsp->wbgr.mode = hw_mode.hw_mode;
1966         cmdrsp->wbgr.rate = hw_mode.max_rate;
1967     }
1968     return ret ? -CMD_ERR_OPS : 0;
1969 }
1970 
watc_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1971 int watc_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1972     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1973 {
1974     int ret = 0;
1975     if (set_opt) {
1976         if (cmd->watc.enable > 1) {
1977             return -CMD_ERR_INV_PARAMS;
1978         }
1979         ret = tls_cmd_set_adhoc_create_mode(cmd->watc.enable, update_flash);
1980     } else {
1981         ret = tls_cmd_get_adhoc_create_mode(&cmdrsp->watc.enable);
1982     }
1983 
1984     return ret ? -CMD_ERR_OPS : 0;
1985 }
1986 
wpsm_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)1987 int wpsm_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
1988     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
1989 {
1990     int ret = 0;
1991     if (set_opt) {
1992         if (cmd->wpsm.enable > 1) {
1993             return -CMD_ERR_INV_PARAMS;
1994         }
1995         ret = tls_cmd_set_wl_ps_mode(cmd->wpsm.enable, update_flash);
1996     } else {
1997         ret = tls_cmd_get_wl_ps_mode(&cmdrsp->wpsm.enable);
1998     }
1999 
2000     return ret ? -CMD_ERR_OPS : 0;
2001 }
2002 
warc_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2003 int warc_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2004     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2005 {
2006     int ret = 0;
2007     if (set_opt) {
2008         if (cmd->warc.autoretrycnt > TWO_HUNDRED_AND_FIFTY_FIVE) {
2009             return -CMD_ERR_INV_PARAMS;
2010         }
2011         ret = tls_cmd_set_warc(cmd->warc.autoretrycnt, update_flash);
2012     } else {
2013         ret = tls_cmd_get_warc(&cmdrsp->warc.autoretrycnt);
2014     }
2015 
2016     return ret ? -CMD_ERR_OPS : 0;
2017 }
2018 
warm_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2019 int warm_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2020     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2021 {
2022     int ret = 0;
2023     if (set_opt) {
2024         if (cmd->warm.enable > 1) {
2025             return -CMD_ERR_INV_PARAMS;
2026         }
2027         ret = tls_cmd_set_roaming_mode(cmd->warm.enable, update_flash);
2028     } else {
2029         ret = tls_cmd_get_roaming_mode(&cmdrsp->warm.enable);
2030     }
2031 
2032     return ret ? -CMD_ERR_OPS : 0;
2033 }
2034 
2035 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
nip_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2036 int nip_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2037     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2038 {
2039     int ret = 0;
2040     struct tls_cmd_ip_params_t ip_info;
2041     if (set_opt) {
2042         if (cmd->nip.type > 1) {
2043             return -CMD_ERR_INV_PARAMS;
2044         }
2045         ip_info.type = cmd->nip.type;
2046         memcpy(ip_info.ip_addr, cmd->nip.ip, FOUR);
2047         memcpy(ip_info.netmask, cmd->nip.nm, FOUR);
2048         memcpy(ip_info.gateway, cmd->nip.gw, FOUR);
2049         memcpy(ip_info.dns, cmd->nip.dns, FOUR);
2050         ret = tls_cmd_set_ip_info(&ip_info, update_flash);
2051     } else {
2052         ret = tls_cmd_get_ip_info(&ip_info);
2053         cmdrsp->nip.type = ip_info.type;
2054         memcpy(cmdrsp->nip.ip, ip_info.ip_addr, FOUR);
2055         memcpy(cmdrsp->nip.nm, ip_info.netmask, FOUR);
2056         memcpy(cmdrsp->nip.gw, ip_info.gateway, FOUR);
2057         memcpy(cmdrsp->nip.dns, ip_info.dns, FOUR);
2058     }
2059 
2060     return ret ? -CMD_ERR_OPS : 0;
2061 }
2062 #endif
2063 
atm_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2064 int atm_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2065     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2066 {
2067     int ret = 0;
2068     if (set_opt) {
2069         if (cmd->atm.mode > 1) {
2070             return -CMD_ERR_INV_PARAMS;
2071         }
2072         ret = tls_cmd_set_work_mode(cmd->atm.mode, update_flash);
2073     } else {
2074         ret = tls_cmd_get_work_mode(&cmdrsp->atm.mode);
2075     }
2076 
2077     return ret ? -CMD_ERR_OPS : 0;
2078 }
2079 
atrm_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2080 int atrm_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2081     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2082 {
2083     if (set_opt) {
2084         tls_cmd_set_default_socket_params((struct tls_cmd_socket_t *)&cmd->atrm, update_flash);
2085     } else {
2086         tls_cmd_get_default_socket_params((struct tls_cmd_socket_t *)&cmdrsp->atrm);
2087     }
2088     return 0;
2089 }
2090 
aolm_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2091 int aolm_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2092     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2093 {
2094     return 0;
2095 }
2096 
portm_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2097 int portm_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2098     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2099 {
2100     int ret = 0;
2101     if (set_opt) {
2102         if (cmd->portm.mode > THREE) {
2103             return -CMD_ERR_INV_PARAMS;
2104         }
2105         ret = tls_cmd_set_hostif_mode(cmd->portm.mode, update_flash);
2106     } else {
2107         ret = tls_cmd_get_hostif_mode(&cmdrsp->portm.mode);
2108     }
2109 
2110     return ret ? -CMD_ERR_OPS : 0;
2111 }
2112 
uart_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2113 int uart_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2114     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2115 {
2116     int ret = 0;
2117     struct tls_cmd_uart_params_t uart_cfg;
2118     memset(&uart_cfg, 0, sizeof(struct tls_cmd_uart_params_t));
2119     if (set_opt) {
2120         memcpy((u8 *)&uart_cfg.baud_rate, cmd->uart.baud_rate, THREE);
2121         uart_cfg.charlength = cmd->uart.char_len;
2122         uart_cfg.stop_bit = cmd->uart.stopbit;
2123         uart_cfg.parity = cmd->uart.parity;
2124         uart_cfg.flow_ctrl = cmd->uart.flow_ctrl;
2125         ret = tls_cmd_set_uart_params(&uart_cfg, update_flash);
2126     } else {
2127         ret = tls_cmd_get_uart_params(&uart_cfg);
2128         memcpy(cmdrsp->uart.baud_rate, &uart_cfg.baud_rate, THREE);
2129         cmdrsp->uart.char_len = uart_cfg.charlength;
2130         cmdrsp->uart.flow_ctrl = uart_cfg.flow_ctrl;
2131         cmdrsp->uart.parity = uart_cfg.parity;
2132         cmdrsp->uart.stopbit = uart_cfg.stop_bit;
2133     }
2134 
2135     return ret ? -CMD_ERR_OPS : 0;
2136 }
2137 
atlt_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2138 int atlt_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2139     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2140 {
2141     int ret = 0;
2142     if (set_opt) {
2143         if (cmd->atlt.length > ONE_THOUSAND_AND_TWENTY_FOUR || cmd->atlt.length < (THIRTY + TWO)) {
2144             return -CMD_ERR_INV_PARAMS;
2145         }
2146         ret = tls_cmd_set_atlt(cmd->atlt.length, update_flash);
2147     } else {
2148         ret = tls_cmd_get_atlt((u16 *)&cmdrsp->atlt.length);
2149     }
2150 
2151     return ret ? -CMD_ERR_OPS : 0;
2152 }
2153 
dns_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2154 int dns_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2155     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2156 {
2157     int ret = 0;
2158     if (set_opt) {
2159         if (cmd->dns.length > (THIRTY + 1) || cmd->dns.length == 0) {
2160             return -CMD_ERR_INV_PARAMS;
2161         }
2162         cmd->dns.name[cmd->dns.length] = '\0';
2163         ret = tls_cmd_set_dnsname(cmd->dns.name, update_flash);
2164     } else {
2165         ret = tls_cmd_get_dnsname(cmdrsp->dns.name);
2166         cmdrsp->dns.length = strlen((char *)cmdrsp->dns.name);
2167     }
2168 
2169     return ret ? -CMD_ERR_OPS : 0;
2170 }
2171 
ddns_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2172 int ddns_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2173     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2174 {
2175     return 0;
2176 }
2177 
upnp_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2178 int upnp_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2179     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2180 {
2181     return 0;
2182 }
2183 
dname_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2184 int dname_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2185     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2186 {
2187     return 0;
2188 }
2189 
atpt_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2190 int atpt_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2191     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2192 {
2193     int ret = 0;
2194     if (set_opt) {
2195         if (cmd->portm.mode > TEN_THOUSAND) {
2196             return -CMD_ERR_INV_PARAMS;
2197         }
2198         ret = tls_cmd_set_atpt(cmd->atpt.period, update_flash);
2199     } else {
2200         ret = tls_cmd_get_atpt((u16 *)&cmdrsp->atpt.period);
2201     }
2202 
2203     return ret ? -CMD_ERR_OPS : 0;
2204 }
2205 
dbg_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2206 int dbg_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2207     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2208 {
2209     if (set_opt) {
2210         tls_cmd_set_dbg(cmd->dbg.dbg_level);
2211     }
2212 
2213     return 0;
2214 }
2215 
espc_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2216 int espc_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2217     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2218 {
2219     int ret = 0;
2220     if (set_opt) {
2221         if (cmd->espc.escapechar > 0xFF) {
2222             return -CMD_ERR_INV_PARAMS;
2223         }
2224         ret = tls_cmd_set_espc(cmd->espc.escapechar, update_flash);
2225     } else {
2226         ret = tls_cmd_get_espc(&cmdrsp->espc.escapechar);
2227     }
2228 
2229     return ret ? -CMD_ERR_OPS : 0;
2230 }
2231 
espt_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2232 int espt_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2233     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2234 {
2235     int ret = 0;
2236     if (set_opt) {
2237         if (cmd->espt.escapeperiod > TEN_THOUSAND || cmd->espt.escapeperiod < ONE_HUNDRED) {
2238             return -CMD_ERR_INV_PARAMS;
2239         }
2240         ret = tls_cmd_set_espt(cmd->espt.escapeperiod, update_flash);
2241     } else {
2242         ret = tls_cmd_get_espt((u16 *)&cmdrsp->espt.escapeperiod);
2243     }
2244 
2245     return ret ? -CMD_ERR_OPS : 0;
2246 }
2247 
webs_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2248 int webs_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2249     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2250 {
2251     int ret = 0;
2252     struct tls_webs_cfg stWebsCfg;
2253     if (set_opt) {
2254         if (cmd->webs.autorun > 1 || cmd->webs.portnum < 1
2255             || cmd->webs.portnum > SIXTY_FIVE_THOUSAND_FIVE_HUNDRED_AND_THIRTY_FIVE) {
2256             return -CMD_ERR_INV_PARAMS;
2257         }
2258         stWebsCfg.AutoRun = cmd->webs.autorun;
2259         stWebsCfg.PortNum = cmd->webs.portnum;
2260         ret = tls_cmd_set_webs(stWebsCfg, update_flash);
2261     } else {
2262         ret = tls_cmd_get_webs(&stWebsCfg);
2263         cmdrsp->webs.autorun = stWebsCfg.AutoRun;
2264         cmdrsp->webs.portnum = stWebsCfg.PortNum;
2265     }
2266 
2267     return ret ? -CMD_ERR_OPS : 0;
2268 }
2269 
iom_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2270 int iom_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2271     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2272 {
2273     int ret = 0;
2274     if (set_opt) {
2275         if (cmd->iom.mode > TWO) {
2276             return -CMD_ERR_INV_PARAMS;
2277         }
2278         ret = tls_cmd_set_iom(cmd->iom.mode, update_flash);
2279     } else {
2280         ret = tls_cmd_get_iom(&cmdrsp->iom.mode);
2281     }
2282 
2283     return ret ? -CMD_ERR_OPS : 0;
2284 }
2285 
cmdm_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2286 int cmdm_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2287     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2288 {
2289     int ret = 0;
2290     if (set_opt) {
2291         if (cmd->iom.mode > 1) {
2292             return -CMD_ERR_INV_PARAMS;
2293         }
2294         ret = tls_cmd_set_cmdm(cmd->cmdm.mode, update_flash);
2295     } else {
2296         ret = tls_cmd_get_cmdm(&cmdrsp->cmdm.mode);
2297     }
2298 
2299     return ret ? -CMD_ERR_OPS : 0;
2300 }
2301 
pass_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2302 int pass_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2303     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2304 {
2305     int ret = 0;
2306     if (set_opt) {
2307         if (cmd->pass.length != SIX) {
2308             return -CMD_ERR_INV_PARAMS;
2309         }
2310         ret = tls_cmd_set_pass(cmd->pass.password, update_flash);
2311     } else {
2312         ret = tls_cmd_get_pass(cmdrsp->pass.password);
2313         cmdrsp->pass.length = SIX;
2314     }
2315 
2316     return ret ? -CMD_ERR_OPS : 0;
2317 }
2318 
2319 #if TLS_CONFIG_HTTP_CLIENT_TASK
httpc_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2320 int httpc_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2321     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2322 {
2323     http_client_msg msg;
2324 
2325     if (set_opt) {
2326         if ((cmd->httpc.url_len > TWO_HUNDRED_AND_FIFTY_FIVE)
2327             || (cmd->httpc.data_len > FIVE_HUNDRED_AND_TWELVE)) {
2328             return -CMD_ERR_INV_PARAMS;
2329         }
2330         memset(&msg, 0, sizeof(http_client_msg));
2331         msg.param.Uri = (CHAR *)cmd->httpc.url;
2332         msg.method = (HTTP_VERB)cmd->httpc.verb;
2333         if (cmd->httpc.verb == VerbPost || cmd->httpc.verb == VerbPut) {
2334             msg.dataLen = cmd->httpc.data_len;
2335             msg.sendData = (CHAR *)cmd->httpc.data;
2336         }
2337         msg.recv_fn = tls_hostif_http_client_recv_callback;
2338         msg.err_fn = tls_hostif_http_client_err_callback;
2339         http_client_post(&msg);
2340         cmdrsp->httpc.psession = msg.pSession;
2341     }
2342 
2343     return 0;
2344 }
2345 
fwup_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2346 int fwup_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2347     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2348 {
2349     return;
2350 }
2351 
2352 #endif
2353 #endif
2354 
tem_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2355 int tem_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2356     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2357 {
2358     int ret = 0;
2359     struct tls_cmd_tem_t tem = { 0 };
2360 
2361     memset(&tem, 0, sizeof(struct tls_cmd_tem_t));
2362     if (set_opt) {
2363         return -CMD_ERR_UNSUPP;
2364     } else {
2365         char temperature[EIGHT] = {0};
2366         int temp = adc_temp();
2367         s32 offset = 0;
2368 
2369         ret = tls_get_rx_iq_gain((u8 *)&offset);
2370         if (offset != -1) {
2371             temp = temp - offset;
2372         }
2373         if (!ret) {
2374             if (temp < 0) {
2375                 temp = 0 - temp;
2376                 sprintf(temperature, "-%d.%d", temp / ONE_THOUSAND, (temp % ONE_THOUSAND) / ONE_HUNDRED);
2377             } else {
2378                 sprintf(temperature, "%d.%d", temp / ONE_THOUSAND, (temp % ONE_THOUSAND) / ONE_HUNDRED);
2379             }
2380             memcpy((char *)cmdrsp->tem.offset, temperature, strlen(temperature));
2381         }
2382     }
2383 
2384     return ret ? -CMD_ERR_OPS : 0;
2385 }
2386 
qmac_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2387 int qmac_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2388     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2389 {
2390     u8 *mac = NULL;
2391     mac = wpa_supplicant_get_mac();
2392     memcpy(cmdrsp->mac.addr, mac, SIX);
2393     return 0;
2394 }
2395 
2396 #if TLS_CONFIG_AP
slist_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2397 int slist_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2398     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2399 {
2400 #define STA_DETAIL_BUF_LEN  320
2401     u32 sta_num = 0;
2402     u8 *sta_detail;
2403     int ret = -1;
2404 
2405     sta_detail = tls_mem_alloc(STA_DETAIL_BUF_LEN);
2406     if (sta_detail == NULL) {
2407         return -CMD_ERR_MEM;
2408     }
2409 
2410     memset(sta_detail, 0, STA_DETAIL_BUF_LEN);
2411     ret = tls_cmd_get_sta_detail(&sta_num, sta_detail);
2412     if (ret) {
2413         tls_mem_free(sta_detail);
2414         return -CMD_ERR_MEM;
2415     }
2416 
2417     cmdrsp->stalist.sta_num = sta_num;
2418     memcpy(cmdrsp->stalist.data, sta_detail, strlen((char *)sta_detail) + 1);
2419     tls_mem_free(sta_detail);
2420 
2421     return 0;
2422 }
2423 
softap_lkstt_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2424 int softap_lkstt_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2425     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2426 {
2427     struct tls_cmd_link_status_t lk;
2428 
2429     memset(&lk, 0, sizeof(struct tls_cmd_link_status_t));
2430     tls_cmd_get_softap_link_status(&lk);
2431     cmdrsp->lkstt.status = lk.status;
2432     if (cmdrsp->lkstt.status == 0) {
2433         return 0;
2434     } else {
2435         memcpy(cmdrsp->lkstt.ip, lk.ip, FOUR);
2436         memcpy(cmdrsp->lkstt.nm, lk.netmask, FOUR);
2437         memcpy(cmdrsp->lkstt.gw, lk.gw, FOUR);
2438         memcpy(cmdrsp->lkstt.dns1, lk.dns1, FOUR);
2439         memcpy(cmdrsp->lkstt.dns2, lk.dns2, FOUR);
2440     }
2441     return 0;
2442 }
2443 
softap_ssid_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2444 int softap_ssid_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2445     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2446 {
2447     int ret = 0;
2448     struct tls_cmd_ssid_t ssid;
2449 
2450     memset(&ssid, 0, sizeof(struct tls_cmd_ssid_t));
2451     if (set_opt) {
2452         if ((cmd->ssid.ssid_len > (THIRTY + TWO)) || (cmd->ssid.ssid_len == 0)) {
2453             return -CMD_ERR_INV_PARAMS;
2454         }
2455         ssid.ssid_len = cmd->ssid.ssid_len;
2456         MEMCPY(ssid.ssid, cmd->ssid.ssid, ssid.ssid_len);
2457         ret = tls_cmd_set_softap_ssid(&ssid, update_flash);
2458     } else {
2459         ret = tls_cmd_get_softap_ssid(&ssid);
2460         if (!ret) {
2461             cmdrsp->ssid.ssid_len = ssid.ssid_len;
2462             MEMCPY(cmdrsp->ssid.ssid, ssid.ssid, ssid.ssid_len);
2463         }
2464     }
2465     return ret ? -CMD_ERR_OPS : 0;
2466 }
2467 
softap_qmac_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2468 int softap_qmac_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2469     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2470 {
2471     u8 *mac = NULL;
2472     mac = hostapd_get_mac();
2473     memcpy(cmdrsp->mac.addr, mac, SIX);
2474     return 0;
2475 }
2476 
softap_encry_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2477 int softap_encry_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2478     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2479 {
2480     int ret = 0;
2481     if (set_opt) {
2482         if (cmd->encrypt.mode > EIGHT) {
2483             return -CMD_ERR_INV_PARAMS;
2484         }
2485         ret = tls_cmd_set_softap_encrypt(cmd->encrypt.mode, update_flash);
2486     } else {
2487         ret = tls_cmd_get_softap_encrypt(&cmdrsp->encrypt.mode);
2488     }
2489 
2490     return ret ? -CMD_ERR_OPS : 0;
2491 }
2492 
softap_key_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2493 int softap_key_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2494     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2495 {
2496     int ret = 0;
2497     struct tls_cmd_key_t key;
2498     if (set_opt) {
2499         if (cmd->key.format > 1 || cmd->key.index > FOUR
2500             || cmd->key.key_len > (SIXTY + FOUR)) {
2501             return -CMD_ERR_INV_PARAMS;
2502         }
2503         key.format = cmd->key.format;
2504         key.index = cmd->key.index;
2505         memcpy(key.key, cmd->key.key, cmd->key.key_len);
2506         key.key_len = cmd->key.key_len;
2507         ret = tls_cmd_set_softap_key(&key, update_flash);
2508     } else {
2509         ret = tls_cmd_get_softap_key(&key);
2510         if (!ret) {
2511             cmdrsp->key.format = key.format;
2512             cmdrsp->key.index = key.index;
2513             cmdrsp->key.key_len = key.key_len;
2514             memcpy(cmdrsp->key.key, key.key, cmdrsp->key.key_len);
2515         }
2516     }
2517 
2518     return ret ? -CMD_ERR_OPS : 0;
2519 }
2520 
softap_chl_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2521 int softap_chl_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2522     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2523 {
2524     int ret = 0;
2525     if (set_opt) {
2526         if ((cmd->channel.enable > 1) || ((cmd->channel.enable == 1)
2527             && ((cmd->channel.channel > (TEN + FOUR)) ||(cmd->channel.channel < 1)))) {
2528             return -CMD_ERR_INV_PARAMS;
2529         }
2530         if (cmd->channel.enable == 0) {
2531             cmd->channel.channel = 1;
2532         }
2533         ret = tls_cmd_set_softap_channel(cmd->channel.channel, update_flash);
2534     } else {
2535         ret = tls_cmd_get_softap_channel(&cmdrsp->channel.channel);
2536         cmdrsp->channel.enable = 1;
2537     }
2538 
2539     return ret ? -CMD_ERR_OPS : 0;
2540 }
2541 
softap_wbgr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2542 int softap_wbgr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2543     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2544 {
2545     int ret = 0;
2546     int limit_rate;
2547     struct tls_cmd_wl_hw_mode_t hw_mode;
2548     memset(&hw_mode, 0, sizeof(struct tls_cmd_wl_hw_mode_t));
2549 
2550     if (set_opt) {
2551         if (cmd->wbgr.mode > THREE || cmd->wbgr.rate > (TWENTY + EIGHT)) {
2552             return -CMD_ERR_INV_PARAMS;
2553         }
2554         limit_rate = (cmd->wbgr.mode == 1) ? THREE : ((cmd->wbgr.mode == TWO)
2555                       ? (TWENTY + EIGHT) : (TEN + 1));
2556         hw_mode.max_rate = (cmd->wbgr.rate > limit_rate) ? limit_rate: cmd->wbgr.rate;
2557         hw_mode.hw_mode = cmd->wbgr.mode;
2558         ret = tls_cmd_set_softap_hw_mode(&hw_mode, update_flash);
2559     } else {
2560         ret = tls_cmd_get_softap_hw_mode(&hw_mode);
2561         cmdrsp->wbgr.mode = hw_mode.hw_mode;
2562         cmdrsp->wbgr.rate = hw_mode.max_rate;
2563     }
2564     return ret ? -CMD_ERR_OPS : 0;
2565 }
2566 
softap_nip_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2567 int softap_nip_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2568     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2569 {
2570     int ret = 0;
2571     struct tls_cmd_ip_params_t ip_info;
2572     if (set_opt) {
2573         if (cmd->nip.type > 1) {
2574             return -CMD_ERR_INV_PARAMS;
2575         }
2576         ip_info.type = cmd->nip.type;
2577         memcpy(ip_info.ip_addr, cmd->nip.ip, FOUR);
2578         memcpy(ip_info.netmask, cmd->nip.nm, FOUR);
2579         memcpy(ip_info.gateway, cmd->nip.gw, FOUR);
2580         memcpy(ip_info.dns, cmd->nip.dns, FOUR);
2581         ret = tls_cmd_set_softap_ip_info(&ip_info, update_flash);
2582     } else {
2583         ret = tls_cmd_get_softap_ip_info(&ip_info);
2584         cmdrsp->nip.type = ip_info.type;
2585         memcpy(cmdrsp->nip.ip, ip_info.ip_addr, FOUR);
2586         memcpy(cmdrsp->nip.nm, ip_info.netmask, FOUR);
2587         memcpy(cmdrsp->nip.gw, ip_info.gateway, FOUR);
2588         memcpy(cmdrsp->nip.dns, ip_info.dns, FOUR);
2589     }
2590 
2591     return ret ? -CMD_ERR_OPS : 0;
2592 }
2593 #endif
2594 
qver_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2595 int qver_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2596     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2597 {
2598     tls_cmd_get_ver((struct tls_cmd_ver_t *)&cmdrsp->ver);
2599     return 0;
2600 }
2601 
updd_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2602 int updd_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2603     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2604 {
2605     int datasize, session_id;
2606     int err = 0;
2607 
2608     session_id = tls_fwup_get_current_session_id();
2609     if ((session_id == 0) || (TLS_FWUP_STATUS_OK != tls_fwup_current_state(session_id))) {
2610         return -CMD_ERR_INV_PARAMS;
2611     }
2612 
2613     datasize = cmd->updd.size;
2614     if (cmd->updd.data[0] == 0) {    /* at */
2615         if (datasize != sizeof(struct tls_fwup_block)) {
2616             err = -CMD_ERR_INV_PARAMS;
2617         }
2618     } else if (cmd->updd.data[0] == 1) { /* ri */
2619     }
2620 
2621     return err;
2622 }
2623 
2624 /******************************************************************
2625 * Description:    Read register or memory
2626 
2627 * Format:        AT+&REGR=<address>,[num]<CR>
2628             +OK=<value1>,[value2]...<CR><LF><CR><LF>
2629 
2630 * Argument:    address: num:
2631 
2632 * Author:     kevin 2014-03-19
2633 ******************************************************************/
regr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2634 int regr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2635     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2636 {
2637     u32 Addr, Num;
2638     int i = 0;
2639     Addr = cmd->regr.reg_base_addr;
2640     Num = cmd->regr.length;
2641     for (i = 0; i < Num; i++) {
2642         cmdrsp->regr.value[i] = tls_reg_read32(Addr);
2643         Addr += FOUR;
2644     }
2645     cmdrsp->regr.length = Num;
2646     return 0;
2647 }
2648 
2649 /******************************************************************
2650 * Description:    Write register or memory
2651 
2652 * Format:        AT+&REGW=<address>,<value1>,[value2]...<CR>
2653             +OK=<CR><LF><CR><LF>
2654 
2655 * Argument:    address: value:
2656 
2657 * Author:     kevin 2014-03-19
2658 ******************************************************************/
regw_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2659 int regw_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2660     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2661 {
2662     u32 Addr, i;
2663     u32 cpu_sr;
2664 
2665     cpu_sr = tls_os_set_critical();
2666     Addr = cmd->regw.reg_base_addr;
2667     for (i = 0; i < cmd->regw.length; i++) {
2668         tls_reg_write32(Addr, cmd->regw.v[i]);
2669         Addr += FOUR;
2670     }
2671     tls_os_release_critical(cpu_sr);
2672     return 0;
2673 }
2674 
2675 /******************************************************************
2676 * Description:    Read RF register
2677 
2678 * Format:        AT+&RFR=<address>,[num]<CR>
2679             +OK=<value1>,[value2]...<CR><LF><CR><LF>
2680 
2681 * Argument:    address: size:
2682 
2683 * Author:     kevin 2014-03-19
2684 ******************************************************************/
rfr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2685 int rfr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2686     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2687 {
2688     int i;
2689     u32 Addr, Num;
2690 
2691     Addr = cmd->rfr.reg_base_addr;
2692     Num = cmd->rfr.length;
2693 
2694     if ((Num < 1) || (Num > EIGHT) || (Addr + Num - 1) > RFR_REG_MAX_NUM) {
2695         return -CMD_ERR_INV_PARAMS;
2696     }
2697 
2698     for (i = 0; i < Num; i++) {
2699         cmdrsp->rfr.value[i] = (u16)rf_spi_read(Addr);
2700         Addr += 1;
2701     }
2702     cmdrsp->rfr.length = Num;
2703     return 0;
2704 }
2705 
2706 /******************************************************************
2707 * Description:    Write RF registers
2708 
2709 * Format:        AT+&RFW=<address>,<value1>,[value2]...<CR>
2710             +OK<CR><LF><CR><LF>
2711 
2712 * Argument:    address: value:
2713 
2714 * Author:     kevin 2014-03-19
2715 ******************************************************************/
rfw_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2716 int rfw_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2717     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2718 {
2719     int i;
2720     u32 Addr, Num;
2721     u16 databuf[EIGHT];
2722 
2723     Num = 0;
2724     Addr = cmd->rfw.reg_base_addr;
2725     for (i = 0; i < cmd->rfw.length; i++) {
2726         databuf[Num++] = cmd->rfw.v[i];
2727     }
2728     if ((Num < 1) || (Num > EIGHT) || (Addr + Num - 1) > RFR_REG_MAX_NUM) {
2729         return -CMD_ERR_INV_PARAMS;
2730     }
2731     Addr = Addr * TWO;
2732     for (i = 0; i < Num; i++) {
2733         rf_spi_write((Addr << (TEN + SIX)) | databuf[i]);
2734         Addr += TWO;
2735     }
2736     return 0;
2737 }
2738 
flsr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2739 int flsr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2740     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2741 {
2742     u32 addr, len, ret = 0;
2743     u8 buff[THIRTY + TWO];
2744     addr = cmd->flsr.reg_base_addr;
2745     len = cmd->flsr.length;
2746     if ((len > EIGHT) || (len < 1)) {
2747         TLS_DBGPRT_INFO("ret = 0x%x, len = 0x%x\r\n", ret, len);
2748         return -CMD_ERR_INV_PARAMS;
2749     }
2750 
2751     TLS_DBGPRT_INFO("addr = 0x%x, len = 0x%x\r\n", addr, len);
2752 
2753     memset(buff, 0, sizeof(buff));
2754     ret = tls_fls_read(addr, buff, FOUR * len);
2755     if (ret) {
2756         TLS_DBGPRT_INFO("ret = 0x%x\r\n", ret);
2757         return -CMD_ERR_INV_PARAMS;
2758     }
2759     memcpy((u8 *)cmdrsp->flsr.value, buff, FOUR * len);
2760     cmdrsp->flsr.length = len;
2761     return 0;
2762 }
2763 
flsw_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2764 int flsw_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2765     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2766 {
2767     u32 addr, num, data, ret, i;
2768     u8 buff[THIRTY + TWO];
2769     addr = cmd->flsw.reg_base_addr;
2770     num = cmd->flsw.length;
2771     memset(buff, 0, sizeof(buff));
2772     for (i = 0; i < num; i++) {
2773         data = cmd->flsw.v[i];
2774         MEMCPY(&buff[FOUR * i], &data, sizeof(u32));
2775         TLS_DBGPRT_INFO("data = 0x%x\r\n", data);
2776     }
2777 
2778     ret = tls_fls_write(addr, buff, FOUR * num);
2779     if (ret) {
2780         TLS_DBGPRT_INFO("ret = 0x%x\r\n", ret);
2781         return -CMD_ERR_INV_PARAMS;
2782     }
2783     return 0;
2784 }
2785 
2786 /******************************************************************
2787 * Description:    set/get system tx gain
2788 
2789 * Format:        AT+&TXG=[!?][gain]<CR>
2790             +OK[=gain]<CR><LF><CR><LF>
2791 
2792 * Argument:    12 byte hex ascii
2793 
2794 * Author:     kevin 2014-03-12
2795 ******************************************************************/
txg_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2796 int txg_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2797     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2798 {
2799     u8* tx_gain = ieee80211_get_tx_gain();
2800     if (set_opt) {
2801         memcpy(tx_gain, cmd->txg.tx_gain, TX_GAIN_LEN);
2802         TLS_DBGPRT_INFO("save tx gain!\r\n");
2803         tls_set_tx_gain(tx_gain);
2804     } else {
2805         MEMCPY(cmdrsp->txg.tx_gain, tx_gain, TX_GAIN_LEN);
2806     }
2807     return 0;
2808 }
2809 
txg_rate_set_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2810 int txg_rate_set_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2811     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2812 {
2813     u8* tx_gain = ieee80211_get_tx_gain();
2814     if (set_opt) {
2815         tx_gain[cmd->txgr.tx_rate] = cmd->txgr.txr_gain[0];
2816         tx_gain[cmd->txgr.tx_rate + TX_GAIN_LEN / THREE] = cmd->txgr.txr_gain[1];
2817         tx_gain[cmd->txgr.tx_rate + TX_GAIN_LEN * TWO / THREE] = cmd->txgr.txr_gain[TWO];
2818         tls_set_tx_gain(tx_gain);
2819     }
2820     return 0;
2821 }
2822 
txg_rate_get_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2823 int txg_rate_get_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2824     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2825 {
2826     u8* tx_gain = ieee80211_get_tx_gain();
2827     cmdrsp->txgr.tx_rate = cmd->txgr.tx_rate;
2828     cmdrsp->txgr.txr_gain[0] = tx_gain[cmd->txgr.tx_rate];
2829     cmdrsp->txgr.txr_gain[1] =  tx_gain[cmd->txgr.tx_rate + TX_GAIN_LEN / THREE];
2830     cmdrsp->txgr.txr_gain[TWO] = tx_gain[cmd->txgr.tx_rate + TX_GAIN_LEN * TWO / THREE];
2831     return 0;
2832 }
2833 
mac_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2834 int mac_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2835     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2836 {
2837     if (set_opt) {
2838         if (cmd->mac.length > (TEN + TWO)) {
2839             return -CMD_ERR_INV_PARAMS;
2840         }
2841         wpa_supplicant_set_mac(cmd->mac.macaddr);
2842         tls_set_mac_addr(cmd->mac.macaddr);
2843     } else {
2844         u8 *mac = NULL;
2845         mac = wpa_supplicant_get_mac();
2846         memcpy(cmdrsp->mac.addr, mac, SIX);
2847     }
2848     return 0;
2849 }
2850 
hwv_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2851 int hwv_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2852     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2853 {
2854     tls_cmd_get_ver((struct tls_cmd_ver_t *)&cmdrsp->ver);
2855     return 0;
2856 }
2857 
2858 /******************************************************************
2859 * Description:    Set/Get spi flash's parameter
2860 
2861 * Format:        AT+&SPIF=[!?][size]<CR>[data stream]
2862             +OK<CR><LF><CR><LF>[data stream]
2863 
2864 * Argument:    hex
2865 
2866 * Author:     kevin 2014-03-17
2867 ******************************************************************/
spif_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2868 int spif_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2869     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2870 {
2871     return 0;
2872 }
2873 
2874 /******************************************************************
2875 * Description:    For litepoint init
2876 
2877 * Format:    none
2878 
2879 * Argument:    none
2880 
2881 * Author:     kevin 2014-03-13
2882 ******************************************************************/
atcmd_lpinit(void)2883 static void atcmd_lpinit(void)
2884 {
2885     tls_cmd_disconnect_network(IEEE80211_MODE_INFRA | IEEE80211_MODE_AP);
2886     tls_litepoint_start();
2887 }
2888 
2889 /******************************************************************
2890 * Description:    For litepoint test, set wireless channel
2891 
2892 * Format:        AT+&LPCHL=[!?]<channel><CR>
2893             +OK<CR><LF><CR><LF>
2894 * Argument:    channel:1-14
2895 
2896 * Author:     kevin 2014-03-12
2897 ******************************************************************/
lpchl_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2898 int lpchl_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2899     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2900 {
2901     if ((cmd->lpchl.channel < 1) || (cmd->lpchl.channel > (TEN + FOUR))) {
2902         TLS_DBGPRT_INFO("kevin params err! %x\r\n", cmd->lpchl.channel);
2903         return -CMD_ERR_INV_PARAMS;
2904     }
2905 
2906     atcmd_lpinit();
2907     tls_set_test_channel(cmd->lpchl.channel, cmd->lpchl.bandwidth);
2908 
2909     return 0;
2910 }
2911 
2912 /******************************************************************
2913 * Description:    For litepoint test, start tx process
2914 
2915 * Format:        AT+&LPTSTR=<temperaturecompensation>,<PacketCount>,
2916                             <PsduLen>,<TxGain>,<DataRate>[,rifs][,greenfield][,gimode]<CR>
2917             +OK<CR><LF><CR><LF>
2918 
2919 * Argument:    hex <temperaturecompensation>:
2920                    255-compensation for different temperature;other value-no temperature;
2921                 <PacketCount>, 0琛ㄧず闀垮彂
2922                 <PsduLen>,     鍖呴暱搴?
2923                 <TxGain>,      澧炵泭锛岀洿鎺ュ啓鍒癕ac bd
2924                 <DataRate>,
2925                 S2M = 0x0000,
2926                 S5M5 = 0x0001,    S11M = 0x0002,    L1M = 0x0003,    L2M = 0x0004,
2927                 L5M5 = 0x0005,    L11M = 0x0006,
2928                 R06M = 0x0100,    R09M = 0x0101,    R12M = 0x0102,    R18M = 0x0103,     R24M = 0x0104,
2929                 R36M = 0x0105,    R48M = 0x0106,    R54M = 0x0107,
2930                 MCS0 = 0x0200,    MCS1 = 0x0201,    MCS2 = 0x0202,    MCS3 = 0x0203,    MCS4 = 0x0204,
2931                 MCS5 = 0x0205,    MCS6 = 0x0206,    MCS7 = 0x0207,    MCS8 = 0x0208,    MCS9 = 0x0209,
2932                 MCS10 = 0x0210,    MCS11 = 0x0211,    MCS12 = 0x0212,    MCS13 = 0x0213,    MCS14 = 0x0214,
2933                 MCS15 = 0x0215,    MCS32 = 0x0232,
2934                 [rifs],        1: mac_txbd->ctrl1 |= (1 << 12)
2935                 [greenfield],  1: mac_txbd->ctrl4 |= (1 << 18)
2936                 [gimode],      1: mac_txbd->ctrl4 |= (1 << 19)
2937                 [timedelay]    鍖呴棿闅旀椂闂达紝鍗曚綅寰锛?6杩涘埗
2938 ******************************************************************/
lptstr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2939 int lptstr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2940     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2941 {
2942     TLS_DBGPRT_INFO("tempcomp = 0x%x, PacketCount = 0x%x, PsduLen = 0x%x, TxGain = 0x%x, DataRate = 0x%x"
2943                     "rifs:0x%x,greenfield:0x%x, gimode:0x%x \r\n",
2944                     cmd->lptstr.tempcomp, cmd->lptstr.packetcount, cmd->lptstr.psdulen,
2945                     cmd->lptstr.txgain, cmd->lptstr.datarate, cmd->lptstr.rifs,
2946                     cmd->lptstr.greenfield, cmd->lptstr.gimode);
2947 
2948     atcmd_lpinit();
2949     tls_tx_litepoint_test_start(cmd->lptstr.tempcomp, cmd->lptstr.packetcount, cmd->lptstr.psdulen,
2950                                 cmd->lptstr.txgain, cmd->lptstr.datarate, cmd->lptstr.gimode,
2951                                 cmd->lptstr.greenfield, cmd->lptstr.rifs);
2952 
2953     return 0;
2954 }
2955 
tls_lptperiod_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2956 int tls_lptperiod_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2957     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2958 {
2959     if (set_opt) {
2960         tls_set_tx_litepoint_period(cmd->rxsin.rxlen);
2961     }
2962     return 0;
2963 }
2964 
2965 /******************************************************************
2966 * Description:    For litepoint test, stop tx process
2967 
2968 * Format:        AT+&LPTSTP<CR>
2969             +OK<CR><LF><CR><LF>
2970 
2971 * Argument: none
2972 
2973 * Author:     kevin 2014-03-13
2974 ******************************************************************/
lptstp_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2975 int lptstp_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2976     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2977 {
2978     tls_txrx_litepoint_test_stop();
2979     return 0;
2980 }
2981 
2982 /******************************************************************
2983 * Description:    For litepoint test, query tx infomation
2984 
2985 * Format:        AT+&LPTSTT<CR>
2986             +OK=<TransCnt><CR><LF><CR><LF>
2987 
2988 * Author:     kevin 2014-03-13
2989 ******************************************************************/
lptstt_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)2990 int lptstt_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
2991     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
2992 {
2993     return 0;
2994 }
2995 
2996 /******************************************************************
2997 * Description:    For litepoint test, start rx process
2998 
2999 * Format:        AT+&LPRSTR=channel<CR>
3000             +OK<CR><LF><CR><LF>
3001 
3002 * Argument:    channel:1-14
3003 
3004 * Author:     kevin 2014-03-13
3005 ******************************************************************/
lprstr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3006 int lprstr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3007     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3008 {
3009     if ((cmd->lpchl.channel < 1) || (cmd->lpchl.channel > (TEN + FOUR))) {
3010         TLS_DBGPRT_INFO("Channel = 0x%x \r\n", cmd->lpchl.channel);
3011         return -CMD_ERR_INV_PARAMS;
3012     }
3013     atcmd_lpinit();
3014     tls_rx_litepoint_test_start(cmd->lpchl.channel, cmd->lpchl.bandwidth);
3015     return 0;
3016 }
3017 
3018 /******************************************************************
3019 * Description:    For litepoint test, stop rx process
3020 
3021 * Format:        AT+&LPRSTP<CR>
3022             +OK<CR><LF><CR><LF>
3023 
3024 * Author:     kevin 2014-03-13
3025 ******************************************************************/
lprstp_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3026 int lprstp_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3027     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3028 {
3029     tls_txrx_litepoint_test_stop();
3030     return 0;
3031 }
3032 
3033 /******************************************************************
3034 * Description:    For litepoint test, query rx infomation
3035 
3036 * Format:        AT+&LPRSTT<CR>
3037             +OK=<TotalRecvCnt>,<CorrectRecvCnt>,<FcsErrorCnt><CR><LF><CR><LF>
3038 
3039 * Author:     kevin 2014-03-13
3040 ******************************************************************/
lprstt_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3041 int lprstt_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3042     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3043 {
3044     return 0;
3045 }
3046 
3047 /******************************************************************
3048 * Description:    For litepoint test, start the calibration process of rf's parameter(LO-Leakage)
3049 
3050 * Format:        AT+&LPPSTR=<init_param>,<flag_start><CR>
3051             +OK<CR><LF><CR><LF>
3052 
3053 * Argument:    hex init_param: flag_start:
3054 
3055 * Author:     kevin 2014-03-14
3056 ******************************************************************/
3057 u8 gulCalFlag = 0;
lppstr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3058 int lppstr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3059     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3060 {
3061     return 0;
3062 }
3063 
3064 /******************************************************************
3065 * Description:    For litepoint test, stop the calibration and return the result (IQ-Mismatch)
3066 
3067 * Format:        AT+&LPPSTP=<result_param><CR>
3068             +OK<CR><LF><CR><LF>
3069 
3070 * Argument:    hex result_param: IQ-Mismatch
3071 
3072 * Author:     kevin 2014-03-14
3073 ******************************************************************/
lppstp_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3074 int lppstp_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3075     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3076 {
3077     return 0;
3078 }
3079 
3080 /******************************************************************
3081 * Description:    For litepoint test, setting the parameter of RF
3082 
3083 * Format:        AT+&LPRFPS=< rftype ><size><CR>[data stream]
3084             +OK=<CR><LF><CR><LF>
3085 
3086 * Argument:    ftype锛歳f绫诲瀷 0锛?230锛?锛?829锛?锛欻EDrf
3087                   data stream 涓寘鍚?6涓猺f瀵勫瓨鍣紝鍜?8涓俊閬撳瘎瀛樺櫒
3088 
3089 * Author:     kevin 2014-03-14
3090 ******************************************************************/
lprfps_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3091 int lprfps_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3092     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3093 {
3094     return 0;
3095 }
3096 
3097 /******************************************************************
3098 * Description:    For litepoint test,  receive and set channel
3099 
3100 * Format:        AT+&LPCHRS =<channel>,< rxcbw ><CR>
3101             +OK<CR><LF><CR><LF>
3102 
3103 * Argument:    channel: 鏃犵嚎淇¢亾鍙凤紝鏈夋晥鑼冨洿1锝?4
3104                     rxcbw: 鎺ユ敹瀵瑰簲淇¢亾甯﹀0:  20M锛?锛?0M
3105 
3106 * Author:     kevin 2014-03-14
3107 ******************************************************************/
lpchrs_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3108 int lpchrs_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3109     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3110 {
3111     return lpchl_proc(set_opt, update_flash, cmd, cmdrsp);
3112 }
3113 
3114 /******************************************************************
3115 * Description:    For litepoint test,  BD Tx process
3116 
3117 * Format:        AT+&LPTBD =< psdulen >,< txgain >,< datarate >< txcbw >,<gi>,<gf>,< rifs ><CR>
3118             +OK<CR><LF><CR><LF>
3119 
3120 * Argument:    psdulen: 鏁版嵁闀垮害锛屾湁鏁堣寖鍥?4锝?5535
3121             txgain: 鍙戝皠澧炵泭
3122             datarate: 鏁版嵁鏁扮巼
3123             txcbw: 鍙戝皠甯﹀0:20M;1:40M
3124             gi:  0:normal gi;1:short gi
3125             gf:  0:no green field;1: green field
3126             rifs:  0:no rifs;1:rifs
3127             Data Rate:
3128             S2M = 0x0000, S5.5M = 0x0001, S11M = 0x0002, L1M = 0x0003,
3129             L2M = 0x0004, L5M5 = 0x0005, L11M = 0x0006, 06M = 0x0100,
3130             09M = 0x0101, 12M = 0x0102, 18M = 0x0103, 24M = 0x0104,
3131             36M = 0x0105, 48M = 0x0106, 54M = 0x0107, MCS0 = 0x200,
3132             MCS1 = 0x201, MCS2 = 0x202, MCS3 = 0x203, MCS4 = 0x204,
3133             MCS5 = 0x205, MCS6 = 0x206, MCS7 = 0x207,
3134 
3135 * Author:     kevin 2014-03-14
3136 ******************************************************************/
lptbd_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3137 int lptbd_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3138     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3139 {
3140     return lptstr_proc(set_opt, update_flash, cmd, cmdrsp);
3141 }
3142 
3143 /******************************************************************
3144 * Description:    For litepoint test,  stop tx process
3145 
3146 * Format:        AT+&LPSTPT<CR>
3147             +OK<CR><LF><CR><LF>
3148 
3149 * Author:     kevin 2014-03-14
3150 ******************************************************************/
lpstpt_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3151 int lpstpt_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3152     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3153 {
3154     return lptstp_proc(set_opt, update_flash, cmd, cmdrsp);
3155 }
3156 
3157 /******************************************************************
3158 * Description:    For litepoint test, receive channel
3159 
3160 * Format:        AT+&LPCHLR =<channel>,< rxcbw ><CR>
3161             +OK<CR><LF><CR><LF>
3162 
3163 * Author:     kevin 2014-03-14
3164 ******************************************************************/
lpchlr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3165 int lpchlr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3166     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3167 {
3168     return lprstr_proc(set_opt, update_flash, cmd, cmdrsp);
3169 }
3170 
3171 /******************************************************************
3172 * Description:    For litepoint test,  stop rx process
3173 
3174 * Format:        AT+&LPSTPR<CR>
3175             +OK<CR><LF><CR><LF>
3176 
3177 * Author:     kevin 2014-03-14
3178 ******************************************************************/
lpstpr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3179 int lpstpr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3180     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3181 {
3182     return lprstp_proc(set_opt, update_flash, cmd, cmdrsp);
3183 }
3184 
3185 /******************************************************************
3186 * Description:    For litepoint test, For query rx frame information
3187 
3188 * Format:        AT+&LPRAGC <CR>
3189             +OK=<TotalRecvCnt>,<CorrectRecvCnt>,<FcsErrorCnt><CR><LF><CR><LF>
3190 
3191 * Author:     kevin 2014-03-14
3192 ******************************************************************/
lpragc_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3193 int lpragc_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3194     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3195 {
3196     return 0;
3197 }
3198 
3199 /******************************************************************
3200 * Description:    For litepoint test,  For query rx frame information
3201 
3202 * Format:        AT+&LPRSR [=?]<CR>
3203             +OK[=valid,rcpi,snr]<CR><LF><CR><LF>
3204 
3205 * Argument:    none
3206 
3207 * Author:     kevin 2014-03-14
3208 ******************************************************************/
lprsr_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3209 int lprsr_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3210     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3211 {
3212     return 0;
3213 }
3214 
tls_tx_lo_proc(u8 set_opt,u8 update_flah,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3215 int tls_tx_lo_proc(u8 set_opt, u8 update_flah, union HOSTIF_CMD_PARAMS_UNION *cmd,
3216     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3217 {
3218     int ret = -1;
3219 
3220     if (set_opt) {
3221         ret = tls_set_tx_lo((u8 *)&cmd->txLO.txlo);
3222     } else {
3223         ret = tls_get_tx_lo((u8 *)&cmdrsp->txLO.txlo);
3224     }
3225 
3226     return ret;
3227 }
3228 
tls_tx_iq_mismatch_proc(u8 set_opt,u8 update_flah,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3229 int tls_tx_iq_mismatch_proc(u8 set_opt, u8 update_flah, union HOSTIF_CMD_PARAMS_UNION *cmd,
3230     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3231 {
3232     int ret = -1;
3233 
3234     if (set_opt) {
3235         ret = tls_set_tx_iq_gain((u8 *)&cmd->txIQ.txiqgain);
3236         ret = tls_set_tx_iq_phase((u8 *)&cmd->txIQ.txiqphase);
3237     } else {
3238         ret = tls_get_tx_iq_gain((u8 *)&cmdrsp->txIQ.txiqgain);
3239         ret = tls_get_tx_iq_phase((u8 *)&cmdrsp->txIQ.txiqphase);
3240     }
3241 
3242     return ret;
3243 }
3244 
tls_freq_error_proc(u8 set_opt,u8 update_flah,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3245 int tls_freq_error_proc(u8 set_opt, u8 update_flah, union HOSTIF_CMD_PARAMS_UNION *cmd,
3246     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3247 {
3248     int ret = -1;
3249 
3250     if (set_opt) {
3251         ret = tls_freq_err_op((u8 *) &cmd->FreqErr.freqerr, 1);
3252     } else {
3253         ret = tls_freq_err_op((u8 *) &cmdrsp->FreqErr.freqerr, 0);
3254     }
3255 
3256     return ret;
3257 }
3258 
tls_rf_vcg_ctrl_proc(u8 set_opt,u8 update_flah,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3259 int tls_rf_vcg_ctrl_proc(u8 set_opt, u8 update_flah, union HOSTIF_CMD_PARAMS_UNION *cmd,
3260     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3261 {
3262     return;
3263 }
3264 
3265 #if TLS_CONFIG_WIFI_PERF_TEST
3266 /******************************************************************
3267 * Description:  As server: TEST UDP & TCP RX
3268                 AT+THT=Ss,-i=1
3269                 AT+THT=Ss
3270 
3271 As client: None
3272 UDP TX:  AT+THT=Cc,192.168.1.100, UDP, -b=10K,-t=10,-i=1
3273             -b=0: full speed test
3274             K for kilo bps
3275             M for Mega bps
3276 
3277 TCP TX: AT+THT=Cc,192.168.1.100, TCP, -l=1024,-t=10,-i=1
3278             -l: 1024 block size; prefer to x * 1024, l < 32
3279 
3280 ******************************************************************/
tht_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3281 int tht_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3282     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3283 {
3284     int ret = -1;
3285     ret = tht_start_iperf_test(((struct tls_atcmd_token_t *)cmd->tht.tok)->arg);
3286     switch (ret) {
3287         case 0:
3288             ret = 0;
3289             break;
3290         case -1:
3291             ret = -CMD_ERR_MEM;
3292             break;
3293         default:
3294             ret = -CMD_ERR_INV_PARAMS;
3295             break;
3296     }
3297     return ret;
3298 }
3299 #endif
3300 
3301 #if TLS_CONFIG_WIFI_PING_TEST
ping_parse_param(struct ping_param * para,union HOSTIF_CMD_PARAMS_UNION * cmd)3302 static int ping_parse_param(struct ping_param *para,
3303                             union HOSTIF_CMD_PARAMS_UNION *cmd)
3304 {
3305     int ret = -1;
3306 
3307     strcpy(para->host, (char*)cmd->ping.ip);
3308     para->interval = cmd->ping.timeLimt;
3309     para->cnt = cmd->ping.cnt;
3310     para->src = cmd->ping.src;
3311     ret = cmd->ping.start;
3312     return ret;
3313 }
3314 
3315 /*
3316     AT+PING=HOST,INTERVAL(ms),T(0|1),START(1)
3317     AT+PING=HOST,INTERVAL(ms),T(0|1),STOP(0)
3318 */
ping_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3319 static int ping_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3320     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3321 {
3322     int ret = -1;
3323     struct ping_param para;
3324 
3325     memset(&para, 0, sizeof(para));
3326     cmdrsp->ping.ext = cmd->ping.ext;
3327 
3328     if (cmd->ping.ext) {
3329         ping_test_create_task();
3330 
3331         ret = ping_parse_param(&para, cmd);
3332         if (ret == 1) {
3333             ping_test_start(&para);
3334             ret = 0;
3335         } else if (ret == 0) {
3336             ping_test_stop();
3337             ret = 0;
3338         } else {
3339             ret = -CMD_ERR_INV_PARAMS;
3340         }
3341     } else {
3342         ping_parse_param(&para, cmd);
3343         ret = ping_test_sync(&para);
3344         if (ret >= 0) {
3345             cmdrsp->ping.ttl = ret;
3346             ret = 0;
3347         }
3348     }
3349     return ret;
3350 }
3351 #endif
3352 
3353 /*
3354 For PIN:
3355 1:
3356 Step1:       AT+WWPS=get_pin
3357            Pin code will be responsed; User should input this Pin to AP;
3358 Step2:        AT+WWPS=start_pin
3359 ___________________________
3360 2:
3361 Step1:       AT+WWPS=!set_pin,xxxx
3362           User can set an Pin code to device; User should input this Pin to AP;
3363 Step2:       AT+WWPS=start_pin
3364 
3365 ___________________________
3366 3:
3367 Step1:      AT+WWPS=start_pin
3368             Pin code is the default value, and stored in system during
3369             manufacturing;User should input this Pin to AP;
3370 
3371 ___________________________
3372 For PBC:
3373 4:
3374 Step1:     AT+WWPS=start_pbc
3375 
3376 */
3377 #if TLS_CONFIG_WPS
wwps_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3378 int wwps_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3379     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3380 {
3381     struct tls_param_wps tmp_wps;
3382     int err = 0;
3383 
3384     if (set_opt) {
3385         memset(&tmp_wps, 0, sizeof(struct tls_param_wps));
3386         if (cmd->wps.mode == 0) {
3387             tls_cmd_get_wps_pin(&tmp_wps);
3388             memcpy(cmdrsp->wps.pin, tmp_wps.pin, WPS_PIN_LEN);
3389             cmdrsp->wps.pin_len = WPS_PIN_LEN;
3390             cmdrsp->wps.result = 1;
3391         } else if (cmd->wps.mode == 1) {
3392             if (cmd->wps.pin_len != EIGHT) {
3393                 return -CMD_ERR_INV_PARAMS;
3394             }
3395             memcpy(tmp_wps.pin, cmd->wps.pin, cmd->wps.pin_len);
3396             tls_cmd_set_wps_pin(&tmp_wps, update_flash);
3397             cmdrsp->wps.result = 0;
3398         } else if (cmd->wps.mode == TWO) {
3399             err = tls_wps_start_pin();
3400             cmdrsp->wps.result = 0;
3401         } else if (cmd->wps.mode == THREE) {
3402             err = tls_wps_start_pbc();
3403             cmdrsp->wps.result = 0;
3404         } else
3405             err = 1;
3406     } else {
3407         err = 1;
3408     }
3409     return err ? -CMD_ERR_INV_PARAMS : 0;
3410 }
3411 #endif
3412 
custdata_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3413 int custdata_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3414     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3415 {
3416     return;
3417 }
3418 
stand_by_power_down(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3419 int stand_by_power_down(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3420     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3421 {
3422 #define CMD_START_Pos          8U                       /*!< CMD start position */
3423 #define CMD_START_Msk          (1UL << CMD_START_Pos)   /*!< CMD start Mask */
3424     uint32_t val = 0;
3425     val = tls_reg_read32(HR_PMU_PS_CR);
3426     val |= BIT(0);
3427     tls_reg_write32(HR_PMU_PS_CR, val);
3428 
3429     /* Enter Deep Power Down Mode */
3430     M32(HR_FLASH_CMD_ADDR) = 0xB9;
3431     M32(HR_FLASH_CMD_START) = CMD_START_Msk;
3432     return 0;
3433 }
3434 
cpu_state_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3435 int cpu_state_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3436     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3437 {
3438     csi_vic_set_wakeup_irq(UART0_IRQn);
3439     switch (cmd->width.freq) {
3440         case 0:
3441             __WAIT();
3442             break;
3443         case 1:
3444             __DOZE();
3445             break;
3446         case TWO:
3447             __STOP();
3448             break;
3449         default:
3450             return -1;
3451     }
3452     printf("cpu state %d out\n", cmd->width.freq);
3453     return 0;
3454 }
3455 
tls_uart_bps_set(u8 portNum,u32 bdrate)3456 s32 tls_uart_bps_set(u8 portNum, u32 bdrate)
3457 {
3458     u32 val, reg_addr;
3459     tls_sys_clk sysclk;
3460 
3461     reg_addr = HR_UART0_BAUD_RATE_CTRL + portNum * 0x200;
3462     tls_sys_clk_get(&sysclk);
3463     val = (sysclk.apbclk * ONE_MILLION / ((TEN + SIX) * bdrate) - 1) |
3464           (((sysclk.apbclk * ONE_MILLION % (bdrate * (TEN + SIX))) *
3465             (TEN + SIX) / (bdrate * (TEN + SIX))) << (TEN + SIX));
3466 
3467     tls_reg_write32(reg_addr, val);
3468 
3469     return 0;
3470 }
3471 
3472 #if (WM_BT_INCLUDED == CFG_ON || WM_BLE_INCLUDED == CFG_ON  || WM_NIMBLE_INCLUDED == CFG_ON)
3473 
bt_enable_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3474 int bt_enable_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3475     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3476 {
3477     return;
3478 }
3479 
bt_destory_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3480 int bt_destory_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3481     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3482 {
3483     return;
3484 }
3485 
bt_ctrl_get_status_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3486 int bt_ctrl_get_status_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3487     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3488 {
3489     cmdrsp->bt.status = (u8)tls_bt_controller_get_status();
3490     return 0;
3491 }
3492 
bt_sleep_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3493 int bt_sleep_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3494     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3495 {
3496     tls_bt_status_t ret = TLS_BT_STATUS_FAIL;
3497 
3498     if (cmd->bt.cmd) {
3499         ret = tls_bt_ctrl_sleep(TRUE);
3500     } else {
3501         ret = tls_bt_ctrl_sleep(FALSE);
3502     }
3503 
3504     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3505 }
3506 
ble_tx_power_set_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3507 int ble_tx_power_set_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3508     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3509 {
3510     tls_bt_status_t ret = TLS_BT_STATUS_FAIL;
3511     ret = tls_ble_set_tx_power((tls_ble_power_type_t)cmd->btctrl.type, cmd->btctrl.level);
3512 
3513     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3514 }
3515 
ble_tx_power_get_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3516 int ble_tx_power_get_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3517     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3518 {
3519     cmdrsp->bt.status = (u8)tls_ble_get_tx_power((tls_ble_power_type_t)cmd->btctrl.type);
3520     return 0;
3521 }
3522 
bt_tx_power_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3523 int bt_tx_power_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3524     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3525 {
3526     tls_bt_status_t ret = TLS_BT_STATUS_FAIL;
3527 
3528     if (set_opt) {
3529         ret = tls_bredr_set_tx_power((int8_t)cmd->btctrl.type, (int8_t)cmd->btctrl.level);
3530     } else {
3531         tls_bredr_get_tx_power((int8_t *)&cmdrsp->blepow.min, (int8_t *)&cmdrsp->blepow.max);
3532         ret = TLS_BT_STATUS_SUCCESS;
3533     }
3534 
3535     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3536 }
3537 
bt_test_mode_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3538 int bt_test_mode_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3539     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3540 {
3541     tls_bt_status_t ret = TLS_BT_STATUS_SUCCESS;
3542     tls_bt_hci_if_t hci_if;
3543 
3544     if (cmd->bt.cmd == 1) {
3545         /* default uart1 will be used */
3546         hci_if.uart_index = 1;
3547         ret = enable_bt_test_mode(&hci_if);
3548     } else if (cmd->bt.cmd == 0) {
3549         ret = exit_bt_test_mode();
3550     }
3551 
3552     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3553 }
3554 
bt_mac_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3555 int bt_mac_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3556     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3557 {
3558     int ret;
3559 
3560     if (set_opt) {
3561         if (cmd->mac.length > (TEN + TWO)) {
3562             return -CMD_ERR_INV_PARAMS;
3563         }
3564         ret = tls_set_bt_mac_addr(cmd->mac.macaddr);
3565     } else {
3566         ret = tls_get_bt_mac_addr(cmdrsp->mac.addr);
3567     }
3568     return ret;
3569 }
3570 
bt_name_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3571 int bt_name_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3572     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3573 {
3574     return;
3575 }
3576 
bt_rf_mode_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3577 int bt_rf_mode_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3578     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3579 {
3580     tls_bt_status_t ret = TLS_BT_STATUS_SUCCESS;
3581     tls_rf_bt_mode(cmd->bt.cmd);
3582     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3583 }
3584 
3585 #if (WM_BTA_AV_SINK_INCLUDED == CFG_ON)
3586 
bt_audio_sink_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3587 int bt_audio_sink_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3588     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3589 {
3590     tls_bt_status_t ret = TLS_BT_STATUS_SUCCESS;
3591 
3592     if (cmd->bt.cmd == 1) {
3593         ret = tls_bt_enable_a2dp_sink();
3594     } else if (cmd->bt.cmd == 0) {
3595         ret = tls_bt_disable_a2dp_sink();
3596     }
3597     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3598 }
3599 #endif
3600 
3601 #if (WM_BTA_HFP_HSP_INCLUDED == CFG_ON)
3602 
bt_hfp_client_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3603 int bt_hfp_client_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3604     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3605 {
3606     tls_bt_status_t ret = TLS_BT_STATUS_SUCCESS;
3607 
3608     if (cmd->bt.cmd == 1) {
3609         ret = tls_bt_enable_hfp_client();
3610     } else if (cmd->bt.cmd == 0) {
3611         ret = tls_bt_disable_hfp_client();
3612     }
3613     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3614 }
3615 
bt_dial_up_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3616 int bt_dial_up_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3617     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3618 {
3619     tls_bt_status_t ret = TLS_BT_STATUS_FAIL;
3620 
3621     ret = tls_bt_dial_number(cmd->btname.name);
3622 
3623     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3624 }
3625 
3626 #endif
3627 
3628 #if (WM_BTA_SPPC_INCLUDED == CFG_ON)
bt_spp_client_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3629 int bt_spp_client_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3630     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3631 {
3632     tls_bt_status_t ret = TLS_BT_STATUS_SUCCESS;
3633 
3634     if (cmd->bt.cmd == 1) {
3635         ret = tls_bt_enable_spp_client();
3636     } else if (cmd->bt.cmd == 0) {
3637         ret = tls_bt_disable_spp_client();
3638     }
3639     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3640 }
3641 #endif
3642 
3643 #if (WM_BTA_SPPS_INCLUDED == CFG_ON)
3644 
bt_spp_server_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3645 int bt_spp_server_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3646     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3647 {
3648     tls_bt_status_t ret = TLS_BT_STATUS_SUCCESS;
3649 
3650     if (cmd->bt.cmd == 1) {
3651         ret = tls_bt_enable_spp_server();
3652     } else if (cmd->bt.cmd == 0) {
3653         ret = tls_bt_disable_spp_server();
3654     }
3655     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3656 }
3657 #endif
3658 
3659 #if (WM_BT_INCLUDED == CFG_ON)
3660 
bt_scan_mode_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3661 int bt_scan_mode_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3662     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3663 {
3664     tls_bt_status_t ret = TLS_BT_STATUS_SUCCESS;
3665     ret = demo_bt_scan_mode(cmd->bt.cmd);
3666 
3667     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3668 }
3669 
bt_inquiry_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3670 int bt_inquiry_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3671     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3672 {
3673     tls_bt_status_t ret = TLS_BT_STATUS_SUCCESS;
3674     ret = demo_bt_inquiry(cmd->bt.cmd);
3675 
3676     return (ret == TLS_BT_STATUS_SUCCESS) ? 0 : -CMD_ERR_OPS;
3677 }
3678 #endif
3679 #endif
3680 
cpu_clock_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3681 int cpu_clock_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3682     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3683 {
3684     u8 div = (u8)cmd->width.freq;
3685     if (set_opt) {
3686         tls_sys_clk_set(div);
3687         tls_uart_bps_set(0, TEN_HUNDRED_AND_FIFTEEN_THOUSAND_AND_TWO_HUNDRED);
3688     } else {
3689         clk_div_reg clk_div;
3690         clk_div.w = tls_reg_read32(HR_CLK_DIV_CTL);
3691         cmdrsp->pass.length = clk_div.b.CPU;
3692         div = clk_div.b.CPU;
3693     }
3694     printf("cpu clk is %d\n", FOUR_HUNRED_AND_EIGHTY_MILLION / div);
3695     return 0;
3696 }
3697 
set_token_proc(u8 set_opt,u8 update_flash,union HOSTIF_CMD_PARAMS_UNION * cmd,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp)3698 int set_token_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd,
3699     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp)
3700 {
3701     return;
3702 }
3703 
3704 static struct tls_cmd_t  at_ri_cmd_tbl[] = {
3705 #if 1
3706     { "Z", HOSTIF_CMD_RESET, 0x11, 0, 0, z_proc},
3707     { "E", HOSTIF_CMD_NOP, 0x1, 0, 0, e_proc},
3708     { "ENTS", HOSTIF_CMD_PS, 0x22, FOUR, FOUR, ents_proc},
3709     { "RSTF", HOSTIF_CMD_RESET_FLASH, 0x11, 0, 0, rstf_proc},
3710     { "PMTF", HOSTIF_CMD_PMTF, 0x11, 0, 0, pmtf_proc},
3711     { "IOC", HOSTIF_CMD_GPIO, 0x11, 0, 0, ioc_proc},
3712     { "WLEAV", HOSTIF_CMD_WLEAVE, 0x13, 1, 0, wleav_proc},
3713 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
3714     { "LKSTT", HOSTIF_CMD_LINK_STATUS, 0x19, 0, 0, lkstt_proc},
3715     { "SKSTT", HOSTIF_CMD_SKSTT, 0x22, 1, 1, skstt_proc},
3716     { "SKCLS", HOSTIF_CMD_SKCLOSE, 0x22, 1, 1, skcls_proc},
3717     { "SKSDF", HOSTIF_CMD_SKSDF, 0x22, 1, 1, sksdf_proc},
3718     { "SKRCV", HOSTIF_CMD_NOP, 0x02, TWO, 0, skrcv_proc},
3719     { "SKRPTM", HOSTIF_CMD_NOP, 0xA, 1, 0, skrptm_proc},
3720     { "SKSRCIP", HOSTIF_CMD_SKSRCIP, 0x18, 0, 0, sksrcip_proc},
3721     { "SKGHBN", HOSTIF_CMD_SKGHBN, 0x22, 1, 1, skghbn_proc},
3722 #endif
3723     { "WPRT", HOSTIF_CMD_WPRT, 0x7F, 1, 1, wprt_proc},
3724     { "SSID", HOSTIF_CMD_SSID, 0x7F, 1, 1, ssid_proc},
3725     { "KEY", HOSTIF_CMD_KEY, 0x7F, THREE, THREE, key_proc},
3726     { "ENCRY", HOSTIF_CMD_ENCRYPT, 0x7F, 1, 1, encry_proc},
3727     { "BSSID", HOSTIF_CMD_BSSID, 0x7F, 1, 1, bssid_proc},
3728     { "BRDSSID", HOSTIF_CMD_BRD_SSID, 0x7F, 1, 1, brdssid_proc},
3729     { "CNTPARAM", HOSTIF_CMD_CNTPARAM, 0x19, 0, 0, cntparam_proc},
3730     { "CHL", HOSTIF_CMD_CHNL, 0x7F, 1, TWO, chl_proc},
3731     { "CHLL", HOSTIF_CMD_CHLL, 0x7F, 1, TWO, chll_proc},
3732     { "WREG", HOSTIF_CMD_WREG, 0x7F, 1, TWO, wreg_proc},
3733     { "WBGR", HOSTIF_CMD_WBGR, 0x7F, TWO, TWO, wbgr_proc},
3734     { "WATC", HOSTIF_CMD_WATC, 0x7F, 1, 1, watc_proc},
3735     { "WPSM", HOSTIF_CMD_WPSM, 0x7F, 1, 1, wpsm_proc},
3736     { "WARC", HOSTIF_CMD_WARC, 0x7F, 1, 1, warc_proc},
3737     { "WARM", HOSTIF_CMD_WARM, 0x7F, 1, 1, warm_proc},
3738 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
3739     { "NIP", HOSTIF_CMD_NIP, 0x7F, 1, TEN + SEVEN, nip_proc},
3740 #endif
3741     { "ATM", HOSTIF_CMD_ATM, 0x7F, 1, 1, atm_proc},
3742     { "ATRM", HOSTIF_CMD_ATRM, 0x7F, FOUR, SIX, atrm_proc},
3743     { "AOLM", HOSTIF_CMD_AOLM, 0x7F, 0, 0, aolm_proc},
3744     { "PORTM", HOSTIF_CMD_PORTM, 0x7F, 1, 1, portm_proc},
3745     { "UART", HOSTIF_CMD_UART, 0x7F, FOUR, SEVEN, uart_proc},
3746     { "ATLT", HOSTIF_CMD_ATLT, 0x7F, 1, TWO, atlt_proc},
3747     { "DNS", HOSTIF_CMD_DNS, 0x7F, 1, TWO, dns_proc},
3748     { "DDNS", HOSTIF_CMD_DDNS, 0x7F, 0, 0, ddns_proc},
3749     { "UPNP", HOSTIF_CMD_UPNP, 0x7F, 0, 0, upnp_proc},
3750     { "DNAME", HOSTIF_CMD_DNAME, 0x7F, 0, 0, dname_proc},
3751     { "ATPT", HOSTIF_CMD_ATPT, 0x7F, 1, TWO, atpt_proc},
3752     { "&DBG", HOSTIF_CMD_DBG, 0x22, 1, FOUR, dbg_proc},
3753     { "ESPC", HOSTIF_CMD_NOP, 0xF, 1, 0, espc_proc},
3754     { "ESPT", HOSTIF_CMD_NOP, 0xF, 1, 0, espt_proc},
3755     { "WEBS", HOSTIF_CMD_WEBS, 0x7F, 1, 1, webs_proc},
3756     { "IOM", HOSTIF_CMD_IOM, 0x7F, 1, 1, iom_proc},
3757     { "CMDM", HOSTIF_CMD_CMDM, 0x7F, 1, 1, cmdm_proc},
3758     { "PASS", HOSTIF_CMD_PASS, 0x7F, 1, SEVEN, pass_proc},
3759 #if TLS_CONFIG_HTTP_CLIENT_TASK
3760     { "FWUP", HOSTIF_CMD_FWUP, 0x22, 1, 0, fwup_proc},
3761 #endif
3762     { "TEM", HOSTIF_CMD_TEM, 0x7F, 1, 1, tem_proc},
3763 #endif
3764     { "QMAC", HOSTIF_CMD_MAC, 0x19, 0, 0, qmac_proc},
3765     { "QVER", HOSTIF_CMD_VER, 0x19, 0, 0, qver_proc},
3766     { "&UPDD", HOSTIF_CMD_UPDD, 0x22, 1, TWO, updd_proc},
3767     { "&REGR", HOSTIF_CMD_REGR, 0x22, TWO, FIVE, regr_proc},
3768     { "&REGW", HOSTIF_CMD_REGW, 0x22, TWO, FIVE, regw_proc},
3769     { "&RFR", HOSTIF_CMD_RFR, 0x22, TWO, THREE, rfr_proc},
3770     { "&RFW", HOSTIF_CMD_RFW, 0x22, TWO, THREE, rfw_proc},
3771     { "&FLSR", HOSTIF_CMD_FLSR, 0x22, TWO, FIVE, flsr_proc},
3772     { "&FLSW", HOSTIF_CMD_FLSW, 0x22, TWO, FIVE, flsw_proc},
3773     { "&TXG", HOSTIF_CMD_NOP, 0xF, 1, 0, txg_proc},
3774     { "&TXGS", HOSTIF_CMD_NOP, 0xF, 1, 0, txg_rate_set_proc},
3775     { "&TXGG", HOSTIF_CMD_NOP, 0xF, 1, 0, txg_rate_get_proc},
3776     { "&MAC", HOSTIF_CMD_NOP, 0xF, 1, 0, mac_proc},
3777     { "&HWV", HOSTIF_CMD_NOP, 0x9, 0, 0, hwv_proc},
3778     { "&SPIF", HOSTIF_CMD_NOP, 0x2, 1, 0, spif_proc},
3779     { "&LPCHL", HOSTIF_CMD_NOP, 0xB, 1, 0, lpchl_proc},
3780     { "&LPTSTR", HOSTIF_CMD_NOP, 0x2, FIVE, 0, lptstr_proc},
3781     { "&LPTSTP", HOSTIF_CMD_NOP, 0x1, 0, 0, lptstp_proc},
3782     { "&LPTSTT", HOSTIF_CMD_NOP, 0xF, 0, 0, lptstt_proc},
3783     { "&LPRSTR", HOSTIF_CMD_NOP, 0x2, 1, 0, lprstr_proc},
3784     { "&LPRSTP", HOSTIF_CMD_NOP, 0x1, 0, 0, lprstp_proc},
3785     { "&LPRSTT", HOSTIF_CMD_NOP, 0x1, 0, 0, lprstt_proc},
3786     { "&LPPSTR", HOSTIF_CMD_NOP, 0x3, TWO, 0, lppstr_proc},
3787     { "&LPPSTP", HOSTIF_CMD_NOP, 0x2, 1, 0, lppstp_proc},
3788     { "&LPRFPS", HOSTIF_CMD_NOP, 0x1, 0, 0, lprfps_proc},
3789     { "&LPCHRS", HOSTIF_CMD_NOP, 0x2, 1, 0, lpchrs_proc},
3790     { "&LPTBD", HOSTIF_CMD_NOP, 0x2, SEVEN, 0, lptbd_proc},
3791     { "&LPSTPT", HOSTIF_CMD_NOP, 0x1, 0, 0, lpstpt_proc},
3792     { "&LPCHLR", HOSTIF_CMD_NOP, 0x2, 1, 0, lpchlr_proc},
3793     { "&LPSTPR", HOSTIF_CMD_NOP, 0x1, 0, 0, lpstpr_proc},
3794     { "&LPRAGC", HOSTIF_CMD_NOP, 0x1, 0, 0, lpragc_proc},
3795     { "&LPRSR", HOSTIF_CMD_NOP, 0x9, 0, 0, lprsr_proc},
3796 #if TLS_CONFIG_AP
3797     { "SLIST", HOSTIF_CMD_STA_LIST, 0x19, 0, 0, slist_proc},
3798     { "APLKSTT", HOSTIF_CMD_AP_LINK_STATUS, 0x19, 0, 0, softap_lkstt_proc},
3799     { "APSSID", HOSTIF_CMD_AP_SSID, 0x7F, 1, 1, softap_ssid_proc},
3800     { "APMAC", HOSTIF_CMD_AP_MAC, 0x19, 0, 0, softap_qmac_proc},
3801     { "APENCRY", HOSTIF_CMD_AP_ENCRYPT, 0x7F, 1, 1, softap_encry_proc },
3802     { "APKEY", HOSTIF_CMD_AP_KEY, 0x7F, THREE, THREE, softap_key_proc },
3803     { "APCHL", HOSTIF_CMD_AP_CHL, 0x7F, 1, TWO, softap_chl_proc},
3804     { "APWBGR", HOSTIF_CMD_AP_WBGR, 0x7F, TWO, TWO, softap_wbgr_proc},
3805     { "APNIP", HOSTIF_CMD_AP_NIP, 0x7F, 1, TEN + SEVEN, softap_nip_proc },
3806 #endif
3807 #if TLS_CONFIG_WIFI_PERF_TEST
3808     { "THT", HOSTIF_CMD_NOP, 0x2, 0, 0, tht_proc},
3809 #endif
3810 #if TLS_CONFIG_WIFI_PING_TEST
3811     { "PING", HOSTIF_CMD_NOP, 0x2, 0, 0, ping_proc},
3812 #endif
3813 #if TLS_CONFIG_WPS
3814     { "WWPS", HOSTIF_CMD_WPS, 0x7F, 1, 1, wwps_proc},
3815 #endif
3816     { "CUSTDATA", HOSTIF_CMD_CUSTDATA, 0x19, 0, 0, custdata_proc},
3817     { "TXLO", HOSTIF_CMD_NOP, 0x7F, 1, 0, tls_tx_lo_proc},
3818     { "TXIQ", HOSTIF_CMD_NOP, 0x7F, TWO, 0, tls_tx_iq_mismatch_proc},
3819     { "FREQ", HOSTIF_CMD_NOP, 0x7F, 1, 0, tls_freq_error_proc},
3820     { "VCG",    HOSTIF_CMD_NOP, 0x7F, 1, 0, tls_rf_vcg_ctrl_proc},
3821     { "&LPTPD", HOSTIF_CMD_NOP, 0x7F, 1, 0, tls_lptperiod_proc},
3822     { "STDBY", HOSTIF_CMD_NOP, 0x1, 0, 0, stand_by_power_down},
3823     { "CPUSTA", HOSTIF_CMD_NOP, 0x2, 1, 0, cpu_state_proc},
3824     { "CPUDIV", HOSTIF_CMD_NOP, 0xb, 1, 0, cpu_clock_proc},
3825 #if (WM_BT_INCLUDED == CFG_ON || WM_BLE_INCLUDED == CFG_ON || WM_NIMBLE_INCLUDED == CFG_ON)
3826 
3827     { "BTEN", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, TWO, 0, bt_enable_proc},
3828     { "BTDES", HOSTIF_CMD_NOP, ATCMD_OP_NULL, 0, 0, bt_destory_proc},
3829     { "&BTMAC", HOSTIF_CMD_NOP, 0xF, 1, 0, bt_mac_proc},
3830     { "&BTNAME", HOSTIF_CMD_NOP, 0xF, 1, 0, bt_name_proc},
3831     { "BTCTRLGS", HOSTIF_CMD_NOP, ATCMD_OP_NULL | ATCMD_OP_QU | RICMD_OP_GET, 0, 0, bt_ctrl_get_status_proc},
3832     { "BTSLEEP", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, 1, 0, bt_sleep_proc},
3833     { "BLETPS", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, TWO, 0, ble_tx_power_set_proc},
3834     { "BLETPG", HOSTIF_CMD_NOP, ATCMD_OP_NULL | ATCMD_OP_QU | RICMD_OP_GET, 1, 0, ble_tx_power_get_proc},
3835     { "BTTEST", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, 1, 0, bt_test_mode_proc},
3836     { "BTRF", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, 1, 0, bt_rf_mode_proc},
3837 #if (WM_BTA_AV_SINK_INCLUDED == CFG_ON)
3838     { "BTAVS", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, 1, 0, bt_audio_sink_proc},
3839 #endif
3840 #if (WM_BTA_HFP_HSP_INCLUDED == CFG_ON)
3841     { "BTHFP", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, 1, 0, bt_hfp_client_proc},
3842     { "BTDIAL", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, 1, 0, bt_dial_up_proc},
3843 #endif
3844 #if (WM_BTA_SPPS_INCLUDED == CFG_ON)
3845     { "BTSPPS", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, 1, 0, bt_spp_server_proc},
3846 #endif
3847 #if (WM_BTA_SPPC_INCLUDED == CFG_ON)
3848     { "BTSPPC", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, 1, 0, bt_spp_client_proc},
3849 #endif
3850 
3851 #if (WM_BT_INCLUDED == CFG_ON)
3852     { "BTSCM", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, 1, 0, bt_scan_mode_proc},
3853     { "BTINQUIRY", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, 1, 0, bt_inquiry_proc},
3854 #endif
3855 #endif
3856    { "SETTOKEN", HOSTIF_CMD_NOP, ATCMD_OP_EQ | ATCMD_OP_EP | RICMD_OP_SET, FOUR, 0, set_token_proc},
3857     { NULL, HOSTIF_CMD_NOP, 0, 0, 0, NULL},
3858 };
3859 
at_parse_func(char * at_name,struct tls_atcmd_token_t * tok,union HOSTIF_CMD_PARAMS_UNION * cmd)3860 int at_parse_func(char *at_name, struct tls_atcmd_token_t *tok, union HOSTIF_CMD_PARAMS_UNION *cmd)
3861 {
3862     if (strcmp("QMAC", at_name) == 0 || strcmp("QVER", at_name) == 0 || strcmp("&HWV", at_name) == 0 ||
3863         strcmp("&LPTSTP", at_name) == 0 || strcmp("&LPTSTT", at_name) == 0 || strcmp("&LPRSTP", at_name) == 0 ||
3864         strcmp("&LPRSTT", at_name) == 0 || strcmp("&LPRFPS", at_name) == 0 || strcmp("&LPSTPT", at_name) == 0 ||
3865         strcmp("&LPSTPR", at_name) == 0 || strcmp("&LPRAGC", at_name) == 0 || strcmp("&LPRSR", at_name) == 0 ||
3866         strcmp("CUSTDATA", at_name) == 0 || strcmp("STDBY", at_name) == 0) {
3867         ;
3868 #if TLS_CONFIG_AT_CMD
3869     } else if ((strcmp("Z", at_name) == 0) || (strcmp("E", at_name) == 0) || (strcmp("RSTF", at_name) == 0) ||
3870                (strcmp("PMTF", at_name) == 0) || (strcmp("IOC", at_name) == 0)  ||
3871                (strcmp("LKSTT", at_name) == 0) || (strcmp("CNTPARAM", at_name) == 0)) {
3872             ;
3873     } else if (strcmp("ENTS", at_name) == 0) {
3874         int err = 0, ret = 0;
3875         u32 params;
3876         if (tok->arg_found != FOUR)
3877             return -CMD_ERR_INV_PARAMS;
3878         do {
3879             ret = string_to_uint(tok->arg[0], &params);
3880             if (ret) {
3881                 err = 1;
3882                 break;
3883             }
3884             cmd->ps.ps_type = (u8)params;
3885 
3886             ret = string_to_uint(tok->arg[1], &params);
3887             if (ret) {
3888                 err = 1;
3889                 break;
3890             }
3891             cmd->ps.wake_type = (u8)params;
3892 
3893             ret = string_to_uint(tok->arg[TWO], &params);
3894             if (ret) {
3895                 err = 1;
3896                 break;
3897             }
3898             cmd->ps.delay_time = (u16)params;
3899 
3900             ret = string_to_uint(tok->arg[THREE], &params);
3901             if (ret) {
3902                 err = 1;
3903                 break;
3904             }
3905             cmd->ps.wake_time = (u16)params;
3906         } while (0);
3907         if (err)
3908             return -CMD_ERR_INV_PARAMS;
3909     } else if (strcmp("WJOIN", at_name) == 0) {
3910         cmd->wscan.mode = tok->cmd_mode;
3911     } else if (strcmp("WSCAN", at_name) == 0) {
3912         int ret;
3913         u32 value = 0;
3914         cmd->scanparam.mode = tok->cmd_mode;
3915         cmd->scanparam.switchinterval = 0;
3916         cmd->scanparam.scantimes = 0;
3917         cmd->scanparam.chlist = 0;
3918 
3919         switch (tok->arg_found) {
3920             case THREE:
3921                 ret = string_to_uint(tok->arg[TWO], &value);
3922                 if (ret)
3923                     return -CMD_ERR_INV_PARAMS;
3924                 cmd->scanparam.switchinterval = value;
3925             case TWO:
3926                 ret = string_to_uint(tok->arg[1], &value);
3927                 if (ret)
3928                     return -CMD_ERR_INV_PARAMS;
3929                 cmd->scanparam.scantimes = value;
3930             case 1:
3931                 ret = hexstr_to_unit(tok->arg[0], &value);
3932                 if (ret)
3933                     return -CMD_ERR_INV_PARAMS;
3934                 cmd->scanparam.chlist = value;
3935                 break;
3936             default:
3937                 cmd->scanparam.switchinterval = 0;
3938                 cmd->scanparam.scantimes = 0;
3939                 cmd->scanparam.chlist = 0;
3940                 break;
3941         }
3942     } else if (strcmp("SSID", at_name) == 0 || strcmp("DNS", at_name) == 0  || strcmp("PASS", at_name) == 0
3943 #if TLS_CONFIG_AP
3944               || strcmp("APSSID", at_name) == 0
3945 #endif
3946     ) {
3947         int ret = 0;
3948         u8 *tmpssid;
3949         if (tok->arg_found > 1)
3950             return -CMD_ERR_INV_PARAMS;
3951         if (tok->arg_found == 1) {
3952             ret = atcmd_filter_quotation(&tmpssid, (u8 *)tok->arg[0]);
3953             if (ret)
3954                 return -CMD_ERR_INV_PARAMS;
3955             cmd->ssid.ssid_len = strlen((char *)tmpssid);
3956             memcpy(cmd->ssid.ssid, tmpssid, cmd->ssid.ssid_len);
3957         }
3958     } else if (strcmp("TEM", at_name) == 0) {
3959         int ret = 0;
3960         u8 *tmpssid;
3961         if (tok->arg_found > 1)
3962             return -CMD_ERR_INV_PARAMS;
3963         if (tok->arg_found == 1) {
3964             ret = atcmd_filter_quotation(&tmpssid, (u8 *)tok->arg[0]);
3965             if (ret)
3966                 return -CMD_ERR_INV_PARAMS;
3967             cmd->tem.offsetLen = strlen((char *)tmpssid);
3968             memcpy(cmd->tem.offset, tmpssid, cmd->tem.offsetLen);
3969         }
3970     } else if ((strcmp("WPRT", at_name) == 0) || (strcmp("ENCRY", at_name) == 0) || (strcmp("BRDSSID", at_name) == 0) ||
3971                (strcmp("WATC", at_name) == 0) || (strcmp("WPSM", at_name) == 0) || (strcmp("WARC", at_name) == 0) ||
3972                (strcmp("WARM", at_name) == 0) || (strcmp("ATM", at_name) == 0) || (strcmp("PORTM", at_name) == 0) ||
3973                (strcmp("IOM", at_name) == 0) || (strcmp("CMDM", at_name) == 0) || (strcmp("ONESHOT", at_name) == 0) ||
3974                (strcmp("&UPDP", at_name) == 0)) {
3975         int ret = 0;
3976         u32 param;
3977         if (tok->arg_found > 1)
3978             return -CMD_ERR_INV_PARAMS;
3979         if (tok->arg_found == 1) {
3980             ret = string_to_uint(tok->arg[0], &param);
3981             if (ret)
3982                 return -CMD_ERR_INV_PARAMS;
3983             cmd->wprt.type = (u8)param;
3984         }
3985     } else if ((strcmp("KEY", at_name) == 0)
3986 #if TLS_CONFIG_AP
3987     ||(strcmp("APKEY", at_name) == 0)
3988 #endif
3989     ) {
3990         int ret;
3991         u32 params;
3992         u8 *keyInfo;
3993 
3994         if (tok->arg_found != 0 && tok->arg_found != THREE)
3995             return  -CMD_ERR_INV_PARAMS;
3996         if (tok->arg_found == THREE) {
3997             ret= strtodec((int *)&params, tok->arg[0]);
3998             if (ret)
3999                 return -CMD_ERR_INV_PARAMS;
4000             cmd->key.format = (u8)params;
4001             ret = strtodec((int *)&params, tok->arg[1]);
4002             if (ret) {
4003                 return -CMD_ERR_INV_PARAMS;
4004             }
4005             cmd->key.index = (u8)params;
4006             ret = atcmd_filter_quotation(&keyInfo, (u8 *)tok->arg[TWO]);
4007             if (ret)
4008                 return -CMD_ERR_INV_PARAMS;
4009             cmd->key.key_len = strlen((char *)keyInfo);
4010             memcpy(cmd->key.key, keyInfo, cmd->key.key_len);
4011         }
4012     } else if ((strcmp("CHL", at_name) == 0)
4013 #if TLS_CONFIG_AP
4014     ||(strcmp("APCHL", at_name) == 0)
4015 #endif
4016     ) {
4017         int ret;
4018         u32 params;
4019         if (tok->arg_found > TWO)
4020             return -CMD_ERR_INV_PARAMS;
4021         if (tok->arg_found > 0) {
4022             ret = string_to_uint(tok->arg[0], &params);
4023             if (ret)
4024                 return -CMD_ERR_INV_PARAMS;
4025             cmd->channel.enable = (u8)params;
4026             if (cmd->channel.enable == 0 && tok->arg_found > 1)
4027                 return -CMD_ERR_INV_PARAMS;
4028             if (cmd->channel.enable == 0) {
4029                 cmd->channel.channel = 1;
4030                 return 0;
4031             }
4032             ret = string_to_uint(tok->arg[1], &params);
4033             if (ret)
4034                 return -CMD_ERR_INV_PARAMS;
4035             cmd->channel.channel = (u8)params;
4036         }
4037     } else if (strcmp("CHLL", at_name) == 0) {
4038         int ret;
4039         u32 params;
4040         if (tok->arg_found > 1)
4041             return -CMD_ERR_INV_PARAMS;
4042         if (tok->arg_found == 1) {
4043             ret = strtohex(&params, tok->arg[0]);
4044             if (ret)
4045                 return -CMD_ERR_INV_PARAMS;
4046             cmd->channel_list.channellist = (u16)params;
4047         }
4048     } else if (strcmp("WREG", at_name) == 0 || strcmp("ATLT", at_name) == 0
4049                || strcmp("ATPT", at_name) == 0
4050                || strcmp("ESPT", at_name) == 0
4051                || (strcmp("WLEAV", at_name) == 0)) {
4052         int ret;
4053         u32 params;
4054         if (tok->arg_found > 1)
4055             return -CMD_ERR_INV_PARAMS;
4056         if (tok->arg_found == 1) {
4057             ret = string_to_uint(tok->arg[0], &params);
4058             if (ret) {
4059                 return -CMD_ERR_INV_PARAMS;
4060             }
4061             cmd->wreg.region = (u16)params;
4062         }
4063     } else if (strcmp("AOLM", at_name) == 0 || strcmp("DDNS", at_name) == 0 ||
4064                strcmp("UPNP", at_name) == 0 || strcmp("DNAME", at_name) == 0) {
4065         if (tok->arg_found) {
4066             return -CMD_ERR_INV_PARAMS;
4067         }
4068     } else if (strcmp("&DBG", at_name) == 0) {
4069         u32 dbg;
4070         int ret = 0;
4071         if (tok->arg_found != 1) {
4072             return -CMD_ERR_INV_PARAMS;
4073         }
4074         ret = string_to_uint(tok->arg[0], &dbg);
4075         if (ret) {
4076             return -CMD_ERR_INV_PARAMS;
4077         }
4078         cmd->dbg.dbg_level = dbg;
4079     } else if (strcmp("ESPC", at_name) == 0) {
4080         int ret;
4081         u32 params;
4082         if (tok->arg_found > 1) {
4083             return -CMD_ERR_INV_PARAMS;
4084         }
4085         if (tok->arg_found == 1) {
4086             ret = strtohex(&params, tok->arg[0]);
4087             if (ret) {
4088                 return -CMD_ERR_INV_PARAMS;
4089             }
4090             cmd->espc.escapechar = (u8)params;
4091         }
4092     } else if (strcmp("WEBS", at_name) == 0) {
4093         u32 params;
4094         int ret = 0;
4095         if (tok->arg_found > TWO) {
4096             return -CMD_ERR_INV_PARAMS;
4097         }
4098         if (tok->arg_found >= 1) {
4099             ret = strtodec((int *)&params, tok->arg[0]);
4100             if (ret) {
4101                 return -CMD_ERR_INV_PARAMS;
4102             }
4103             cmd->webs.autorun = (u8)params;
4104             cmd->webs.portnum = EIGHTY;
4105         }
4106 
4107         if (tok->arg_found >= TWO) {
4108             ret = strtodec((int *)&params, tok->arg[1]);
4109             if (ret) {
4110                 return -CMD_ERR_INV_PARAMS;
4111             }
4112             cmd->webs.portnum = (u16)params;
4113         }
4114 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
4115     } else if ((strcmp("ENTM", at_name) == 0) || (strcmp("SKSRCIP", at_name) == 0)) {
4116         ;
4117     } else if ((strcmp("SKSTT", at_name) == 0) || (strcmp("SKCLS", at_name) == 0) ||
4118                (strcmp("SKSDF", at_name) == 0)) {
4119         int err;
4120         u32 params;
4121         if (tok->arg_found != 1) {
4122             return -CMD_ERR_INV_PARAMS;
4123         }
4124         err = string_to_uint(tok->arg[0], &params);
4125         if (err) {
4126             return -CMD_ERR_INV_PARAMS;
4127         }
4128         cmd->skstt.socket = params;
4129     } else if ((strcmp("SKSND", at_name) == 0) || (strcmp("SKRCV", at_name) == 0)) {
4130         int ret;
4131         u32 params;
4132         if (tok->cmd_mode == CMD_MODE_UART0_ATCMD) {
4133             return -CMD_ERR_UNSUPP;
4134         }
4135 
4136         if (tok->arg_found != TWO) {
4137             return -CMD_ERR_INV_PARAMS;
4138         }
4139         ret = string_to_uint(tok->arg[0], &params);
4140         if (ret) {
4141             return -CMD_ERR_INV_PARAMS;
4142         }
4143         cmd->sksnd.socket = params;
4144         ret = string_to_uint(tok->arg[1], &params);
4145         if (ret) {
4146             return -CMD_ERR_INV_PARAMS;
4147         }
4148         cmd->sksnd.size = params;
4149     } else if (strcmp("SKRPTM", at_name) == 0) {
4150         int err;
4151         u32 params;
4152         if (tok->arg_found > 1) {
4153             return -CMD_ERR_INV_PARAMS;
4154         }
4155         if (tok->arg_found == 1) {
4156             err = string_to_uint(tok->arg[0], &params);
4157             if (err) {
4158                 return -CMD_ERR_INV_PARAMS;
4159             }
4160             cmd->skrptm.mode = params;
4161         }
4162     } else if (strcmp("SKGHBN", at_name) == 0) {
4163         u8 *ipstr = NULL;
4164         if (tok->arg_found != 1) {
4165             return -CMD_ERR_INV_PARAMS;
4166         }
4167         atcmd_filter_quotation(&ipstr, (u8 *)tok->arg[0]);
4168         memcpy(cmd->skghbn.ipstr, ipstr, strlen((char *)ipstr));
4169 #endif
4170 #if TLS_CONFIG_HTTP_CLIENT_TASK
4171     } else if (strcmp("HTTPC", at_name) == 0) {
4172         int ret, verb;
4173         u8 *uri;
4174         if (tok->arg_found != TWO && tok->arg_found != THREE) {
4175             return -CMD_ERR_INV_PARAMS;
4176         }
4177         ret = atcmd_filter_quotation(&uri, (u8 *)tok->arg[0]);
4178         if (ret) {
4179             return -CMD_ERR_INV_PARAMS;
4180         }
4181         cmd->httpc.url_len = strlen((char *)uri);
4182         cmd->httpc.url = uri;
4183         ret = string_to_uint(tok->arg[1], (u32 *)&verb);
4184         if (ret) {
4185             return -CMD_ERR_INV_PARAMS;
4186         }
4187         cmd->httpc.verb = (u8)verb;
4188         if (verb == VerbPost || verb == VerbPut) {
4189             if (tok->arg_found != THREE) {
4190                 return -CMD_ERR_INV_PARAMS;
4191             }
4192             cmd->httpc.data_len = strlen(tok->arg[TWO]);
4193             cmd->httpc.data = (u8 *)tok->arg[TWO];
4194         }
4195     } else if (strcmp("FWUP", at_name) == 0) {
4196         int ret;
4197         u8 *uri;
4198         if (tok->arg_found != 1) {
4199             return -CMD_ERR_INV_PARAMS;
4200         }
4201         ret = atcmd_filter_quotation(&uri, (u8 *)tok->arg[0]);
4202         if (ret) {
4203             return -CMD_ERR_INV_PARAMS;
4204         }
4205         cmd->httpc.url_len = strlen((char *)uri);
4206         cmd->httpc.url = uri;
4207 #endif
4208 #endif
4209     } else if (strcmp("&UPDM", at_name) == 0) {
4210         int ret, mode;
4211         if (tok->arg_found != 1) {
4212             return -CMD_ERR_INV_PARAMS;
4213         }
4214         ret = string_to_uint(tok->arg[0], (u32 *)&mode);
4215         if (ret) {
4216             return -CMD_ERR_INV_PARAMS;
4217         }
4218         cmd->updm.mode = (u8)mode;
4219         cmd->updm.src = 0;
4220     } else if (strcmp("&REGR", at_name) == 0 || strcmp("&FLSR", at_name) == 0) {
4221         int ret;
4222         u32 Addr, Num;
4223         if (tok->arg_found != TWO) {
4224             return -CMD_ERR_OPS;
4225         }
4226         ret = hexstr_to_unit(tok->arg[0], &Addr);
4227         if (ret) {
4228             return -CMD_ERR_INV_PARAMS;
4229         }
4230         cmd->regr.reg_base_addr = Addr;
4231         ret = hexstr_to_unit(tok->arg[1], &Num);
4232         if (ret) {
4233             return -CMD_ERR_INV_PARAMS;
4234         }
4235         cmd->regr.length = Num;
4236     } else if (strcmp("&REGW", at_name) == 0 || strcmp("&FLSW", at_name) == 0) {
4237         int ret;
4238         u32 Addr, Value, i;
4239         if (tok->arg_found < TWO || tok->arg_found > NINE) {
4240             return -CMD_ERR_OPS;
4241         }
4242         ret = hexstr_to_unit(tok->arg[0], &Addr);
4243         if (ret) {
4244             return -CMD_ERR_INV_PARAMS;
4245         }
4246         cmd->regw.reg_base_addr = Addr;
4247         cmd->regw.length = tok->arg_found - 1;
4248         for (i = 0; i < cmd->regw.length; i++) {
4249             ret = hexstr_to_unit(tok->arg[i + 1], &Value);
4250             if (ret) {
4251                 return -CMD_ERR_INV_PARAMS;
4252             }
4253             cmd->regw.v[i] = Value;
4254         }
4255     } else if (strcmp("&RFR", at_name) == 0) {
4256         int ret;
4257         u32 Addr, Num;
4258         if (tok->arg_found != TWO) {
4259             return -CMD_ERR_OPS;
4260         }
4261         ret = hexstr_to_unit(tok->arg[0], &Addr);
4262         if (ret) {
4263             return -CMD_ERR_INV_PARAMS;
4264         }
4265         cmd->rfr.reg_base_addr = (u16)Addr;
4266         ret = hexstr_to_unit(tok->arg[1], &Num);
4267         if (ret) {
4268             return -CMD_ERR_INV_PARAMS;
4269         }
4270         cmd->rfr.length = Num;
4271     } else if (strcmp("&RFW", at_name) == 0) {
4272         int ret;
4273         u32 Addr, Value, i;
4274         if (tok->arg_found < TWO || tok->arg_found > NINE) {
4275             return -CMD_ERR_OPS;
4276         }
4277         ret = hexstr_to_unit(tok->arg[0], &Addr);
4278         if (ret) {
4279             return -CMD_ERR_INV_PARAMS;
4280         }
4281         cmd->rfw.reg_base_addr = (u16)Addr;
4282         cmd->rfw.length = tok->arg_found - 1;
4283         for (i = 0; i < cmd->rfw.length; i++) {
4284             ret = hexstr_to_unit(tok->arg[i + 1], &Value);
4285             if (ret) {
4286                 return -CMD_ERR_INV_PARAMS;
4287             }
4288             cmd->rfw.v[i] = (u16)Value;
4289         }
4290     } else if (strcmp("&TXG", at_name) == 0) {
4291         if (tok->arg_found > 1) {
4292             return -CMD_ERR_INV_PARAMS;
4293         }
4294         if (tok->arg_found == 1) {
4295             if (strtohexarray(cmd->txg.tx_gain, TX_GAIN_LEN, tok->arg[0]) < 0) {
4296                 return -CMD_ERR_INV_PARAMS;
4297             }
4298         }
4299     } else if (strcmp("&TXGI", at_name) == 0) {
4300         if (tok->arg_found > 1) {
4301             return -CMD_ERR_INV_PARAMS;
4302         }
4303 
4304         if (tok->arg_found == 1) {
4305             if (strtohexarray(cmd->txg.tx_gain, TX_GAIN_LEN / THREE, tok->arg[0]) < 0) {
4306                 return -CMD_ERR_INV_PARAMS;
4307             }
4308         }
4309     } else if (strcmp("&TXGS", at_name) == 0) {
4310         if (tok->arg_found >= 1) {
4311             u32 rate;
4312             if (string_to_uint(tok->arg[0], (u32 *)&rate) != 0) {
4313                 return -CMD_ERR_INV_PARAMS;
4314             }
4315             cmd->txgr.tx_rate = rate;
4316         }
4317 
4318         if (tok->arg_found == TWO) {
4319             if (strtohexarray(cmd->txgr.txr_gain, THREE, tok->arg[1]) < 0) {
4320                 return -CMD_ERR_INV_PARAMS;
4321             }
4322         }
4323     } else  if (strcmp("&TXGG", at_name) == 0) {
4324         if (tok->arg_found >= 1) {
4325             u32 rate;
4326             if (string_to_uint(tok->arg[0], (u32 *)&rate)  != 0) {
4327                 return -CMD_ERR_INV_PARAMS;
4328             }
4329             cmd->txgr.tx_rate = rate;
4330         }
4331     } else if (strcmp("&MAC", at_name) == 0) {
4332         u8 *tmpmac = NULL;
4333         if (tok->arg_found == 1) {
4334             if (atcmd_filter_quotation(&tmpmac, (u8 *)tok->arg[0])) {
4335                 return -CMD_ERR_INV_PARAMS;
4336             }
4337             cmd->mac.length = strlen((char *)tmpmac);
4338             if (strtohexarray(cmd->mac.macaddr, ETH_ALEN, (char *)tmpmac)< 0) {
4339                 return -CMD_ERR_INV_PARAMS;
4340             }
4341         }
4342     } else if (strcmp("TXLO", at_name) == 0) {
4343         int ret = 0;
4344         u32 value = 0;
4345 
4346         if (tok->arg_found == 1) {
4347             ret = hexstr_to_unit(tok->arg[0], &value);
4348             if (ret) {
4349                 return -CMD_ERR_INV_PARAMS;
4350             }
4351             cmd->txLO.txlo = value;
4352         }
4353     } else if (strcmp("TXIQ", at_name) == 0) {
4354         int ret = 0;
4355         u32 value = 0;
4356 
4357         if (tok->arg_found == TWO) {
4358             ret = hexstr_to_unit(tok->arg[0],  &value);
4359             if (ret) {
4360                 return -CMD_ERR_INV_PARAMS;
4361             }
4362             cmd->txIQ.txiqgain = value;
4363 
4364             ret = hexstr_to_unit(tok->arg[1], &value);
4365             if (ret) {
4366                 return -CMD_ERR_INV_PARAMS;
4367             }
4368             cmd->txIQ.txiqphase = value;
4369         }
4370     } else if (strcmp("FREQ", at_name) == 0) {
4371         int ret = 0;
4372         int value = 0;
4373 
4374         if (tok->arg_found == 1) {
4375             ret = strtodec(&value, tok->arg[0]);
4376             if (ret) {
4377                 return -CMD_ERR_INV_PARAMS;
4378             }
4379             cmd->FreqErr.freqerr = value;
4380         }
4381     } else if (strcmp("VCG", at_name) == 0) {
4382         int ret = 0;
4383         int value = 0;
4384 
4385         if (tok->arg_found == 1) {
4386             ret = strtodec(&value, tok->arg[0]);
4387             if (ret) {
4388                 return -CMD_ERR_INV_PARAMS;
4389             }
4390             cmd->vcgCtrl.vcg = value;
4391         }
4392     } else if (strcmp("&SPIF", at_name) == 0) {
4393         int ret, len;
4394         if (tok->arg_found != 1 && tok->arg_found != TWO)
4395             return -CMD_ERR_INV_PARAMS;
4396         ret = string_to_uint(tok->arg[0], (u32 *)&len);
4397         if (ret) {
4398             return -CMD_ERR_INV_PARAMS;
4399         }
4400         cmd->spif.len = (u8)len;
4401         if (tok->arg_found == TWO) {
4402             if (strtohexarray(cmd->spif.data, cmd->spif.len, (char *)tok->arg[1]) < 0) {
4403                 return -CMD_ERR_INV_PARAMS;
4404             }
4405             cmd->spif.mode = 1;
4406         } else {
4407             cmd->spif.mode = 0;
4408         }
4409     } else if (strcmp("&LPCHL", at_name) == 0) {
4410         int ret;
4411 
4412         if (tok->arg_found == 1) {
4413             ret = string_to_uint(tok->arg[0], (u32 *)&cmd->lpchl.channel);
4414             if (ret) {
4415                 return -CMD_ERR_INV_PARAMS;
4416             }
4417             cmd->lpchl.bandwidth = 0;
4418         } else if (tok->arg_found == TWO) {
4419             ret = string_to_uint(tok->arg[0], (u32 *)&cmd->lpchl.channel);
4420             if (ret) {
4421                 return -CMD_ERR_INV_PARAMS;
4422             }
4423             ret = string_to_uint(tok->arg[1], (u32 *)&cmd->lpchl.bandwidth);
4424             if (ret) {
4425                 return -CMD_ERR_INV_PARAMS;
4426             }
4427         } else {
4428             return -CMD_ERR_INV_PARAMS;
4429         }
4430     } else if (strcmp("&LPRSTR", at_name) == 0 || strcmp("&LPCHRS", at_name) == 0
4431               || strcmp("&LPCHLR", at_name) == 0) {
4432         int ret;
4433         if ((tok->arg_found != 1) && (tok->arg_found != TWO)) {
4434             return -CMD_ERR_INV_PARAMS;
4435         }
4436         ret = hexstr_to_unit(tok->arg[0], (u32 *)&cmd->lpchl.channel);
4437         if (ret) {
4438             return -CMD_ERR_INV_PARAMS;
4439         }
4440         if (tok->arg_found == TWO) {
4441             ret = hexstr_to_unit(tok->arg[1], (u32 *)&cmd->lpchl.bandwidth);
4442             if (ret) {
4443                 return -CMD_ERR_INV_PARAMS;
4444             }
4445         }
4446     } else if (strcmp("&LPPSTR", at_name) == 0) {
4447         int ret;
4448         if (tok->arg_found != 0 && tok->arg_found != TWO) {
4449             return -CMD_ERR_INV_PARAMS;
4450         }
4451         if (tok->arg_found == TWO) {
4452             ret = hexstr_to_unit(tok->arg[0], (u32 *)&cmd->lppstr.param);
4453             if (ret) {
4454                 return -CMD_ERR_INV_PARAMS;
4455             }
4456             ret = hexstr_to_unit(tok->arg[1], (u32 *)&cmd->lppstr.start);
4457             if (ret) {
4458                 return -CMD_ERR_INV_PARAMS;
4459             }
4460         }
4461     } else if (strcmp("&LPPSTP", at_name) == 0) {
4462         int ret;
4463         if (tok->arg_found != 1) {
4464             return -CMD_ERR_INV_PARAMS;
4465         }
4466         ret = hexstr_to_unit(tok->arg[0], (u32 *)&cmd->lppstp.mismatch);
4467         if (ret) {
4468             return -CMD_ERR_INV_PARAMS;
4469         }
4470     } else if (strcmp("&LPTBD", at_name) == 0) {
4471         int ret;
4472         if (tok->arg_found != SEVEN) {
4473             return -CMD_ERR_INV_PARAMS;
4474         }
4475         cmd->lptstr.packetcount = 0;
4476         ret = hexstr_to_unit(tok->arg[0], (u32 *)&cmd->lptstr.psdulen);
4477         if (ret) {
4478             return -CMD_ERR_INV_PARAMS;
4479         }
4480         ret = hexstr_to_unit(tok->arg[1], (u32 *)&cmd->lptstr.txgain);
4481         if (ret) {
4482             return -CMD_ERR_INV_PARAMS;
4483         }
4484         ret = hexstr_to_unit(tok->arg[TWO], (u32 *)&cmd->lptstr.datarate);
4485         if (ret) {
4486             return -CMD_ERR_INV_PARAMS;
4487         }
4488     } else if (strcmp("WIDTH", at_name) == 0) {
4489         int ret;
4490         if (tok->arg_found != TWO) {
4491             return -CMD_ERR_INV_PARAMS;
4492         }
4493         ret = string_to_uint(tok->arg[0], (u32 *)&cmd->width.freq);
4494         if (ret) {
4495             return -CMD_ERR_INV_PARAMS;
4496         }
4497         ret = string_to_uint(tok->arg[1], (u32 *)&cmd->width.dividend);
4498         if (ret) {
4499             return -CMD_ERR_INV_PARAMS;
4500         }
4501     } else if (strcmp("&RXSIN", at_name) == 0) {
4502         int ret;
4503         if (tok->arg_found != TWO) {
4504             return -CMD_ERR_INV_PARAMS;
4505         }
4506         ret = string_to_uint(tok->arg[0], (u32 *)&cmd->rxsin.rxlen);
4507         if (ret) {
4508             return -CMD_ERR_INV_PARAMS;
4509         }
4510         ret = string_to_uint(tok->arg[1], (u32 *)&cmd->rxsin.isprint);
4511         if (ret) {
4512             return -CMD_ERR_INV_PARAMS;
4513         }
4514     } else if (strcmp("CPUSTA", at_name) == 0) {
4515         int ret;
4516         if (tok->arg_found != 1) {
4517             return -CMD_ERR_INV_PARAMS;
4518         }
4519         ret = string_to_uint(tok->arg[0], (u32 *)&cmd->width.freq);
4520         if (ret) {
4521             return -CMD_ERR_INV_PARAMS;
4522         }
4523     } else if (strcmp("CPUDIV", at_name) == 0) {
4524         int ret;
4525         if (tok->arg_found > 1) {
4526             return -CMD_ERR_INV_PARAMS;
4527         }
4528         if (tok->arg_found == 1) {
4529             ret = string_to_uint(tok->arg[0], (u32 *)&cmd->width.freq);
4530             if (ret) {
4531                 return -CMD_ERR_INV_PARAMS;
4532             }
4533         }
4534     } else if (strcmp("&LPTPD", at_name) == 0) {
4535         int ret;
4536         if (tok->arg_found == 1) {
4537             ret = string_to_uint(tok->arg[0], (u32 *)&cmd->rxsin.rxlen);
4538             if (ret) {
4539                 return -CMD_ERR_INV_PARAMS;
4540             }
4541         }
4542     }
4543     return 0;
4544 }
4545 
at_format_func(char * at_name,u8 set_opt,u8 update_flash,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp,char * res_resp,u32 * res_len)4546 int at_format_func(char *at_name, u8 set_opt, u8 update_flash, union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp,
4547     char *res_resp, u32 *res_len)
4548 {
4549     if (strcmp("QMAC", at_name) == 0 || strcmp("&HWV", at_name) == 0
4550 #if TLS_CONFIG_AP
4551         || strcmp("APMAC", at_name) == 0
4552 #endif
4553     ) {
4554         *res_len = sprintf(res_resp, "+OK=%02x%02x%02x%02x%02x%02x",
4555                            cmdrsp->mac.addr[0], cmdrsp->mac.addr[1], cmdrsp->mac.addr[TWO],
4556                            cmdrsp->mac.addr[THREE], cmdrsp->mac.addr[FOUR], cmdrsp->mac.addr[FIVE]);
4557     } else if (strcmp("TEM", at_name) == 0) {
4558         if (set_opt) {
4559             *res_len = atcmd_ok_resp(res_resp);
4560         } else {
4561             *res_len = sprintf(res_resp, "+OK=%s", cmdrsp->tem.offset);
4562         }
4563 #if TLS_CONFIG_AT_CMD
4564     } else if ((strcmp("Z", at_name) == 0) || (strcmp("E", at_name) == 0) || (strcmp("ENTS", at_name) == 0) ||
4565         (strcmp("RSTF", at_name) == 0) || (strcmp("PMTF", at_name) == 0) || (strcmp("IOC", at_name) == 0) ||
4566         (strcmp("WLEAV", at_name) == 0) || (strcmp("AOLM", at_name) == 0) || (strcmp("DDNS", at_name) == 0) ||
4567         (strcmp("UPNP", at_name) == 0) || (strcmp("DNAME", at_name) == 0) || (strcmp("&DBG", at_name) == 0) ||
4568         (strcmp("&UPDP", at_name) == 0) || (strcmp("STDBY", at_name) == 0)
4569         ) {
4570         *res_len = atcmd_ok_resp(res_resp);
4571     } else if (strcmp("WJOIN", at_name) == 0) {
4572         int len = 0, i = 0;
4573         len = sprintf(res_resp, "+OK=%02x%02x%02x%02x%02x%02x,%d,%d,%d,\"",
4574                       cmdrsp->join.bssid[0], cmdrsp->join.bssid[1], cmdrsp->join.bssid[TWO],
4575                       cmdrsp->join.bssid[THREE], cmdrsp->join.bssid[FOUR], cmdrsp->join.bssid[FIVE],
4576                       cmdrsp->join.type, cmdrsp->join.channel,
4577                       (cmdrsp->join.encrypt ? 1 : 0));
4578         for (i = 0; i < cmdrsp->join.ssid_len; i++) {
4579             sprintf(res_resp + len + i, "%c", cmdrsp->join.ssid[i]);
4580         }
4581         *res_len = len + cmdrsp->join.ssid_len;
4582         len = sprintf(res_resp + len + cmdrsp->join.ssid_len, "\",%d", (signed char)cmdrsp->join.rssi);
4583         *res_len += len;
4584     } else if (strcmp("WSCAN", at_name) == 0) {
4585         *res_len = 0;
4586     } else if (strcmp("DNS", at_name) == 0 || strcmp("PASS", at_name) == 0) {
4587         if (set_opt) {
4588             *res_len = atcmd_ok_resp(res_resp);
4589         } else {
4590             *res_len = sprintf(res_resp, "+OK=\"%s\"", cmdrsp->ssid.ssid);
4591         }
4592     } else if (strcmp("SSID", at_name) == 0
4593 #if TLS_CONFIG_AP
4594              || strcmp("APSSID", at_name) == 0
4595 #endif
4596     ) {
4597         if (set_opt) {
4598             *res_len = atcmd_ok_resp(res_resp);
4599         } else {
4600             *res_len = sprintf(res_resp, "+OK=%s", cmdrsp->ssid.ssid);
4601         }
4602     } else if ((strcmp("WPRT", at_name) == 0) || (strcmp("ENCRY", at_name) == 0) || (strcmp("BRDSSID", at_name) == 0) ||
4603                (strcmp("WATC", at_name) == 0) || (strcmp("WPSM", at_name) == 0) || (strcmp("WARC", at_name) == 0) ||
4604                (strcmp("WARM", at_name) == 0) || (strcmp("ATM", at_name) == 0) || (strcmp("PORTM", at_name) == 0) ||
4605                (strcmp("IOM", at_name) == 0) || (strcmp("CMDM", at_name) == 0) || (strcmp("ONESHOT", at_name) == 0)) {
4606         if (set_opt) {
4607             *res_len = atcmd_ok_resp(res_resp);
4608         } else {
4609             *res_len = sprintf(res_resp, "+OK=%hhu", cmdrsp->bt.status);
4610         }
4611     } else if ((strcmp("KEY", at_name) == 0)
4612 #if TLS_CONFIG_AP
4613         ||(strcmp("APKEY", at_name) == 0)
4614 #endif
4615     ) {
4616         if (set_opt) {
4617             *res_len = atcmd_ok_resp(res_resp);
4618         } else {
4619             *res_len = sprintf(res_resp, "+OK=%u,%u,", cmdrsp->key.format, cmdrsp->key.index);
4620             MEMCPY(res_resp + *res_len, cmdrsp->key.key, cmdrsp->key.key_len);
4621             *res_len += cmdrsp->key.key_len;
4622         }
4623     } else if ((strcmp("CHL", at_name) == 0)
4624 #if TLS_CONFIG_AP
4625     ||(strcmp("APCHL", at_name) == 0)
4626 #endif
4627     ) {
4628         if (set_opt) {
4629             *res_len = atcmd_ok_resp(res_resp);
4630         } else {
4631             if (cmdrsp->channel.enable) {
4632                 *res_len = sprintf(res_resp, "+OK=%u,%u", cmdrsp->channel.enable, cmdrsp->channel.channel);
4633             } else {
4634                 *res_len = sprintf(res_resp, "+OK=%u", cmdrsp->channel.enable);
4635             }
4636         }
4637     } else if (strcmp("CHLL", at_name) == 0) {
4638         if (set_opt) {
4639             *res_len = atcmd_ok_resp(res_resp);
4640         } else {
4641             *res_len = sprintf(res_resp, "+OK=%04x", cmdrsp->channel_list.channellist);
4642         }
4643     } else if (strcmp("WREG", at_name) == 0 || strcmp("ATLT", at_name) == 0 || strcmp("ATPT", at_name) == 0 ||
4644              strcmp("ESPT", at_name) == 0) {
4645         if (set_opt) {
4646             *res_len = atcmd_ok_resp(res_resp);
4647         } else {
4648             *res_len = sprintf(res_resp, "+OK=%u", cmdrsp->wreg.region);
4649         }
4650     } else if ((strcmp("WBGR", at_name) == 0)
4651 #if TLS_CONFIG_AP
4652     ||(strcmp("APWBGR", at_name) == 0)
4653 #endif
4654     ) {
4655         if (set_opt) {
4656             *res_len = atcmd_ok_resp(res_resp);
4657         } else {
4658             *res_len = sprintf(res_resp, "+OK=%u,%u", cmdrsp->wbgr.mode,
4659                                cmdrsp->wbgr.rate);
4660         }
4661     } else if (strcmp("UART", at_name) == 0) {
4662         u32 baud_rate = 0;
4663         if (set_opt) {
4664             *res_len = atcmd_ok_resp(res_resp);
4665         } else {
4666             memcpy(&baud_rate, cmdrsp->uart.baud_rate, THREE);
4667 
4668             *res_len = sprintf(res_resp,
4669                                "+OK=%u,%u,%u,%u,%u",
4670                                baud_rate,
4671                                cmdrsp->uart.char_len,
4672                                cmdrsp->uart.stopbit, cmdrsp->uart.parity,
4673                                cmdrsp->uart.flow_ctrl);
4674         }
4675     } else if (strcmp("ESPC", at_name) == 0) {
4676         if (set_opt) {
4677             *res_len = atcmd_ok_resp(res_resp);
4678         } else {
4679             *res_len = sprintf(res_resp, "+OK=0x%02x", cmdrsp->espc.escapechar);
4680         }
4681     } else if (strcmp("WEBS", at_name) == 0) {
4682         if (set_opt) {
4683             *res_len = atcmd_ok_resp(res_resp);
4684         } else {
4685             if (cmdrsp->webs.autorun == 1) {
4686                 *res_len = sprintf(res_resp, "+OK=%d,%d", cmdrsp->webs.autorun, cmdrsp->webs.portnum);
4687             } else {
4688                 *res_len = sprintf(res_resp, "+OK=%d", cmdrsp->webs.autorun);
4689             }
4690         }
4691 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
4692     } else if (strcmp("ENTM", at_name) == 0 || strcmp("SKCLS", at_name) == 0 || strcmp("SKSDF", at_name) == 0) {
4693         *res_len = atcmd_ok_resp(res_resp);
4694     } else if (strcmp("SKCT", at_name) == 0) {
4695         if (set_opt) {
4696             *res_len = sprintf(res_resp, "+OK=%d", cmdrsp->skct.socket);
4697         }
4698     } else if (strcmp("SKSND", at_name) == 0) {
4699         *res_len = sprintf(res_resp, "+OK=%u", cmdrsp->sksnd.size);
4700     } else if (strcmp("SKRPTM", at_name) == 0) {
4701         if (set_opt) {
4702             *res_len = atcmd_ok_resp(res_resp);
4703         } else {
4704             *res_len = sprintf(res_resp, "+OK=%d\n", cmdrsp->skrptm.mode);
4705         }
4706     } else if (strcmp("SKSRCIP", at_name) == 0) {
4707         *res_len = sprintf(res_resp, "+OK=%d.%d.%d.%d", cmdrsp->sksrcip.ipvalue[0], cmdrsp->sksrcip.ipvalue[1],
4708                            cmdrsp->sksrcip.ipvalue[TWO], cmdrsp->sksrcip.ipvalue[THREE]);
4709     } else if (strcmp("SKGHBN", at_name) == 0) {
4710         *res_len = sprintf(res_resp, "+OK=\"%d.%d.%d.%d\"", \
4711                            cmdrsp->skghbn.h_addr_list[0], cmdrsp->skghbn.h_addr_list[1], \
4712                            cmdrsp->skghbn.h_addr_list[TWO], cmdrsp->skghbn.h_addr_list[THREE]);
4713 #endif
4714 #if TLS_CONFIG_HTTP_CLIENT_TASK
4715     } else if (strcmp("HTTPC", at_name) == 0) {
4716         *res_len = sprintf(res_resp, "+OK=%d", cmdrsp->httpc.psession);
4717     } else if (strcmp("FWUP", at_name) == 0) {
4718         *res_len = sprintf(res_resp, "+OK=%d", cmdrsp->httpc.psession);
4719 #endif
4720 #endif
4721     } else if (strcmp("&UPDD", at_name) == 0) {
4722         *res_len = sprintf(res_resp, "+OK=%d", tls_fwup_get_current_update_numer());
4723     } else if (strcmp("&LPTPD", at_name) == 0) {
4724         if (set_opt) {
4725             *res_len = sprintf(res_resp, "+OK");
4726         } else {
4727             *res_len = sprintf(res_resp, "+OK=%d", tls_get_tx_litepoint_period());
4728         }
4729     } else if (strcmp("&REGR", at_name) == 0) {
4730         int i = 0;
4731         *res_len = sprintf(res_resp, "+OK=%08x", cmdrsp->regr.value[0]);
4732         for (i = 1;i < cmdrsp->regr.length; i++) {
4733             *res_len += sprintf(res_resp + *res_len, ",%08x", cmdrsp->regr.value[i]);
4734         }
4735     } else if (strcmp("&RFR", at_name) == 0) {
4736         int i = 0;
4737         *res_len = sprintf(res_resp, "+OK=%04x", cmdrsp->rfr.value[0]);
4738         for (i = 1;i < cmdrsp->rfr.length; i++) {
4739             *res_len += sprintf(res_resp + *res_len, ",%04x", cmdrsp->rfr.value[i]);
4740         }
4741     } else if (strcmp("&FLSR", at_name) == 0) {
4742         u8 temp[TEN + SIX];
4743         int i = 0;
4744         u8 buff[THIRTY + TWO];
4745         u32 len;
4746         u32 regv32;
4747         len = cmdrsp->flsr.length;
4748         memcpy(buff, (u8 *)&cmdrsp->flsr.value[0], FOUR * len);
4749         MEMCPY(&regv32, &buff[0], FOUR);
4750         *res_len = sprintf(res_resp, "+OK=%08x", regv32);
4751         for (i = 1; i < len; i++) {
4752             MEMCPY(&regv32, &buff[i * FOUR], FOUR);
4753             sprintf((char *)temp, ",%08x", regv32);
4754             strcat(res_resp, (char *)temp);
4755             *res_len += NINE;
4756         }
4757     }
4758     if (strcmp("&TXGS", at_name) == 0) {
4759        *res_len = atcmd_ok_resp(res_resp);
4760     }
4761     if (strcmp("&TXGG", at_name) == 0) {
4762         *res_len = sprintf(res_resp, "+OK=%d,%02x%02x%02x", cmdrsp->txgr.tx_rate, cmdrsp->txgr.txr_gain[0],
4763                            cmdrsp->txgr.txr_gain[1], cmdrsp->txgr.txr_gain[TWO]);
4764     }
4765 
4766     if (strcmp("&MAC", at_name) == 0) {
4767         if (set_opt) {
4768             *res_len = atcmd_ok_resp(res_resp);
4769         } else {
4770             *res_len = sprintf(res_resp, "+OK=%02x%02x%02x%02x%02x%02x",
4771                 cmdrsp->mac.addr[0], cmdrsp->mac.addr[1], cmdrsp->mac.addr[TWO],
4772                 cmdrsp->mac.addr[THREE], cmdrsp->mac.addr[FOUR], cmdrsp->mac.addr[FIVE]);
4773         }
4774     } else if (strcmp("TXLO", at_name) == 0) {
4775         if (set_opt) {
4776             *res_len = atcmd_ok_resp(res_resp);
4777         } else {
4778             *res_len = sprintf(res_resp, "+OK =%08x", cmdrsp->txLO.txlo);
4779         }
4780     } else if (strcmp("TXIQ", at_name) == 0) {
4781         if (set_opt) {
4782             *res_len = atcmd_ok_resp(res_resp);
4783         } else {
4784             *res_len = sprintf(res_resp, "+OK =%08x,%08x", cmdrsp->txIQ.txiqgain, cmdrsp->txIQ.txiqphase);
4785         }
4786     } else if (strcmp("FREQ", at_name) == 0) {
4787         if (set_opt) {
4788             *res_len = atcmd_ok_resp(res_resp);
4789         } else {
4790             *res_len = sprintf(res_resp, "+OK =%d", cmdrsp->FreqErr.freqerr);
4791         }
4792     } else if (strcmp("VCG", at_name) == 0) {
4793         if (set_opt) {
4794             *res_len = atcmd_ok_resp(res_resp);
4795         } else {
4796             *res_len = sprintf(res_resp, "+OK =%d", cmdrsp->vcgCtrl.vcg);
4797         }
4798     } else if (strcmp("&SPIF", at_name) == 0) {
4799         if (cmdrsp->spif.mode == 0) {
4800             *res_len = sprintf(res_resp, "+OK=%s", cmdrsp->spif.data);
4801         } else {
4802             *res_len = atcmd_ok_resp(res_resp);
4803         }
4804     } else if (strcmp("&LPCHL", at_name) == 0 || strcmp("&LPCHRS", at_name) == 0) {
4805         if (set_opt) {
4806             *res_len = atcmd_ok_resp(res_resp);
4807         } else {
4808             *res_len = sprintf(res_resp, "+OK=%d", cmdrsp->lpchl.channel);
4809         }
4810     } else if (strcmp("&LPTSTT", at_name) == 0) {
4811         *res_len = sprintf(res_resp, "+OK=%x", tls_tx_litepoint_test_get_totalsnd());
4812     } else if ((strcmp("&LPRSTT", at_name) == 0) || (strcmp("&LPRAGC", at_name) == 0)) {
4813         u32 cnt_total = 0, cnt_good = 0, cnt_bad = 0;
4814         tls_rx_litepoint_test_result(&cnt_total, &cnt_good, &cnt_bad);
4815         *res_len = sprintf(res_resp, "+OK=%x,%x,%x", cnt_total, cnt_good, cnt_bad);
4816     } else if (strcmp("&LPPSTR", at_name) == 0) {
4817         if (gulCalFlag) {
4818             *res_len = sprintf(res_resp, "+OK=%x", rf_spi_read(TEN + 1));
4819         } else {
4820             *res_len = atcmd_ok_resp(res_resp);
4821         }
4822     } else if (strcmp("&LPRSR", at_name) == 0) {
4823         u32 rx_valid, rx_snr, rx_rcpi = 0;
4824         tls_rx_litepoint_pwr_result(&rx_valid, &rx_snr, &rx_rcpi);
4825         if (rx_valid) {
4826             *res_len = sprintf(res_resp, "+OK=%d,%x,%x", rx_valid, rx_rcpi, rx_snr);
4827         } else {
4828             *res_len = sprintf(res_resp, "+OK=%d", rx_valid);
4829         }
4830 #if TLS_CONFIG_WIFI_PERF_TEST
4831     } else if (strcmp("THT", at_name) == 0) {
4832         *res_len = atcmd_ok_resp(res_resp);
4833 #endif
4834     } else if (strcmp("CUSTDATA", at_name) == 0) {
4835         *res_len = sprintf(res_resp, "+OK=\"%s\"", cmdrsp->custdata.data);
4836 #if TLS_CONFIG_AP
4837     } else if (strcmp("SLIST", at_name) == 0) {
4838         if (cmdrsp->stalist.sta_num  == 0) {
4839             *res_len = sprintf(res_resp, "+OK=%hhu", cmdrsp->stalist.sta_num);
4840         } else {
4841             *res_len = sprintf(res_resp, "+OK=%hhu%s", cmdrsp->stalist.sta_num, cmdrsp->stalist.data);
4842         }
4843 #endif
4844     } else if (strcmp("PING", at_name) == 0) {
4845         if (cmdrsp->ping.ext) {
4846             *res_len = atcmd_ok_resp(res_resp);
4847         } else {
4848             *res_len = sprintf(res_resp, "+OK=%u", cmdrsp->ping.ttl);
4849         }
4850     } else if (strcmp("CPUSTA", at_name) == 0) {
4851         *res_len = atcmd_ok_resp(res_resp);
4852     } else if (strcmp("CPUDIV", at_name) == 0) {
4853         *res_len = sprintf(res_resp, "+OK=%hhu", cmdrsp->pass.length);
4854     } else if (strcmp("SETTOKEN", at_name) == 0) {
4855         *res_len = atcmd_ok_resp(res_resp);
4856     }
4857 
4858     return 0;
4859 }
4860 
ri_parse_func(s16 ri_cmd_id,char * buf,u32 length,union HOSTIF_CMD_PARAMS_UNION * cmd)4861 int ri_parse_func(s16 ri_cmd_id, char *buf, u32 length, union HOSTIF_CMD_PARAMS_UNION *cmd)
4862 {
4863     if (ri_cmd_id == HOSTIF_CMD_REGR || ri_cmd_id == HOSTIF_CMD_FLSR) {
4864         if (length > NINE) {
4865             return CMD_ERR_INV_PARAMS;
4866         }
4867     } else if (ri_cmd_id == HOSTIF_CMD_RFR) {
4868         if (length > SEVEN) {
4869             return CMD_ERR_INV_PARAMS;
4870         }
4871     } else if (ri_cmd_id == HOSTIF_CMD_REGW || ri_cmd_id == HOSTIF_CMD_FLSW) {
4872         if (length > (FORTY + 1)) {
4873             return CMD_ERR_INV_PARAMS;
4874         }
4875     } else if (ri_cmd_id == HOSTIF_CMD_RFW) {
4876         if (length > (TWENTY + THREE)) {
4877             return CMD_ERR_INV_PARAMS;
4878         }
4879     } else if (ri_cmd_id == HOSTIF_CMD_UPDM) {
4880         cmd->updm.src = 1;
4881     } else if (ri_cmd_id == HOSTIF_CMD_UPDD) {
4882         cmd->updd.data[0] = 1;    /* 鏍囪瘑鏄痳i鎸囦护 */
4883     }
4884     return 0;
4885 }
4886 
ri_format_func(s16 ri_cmd_id,u8 set_opt,u8 update_flash,union HOSTIF_CMDRSP_PARAMS_UNION * cmdrsp,char * res_resp,u32 * res_len)4887 int ri_format_func(s16 ri_cmd_id, u8 set_opt, u8 update_flash, union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp,
4888     char *res_resp, u32 *res_len)
4889 {
4890     if (ri_cmd_id == HOSTIF_CMD_MAC
4891 #if TLS_CONFIG_AP
4892     || ri_cmd_id == HOSTIF_CMD_AP_MAC
4893 #endif
4894     ) {
4895         *res_len = sizeof(struct tls_hostif_cmd_hdr) + SIX;
4896     } else if (ri_cmd_id == HOSTIF_CMD_VER) {
4897         *res_len = sizeof(struct tls_hostif_cmd_hdr) + TEN;
4898 #if TLS_CONFIG_RI_CMD
4899     } else if (ri_cmd_id == HOSTIF_CMD_PS || ri_cmd_id == HOSTIF_CMD_DBG || ri_cmd_id == HOSTIF_CMD_UPDP) {
4900         ;
4901     } else if (ri_cmd_id == HOSTIF_CMD_RESET_FLASH || ri_cmd_id == HOSTIF_CMD_RESET || ri_cmd_id == HOSTIF_CMD_PMTF ||
4902               ri_cmd_id == HOSTIF_CMD_GPIO || ri_cmd_id == HOSTIF_CMD_WLEAVE || ri_cmd_id == HOSTIF_CMD_WSCAN ||
4903               ri_cmd_id == HOSTIF_CMD_AOLM || ri_cmd_id == HOSTIF_CMD_DDNS ||
4904               ri_cmd_id == HOSTIF_CMD_UPNP || ri_cmd_id == HOSTIF_CMD_DNAME) {
4905         struct tls_hostif_cmdrsp *cmd_rsp = (struct tls_hostif_cmdrsp *)res_resp;
4906         cmd_rsp->cmd_hdr.ext = 0x00;
4907     } else if (ri_cmd_id == HOSTIF_CMD_WJOIN) {
4908         if (cmdrsp->join.result == 1) {
4909             u8 *p = cmdrsp->join.ssid + cmdrsp->join.ssid_len;
4910             *p = cmdrsp->join.rssi;
4911             *res_len = sizeof(struct tls_hostif_cmd_hdr) + TEN + 1 + cmdrsp->join.ssid_len;
4912         } else {
4913             struct tls_hostif_cmdrsp *cmd_rsp = (struct tls_hostif_cmdrsp *)res_resp;
4914             cmd_rsp->cmd_hdr.ext = 0x00;
4915         }
4916     } else if (ri_cmd_id == HOSTIF_CMD_LINK_STATUS
4917 #if TLS_CONFIG_AP
4918     || ri_cmd_id == HOSTIF_CMD_AP_LINK_STATUS
4919 #endif
4920     ) {
4921         if (cmdrsp->lkstt.status == 1) {
4922             *res_len = sizeof(struct tls_hostif_cmd_hdr) +
4923                        sizeof(struct _HOSTIF_CMDRSP_PARAMS_LKSTT);
4924         } else {
4925             *res_len = sizeof(struct tls_hostif_cmd_hdr) + 1;
4926         }
4927     } else if (ri_cmd_id == HOSTIF_CMD_SSID || ri_cmd_id == HOSTIF_CMD_DNS
4928 #if TLS_CONFIG_AP
4929     || ri_cmd_id == HOSTIF_CMD_AP_SSID
4930 #endif
4931     ) {
4932         if (!set_opt) {
4933             *res_len = sizeof(struct tls_hostif_cmd_hdr) + 1 + cmdrsp->ssid.ssid_len;
4934         }
4935     } else if (ri_cmd_id == HOSTIF_CMD_WPRT || ri_cmd_id == HOSTIF_CMD_ENCRYPT || ri_cmd_id == HOSTIF_CMD_BRD_SSID ||
4936                ri_cmd_id == HOSTIF_CMD_WATC || ri_cmd_id == HOSTIF_CMD_WPSM || ri_cmd_id == HOSTIF_CMD_WARM ||
4937                ri_cmd_id == HOSTIF_CMD_ATM || ri_cmd_id == HOSTIF_CMD_PORTM || ri_cmd_id == HOSTIF_CMD_ONESHOT ||
4938                ri_cmd_id == HOSTIF_CMD_WARC || ri_cmd_id == HOSTIF_CMD_IOM || ri_cmd_id == HOSTIF_CMD_CMDM
4939 #if TLS_CONFIG_AP
4940            ||  ri_cmd_id == HOSTIF_CMD_AP_ENCRYPT
4941 #endif
4942     ) {
4943         if (!set_opt) {
4944             *res_len = sizeof(struct tls_hostif_cmd_hdr) + 1;
4945         }
4946     } else if (ri_cmd_id == HOSTIF_CMD_KEY
4947 #if TLS_CONFIG_AP
4948     || ri_cmd_id == HOSTIF_CMD_AP_KEY
4949 #endif
4950     ) {
4951         if (!set_opt) {
4952             *res_len = sizeof(struct tls_hostif_cmd_hdr) + THREE + cmdrsp->key.key_len;
4953         }
4954     } else if (ri_cmd_id == HOSTIF_CMD_BSSID || ri_cmd_id == HOSTIF_CMD_UART || ri_cmd_id == HOSTIF_CMD_PASS) {
4955         if (!set_opt) {
4956             u8 baud_rate[THREE];
4957             memcpy(baud_rate, cmdrsp->uart.baud_rate, THREE);
4958             cmdrsp->uart.baud_rate[0] = baud_rate[TWO];
4959             cmdrsp->uart.baud_rate[1] = baud_rate[1];
4960             cmdrsp->uart.baud_rate[TWO] = baud_rate[0];
4961             *res_len = sizeof(struct tls_hostif_cmd_hdr) + SEVEN;
4962         }
4963     } else if (ri_cmd_id == HOSTIF_CMD_CHNL || ri_cmd_id == HOSTIF_CMD_WBGR
4964 #if TLS_CONFIG_AP
4965     || ri_cmd_id == HOSTIF_CMD_AP_CHL || ri_cmd_id == HOSTIF_CMD_AP_WBGR
4966 #endif
4967     ) {
4968         if (!set_opt) {
4969             *res_len = sizeof(struct tls_hostif_cmd_hdr) + TWO;
4970         }
4971     } else if (ri_cmd_id == HOSTIF_CMD_WREG || ri_cmd_id == HOSTIF_CMD_ATLT ||
4972                ri_cmd_id == HOSTIF_CMD_CHLL || ri_cmd_id == HOSTIF_CMD_ATPT) {
4973         if (!set_opt) {
4974             cmdrsp->wreg.region = host_to_be16(cmdrsp->wreg.region);
4975             *res_len = sizeof(struct tls_hostif_cmd_hdr) + TWO;
4976         }
4977     } else if (ri_cmd_id == HOSTIF_CMD_NIP
4978 #if TLS_CONFIG_AP
4979     || ri_cmd_id == HOSTIF_CMD_AP_NIP
4980 #endif
4981     ) {
4982         if (!set_opt) {
4983             *res_len = sizeof(struct tls_hostif_cmd_hdr) + TEN + SEVEN;
4984         }
4985     } else if (ri_cmd_id == HOSTIF_CMD_WEBS) {
4986         if (!set_opt) {
4987             cmdrsp->webs.portnum = host_to_be16(cmdrsp->webs.portnum);
4988             *res_len = sizeof(struct tls_hostif_cmd_hdr) + THREE;
4989         }
4990     } else if (ri_cmd_id == HOSTIF_CMD_ATRM) {
4991         u8 *p = (u8 *)res_resp + sizeof(struct tls_hostif_hdr) + sizeof(struct tls_hostif_cmd_hdr);
4992         u8  proto, cs, host_len;
4993         u16 port;
4994         char host_name[THIRTY + TWO];
4995 
4996         if (!set_opt) {
4997             proto = cmdrsp->atrm.proto;
4998             cs = cmdrsp->atrm.client ? 0: 1;
4999             host_len = cmdrsp->atrm.host_len;
5000             if (cmdrsp->atrm.client && cmdrsp->atrm.host_len == FOUR) {
5001                 memcpy(host_name, cmdrsp->atrm.ip_addr, cmdrsp->atrm.host_len);
5002             } else if (cmdrsp->atrm.client) {
5003                 memcpy(host_name, cmdrsp->atrm.host_name, cmdrsp->atrm.host_len);
5004             } else if (!cmdrsp->atrm.client && cmdrsp->atrm.proto == 0) {
5005                 put_unaligned_be32(cmdrsp->atrm.timeout, (u8 *)host_name);
5006             }
5007             port = cmdrsp->atrm.port;
5008 
5009             *p = proto;
5010             p += 1;
5011             *p = cs;
5012             p += 1;
5013             *p = host_len;
5014             p += 1;
5015             memcpy(p, host_name, host_len);
5016             p += host_len;
5017             put_unaligned_be16(port, (u8 *)p);
5018 
5019             *res_len = sizeof(struct tls_hostif_cmd_hdr) + FIVE + cmdrsp->atrm.host_len;
5020         }
5021     } else if (ri_cmd_id == HOSTIF_CMD_CNTPARAM) {
5022         if (!set_opt) {
5023             if (cmdrsp->cntparam_bssid_en.bssid_enable) {
5024                 *res_len = sizeof(struct tls_hostif_cmd_hdr) + EIGHT + cmdrsp->cntparam_bssid_en.key_len;
5025             } else {
5026                 *res_len = sizeof(struct tls_hostif_cmd_hdr) + THREE + cmdrsp->cntparam_bssid_dis.ssid_len +
5027                                   cmdrsp->cntparam_bssid_dis.key_len;
5028             }
5029         }
5030 #if TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD
5031     } else if (ri_cmd_id == HOSTIF_CMD_SKCT) {
5032         struct tls_hostif_cmdrsp *cmd_rsp = (struct tls_hostif_cmdrsp *)res_resp;
5033         cmd_rsp->cmd_hdr.ext = 0x01;
5034         *res_len = sizeof(struct tls_hostif_cmd_hdr) + 1;
5035     } else if (ri_cmd_id == HOSTIF_CMD_SKSTT) {
5036         struct tls_hostif_cmdrsp *cmd_rsp = (struct tls_hostif_cmdrsp *)res_resp;
5037         cmd_rsp->cmd_hdr.ext = 0x01;
5038         for (int i = 0; i < cmdrsp->skstt.number; i++) {
5039             put_unaligned_le32(get_unaligned_le32(cmdrsp->skstt.ext[i].host_ipaddr),
5040                                (u8 *)cmdrsp->skstt.ext[i].host_ipaddr);
5041             put_unaligned_be16(get_unaligned_le16((u8 *)&cmdrsp->skstt.ext[i].remote_port),
5042                                (u8 *)&cmdrsp->skstt.ext[i].remote_port);
5043             put_unaligned_be16(get_unaligned_le16((u8 *)&cmdrsp->skstt.ext[i].local_port),
5044                                (u8 *)&cmdrsp->skstt.ext[i].local_port);
5045         }
5046         *res_len = sizeof(struct tls_hostif_cmd_hdr) + 1 +
5047                           cmdrsp->skstt.number * sizeof(struct hostif_cmdrsp_skstt_ext);
5048     } else if (ri_cmd_id == HOSTIF_CMD_SKCLOSE || ri_cmd_id ==HOSTIF_CMD_SKSDF) {
5049         ;
5050     } else if (ri_cmd_id == HOSTIF_CMD_SKSRCIP) {
5051         if (!set_opt) {
5052             *res_len = sizeof(struct tls_hostif_cmd_hdr) + FOUR;
5053         }
5054     } else if (ri_cmd_id == HOSTIF_CMD_SKGHBN) {
5055         struct tls_hostif_cmdrsp *cmd_rsp = (struct tls_hostif_cmdrsp *)res_resp;
5056         cmd_rsp->cmd_hdr.ext = 0x01;
5057         *res_len = sizeof(struct tls_hostif_cmd_hdr) + FOUR;
5058 
5059 #endif
5060 #if TLS_CONFIG_HTTP_CLIENT_TASK
5061     } else if (ri_cmd_id == HOSTIF_CMD_HTTPC) {
5062         ;
5063     } else if (ri_cmd_id == HOSTIF_CMD_FWUP) {
5064         ;
5065 #endif
5066 #endif
5067     } else if (ri_cmd_id == HOSTIF_CMD_UPDM || ri_cmd_id == HOSTIF_CMD_UPDD ||
5068              ri_cmd_id == HOSTIF_CMD_REGW ||  ri_cmd_id == HOSTIF_CMD_RFW ||
5069              ri_cmd_id == HOSTIF_CMD_FLSW) {
5070         struct tls_hostif_cmdrsp *cmd_rsp = (struct tls_hostif_cmdrsp *)res_resp;
5071         cmd_rsp->cmd_hdr.ext = 0x00;
5072     } else if (ri_cmd_id == HOSTIF_CMD_REGR || ri_cmd_id == HOSTIF_CMD_FLSR) {
5073         struct tls_hostif_cmdrsp *cmd_rsp = (struct tls_hostif_cmdrsp *)res_resp;
5074         cmd_rsp->cmd_hdr.ext = 0x01;
5075         for (int i = 0; i < cmdrsp->regr.length; i++) {
5076             cmdrsp->regr.value[i] = host_to_be32(cmdrsp->regr.value[i]);
5077         }
5078         *res_len = sizeof(struct tls_hostif_cmd_hdr) + 1 + cmdrsp->regr.length * FOUR;
5079     } else if (ri_cmd_id == HOSTIF_CMD_RFR) {
5080         struct tls_hostif_cmdrsp *cmd_rsp = (struct tls_hostif_cmdrsp *)res_resp;
5081         cmd_rsp->cmd_hdr.ext = 0x01;
5082         for (int i = 0; i < cmdrsp->rfr.length; i++) {
5083             cmdrsp->rfr.value[i] = host_to_be16(cmdrsp->rfr.value[i]);
5084         }
5085         *res_len = sizeof(struct tls_hostif_cmd_hdr) + 1 + cmdrsp->regr.length * TWO;
5086     } else if (ri_cmd_id == HOSTIF_CMD_CUSTDATA) {
5087         if (!set_opt) {
5088             *res_len = sizeof(struct tls_hostif_cmd_hdr) + 1 + cmdrsp->custdata.length;
5089         }
5090 #if TLS_CONFIG_WPS
5091     } else if (ri_cmd_id == HOSTIF_CMD_WPS) {
5092         if (cmdrsp->wps.result == 1) {
5093             struct tls_hostif_cmdrsp *cmd_rsp = (struct tls_hostif_cmdrsp *)res_resp;
5094             cmd_rsp->cmd_hdr.ext = 0x01;
5095             memcpy((u8 *)&cmdrsp->wps.result, (u8 *)&cmdrsp->wps.pin_len, cmdrsp->wps.pin_len + 1);
5096             *res_len = sizeof(struct tls_hostif_cmd_hdr) + TWO + cmdrsp->custdata.length;
5097         }
5098 #endif
5099 #if TLS_CONFIG_AP
5100     } else if (ri_cmd_id == HOSTIF_CMD_STA_LIST) {
5101         if (cmdrsp->stalist.sta_num == 0) {
5102             *res_len = sizeof(struct tls_hostif_cmd_hdr) + 1 + cmdrsp->stalist.sta_num;
5103         } else {
5104             *res_len = sizeof(struct tls_hostif_cmd_hdr) + cmdrsp->stalist.sta_num +
5105                               strlen((char *)cmdrsp->stalist.data);
5106         }
5107 #endif
5108     } else if (ri_cmd_id == HOSTIF_CMD_TEM) {
5109         *res_len = sizeof(struct tls_hostif_cmd_hdr) + strlen((char *)cmdrsp->mac.addr);
5110     } else {
5111         return CMD_ERR_UNSUPP;
5112     }
5113     return 0;
5114 }
5115 
atcmd_err_resp(char * buf,int err_code)5116 int atcmd_err_resp(char *buf, int err_code)
5117 {
5118     int len;
5119     len = sprintf(buf, "+ERR=%d", -err_code);
5120     return len;
5121 }
5122 
atcmd_ok_resp(char * buf)5123 int atcmd_ok_resp(char *buf)
5124 {
5125     int len;
5126     len = sprintf(buf, "+OK");
5127     return len;
5128 }
5129 
atcmd_nop_proc(struct tls_atcmd_token_t * tok,char * res_resp,u32 * res_len)5130 int atcmd_nop_proc(struct tls_atcmd_token_t *tok, char *res_resp, u32 *res_len)
5131 {
5132     if (!tok->arg_found && (tok->op == ATCMD_OP_NULL)) {
5133         *res_len = atcmd_ok_resp(res_resp);
5134     } else {
5135         *res_len = atcmd_err_resp(res_resp, CMD_ERR_OPS);
5136     }
5137 
5138     return 0;
5139 }
5140 
hostif_check_atcmd_opt(u8 op,u8 arg_found,u8 opt_flag,u8 arg_len,u8 * set_opt,u8 * update_flash)5141 static int hostif_check_atcmd_opt(u8 op, u8 arg_found, u8 opt_flag, u8 arg_len,
5142     u8 *set_opt, u8 *update_flash)
5143 {
5144     u8 r = opt_flag&op;
5145     if (r == 0) {
5146         return -CMD_ERR_UNSUPP;
5147     }
5148     if (r == ATCMD_OP_EQ || r == ATCMD_OP_EP) {
5149         if (arg_len > arg_found) {
5150             return -CMD_ERR_UNSUPP;
5151         }
5152         *set_opt = 1;
5153         if (op == ATCMD_OP_EP) {
5154             *update_flash = 1;
5155         }
5156     }
5157     return 0;
5158 }
5159 
get_first_comma(char * buf,int len)5160 char* get_first_comma(char* buf, int len)
5161 {
5162     char prec = '\0', curc;
5163     int n = 0;
5164     if (len <= 0) {
5165         return NULL;
5166     }
5167     if (*buf == '"') {
5168         for (n = 1; n < len; n++) {
5169             curc = *(buf + n);
5170             if (curc == ',' && prec == '"') {
5171                 if (n < THREE || *(buf + n - TWO) != '\\') {
5172                     return buf + n;
5173                 }
5174             }
5175             prec = curc;
5176         }
5177         return NULL;
5178     } else {
5179         return strchr(buf, ',');
5180     }
5181 }
5182 
tls_atcmd_parse(struct tls_atcmd_token_t * tok,char * buf,u32 len)5183 int tls_atcmd_parse(struct tls_atcmd_token_t *tok, char *buf, u32 len)
5184 {
5185     char *c, *end_line, *comma;
5186     int remain_len, ret = 0;
5187     char *buf_start = buf;
5188 
5189     /* at command "AT+", NULL OP */
5190     if (len == 0) {
5191         *tok->name = '\0';
5192         tok->arg_found = 0;
5193         return -1;
5194     }
5195 
5196     /* parse command name */
5197     c = strchr(buf, '=');
5198     if (!c) {
5199         /* format :  at+wprt */
5200         c = strchr(buf, '\n');
5201         if (!c) {
5202             return -CMD_ERR_INV_FMT;
5203         }
5204         if ((c - buf) > (ATCMD_NAME_MAX_LEN - 1)) {
5205             return -CMD_ERR_UNSUPP;
5206         }
5207         MEMCPY(tok->name, buf, c-buf);
5208         *(tok->name + (c-buf)) = '\0';
5209         tok->op = ATCMD_OP_NULL;
5210         tok->arg_found = 0;
5211         return 0;
5212     } else {
5213         /* format : at+wprt=0
5214          *          at+skct=0,0,192.168.1.4,80 */
5215         if ((c - buf) > (ATCMD_NAME_MAX_LEN - 1)) {
5216             return -CMD_ERR_UNSUPP;
5217         }
5218         MEMCPY(tok->name, buf, c-buf);
5219         *(tok->name + (c-buf)) = '\0';
5220         tok->op = ATCMD_OP_NULL;
5221         buf += (c-buf + 1);
5222         switch (*buf) {
5223             case '!':
5224                 tok->op = ATCMD_OP_EP;
5225                 buf++;
5226                 break;
5227             case '?':
5228                 tok->op = ATCMD_OP_QU;
5229                 buf++;
5230                 break;
5231             default:
5232                 tok->op = ATCMD_OP_EQ;
5233                 break;
5234         }
5235         tok->arg[0]= buf;
5236         tok->arg_found = 0;
5237         if (tok->op & 0x9) {
5238             return 0;
5239         }
5240         remain_len = len - (buf - buf_start);
5241         end_line = strchr(buf, '\n');
5242         if (!end_line) {
5243             return -CMD_ERR_INV_FMT;
5244         }
5245         while (remain_len > 0) {
5246             comma = get_first_comma(buf, remain_len);
5247             if (end_line && !comma) {
5248                 if (tok->arg_found >= (ATCMD_MAX_ARG - 1)) {
5249                     return -CMD_ERR_INV_PARAMS;
5250                 }
5251                 /* last parameter */
5252                 *(u8 *)end_line = '\0';
5253                 if (end_line != buf) {
5254                     tok->arg_found++;
5255                 }
5256                 tok->arg[tok->arg_found] = end_line + 1;
5257                 remain_len -= (end_line - buf);
5258                 if (remain_len > 1) {
5259                     return -CMD_ERR_NOT_ALLOW;
5260                 } else {
5261                     return 0;
5262                 }
5263             } else {
5264                 if (tok->arg_found >= (ATCMD_MAX_ARG - 1)) {
5265                     return -CMD_ERR_INV_PARAMS;
5266                 }
5267                 *(u8 *)comma = '\0';
5268                 if (ret) {
5269                     return -CMD_ERR_INV_PARAMS;
5270                 }
5271                 tok->arg_found++;
5272                 tok->arg[tok->arg_found] = comma + 1;
5273                 remain_len -= (comma - buf + 1);
5274                 buf = comma + 1;
5275             }
5276         }
5277         return 0;
5278     }
5279 }
5280 
tls_hostif_atcmd_exec(struct tls_atcmd_token_t * tok,char * res_rsp,u32 * res_len)5281 int tls_hostif_atcmd_exec(struct tls_atcmd_token_t *tok,
5282     char *res_rsp, u32 *res_len)
5283 {
5284     int err = 0;
5285     struct tls_cmd_t *atcmd, *match = NULL;
5286     u8 set_opt = 0, update_flash = 0;
5287     union HOSTIF_CMD_PARAMS_UNION *cmd = NULL;
5288     union HOSTIF_CMDRSP_PARAMS_UNION *cmdrsp = NULL;
5289 
5290     if (strlen(tok->name) == 0) {
5291         err = atcmd_nop_proc(tok, res_rsp, res_len);
5292         return err;
5293     }
5294 
5295     /* look for AT CMD handle table */
5296     atcmd = at_ri_cmd_tbl;
5297     while (atcmd->at_name) {
5298         if (strcmp(atcmd->at_name, tok->name) == 0) {
5299             match = atcmd;
5300             break;
5301         }
5302         atcmd++;
5303     }
5304     /* at command handle */
5305     if (match) {
5306         cmd = tls_mem_alloc(sizeof(union HOSTIF_CMD_PARAMS_UNION));
5307         if (cmd == NULL) {
5308             err = -CMD_ERR_MEM;
5309             goto err;
5310         }
5311         cmdrsp = tls_mem_alloc(sizeof(union HOSTIF_CMDRSP_PARAMS_UNION));
5312         if (cmdrsp == NULL) {
5313             err = -CMD_ERR_MEM;
5314             goto err;
5315         }
5316 
5317         err = hostif_check_atcmd_opt(tok->op, tok->arg_found, match->op_flag,
5318                                      match->at_arg_len, &set_opt, &update_flash);
5319         if (err) {
5320             goto err;
5321         }
5322         memset(cmd, 0, sizeof(union HOSTIF_CMD_PARAMS_UNION));
5323         err = at_parse_func(match->at_name, tok, cmd);
5324         if (err) {
5325             goto err;
5326         }
5327         memset(cmdrsp, 0, sizeof(union HOSTIF_CMDRSP_PARAMS_UNION));
5328         err = match->proc_func(set_opt, update_flash, cmd, cmdrsp);
5329         if (err) {
5330             goto err;
5331         }
5332         err = at_format_func(match->at_name, set_opt, update_flash, cmdrsp, res_rsp, res_len);
5333         if (err) {
5334             if (err != -CMD_ERR_SKT_RPT) {
5335                 goto err;
5336             }
5337         }
5338         if (cmd != NULL) {
5339             tls_mem_free(cmd);
5340         }
5341         if (cmdrsp != NULL) {
5342             tls_mem_free(cmdrsp);
5343             return err;
5344         }
5345     } else {
5346         err = -CMD_ERR_UNSUPP;
5347     }
5348 err:
5349     /* at command not found */
5350     *res_len = sprintf(res_rsp, "+ERR=%d", err);
5351     if (cmd != NULL) {
5352         tls_mem_free(cmd);
5353     }
5354     if (cmdrsp != NULL) {
5355         tls_mem_free(cmdrsp);
5356     }
5357     return err;
5358 }
5359 
ricmd_default_proc(char * buf,u32 length,int err,char * cmdrsp_buf,u32 * cmdrsp_size)5360 int ricmd_default_proc(char *buf, u32 length, int err,
5361     char *cmdrsp_buf, u32 *cmdrsp_size)
5362 {
5363 #if TLS_CONFIG_HOSTIF
5364     struct tls_hostif_cmdrsp *cmdrsp = (struct tls_hostif_cmdrsp *)cmdrsp_buf;
5365     struct tls_hostif_cmd *cmd = (struct tls_hostif_cmd *)buf;
5366 
5367     /* if cmd is not suppost, return this cmd and err code  */
5368     tls_hostif_fill_cmdrsp_hdr(cmdrsp, cmd->cmd_hdr.code, err,
5369                                ((err || (cmd->cmd_hdr.ext & 0x1)) ? 0 : 1));
5370     *cmdrsp_size = sizeof(struct tls_hostif_cmd_hdr);
5371 #endif
5372     return 0;
5373 }
5374 
tls_hostif_ricmd_exec(char * buf,u32 length,char * cmdrsp_buf,u32 * cmdrsp_size)5375 int tls_hostif_ricmd_exec(char *buf, u32 length, char *cmdrsp_buf, u32 *cmdrsp_size)
5376 {
5377     struct tls_hostif_cmd *cmd = (struct tls_hostif_cmd *)buf;
5378     struct tls_hostif_cmdrsp *cmdrsp = (struct tls_hostif_cmdrsp *)cmdrsp_buf;
5379     int err = 0;
5380     struct tls_cmd_t *match = NULL;
5381     int cmdcnt = sizeof(at_ri_cmd_tbl) / sizeof(struct tls_cmd_t);
5382     int i = 0, set_opt = 0, update_flash = 0;
5383 
5384     int cmd_code = cmd->cmd_hdr.code;
5385 
5386     /* find cmdId */
5387     if (cmd_code == 0) {
5388         cmd->cmd_hdr.ext = 1;
5389         goto erred;
5390     }
5391     for (i = 0; i< cmdcnt; i++) {
5392         if (cmd_code == at_ri_cmd_tbl[i].ri_cmd_id) {
5393             match = &at_ri_cmd_tbl[i];
5394             break;
5395         }
5396     }
5397     if (match) {
5398         if (cmd->cmd_hdr.ext & 0x2) {
5399             if ((cmd->cmd_hdr.ext & 0x1) == 0 || (match->op_flag & 0x40) == 0) {
5400                 err = CMD_ERR_INV_PARAMS;
5401                 goto erred;
5402             }
5403             update_flash = 1;
5404             set_opt = 1;
5405         } else if (cmd->cmd_hdr.ext & 0x1) {
5406             if ((match->op_flag & 0x20) == 0) {
5407                 err = CMD_ERR_INV_PARAMS;
5408                 goto erred;
5409             }
5410             set_opt = 1;
5411         } else if ((match->op_flag & 0x10) == 0) {
5412             err = CMD_ERR_INV_PARAMS;
5413             goto erred;
5414         }
5415         if ((cmd->cmd_hdr.msg_type != 0x01) ||
5416             ((set_opt == 0) && (length != sizeof(struct tls_hostif_cmd_hdr))) ||
5417             ((set_opt == 1) && (length < sizeof(struct tls_hostif_cmd_hdr) + match->ri_set_len))) {
5418             err = CMD_ERR_INV_PARAMS;
5419             goto erred;
5420         }
5421 
5422         err = ri_parse_func(cmd_code, buf, length, &cmd->params);
5423         if (err) {
5424             goto erred;
5425         }
5426         err = match->proc_func(set_opt, update_flash, &cmd->params, &cmdrsp->params);
5427         if (err) {
5428             err = -err;
5429             goto erred;
5430         }
5431         ricmd_default_proc(buf, length, err, cmdrsp_buf, cmdrsp_size);
5432         err = ri_format_func(cmd_code, set_opt, update_flash, &cmdrsp->params, cmdrsp_buf, cmdrsp_size);
5433         if (err) {
5434             goto erred;
5435         }
5436         return err;
5437     } else
5438         err = CMD_ERR_OPS;
5439 erred:
5440     ricmd_default_proc(buf, length, err, cmdrsp_buf, cmdrsp_size);
5441     return err;
5442 }
5443 
5444 #endif /* TLS_CONFIG_HOSTIF */
5445