SimpleLink CC32xx ATCommands Library
Simplifies the implementation of Internet connectivity
atcmd_socket.c
1 /*
2  * Copyright (c) 2016, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 //*****************************************************************************
34 // includes
35 //*****************************************************************************
36 #include <stdlib.h>
37 #include <stdio.h>
38 
39 /* TI-DRIVERS Header files */
40 #include <ti/drivers/net/wifi/simplelink.h>
41 #include <ti/net/utils/str_mpl.h>
42 
43 /* AT Header files */
44 #include <ti/net/atcmd/atcmd_socket.h>
45 #include <ti/net/atcmd/atcmd_defs.h>
46 #include <ti/net/atcmd/atcmd_event.h>
47 #include <ti/net/atcmd/atcmd_gen.h>
48 #include <ti/net/atcmd/atcmd.h>
49 
50 //*****************************************************************************
51 // defines
52 //*****************************************************************************
53 
54 
55 //*****************************************************************************
56 // typedefs
57 //*****************************************************************************
58 typedef struct _ATCmdSock_t_
59 {
60  int16_t sd;
61  SlSocklen_t addrlen;
62  SlSockAddr_t addr;
63  int8_t padding[12];
64 }ATCmdSock_t;
65 
66 typedef struct _ATCmdSock_Socket_t_
67 {
68  int16_t domain;
69  int16_t type;
70  int16_t protocol;
71 }ATCmdSock_Socket_t;
72 
73 typedef struct _ATCmdSock_Accept_t_
74 {
75  int16_t sd;
76  int16_t domain;
77  ATCmdSock_t ret;
78 }ATCmdSock_Accept_t;
79 
80 typedef struct _ATCmdSock_Listen_t_
81 {
82  int16_t sd;
83  int16_t backlog;
84 }ATCmdSock_Listen_t;
85 
86 typedef struct _ATCmdSock_Select_t_
87 {
88  int16_t nfds;
89  SlTimeval_t timeout;
90  SlFdSet_t readsds;
91 }ATCmdSock_Select_t;
92 
93 typedef struct _ATCmdSock_SetSockOpt_t_
94 {
95  int16_t sd;
96  int16_t level;
97  int16_t optname;
98  void * optval;
99  SlSocklen_t optlen;
100 }ATCmdSock_SetSockOpt_t;
101 
102 typedef struct _ATCmdSock_tcp_t_
103 {
104  int16_t sd;
105  uint8_t format;
106  int16_t flags;
107  int16_t len;
108  void *data;
109 }ATCmdSock_tcp_t;
110 
111 typedef struct _ATCmdSock_udp_t_
112 {
113  ATCmdSock_t target;
114  uint8_t format;
115  int16_t flags;
116  int16_t len;
117  void *data;
118 }ATCmdSock_udp_t;
119 
120 //*****************************************************************************
121 // AT Command Socket Routines
122 //*****************************************************************************
123 
124 
137 int32_t ATCmdSock_socketResult(void *args, int32_t num, char *buff)
138 {
139  int16_t sd = (int16_t)(num);
140 
141  StrMpl_setStr(ATCmd_sockSocketStr,&buff,ATCMD_DELIM_EVENT);
142  StrMpl_setVal(&sd,&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_16 |STRMPL_FLAG_PARAM_SIGNED|STRMPL_FLAG_PARAM_DEC);
143  return 0;
144 }
145 
158 int32_t ATCmdSock_socketParse(char *buff, ATCmdSock_Socket_t *params)
159 {
160  int32_t ret = 0;
161 
162  /* domain*/
163  if ((ret = StrMpl_getListVal(ATCmd_sockDomain, sizeof(ATCmd_sockDomain)/sizeof(StrMpl_List_t), &buff, &params->domain, ATCMD_DELIM_ARG, sizeof(params->domain))) < 0)
164  {
165  return ret;
166  }
167 
168  /* type */
169  if ((ret = StrMpl_getListVal(ATCmd_sockType, sizeof(ATCmd_sockType)/sizeof(StrMpl_List_t), &buff, &params->type, ATCMD_DELIM_ARG, sizeof(params->type))) < 0)
170  {
171  return ret;
172  }
173 
174  /* protocol */
175  if ((ret = StrMpl_getListVal(ATCmd_sockProtocol, sizeof(ATCmd_sockProtocol)/sizeof(StrMpl_List_t), &buff, &params->protocol, ATCMD_DELIM_TRM, sizeof(params->protocol))) < 0)
176  {
177  return ret;
178  }
179  return ret;
180 }
181 
193 int32_t ATCmdSock_socketCallback(void *arg)
194 {
195  int32_t ret = 0;
196  ATCmdSock_Socket_t sockParams;
197 
198  memset(&sockParams, 0x0, sizeof(ATCmdSock_Socket_t));
199 
200  /* Call the command parser */
201  ret = ATCmdSock_socketParse((char *)arg,&sockParams);
202 
203  if(ret < 0)
204  {
205  ATCmd_errorResult(ATCmd_errorParseStr,ret);
206  return -1;
207  }
208 
209  /* create socket */
210  ret = sl_Socket(sockParams.domain, sockParams.type, sockParams.protocol);
211 
212  if (ret < 0)
213  {
214  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
215  }
216  else
217  {
218  ATCmd_commandResult(ATCmdSock_socketResult,NULL,ret);
219  ATCmd_okResult();
220  }
221 
222  return ret;
223 }
224 
225 
236 int32_t ATCmdSock_closeResult(void *args, int32_t num, char *buff)
237 {
238  int16_t sock = (int16_t)num;
239 
240  StrMpl_setStr(ATCmd_sockCloseStr,&buff,ATCMD_DELIM_EVENT);
241 
242  StrMpl_setVal(&sock,&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_16 |STRMPL_FLAG_PARAM_SIGNED|STRMPL_FLAG_PARAM_DEC);
243  return 0;
244 }
245 
257 int32_t ATCmdSock_closeCallback(void *arg)
258 {
259  int32_t ret = 0;
260  int16_t sock;
261 
262  /* Call the command parser */
263  if ((ret = StrMpl_getVal((char **)&arg, (void *)&sock, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
264  {
265  ATCmd_errorResult(ATCmd_errorParseStr,ret);
266  return -1;
267  }
268 
269  /* create socket */
270  ret = sl_Close(sock);
271 
272  if (ret < 0)
273  {
274  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
275  }
276  else
277  {
278  ATCmd_commandResult(ATCmdSock_closeResult,NULL,sock);
279  ATCmd_okResult();
280  }
281 
282  return ret;
283 }
284 
293 int32_t ATCmdSock_acceptFree(ATCmdSock_Accept_t *params)
294 {
295  if (params != NULL)
296  {
297  free(params);
298  }
299  return 0;
300 }
301 
314 int32_t ATCmdSock_acceptParse(char *buff, ATCmdSock_Accept_t *params)
315 {
316  int32_t ret = 0;
317 
318  /* socket */
319  if ((ret = StrMpl_getVal((char **)&buff, &params->sd, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
320  {
321  return ret;
322  }
323  /* domain */
324  if ((ret = StrMpl_getListVal(ATCmd_sockDomain, sizeof(ATCmd_sockDomain)/sizeof(StrMpl_List_t), &buff, &params->domain, ATCMD_DELIM_TRM, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
325  {
326  return ret;
327  }
328 
329  /* address length */
330  if (params->domain == SL_AF_INET)
331  {
332  params->ret.addrlen = sizeof(SlSockAddrIn_t);
333  }
334  else if (params->domain == SL_AF_INET6)
335  {
336  params->ret.addrlen = sizeof(SlSockAddrIn6_t);
337  }
338  else
339  {
340  return -1;
341  }
342 
343  return ret;
344 }
345 
356 int32_t ATCmdSock_acceptResult(void *args, int32_t num, char *buff)
357 {
358  ATCmdSock_Accept_t *params = (ATCmdSock_Accept_t *)args;
359  void *addr = &params->ret.addr;
360  uint8_t ip[4];
361 
362  StrMpl_setStr(ATCmd_sockAcceptStr,&buff,ATCMD_DELIM_EVENT);
363  /* new socket descriptor */
364  StrMpl_setVal(&params->ret.sd,&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 |STRMPL_FLAG_PARAM_SIGNED|STRMPL_FLAG_PARAM_DEC);
365  /* family */
366  StrMpl_setListStr(ATCmd_sockDomain, sizeof(ATCmd_sockDomain)/sizeof(StrMpl_List_t),&(params->ret.addr.sa_family),&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 |STRMPL_FLAG_PARAM_UNSIGNED);
367 
368  if (params->ret.addr.sa_family == SL_AF_INET)
369  {
370  ((SlSockAddrIn_t *)(addr))->sin_port = sl_Htons(((SlSockAddrIn_t *)(addr))->sin_port);
371  /* port */
372  StrMpl_setVal(&(((SlSockAddrIn_t *)(addr))->sin_port),&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
373  /* address */
374  ((SlSockAddrIn_t *)(addr))->sin_addr.s_addr = sl_Htonl(((SlSockAddrIn_t *)(addr))->sin_addr.s_addr);
375  ATCmd_valToIPv4(((SlSockAddrIn_t *)(addr))->sin_addr.s_addr, ip);
376  StrMpl_setArrayVal(ip,&buff,4,ATCMD_DELIM_TRM,ATCMD_DELIM_INTER,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_8 | STRMPL_FLAG_PARAM_UNSIGNED);
377  }
378  else if (params->ret.addr.sa_family == SL_AF_INET6)
379  {
380  ((SlSockAddrIn6_t *)(addr))->sin6_port = sl_Htons(((SlSockAddrIn6_t *)(addr))->sin6_port);
381  /* port */
382  StrMpl_setVal(&(((SlSockAddrIn6_t *)(addr))->sin6_port),&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
383  /* address */
384  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[0] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[0]);
385  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[1] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[1]);
386  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[2] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[2]);
387  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[3] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[3]);
388  StrMpl_setArrayVal(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32,&buff,4,ATCMD_DELIM_TRM,ATCMD_DELIM_ARRAY,STRMPL_FLAG_PARAM_HEX | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_UNSIGNED);
389  }
390 
391  ATCmdSock_acceptFree(params);
392  return 0;
393 }
394 
406 int32_t ATCmdSock_acceptCallback(void *arg)
407 {
408  int32_t ret = 0;
409  ATCmdSock_Accept_t *params;
410 
411  params = malloc(sizeof(ATCmdSock_Accept_t));
412 
413  if (params == NULL)
414  {
415  ATCmd_errorResult(ATCmd_errorAllocStr,0);
416  return -1;
417  }
418  memset(params, 0x0, sizeof(ATCmdSock_Accept_t));
419 
420  /* Call the command parser */
421  ret = ATCmdSock_acceptParse((char *)arg, params);
422 
423  if (ret < 0)
424  {
425  ATCmd_errorResult(ATCmd_errorParseStr,ret);
426  ATCmdSock_acceptFree(params);
427  return -1;
428  }
429 
430  /* return command complete for blocked command */
431  ATCmd_okResult();
432 
433  /* create socket */
434  params->ret.sd = sl_Accept(params->sd,&params->ret.addr,&params->ret.addrlen);
435 
436  if (params->ret.sd < 0)
437  {
438  ATCmd_errorResult(ATCmd_errorCmdStr,params->ret.sd);
439  ATCmdSock_acceptFree(params);
440  }
441  else
442  {
443  ATCmd_commandResult(ATCmdSock_acceptResult,params,0);
444  ATCmd_okResult();
445  }
446 
447  return ret;
448 }
449 
450 
463 int32_t ATCmdSock_parse(char **buff, ATCmdSock_t *params, char delim)
464 {
465  int32_t ret = 0;
466  void *addr = &params->addr;
467  uint8_t ip[4];
468 
469  /* sd */
470  if ((ret = StrMpl_getVal(buff, &params->sd, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
471  {
472  return ret;
473  }
474  /* family */
475  if ((ret = StrMpl_getListVal(ATCmd_sockDomain, sizeof(ATCmd_sockDomain)/sizeof(StrMpl_List_t), buff, &params->addr.sa_family, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
476  {
477  return ret;
478  }
479 
480  if (params->addr.sa_family == SL_AF_INET)
481  {
482  /* port */
483  if ((ret = StrMpl_getVal(buff, &((SlSockAddrIn_t *)(addr))->sin_port, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
484  {
485  return ret;
486  }
487  ((SlSockAddrIn_t *)(addr))->sin_port = sl_Htons(((SlSockAddrIn_t *)(addr))->sin_port);
488  /* address */
489  if ((ret = StrMpl_getArrayVal(buff,(void *)ip,4,delim,ATCMD_DELIM_INTER, STRMPL_FLAG_PARAM_SIZE_8 ,ATCmd_excludeDelimArray)) < 0)
490  {
491  return ret;
492  }
493  ((SlSockAddrIn_t *)(addr))->sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(ip[0],ip[1],ip[2],ip[3]));
494  /* length */
495  params->addrlen = sizeof(SlSockAddrIn_t);
496  }
497  else if (params->addr.sa_family == SL_AF_INET6)
498  {
499  /* port */
500  if ((ret = StrMpl_getVal(buff, &((SlSockAddrIn6_t *)(addr))->sin6_port, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
501  {
502  return ret;
503  }
504  ((SlSockAddrIn6_t *)(addr))->sin6_port = sl_Htons(((SlSockAddrIn6_t *)(addr))->sin6_port);
505  /* address */
506  if ((ret = StrMpl_getArrayVal(buff, (void *)(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32),4,delim,ATCMD_DELIM_ARRAY,STRMPL_FLAG_PARAM_SIZE_32,ATCmd_excludeDelimArray)) < 0)
507  {
508  return ret;
509  }
510  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[0] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[0]);
511  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[1] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[1]);
512  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[2] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[2]);
513  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[3] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[3]);
514  /* length */
515  params->addrlen = sizeof(SlSockAddrIn6_t);
516  }
517  else
518  {
519  return -1;
520  }
521 
522  return ret;
523 }
524 
525 
537 int32_t ATCmdSock_bindCallback(void *arg)
538 {
539  int32_t ret = 0;
540  ATCmdSock_t params;
541 
542  memset(&params, 0x0, sizeof(ATCmdSock_t));
543 
544  /* Call the command parser */
545  ret = ATCmdSock_parse((char **)&arg, &params,ATCMD_DELIM_TRM);
546 
547  if (ret < 0)
548  {
549  ATCmd_errorResult(ATCmd_errorParseStr,ret);
550  return -1;
551  }
552 
553  /* bind socket */
554  ret = sl_Bind(params.sd,&params.addr,params.addrlen);
555 
556  if (ret < 0)
557  {
558  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
559  }
560  else
561  {
562  ATCmd_okResult();
563  }
564 
565  return ret;
566 }
567 
580 int32_t ATCmdSock_listenParse(char *buff, ATCmdSock_Listen_t *params)
581 {
582  int32_t ret = 0;
583 
584  /* socket */
585  if ((ret = StrMpl_getVal((char **)&buff, &params->sd, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
586  {
587  return ret;
588  }
589  /* num of connections */
590  if ((ret = StrMpl_getVal((char **)&buff, &params->backlog, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
591  {
592  return ret;
593  }
594 
595  return ret;
596 }
597 
609 int32_t ATCmdSock_listenCallback(void *arg)
610 {
611  int32_t ret = 0;
612  ATCmdSock_Listen_t params;
613 
614  memset(&params, 0x0, sizeof(ATCmdSock_Listen_t));
615 
616  /* Call the command parser */
617  ret = ATCmdSock_listenParse((char *)arg, &params);
618 
619  if (ret < 0)
620  {
621  ATCmd_errorResult(ATCmd_errorParseStr,ret);
622  return -1;
623  }
624 
625  /* create socket */
626  ret = sl_Listen(params.sd,params.backlog);
627 
628  if (ret < 0)
629  {
630  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
631  }
632  else
633  {
634  ATCmd_okResult();
635  }
636 
637  return ret;
638 }
639 
648 int32_t ATCmdSock_connectFree(ATCmdSock_t *params)
649 {
650  if (params != NULL)
651  {
652  free(params);
653  }
654  return 0;
655 }
656 
667 int32_t ATCmdSock_connectResult(void *args, int32_t num, char *buff)
668 {
669  ATCmdSock_t *params = (ATCmdSock_t *)args;
670  void *addr = &params->addr;
671  uint8_t ip[4];
672 
673  StrMpl_setStr(ATCmd_sockConnectStr,&buff,ATCMD_DELIM_EVENT);
674  if (params->addr.sa_family == SL_AF_INET)
675  {
676  /* port */
677  ((SlSockAddrIn_t *)(addr))->sin_port = sl_Htons(((SlSockAddrIn_t *)(addr))->sin_port);
678  StrMpl_setVal(&(((SlSockAddrIn_t *)(addr))->sin_port),&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
679  /* address */
680  ((SlSockAddrIn_t *)(addr))->sin_addr.s_addr = sl_Htonl(((SlSockAddrIn_t *)(addr))->sin_addr.s_addr);
681  ATCmd_valToIPv4(((SlSockAddrIn_t *)(addr))->sin_addr.s_addr, ip);
682  StrMpl_setArrayVal(ip,&buff,4,ATCMD_DELIM_TRM,ATCMD_DELIM_INTER,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_8 | STRMPL_FLAG_PARAM_UNSIGNED);
683  }
684  else if (params->addr.sa_family == SL_AF_INET6)
685  {
686  /* port */
687  ((SlSockAddrIn6_t *)(addr))->sin6_port = sl_Htons(((SlSockAddrIn6_t *)(addr))->sin6_port);
688  StrMpl_setVal(&(((SlSockAddrIn6_t *)(addr))->sin6_port),&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
689  /* address */
690  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[0] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[0]);
691  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[1] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[1]);
692  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[2] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[2]);
693  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[3] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[3]);
694  StrMpl_setArrayVal(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32,&buff,4,ATCMD_DELIM_TRM,ATCMD_DELIM_ARRAY,STRMPL_FLAG_PARAM_HEX | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_UNSIGNED);
695  }
696 
697  ATCmdSock_connectFree(params);
698 
699  return 0;
700 }
701 
702 
714 int32_t ATCmdSock_connectCallback(void *arg)
715 {
716  int32_t ret = 0;
717  ATCmdSock_t *params;
718 
719  params = malloc(sizeof(ATCmdSock_t));
720 
721  if (params == NULL)
722  {
723  ATCmd_errorResult(ATCmd_errorAllocStr,0);
724  return -1;
725  }
726  memset(params, 0x0, sizeof(ATCmdSock_t));
727 
728  /* Call the command parser */
729  ret = ATCmdSock_parse((char **)&arg, params,ATCMD_DELIM_TRM);
730 
731  if (ret < 0)
732  {
733  ATCmd_errorResult(ATCmd_errorParseStr,ret);
734  ATCmdSock_connectFree(params);
735  return -1;
736  }
737 
738  /* return command complete for blocked command */
739  ATCmd_okResult();
740 
741  /* connect */
742  ret = sl_Connect(params->sd,&params->addr,params->addrlen);
743 
744  if (ret < 0)
745  {
746  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
747  ATCmdSock_connectFree(params);
748  }
749  else
750  {
751  ATCmd_commandResult(ATCmdSock_connectResult,params,0);
752  ATCmd_okResult();
753  }
754 
755  return ret;
756 }
757 
758 
767 int32_t ATCmdSock_selectFree(ATCmdSock_Select_t *params)
768 {
769  if (params != NULL)
770  {
771  free(params);
772  }
773  return 0;
774 }
775 
786 int32_t ATCmdSock_selectParse(char *buff, ATCmdSock_Select_t *params)
787 {
788  int32_t ret = 0;
789 
790  /* nfds */
791  if ((ret = StrMpl_getVal((char **)&buff, &params->nfds, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
792  {
793  return ret;
794  }
795  /* readsds */
796  if ((ret = StrMpl_getArrayBitVal((char **)&buff, &params->readsds.fd_array[0],ATCMD_DELIM_ARG,ATCMD_DELIM_BIT,ATCmd_excludeDelimArray,STRMPL_FLAG_PARAM_SIZE_32)) < 0)
797  {
798  return ret;
799  }
800 
801  /* timeout - seconds */
802  if ((ret = StrMpl_getVal((char **)&buff, &params->timeout.tv_sec, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
803  {
804  return ret;
805  }
806 
807  /* timeout - microseconds */
808  if ((ret = StrMpl_getVal((char **)&buff, &params->timeout.tv_usec, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
809  {
810  return ret;
811  }
812  return ret;
813 }
814 
825 int32_t ATCmdSock_selectResult(void *args, int32_t num, char *buff)
826 {
827  ATCmdSock_Select_t *params = (ATCmdSock_Select_t *)args;
828 
829  StrMpl_setStr(ATCmd_sockSelectStr,&buff,ATCMD_DELIM_EVENT);
830  StrMpl_setArrayBitVal(&params->readsds.fd_array[0],&buff,ATCMD_DELIM_TRM,ATCMD_DELIM_BIT,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_UNSIGNED);
831 
832  ATCmdSock_selectFree(params);
833 
834  return 0;
835 }
836 
848 int32_t ATCmdSock_selectCallback(void *arg)
849 {
850  int32_t ret = 0;
851  ATCmdSock_Select_t *params;
852 
853  params = malloc(sizeof(ATCmdSock_Select_t));
854 
855  if (params == NULL)
856  {
857  ATCmd_errorResult(ATCmd_errorAllocStr,0);
858  return -1;
859  }
860  memset(params, 0x0, sizeof(ATCmdSock_Select_t));
861 
862  /* Call the command parser */
863  ret = ATCmdSock_selectParse((char *)arg, params);
864 
865  if (ret < 0)
866  {
867  ATCmd_errorResult(ATCmd_errorParseStr,ret);
868  ATCmdSock_selectFree(params);
869  return -1;
870  }
871  else
872  {
873  ATCmd_okResult();
874  }
875 
876  /* select */
877  ret = sl_Select(params->nfds,&params->readsds,NULL,NULL,&params->timeout);
878 
879  if (ret < 0)
880  {
881  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
882  ATCmdSock_selectFree(params);
883  }
884  else
885  {
886  ATCmd_commandResult(ATCmdSock_selectResult,params,0);
887  ATCmd_okResult();
888  }
889 
890  return ret;
891 }
892 
893 
902 int32_t ATCmdSock_setSockOptFree(ATCmdSock_SetSockOpt_t *params)
903 {
904  if (params->optval != NULL)
905  {
906  free(params->optval);
907  }
908  return 0;
909 }
910 
921 int32_t ATCmdSock_setSockOptParse(char *buff, ATCmdSock_SetSockOpt_t *params)
922 {
923  int32_t ret = 0;
924  uint8_t ip[4];
925 
926  /* SD */
927  if ((ret = StrMpl_getVal((char **)&buff, &params->sd, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
928  {
929  return ret;
930  }
931  /*Level */
932  if ((ret = StrMpl_getListVal(ATCmd_sockLevel, sizeof(ATCmd_sockLevel)/sizeof(StrMpl_List_t), &buff, &params->level, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
933  {
934  return ret;
935  }
936  /* option */
937  switch (params->level)
938  {
939  case SL_SOL_SOCKET:
940  if ((ret = StrMpl_getListVal(ATCmd_sockSocketOpt, sizeof(ATCmd_sockSocketOpt)/sizeof(StrMpl_List_t), &buff, &params->optname, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
941  {
942  return ret;
943  }
944  break;
945  case SL_IPPROTO_IP:
946  if ((ret = StrMpl_getListVal(ATCmd_sockIpOpt, sizeof(ATCmd_sockIpOpt)/sizeof(StrMpl_List_t), &buff, &params->optname, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
947  {
948  return ret;
949  }
950  break;
951  case SL_SOL_PHY_OPT:
952  if ((ret = StrMpl_getListVal(ATCmd_sockPhyOpt, sizeof(ATCmd_sockPhyOpt)/sizeof(StrMpl_List_t), &buff, &params->optname, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
953  {
954  return ret;
955  }
956  break;
957  }
958 
959  /* value */
960  switch (params->optname)
961  {
962  case SL_SO_KEEPALIVE:
963  case SL_SO_KEEPALIVETIME:
964  case SL_SO_RX_NO_IP_BOUNDARY:
965  case SL_SO_RCVBUF:
966  case SL_SO_NONBLOCKING :
967  case SL_SO_CHANGE_CHANNEL:
968  case SL_SO_PHY_RATE:
969  case SL_SO_PHY_TX_POWER:
970  case SL_SO_PHY_NUM_FRAMES_TO_TX:
971  case SL_SO_PHY_PREAMBLE:
972  case SL_IP_RAW_RX_NO_HEADER:
973  case SL_IP_HDRINCL:
974  case SL_IP_RAW_IPV6_HDRINCL:
975  case SL_SO_PHY_TX_TIMEOUT:
976  case SL_SO_PHY_ALLOW_ACKS:
977 
978  params->optlen = sizeof(uint32_t);
979  params->optval = malloc(params->optlen);
980  if (params->optval == NULL)
981  {
982  return STRMPL_ERROR_MEM_ALLOCATION;
983  }
984  if ((ret = StrMpl_getVal((char **)&buff, params->optval , ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32)) < 0)
985  {
986  return ret;
987  }
988  break;
989  case SL_SO_RCVTIMEO:
990  params->optlen = sizeof(SlTimeval_t);
991  params->optval = malloc(params->optlen);
992  if (params->optval == NULL)
993  {
994  return STRMPL_ERROR_MEM_ALLOCATION;
995  }
996  if ((ret = StrMpl_getVal((char **)&buff, &(((SlTimeval_t *)(params->optval))->tv_sec), ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
997  {
998  return ret;
999  }
1000 
1001  if ((ret = StrMpl_getVal((char **)&buff, &(((SlTimeval_t *)(params->optval))->tv_usec), ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
1002  {
1003  return ret;
1004  }
1005  break;
1006  case SL_SO_SECMETHOD:
1007  params->optlen = sizeof(uint8_t);
1008  params->optval = malloc(params->optlen);
1009  if (params->optval == NULL)
1010  {
1011  return STRMPL_ERROR_MEM_ALLOCATION;
1012  }
1013  if ((ret = StrMpl_getListVal(ATCmd_sockSocketSecMethod, sizeof(ATCmd_sockSocketSecMethod)/sizeof(StrMpl_List_t), &buff, params->optval, ATCMD_DELIM_TRM, STRMPL_FLAG_PARAM_SIZE_8)) < 0)
1014  {
1015  return ret;
1016  }
1017  break;
1018  case SL_SO_SECURE_MASK:
1019  params->optlen = sizeof(uint32_t);
1020  params->optval = malloc(params->optlen);
1021  if (params->optval == NULL)
1022  {
1023  return STRMPL_ERROR_MEM_ALLOCATION;
1024  }
1025  if ((ret = StrMpl_getBitmaskListVal(ATCmd_sockSocketCipher, sizeof(ATCmd_sockSocketCipher)/sizeof(StrMpl_List_t), &buff, params->optval, ATCMD_DELIM_TRM,ATCMD_DELIM_BIT, ATCmd_excludeDelimArray,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
1026  {
1027  if (ret != STRMPL_ERROR_PARAM_MISSING)
1028  {
1029  return ret;
1030  }
1031  /* set to the default value */
1032  *(uint32_t *)(params->optval) = SL_SEC_MASK_SECURE_DEFAULT;
1033  }
1034  break;
1035  case SL_SO_SECURE_FILES_CA_FILE_NAME:
1036  case SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME:
1037  case SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME:
1038  case SL_SO_SECURE_FILES_PEER_CERT_OR_DH_KEY_FILE_NAME:
1039  case SL_SO_SECURE_DOMAIN_NAME_VERIFICATION:
1040  if ((ret = StrMpl_getAllocStr(&buff, (char **)&params->optval, ATCMD_DELIM_TRM, 255 ,ATCmd_excludeDelimStr)) < 0)
1041  {
1042  return ret;
1043  }
1044  params->optlen = strlen((char *)params->optval);
1045  break;
1046  case SL_SO_SECURE_ALPN:
1047  params->optlen = sizeof(uint32_t);
1048  params->optval = malloc(params->optlen);
1049  if (params->optval == NULL)
1050  {
1051  return STRMPL_ERROR_MEM_ALLOCATION;
1052  }
1053  if ((ret = StrMpl_getBitmaskListVal(ATCmd_sockSocketAlpn, sizeof(ATCmd_sockSocketAlpn)/sizeof(StrMpl_List_t), &buff, params->optval, ATCMD_DELIM_TRM,ATCMD_DELIM_BIT, ATCmd_excludeDelimArray, STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
1054  {
1055  return ret;
1056  }
1057  break;
1058 
1059  case SL_IP_MULTICAST_TTL:
1060  params->optlen = sizeof(uint8_t);
1061  params->optval = malloc(params->optlen);
1062  if (params->optval == NULL)
1063  {
1064  return STRMPL_ERROR_MEM_ALLOCATION;
1065  }
1066  if ((ret = StrMpl_getVal((char **)&buff, params->optval , ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
1067  {
1068  return ret;
1069  }
1070  break;
1071  case SL_IP_ADD_MEMBERSHIP:
1072  case SL_IP_DROP_MEMBERSHIP:
1073  params->optlen = sizeof(SlSockIpMreq_t);
1074  params->optval = malloc(params->optlen);
1075  if (params->optval == NULL)
1076  {
1077  return STRMPL_ERROR_MEM_ALLOCATION;
1078  }
1079  if ((ret = StrMpl_getArrayVal(&buff,(void *)ip,4,ATCMD_DELIM_ARG,ATCMD_DELIM_INTER, STRMPL_FLAG_PARAM_SIZE_8 ,ATCmd_excludeDelimArray)) < 0)
1080  {
1081  return ret;
1082  }
1083  ((SlSockIpMreq_t *)(params->optval))->imr_multiaddr.s_addr = sl_Htonl(SL_IPV4_VAL(ip[0],ip[1],ip[2],ip[3]));
1084  if ((ret = StrMpl_getArrayVal(&buff,(void *)ip,4,ATCMD_DELIM_TRM,ATCMD_DELIM_INTER, STRMPL_FLAG_PARAM_SIZE_8 ,ATCmd_excludeDelimArray)) < 0)
1085  {
1086  return ret;
1087  }
1088  ((SlSockIpMreq_t *)(params->optval))->imr_interface.s_addr = sl_Htonl(SL_IPV4_VAL(ip[0],ip[1],ip[2],ip[3]));
1089  break;
1090  case SL_SO_PHY_TX_INHIBIT_THRESHOLD :
1091  params->optlen = sizeof(uint32_t);
1092  params->optval = malloc(params->optlen);
1093  if (params->optval == NULL)
1094  {
1095  return STRMPL_ERROR_MEM_ALLOCATION;
1096  }
1097  if ((ret = StrMpl_getListVal(ATCmd_sockPhyThreshold, sizeof(ATCmd_sockPhyThreshold)/sizeof(StrMpl_List_t), &buff, params->optval, ATCMD_DELIM_TRM, STRMPL_FLAG_PARAM_SIZE_32)) < 0)
1098  {
1099  return ret;
1100  }
1101  break;
1102  case SL_SO_LINGER:
1103  params->optlen = sizeof(SlSocklinger_t);
1104  params->optval = malloc(params->optlen);
1105  if (params->optval == NULL)
1106  {
1107  return STRMPL_ERROR_MEM_ALLOCATION;
1108  }
1109  if ((ret = StrMpl_getVal((char **)&buff, &(((SlSocklinger_t *)(params->optval))->l_onoff), ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
1110  {
1111  return ret;
1112  }
1113 
1114  if ((ret = StrMpl_getVal((char **)&buff, &(((SlSocklinger_t *)(params->optval))->l_linger), ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
1115  {
1116  return ret;
1117  }
1118  break;
1119  case SL_SO_SECURE_EXT_CLIENT_CHLNG_RESP:
1120  params->optval = malloc(sizeof(int32_t));
1121  if (params->optval == NULL)
1122  {
1123  return STRMPL_ERROR_MEM_ALLOCATION;
1124  }
1125  params->optlen = sizeof(int32_t);
1126  break;
1127 
1128  }
1129  return ret;
1130 }
1131 
1132 
1145 {
1146  int32_t ret = 0;
1147  ATCmdSock_SetSockOpt_t params;
1148 
1149  memset(&params, 0x0, sizeof(ATCmdSock_SetSockOpt_t));
1150 
1151  /* Call the command parser */
1152  ret = ATCmdSock_setSockOptParse((char *)arg, &params);
1153 
1154  if (ret < 0)
1155  {
1156  ATCmd_errorResult(ATCmd_errorParseStr,ret);
1157  ATCmdSock_setSockOptFree(&params);
1158  return -1;
1159  }
1160 
1161  /* set sock opt */
1162  ret = sl_SetSockOpt(params.sd,params.level,params.optname,(const void *)params.optval,params.optlen);
1163 
1164  if (ret < 0)
1165  {
1166  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
1167  }
1168  else
1169  {
1170  ATCmd_okResult();
1171  }
1172 
1173  ATCmdSock_setSockOptFree(&params);
1174  return ret;
1175 }
1176 
1185 int32_t ATCmdSock_getSockOptFree(ATCmdSock_SetSockOpt_t *params)
1186 {
1187  if (params != NULL)
1188  {
1189  if (params->optval != NULL)
1190  {
1191  free(params->optval);
1192  }
1193  free(params);
1194  }
1195  return 0;
1196 }
1197 
1208 int32_t ATCmdSock_getSockOptParse(char *buff, ATCmdSock_SetSockOpt_t *params)
1209 {
1210  int32_t ret = 0;
1211 
1212  /* SD */
1213  if ((ret = StrMpl_getVal((char **)&buff, &params->sd, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1214  {
1215  return ret;
1216  }
1217  /*Level */
1218  if ((ret = StrMpl_getListVal(ATCmd_sockLevel, sizeof(ATCmd_sockLevel)/sizeof(StrMpl_List_t), &buff, &params->level, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1219  {
1220  return ret;
1221  }
1222  /* option */
1223  switch (params->level)
1224  {
1225  case SL_SOL_SOCKET:
1226  if ((ret = StrMpl_getListVal(ATCmd_sockSocketOpt, sizeof(ATCmd_sockSocketOpt)/sizeof(StrMpl_List_t), &buff, &params->optname, ATCMD_DELIM_TRM, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1227  {
1228  return ret;
1229  }
1230  break;
1231  case SL_IPPROTO_IP:
1232  if ((ret = StrMpl_getListVal(ATCmd_sockIpOpt, sizeof(ATCmd_sockIpOpt)/sizeof(StrMpl_List_t), &buff, &params->optname, ATCMD_DELIM_TRM, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1233  {
1234  return ret;
1235  }
1236  break;
1237  case SL_SOL_PHY_OPT:
1238  if ((ret = StrMpl_getListVal(ATCmd_sockPhyOpt, sizeof(ATCmd_sockPhyOpt)/sizeof(StrMpl_List_t), &buff, &params->optname, ATCMD_DELIM_TRM, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1239  {
1240  return ret;
1241  }
1242  break;
1243  }
1244 
1245  /* value */
1246  switch (params->optname)
1247  {
1248  case SL_SO_KEEPALIVE:
1249  case SL_SO_KEEPALIVETIME:
1250  case SL_SO_RX_NO_IP_BOUNDARY:
1251  case SL_SO_RCVBUF:
1252  case SL_SO_NONBLOCKING :
1253  case SL_SO_CHANGE_CHANNEL:
1254  case SL_SO_PHY_RATE:
1255  case SL_SO_PHY_TX_POWER:
1256  case SL_SO_PHY_NUM_FRAMES_TO_TX:
1257  case SL_SO_PHY_PREAMBLE:
1258  case SL_IP_RAW_RX_NO_HEADER:
1259  case SL_IP_HDRINCL:
1260  case SL_IP_RAW_IPV6_HDRINCL:
1261  case SL_SO_PHY_TX_TIMEOUT:
1262  case SL_SO_PHY_ALLOW_ACKS:
1263  case SL_SO_SECURE_MASK:
1264  case SL_SO_SECURE_ALPN:
1265  case SL_SO_PHY_TX_INHIBIT_THRESHOLD :
1266  case SL_SO_SECURE_EXT_CLIENT_CHLNG_RESP:
1267  params->optlen = sizeof(uint32_t);
1268  break;
1269  case SL_SO_RCVTIMEO:
1270  params->optlen = sizeof(SlTimeval_t);
1271  break;
1272  case SL_SO_SECMETHOD:
1273  case SL_IP_MULTICAST_TTL:
1274  params->optlen = sizeof(uint8_t);
1275  break;
1276  case SL_SO_SECURE_FILES_CA_FILE_NAME:
1277  case SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME:
1278  case SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME:
1279  case SL_SO_SECURE_FILES_PEER_CERT_OR_DH_KEY_FILE_NAME:
1280  case SL_SO_SECURE_DOMAIN_NAME_VERIFICATION:
1281  params->optlen = 255;
1282  break;
1283  case SL_IP_ADD_MEMBERSHIP:
1284  case SL_IP_DROP_MEMBERSHIP:
1285  params->optlen = sizeof(SlSockIpMreq_t);
1286  break;
1287  case SL_SO_LINGER:
1288  params->optlen = sizeof(SlSocklinger_t);
1289  break;
1290 
1291  }
1292  params->optval = malloc(params->optlen);
1293  if(params->optval == NULL)
1294  {
1295  return -1;
1296  }
1297 
1298  return ret;
1299 }
1300 
1301 
1312 int32_t ATCmdSock_getSockOptResult(void *args, int32_t num, char *buff)
1313 {
1314  ATCmdSock_SetSockOpt_t *params = (ATCmdSock_SetSockOpt_t *)args;
1315  uint8_t val[4];
1316 
1317  StrMpl_setStr(ATCmd_sockGetSockOptStr,&buff,ATCMD_DELIM_EVENT);
1318  switch (params->optname)
1319  {
1320  case SL_SO_KEEPALIVE:
1321  case SL_SO_KEEPALIVETIME:
1322  case SL_SO_RX_NO_IP_BOUNDARY:
1323  case SL_SO_RCVBUF:
1324  case SL_SO_NONBLOCKING :
1325  case SL_SO_CHANGE_CHANNEL:
1326  case SL_SO_PHY_RATE:
1327  case SL_SO_PHY_TX_POWER:
1328  case SL_SO_PHY_NUM_FRAMES_TO_TX:
1329  case SL_SO_PHY_PREAMBLE:
1330  case SL_IP_RAW_RX_NO_HEADER:
1331  case SL_IP_HDRINCL:
1332  case SL_IP_RAW_IPV6_HDRINCL:
1333  case SL_SO_PHY_TX_TIMEOUT:
1334  case SL_SO_PHY_ALLOW_ACKS:
1335  StrMpl_setVal(params->optval,&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_UNSIGNED);
1336  break;
1337  case SL_SO_RCVTIMEO:
1338  StrMpl_setVal(&(((SlTimeval_t *)(params->optval))->tv_sec),&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_SIGNED);
1339  StrMpl_setVal(&(((SlTimeval_t *)(params->optval))->tv_usec),&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_SIGNED);
1340  break;
1341  case SL_SO_SECMETHOD:
1342  StrMpl_setListStr(ATCmd_sockSocketSecMethod, sizeof(ATCmd_sockSocketSecMethod)/sizeof(StrMpl_List_t),params->optval,&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_8 |STRMPL_FLAG_PARAM_UNSIGNED);
1343  break;
1344  case SL_SO_SECURE_MASK:
1345  StrMpl_setBitmaskListStr(ATCmd_sockSocketCipher, sizeof(ATCmd_sockSocketCipher)/sizeof(StrMpl_List_t),params->optval, &buff, ATCMD_DELIM_TRM, ATCMD_DELIM_BIT, STRMPL_FLAG_PARAM_SIZE_32 |STRMPL_FLAG_PARAM_UNSIGNED);
1346  break;
1347  case SL_SO_SECURE_FILES_CA_FILE_NAME:
1348  case SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME:
1349  case SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME:
1350  case SL_SO_SECURE_FILES_PEER_CERT_OR_DH_KEY_FILE_NAME:
1351  case SL_SO_SECURE_DOMAIN_NAME_VERIFICATION:
1352  StrMpl_setStr((char *)params->optval,&buff,ATCMD_DELIM_TRM);
1353  break;
1354  case SL_SO_SECURE_ALPN:
1355  if (*(uint32_t *)params->optval == SL_SECURE_ALPN_FULL_LIST)
1356  {
1357  StrMpl_setListStr(ATCmd_sockSocketAlpn, sizeof(ATCmd_sockSocketAlpn)/sizeof(StrMpl_List_t),params->optval,&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_8 |STRMPL_FLAG_PARAM_UNSIGNED);
1358  }
1359  else
1360  {
1361  StrMpl_setBitmaskListStr(ATCmd_sockSocketAlpn, sizeof(ATCmd_sockSocketAlpn)/sizeof(StrMpl_List_t),params->optval, &buff, ATCMD_DELIM_TRM, ATCMD_DELIM_BIT, STRMPL_FLAG_PARAM_SIZE_32 |STRMPL_FLAG_PARAM_UNSIGNED);
1362  }
1363  break;
1364 
1365  case SL_IP_MULTICAST_TTL:
1366  StrMpl_setVal(params->optval,&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_8 | STRMPL_FLAG_PARAM_UNSIGNED);
1367  break;
1368  case SL_IP_ADD_MEMBERSHIP:
1369  case SL_IP_DROP_MEMBERSHIP:
1370  ((SlSockIpMreq_t *)(params->optval))->imr_multiaddr.s_addr = sl_Htonl(((SlSockIpMreq_t *)(params->optval))->imr_multiaddr.s_addr);
1371  ATCmd_valToIPv4(((SlSockIpMreq_t *)(params->optval))->imr_multiaddr.s_addr, val);
1372  StrMpl_setArrayVal(val,&buff,4,ATCMD_DELIM_ARG,ATCMD_DELIM_INTER,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_8 | STRMPL_FLAG_PARAM_UNSIGNED);
1373  ((SlSockIpMreq_t *)(params->optval))->imr_interface.s_addr = sl_Htonl(((SlSockIpMreq_t *)(params->optval))->imr_interface.s_addr);
1374  ATCmd_valToIPv4(((SlSockIpMreq_t *)(params->optval))->imr_interface.s_addr, val);
1375  StrMpl_setArrayVal(val,&buff,4,ATCMD_DELIM_TRM,ATCMD_DELIM_INTER,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_8 | STRMPL_FLAG_PARAM_UNSIGNED);
1376  break;
1377  case SL_SO_PHY_TX_INHIBIT_THRESHOLD :
1378  StrMpl_setListStr(ATCmd_sockPhyThreshold, sizeof(ATCmd_sockPhyThreshold)/sizeof(StrMpl_List_t),params->optval,&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32 |STRMPL_FLAG_PARAM_UNSIGNED);
1379  break;
1380  case SL_SO_LINGER:
1381  StrMpl_setVal(&(((SlSocklinger_t *)(params->optval))->l_onoff),&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_UNSIGNED);
1382  StrMpl_setVal(&(((SlSocklinger_t *)(params->optval))->l_linger),&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_UNSIGNED);
1383  break;
1384 
1385  }
1386  ATCmdSock_getSockOptFree(params);
1387 
1388  return 0;
1389 }
1390 
1403 {
1404  int32_t ret = 0;
1405  ATCmdSock_SetSockOpt_t *params;
1406 
1407  params = malloc(sizeof(ATCmdSock_SetSockOpt_t));
1408 
1409  if (params == NULL)
1410  {
1411  ATCmd_errorResult(ATCmd_errorAllocStr,0);
1412  return -1;
1413  }
1414  memset(params, 0x0, sizeof(ATCmdSock_SetSockOpt_t));
1415 
1416  /* Call the command parser */
1417  ret = ATCmdSock_getSockOptParse((char *)arg, params);
1418 
1419  if (ret < 0)
1420  {
1421  ATCmd_errorResult(ATCmd_errorParseStr,ret);
1422  ATCmdSock_getSockOptFree(params);
1423  return -1;
1424  }
1425 
1426  /* set sock opt */
1427  ret = sl_GetSockOpt(params->sd,params->level,params->optname,params->optval,&params->optlen);
1428 
1429  if (ret < 0)
1430  {
1431  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
1432  ATCmdSock_getSockOptFree(params);
1433  }
1434  else
1435  {
1436  ATCmd_commandResult(ATCmdSock_getSockOptResult,params,0);
1437  ATCmd_okResult();
1438  }
1439 
1440  return ret;
1441 }
1442 
1451 int32_t ATCmdSock_sendFree(ATCmdSock_tcp_t *params)
1452 {
1453  if (params->data != NULL)
1454  {
1455  free(params->data);
1456  }
1457  return 0;
1458 }
1459 
1470 int32_t ATCmdSock_sendParse(char *buff, ATCmdSock_tcp_t *params)
1471 {
1472  int32_t ret = 0;
1473  uint16_t outputLen;
1474 
1475  /* sd */
1476  if ((ret = StrMpl_getVal(&buff, &params->sd, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1477  {
1478  return ret;
1479  }
1480 
1481  /* data format */
1482  if ((ret = StrMpl_getVal(&buff, &params->format , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
1483  {
1484  return ret;
1485  }
1486 
1487  /* data length */
1488  if ((ret = StrMpl_getVal(&buff, &params->len, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16)) < 0)
1489  {
1490  return ret;
1491  }
1492  /* data */
1493  if (params->format == ATCMD_DATA_FORMAT_BASE64)
1494  {
1495  /* convert length to binary length */
1496  outputLen = StrMpl_getBase64DecBufSize((uint8_t *)buff,params->len);
1497  params->data = malloc(outputLen);
1498  if (params->data == NULL)
1499  {
1500  return -1;
1501  }
1502  if (StrMpl_decodeBase64((uint8_t *)buff, params->len, params->data, (uint32_t *)&outputLen) < 0)
1503  {
1504  return -1;
1505  }
1506  params->len = outputLen;
1507  }
1508  else
1509  {
1510  params->data = malloc(params->len);
1511  if (params->data == NULL)
1512  {
1513  return -1;
1514  }
1515 
1516  memcpy(params->data, buff, params->len);
1517  }
1518 
1519  return ret;
1520 }
1521 
1522 
1534 int32_t ATCmdSock_sendCallback(void *arg)
1535 {
1536  int32_t ret = 0;
1537  ATCmdSock_tcp_t params;
1538 
1539  memset(&params, 0x0, sizeof(ATCmdSock_tcp_t));
1540 
1541  /* Call the command parser */
1542  ret = ATCmdSock_sendParse((char *)arg, &params);
1543 
1544  if (ret < 0)
1545  {
1546  ATCmd_errorResult(ATCmd_errorParseStr,ret);
1547  ATCmdSock_sendFree(&params);
1548  return -1;
1549  }
1550 
1551  /* send */
1552  ret = sl_Send(params.sd, params.data, params.len, params.flags);
1553 
1554  if (ret < 0)
1555  {
1556  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
1557  }
1558  else
1559  {
1560  ATCmd_okResult();
1561  }
1562 
1563  ATCmdSock_sendFree(&params);
1564  return ret;
1565 }
1566 
1575 int32_t ATCmdSock_recvFree(ATCmdSock_tcp_t *params)
1576 {
1577  if (params != NULL)
1578  {
1579  if (params->data != NULL)
1580  {
1581  free(params->data);
1582  }
1583  free(params);
1584  }
1585  return 0;
1586 }
1587 
1598 int32_t ATCmdSock_recvParse(char *buff, ATCmdSock_tcp_t *params)
1599 {
1600  int32_t ret = 0;
1601 
1602  /* sd */
1603  if ((ret = StrMpl_getVal(&buff, &params->sd, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1604  {
1605  return ret;
1606  }
1607 
1608  /* data format */
1609  if ((ret = StrMpl_getVal(&buff, &params->format , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
1610  {
1611  return ret;
1612  }
1613 
1614  /* data length */
1615  if ((ret = StrMpl_getVal(&buff, &params->len, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1616  {
1617  return ret;
1618  }
1619 
1620  params->data = malloc(params->len);
1621  if (params->data == NULL)
1622  {
1623  return -1;
1624  }
1625  return ret;
1626 }
1627 
1638 int32_t ATCmdSock_recvResult(void *args, int32_t num, char *buff)
1639 {
1640  ATCmdSock_tcp_t *params = (ATCmdSock_tcp_t *)args;
1641  uint32_t outputLen;
1642 
1643  StrMpl_setStr(ATCmd_sockRecvStr,&buff,ATCMD_DELIM_EVENT);
1644  /* sd */
1645  StrMpl_setVal(&params->sd, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 |STRMPL_FLAG_PARAM_SIGNED|STRMPL_FLAG_PARAM_DEC);
1646 
1647  /* format */
1648  StrMpl_setVal(&params->format, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
1649 
1650  /* length */
1651  outputLen = params->len;
1652  if (params->format == ATCMD_DATA_FORMAT_BASE64)
1653  {
1654  /* convert length from binary to base64 */
1655  outputLen = StrMpl_getBase64EncBufSize(params->len);
1656  }
1657  StrMpl_setVal(&outputLen, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
1658  /* data */
1659  if (params->format == ATCMD_DATA_FORMAT_BASE64)
1660  {
1661  /* convert data to base64 */
1662  StrMpl_encodeBase64(params->data, params->len, (uint8_t *)buff, &outputLen);
1663  }
1664  else
1665  {
1666  memcpy(buff,params->data,params->len);
1667  }
1668  ATCmdSock_recvFree(params);
1669 
1670  return 0;
1671 }
1672 
1684 int32_t ATCmdSock_recvCallback(void *arg)
1685 {
1686  int32_t ret = 0;
1687  ATCmdSock_tcp_t *params;
1688 
1689  params = malloc(sizeof(ATCmdSock_tcp_t));
1690 
1691  if (params == NULL)
1692  {
1693  ATCmd_errorResult(ATCmd_errorAllocStr,0);
1694  return -1;
1695  }
1696 
1697  memset(params, 0x0, sizeof(ATCmdSock_tcp_t));
1698 
1699  /* Call the command parser */
1700  ret = ATCmdSock_recvParse((char *)arg, params);
1701 
1702  if (ret < 0)
1703  {
1704  ATCmd_errorResult(ATCmd_errorParseStr,ret);
1705  ATCmdSock_recvFree(params);
1706  return -1;
1707  }
1708 
1709  /* return command complete for blocked command */
1710  ATCmd_okResult();
1711 
1712  /* recv */
1713  params->len = sl_Recv(params->sd, params->data, params->len, params->flags);
1714 
1715  if (params->len < 0)
1716  {
1717  ATCmd_errorResult(ATCmd_errorCmdStr,params->len);
1718  ATCmdSock_recvFree(params);
1719  }
1720  else
1721  {
1722  ATCmd_commandResult(ATCmdSock_recvResult,params,0);
1723  ATCmd_okResult();
1724  }
1725 
1726  return ret;
1727 }
1728 
1737 int32_t ATCmdSock_sendToFree(ATCmdSock_udp_t *params)
1738 {
1739  if (params->data != NULL)
1740  {
1741  free(params->data);
1742  }
1743  return 0;
1744 }
1745 
1756 int32_t ATCmdSock_sendToParse(char *buff, ATCmdSock_udp_t *params)
1757 {
1758  int32_t ret = 0;
1759  uint16_t outputLen;
1760 
1761  /* parse the sd and the addr */
1762  if ((ret = ATCmdSock_parse(&buff, &params->target,ATCMD_DELIM_ARG)) < 0)
1763  {
1764  return ret;
1765  }
1766 
1767  /* data format */
1768  if ((ret = StrMpl_getVal(&buff, &params->format , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
1769  {
1770  return ret;
1771  }
1772 
1773  /* data length */
1774  if ((ret = StrMpl_getVal(&buff, &params->len, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16)) < 0)
1775  {
1776  return ret;
1777  }
1778  /* data */
1779  if (params->format == ATCMD_DATA_FORMAT_BASE64)
1780  {
1781  /* convert length to binary length */
1782  outputLen = StrMpl_getBase64DecBufSize((uint8_t *)buff,params->len);
1783  params->data = malloc(outputLen);
1784  if (params->data == NULL)
1785  {
1786  return -1;
1787  }
1788  if (StrMpl_decodeBase64((uint8_t *)buff, params->len, params->data, (uint32_t *)&outputLen) < 0)
1789  {
1790  return -1;
1791  }
1792  params->len = outputLen;
1793  }
1794  else
1795  {
1796  params->data = malloc(params->len);
1797  if (params->data == NULL)
1798  {
1799  return -1;
1800  }
1801 
1802  memcpy(params->data, buff, params->len);
1803  }
1804 
1805  return ret;
1806 }
1807 
1808 
1820 int32_t ATCmdSock_sendToCallback(void *arg)
1821 {
1822  int32_t ret = 0;
1823  ATCmdSock_udp_t params;
1824 
1825  memset(&params, 0x0, sizeof(ATCmdSock_udp_t));
1826 
1827  /* Call the command parser */
1828  ret = ATCmdSock_sendToParse((char *)arg, &params);
1829 
1830  if (ret < 0)
1831  {
1832  ATCmd_errorResult(ATCmd_errorParseStr,ret);
1833  ATCmdSock_sendToFree(&params);
1834  return -1;
1835  }
1836 
1837  /* send */
1838  ret = sl_SendTo(params.target.sd, params.data, params.len, params.flags,&params.target.addr,params.target.addrlen);
1839 
1840  if (ret < 0)
1841  {
1842  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
1843  }
1844  else
1845  {
1846  ATCmd_okResult();
1847  }
1848 
1849  ATCmdSock_sendToFree(&params);
1850  return ret;
1851 }
1852 
1861 int32_t ATCmdSock_recvFromFree(ATCmdSock_udp_t *params)
1862 {
1863  if (params != NULL)
1864  {
1865  if (params->data != NULL)
1866  {
1867  free(params->data);
1868  }
1869  free(params);
1870  }
1871  return 0;
1872 }
1873 
1884 int32_t ATCmdSock_recvFromParse(char *buff, ATCmdSock_udp_t *params)
1885 {
1886  int32_t ret = 0;
1887 
1888  /* parse the sd and the addr */
1889  if ((ret = ATCmdSock_parse(&buff, &params->target,ATCMD_DELIM_ARG)) < 0)
1890  {
1891  return ret;
1892  }
1893 
1894  /* data format */
1895  if ((ret = StrMpl_getVal(&buff, &params->format , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
1896  {
1897  return ret;
1898  }
1899 
1900  /* data length */
1901  if ((ret = StrMpl_getVal(&buff, &params->len, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1902  {
1903  return ret;
1904  }
1905 
1906  params->data = malloc(params->len);
1907  if (params->data == NULL)
1908  {
1909  return -1;
1910  }
1911  return ret;
1912 }
1913 
1924 int32_t ATCmdSock_recvFromResult(void *args, int32_t num, char *buff)
1925 {
1926  ATCmdSock_udp_t *params = (ATCmdSock_udp_t *)args;
1927  uint32_t outputLen;
1928 
1929  StrMpl_setStr(ATCmd_sockRecvFromStr,&buff,ATCMD_DELIM_EVENT);
1930 
1931  /* sd */
1932  StrMpl_setVal(&params->target.sd, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 |STRMPL_FLAG_PARAM_SIGNED|STRMPL_FLAG_PARAM_DEC);
1933 
1934  /* format */
1935  StrMpl_setVal(&params->format, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
1936 
1937  /* length */
1938  outputLen = params->len;
1939  if (params->format == ATCMD_DATA_FORMAT_BASE64)
1940  {
1941  /* convert length from binary to base64 */
1942  outputLen = StrMpl_getBase64EncBufSize(params->len);
1943  }
1944  StrMpl_setVal(&outputLen, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
1945 
1946  /* data */
1947  if (params->format == ATCMD_DATA_FORMAT_BASE64)
1948  {
1949  /* convert data to base64 */
1950  StrMpl_encodeBase64(params->data, params->len, (uint8_t *)buff, &outputLen);
1951  }
1952  else
1953  {
1954  memcpy(buff,params->data,params->len);
1955  }
1956  ATCmdSock_recvFromFree(params);
1957 
1958  return 0;
1959 }
1960 
1972 int32_t ATCmdSock_recvFromCallback(void *arg)
1973 {
1974  int32_t ret = 0;
1975  ATCmdSock_udp_t *params;
1976 
1977  params = malloc(sizeof(ATCmdSock_udp_t));
1978 
1979  if (params == NULL)
1980  {
1981  ATCmd_errorResult(ATCmd_errorAllocStr,0);
1982  return -1;
1983  }
1984 
1985  memset(params, 0x0, sizeof(ATCmdSock_udp_t));
1986 
1987  /* Call the command parser */
1988  ret = ATCmdSock_recvFromParse((char *)arg, params);
1989 
1990  if (ret < 0)
1991  {
1992  ATCmd_errorResult(ATCmd_errorParseStr,ret);
1993  ATCmdSock_recvFromFree(params);
1994  return -1;
1995  }
1996 
1997  /* return command complete for blocked command */
1998  ATCmd_okResult();
1999 
2000  /* recv from */
2001  params->len = sl_RecvFrom(params->target.sd, params->data, params->len, params->flags,&params->target.addr,&params->target.addrlen);
2002 
2003  if (params->len < 0)
2004  {
2005  ATCmd_errorResult(ATCmd_errorCmdStr,params->len);
2006  ATCmdSock_recvFromFree(params);
2007  }
2008  else
2009  {
2010  ATCmd_commandResult(ATCmdSock_recvFromResult,params,0);
2011  ATCmd_okResult();
2012  }
2013 
2014  return ret;
2015 }
2016 
2017 
int32_t ATCmdSock_closeCallback(void *arg)
Sock Close callback.
Definition: atcmd_socket.c:257
int32_t ATCmdSock_bindCallback(void *arg)
Sock Bind callback.
Definition: atcmd_socket.c:537
int32_t ATCmdSock_recvFromCallback(void *arg)
Sock RecvFrom callback.
int32_t ATCmdSock_sendCallback(void *arg)
Sock Send callback.
int32_t ATCmdSock_sendToCallback(void *arg)
Sock SendTo callback.
int32_t ATCmdSock_listenCallback(void *arg)
Sock Listen callback.
Definition: atcmd_socket.c:609
int32_t ATCmdSock_setSockOptCallback(void *arg)
Sock SetSockOpt callback.
int32_t ATCmdSock_acceptCallback(void *arg)
Sock Accept callback.
Definition: atcmd_socket.c:406
int32_t ATCmdSock_connectCallback(void *arg)
Sock Connect callback.
Definition: atcmd_socket.c:714
int32_t ATCmdSock_getSockOptCallback(void *arg)
Sock GetSockOpt callback.
int32_t ATCmdSock_recvCallback(void *arg)
Sock Recv callback.
int32_t ATCmdSock_selectCallback(void *arg)
Sock Select callback.
Definition: atcmd_socket.c:848
int32_t ATCmdSock_socketCallback(void *arg)
Sock Socket callback.
Definition: atcmd_socket.c:193