SimpleLink CC31xx/CC32xx Host Driver  Version 3.0.1.71
Simplifies the implementation of Internet connectivity
slnetifwifi.c
1 /*
2  * Copyright (c) 2017, 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 /*****************************************************************************/
35 /* Include files */
36 /*****************************************************************************/
37 
38 #include <ti/drivers/net/wifi/slnetifwifi.h>
39 #include <ti/drivers/net/wifi/slwificonn.h>
40 
41 /*****************************************************************************/
42 /* Macro declarations */
43 /*****************************************************************************/
44 
45 /* Macro which split the 8bit security flags from the input flags */
46 #define SPLIT_SEC_AND_INPUT_FLAGS(inputFlags, secFlags) (secFlags = inputFlags >> 24)
47 
48 /* Disable the 8bit security flags */
49 #define SECURITY_FLAGS_IN_32BIT_REPRESENTATION (0xFF000000)
50 #define DISABLE_SEC_BITS_FROM_INPUT_FLAGS(inputFlags) (inputFlags &= ~SECURITY_FLAGS_IN_32BIT_REPRESENTATION)
51 
52 
53 /*****************************************************************************/
54 /* Structure/Enum declarations */
55 /*****************************************************************************/
56 
57 /*****************************************************************************/
58 /* Global declarations */
59 /*****************************************************************************/
60 
61 /* gCB is a pointer for callback function */
62 uint16_t gIfID;
68 SlNetIf_Config_t SlNetIfConfigWifi =
69 {
70  slNetIfWifi_connEnable, // Callback function connEnable in slnetif module
71  slNetIfWifi_connDisable, // Callback function connDisable in slnetif module
72  SlNetIfWifi_socket, // Callback function sockCreate in slnetif module
73  SlNetIfWifi_close, // Callback function sockClose in slnetif module
74  NULL, // Callback function sockShutdown in slnetif module
75  SlNetIfWifi_accept, // Callback function sockAccept in slnetif module
76  SlNetIfWifi_bind, // Callback function sockBind in slnetif module
77  SlNetIfWifi_listen, // Callback function sockListen in slnetif module
78  SlNetIfWifi_connect, // Callback function sockConnect in slnetif module
79  NULL, // Callback function sockGetPeerName in slnetif module
80  NULL, // Callback function sockGetLocalName in slnetif module
81  SlNetIfWifi_select, // Callback function sockSelect in slnetif module
82  SlNetIfWifi_setSockOpt, // Callback function sockSetOpt in slnetif module
83  SlNetIfWifi_getSockOpt, // Callback function sockGetOpt in slnetif module
84  SlNetIfWifi_recv, // Callback function sockRecv in slnetif module
85  SlNetIfWifi_recvFrom, // Callback function sockRecvFrom in slnetif module
86  SlNetIfWifi_send, // Callback function sockSend in slnetif module
87  SlNetIfWifi_sendTo, // Callback function sockSendTo in slnetif module
88  SlNetIfWifi_sockstartSec, // Callback function sockstartSec in slnetif module
89  SlNetIfWifi_getHostByName, // Callback function utilGetHostByName in slnetif module
90  SlNetIfWifi_ping, // Callback function utilPing in slnetif module
91  SlNetIfWifi_getIPAddr, // Callback function ifGetIPAddr in slnetif module
92  SlNetIfWifi_getConnectionStatus, // Callback function ifGetConnectionStatus in slnetif module
93  SlNetIfWifi_loadSecObj, // Callback function ifLoadSecObj in slnetif module
94  SlNetIfWifi_CreateContext, // Callback function ifCreateContext in slnetif module
95  SlNetIfWifi_DeleteContext, // Callback function ifDeleteContext in slnetif module
96 };
97 
98 static const int16_t StartSecOptName[10] =
99 {
100  SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME,
101  SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME,
102  SL_SO_SECURE_FILES_CA_FILE_NAME,
103  SL_SO_SECURE_FILES_PEER_CERT_OR_DH_KEY_FILE_NAME,
104  SL_SO_SECMETHOD,
105  SL_SO_SECURE_MASK,
106  SL_SO_SECURE_ALPN,
107  SL_SO_SECURE_EXT_CLIENT_CHLNG_RESP,
108  SL_SO_SECURE_DOMAIN_NAME_VERIFICATION,
109  SL_SO_SECURE_DISABLE_CERTIFICATE_STORE
110 };
111 
112 static const int16_t socketType[8] =
113 {
114  SL_SOCK_STREAM,
115  SL_SOCK_DGRAM,
116  SL_SOCK_RAW,
117  SLNETSOCK_SOCK_RX_MTR,
118  SL_SOCK_DGRAM,
119  SL_SOCK_RAW,
120  SLNETSOCK_SOCK_BRIDGE,
121  SLNETSOCK_SOCK_ROUTER,
122 };
123 
124 /*****************************************************************************/
125 /* Function prototypes */
126 /*****************************************************************************/
127 
128 //*****************************************************************************
129 //
130 // slNetIfWifi_createConnect - Create wifi connection
131 //
132 //*****************************************************************************
133 int32_t slNetIfWifi_connEnable(void *ifContext)
134 {
135  int retVal;
136 
137  retVal = SlWifiConn_enable();
138 
139  return retVal;
140 }
141 
142 //*****************************************************************************
143 //
144 // slNetIfWifi_disconnect - Gracefully disconnect
145 //
146 //*****************************************************************************
147 int16_t slNetIfWifi_connDisable(void *ifContext)
148 {
149  int retVal;
150 
151  retVal = SlWifiConn_disable();
152 
153  return retVal;
154 }
155 
156 //*****************************************************************************
157 //
158 // SlNetIfWifi_socket - Create an endpoint for communication
159 //
160 //*****************************************************************************
161 int16_t SlNetIfWifi_socket(void *ifContext, int16_t Domain, int16_t Type, int16_t Protocol, void **sdContext)
162 {
163  /* Create socket and return the return value of the function */
164  int16_t mappedSocketType = socketType[Type - 1];
165  return (sl_Socket(Domain, mappedSocketType, Protocol));
166 }
167 
168 
169 //*****************************************************************************
170 //
171 // SlNetIfWifi_close - Gracefully close socket
172 //
173 //*****************************************************************************
174 int32_t SlNetIfWifi_close(int16_t sd, void *sdContext)
175 {
176  /* Close socket and return the return value of the function */
177  return sl_Close(sd);
178 }
179 
180 
181 //*****************************************************************************
182 //
183 // SlNetIfWifi_accept - Accept a connection on a socket
184 //
185 //*****************************************************************************
186 int16_t SlNetIfWifi_accept(int16_t sd, void *sdContext, SlNetSock_Addr_t *addr, SlNetSocklen_t *addrlen, uint8_t flags, void **acceptedSdContext)
187 {
188  return sl_Accept(sd, (SlSockAddr_t *)addr, addrlen);
189 }
190 
191 
192 //*****************************************************************************
193 //
194 // SlNetIfWifi_bind - Assign a name to a socket
195 //
196 //*****************************************************************************
197 int32_t SlNetIfWifi_bind(int16_t sd, void *sdContext, const SlNetSock_Addr_t *addr, int16_t addrlen)
198 {
199  return sl_Bind(sd, (const SlSockAddr_t *)addr, addrlen);
200 }
201 
202 
203 //*****************************************************************************
204 //
205 // SlNetIfWifi_listen - Listen for connections on a socket
206 //
207 //*****************************************************************************
208 int32_t SlNetIfWifi_listen(int16_t sd, void *sdContext, int16_t backlog)
209 {
210  return sl_Listen(sd, backlog);
211 }
212 
213 
214 //*****************************************************************************
215 //
216 // SlNetIfWifi_connect - Initiate a connection on a socket
217 //
218 //*****************************************************************************
219 int32_t SlNetIfWifi_connect(int16_t sd, void *sdContext, const SlNetSock_Addr_t *addr, SlNetSocklen_t addrlen, uint8_t flags)
220 {
221  return sl_Connect(sd, (const SlSockAddr_t *)addr, addrlen);
222 }
223 
224 
225 //*****************************************************************************
226 //
227 // SlNetIfWifi_getSockName - Returns the local address info of the socket
228 // descriptor
229 //
230 //*****************************************************************************
231 int32_t SlNetIfWifi_getSockName(int16_t sd, void *sdContext, SlNetSock_Addr_t *addr, SlNetSocklen_t *addrlen)
232 {
233 // Not implemented in NWP
234  return SLNETERR_INVALPARAM;
235 }
236 
237 
238 //*****************************************************************************
239 //
240 // SlNetIfWifi_select - Monitor socket activity
241 //
242 //*****************************************************************************
243 int32_t SlNetIfWifi_select(void *ifContext, int16_t nfds, SlNetSock_SdSet_t *readsds, SlNetSock_SdSet_t *writesds, SlNetSock_SdSet_t *exceptsds, SlNetSock_Timeval_t *timeout)
244 {
245  SlNetSock_Timeval_t *slNetSockTimeVal;
246  SlTimeval_t tv;
247  /* Translate from SlNetSock_Timeval_t into SlTimeval_t */
248  slNetSockTimeVal = (SlNetSock_Timeval_t *)timeout;
249  tv.tv_sec = slNetSockTimeVal->tv_sec;
250  tv.tv_usec = slNetSockTimeVal->tv_usec;
251  return sl_Select(nfds, (SlFdSet_t *)readsds, (SlFdSet_t *)writesds, (SlFdSet_t *)exceptsds, &tv);
252 }
253 
254 
255 //*****************************************************************************
256 //
257 // SlNetIfWifi_setSockOpt - Set socket options
258 //
259 //*****************************************************************************
260 int32_t SlNetIfWifi_setSockOpt(int16_t sd, void *sdContext, int16_t level, int16_t optname, void *optval, SlNetSocklen_t optlen)
261 {
262  SlNetSock_Timeval_t *slNetSockTimeVal;
263  SlTimeval_t tv;
264 
265  switch (level)
266  {
267  case SLNETSOCK_LVL_SOCKET:
268  {
269  switch (optname)
270  {
271  case SLNETSOCK_OPSOCK_RCV_TIMEO:
272  {
273  /* Translate from SlNetSock_Timeval_t into SlTimeval_t */
274  slNetSockTimeVal = (SlNetSock_Timeval_t *)optval;
275  tv.tv_sec = slNetSockTimeVal->tv_sec;
276  tv.tv_usec = slNetSockTimeVal->tv_usec;
277  optval = (void *)&tv;
278  optlen = sizeof(SlTimeval_t);
279  break;
280  }
281  default:
282  /* Pass values into sl_SetSockOpt directly */
283  break;
284  }
285  break;
286  }
287  default:
288  /* Pass values into sl_SetSockOpt directly */
289  break;
290  }
291 
292  return sl_SetSockOpt(sd, level, optname, optval, optlen);
293 }
294 
295 
296 //*****************************************************************************
297 //
298 // SlNetIfWifi_getSockOpt - Get socket options
299 //
300 //*****************************************************************************
301 int32_t SlNetIfWifi_getSockOpt(int16_t sd, void *sdContext, int16_t level, int16_t optname, void *optval, SlNetSocklen_t *optlen)
302 {
303  SlSocklen_t len;
304  int32_t status = 0;
305  SlNetSock_Timeval_t *slNetSockTimeVal;
306  SlTimeval_t tv;
307 
308  switch (level)
309  {
310  case SLNETSOCK_LVL_SOCKET:
311  {
312  switch (optname)
313  {
314  case SLNETSOCK_OPSOCK_RCV_TIMEO:
315  {
316  if (*optlen < sizeof(SlNetSock_Timeval_t))
317  {
318  return (SLNETERR_RET_CODE_INVALID_INPUT);
319  }
320  len = sizeof(SlTimeval_t);
321  status =
322  sl_GetSockOpt(sd, level, optname, (void *)&tv, &len);
323 
324  slNetSockTimeVal = (SlNetSock_Timeval_t *)optval;
325  slNetSockTimeVal->tv_sec = tv.tv_sec;
326  slNetSockTimeVal->tv_usec = tv.tv_usec;
327  *optlen = sizeof(SlNetSock_Timeval_t);
328  break;
329  }
330 
331  default:
332  {
333  /* Pass values into sl_SetSockOpt directly */
334  status = sl_GetSockOpt(sd, level, optname, optval, optlen);
335  break;
336  }
337 
338  }
339  break;
340  }
341  default:
342  {
343  /* Pass values into sl_SetSockOpt directly */
344  status = sl_GetSockOpt(sd, level, optname, optval, optlen);
345  break;
346  }
347  }
348 
349  return (status);
350 }
351 
352 
353 //*****************************************************************************
354 //
355 // SlNetIfWifi_recv - Read data from TCP socket
356 //
357 //*****************************************************************************
358 int32_t SlNetIfWifi_recv(int16_t sd, void *sdContext, void *buf, uint32_t len, uint32_t flags)
359 {
360  DISABLE_SEC_BITS_FROM_INPUT_FLAGS(flags);
361  return sl_Recv(sd, buf, len, flags);
362 }
363 
364 
365 //*****************************************************************************
366 //
367 // SlNetIfWifi_recvFrom - Read data from socket
368 //
369 //*****************************************************************************
370 int32_t SlNetIfWifi_recvFrom(int16_t sd, void *sdContext, void *buf, uint32_t len, uint32_t flags, SlNetSock_Addr_t *from, SlNetSocklen_t *fromlen)
371 {
372  DISABLE_SEC_BITS_FROM_INPUT_FLAGS(flags);
373  return sl_RecvFrom(sd, buf, len, flags, (SlSockAddr_t *)from, fromlen);
374 }
375 
376 
377 //*****************************************************************************
378 //
379 // SlNetIfWifi_send - Write data to TCP socket
380 //
381 //*****************************************************************************
382 int32_t SlNetIfWifi_send(int16_t sd, void *sdContext, const void *buf, uint32_t len, uint32_t flags)
383 {
384  DISABLE_SEC_BITS_FROM_INPUT_FLAGS(flags);
385  return sl_Send(sd, buf, len, flags);
386 }
387 
388 
389 //*****************************************************************************
390 //
391 // SlNetIfWifi_sendTo - Write data to socket
392 //
393 //*****************************************************************************
394 int32_t SlNetIfWifi_sendTo(int16_t sd, void *sdContext, const void *buf, uint32_t len, uint32_t flags, const SlNetSock_Addr_t *to, SlNetSocklen_t tolen)
395 {
396  DISABLE_SEC_BITS_FROM_INPUT_FLAGS(flags);
397  return sl_SendTo(sd, buf, len, flags, (const SlSockAddr_t *)to, tolen);
398 }
399 
400 
401 //*****************************************************************************
402 //
403 // SlNetIfWifi_sockstartSec - Start a security session on an opened socket
404 //
405 //*****************************************************************************
406 int32_t SlNetIfWifi_sockstartSec(int16_t sd, void *sdContext, SlNetSockSecAttrib_t *secAttrib, uint8_t flags)
407 {
408  SlNetSock_SecAttribNode_t *tempSecAttrib = *secAttrib;
409  int32_t retVal = SLNETERR_RET_CODE_OK;
410 
411  if ( 0 != (flags & SLNETSOCK_SEC_BIND_CONTEXT_ONLY) )
412  {
413  /* run over all attributes and set them */
414  while (NULL != tempSecAttrib)
415  {
416  if ( tempSecAttrib->attribName <= SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE)
417  {
418  retVal = sl_SetSockOpt(sd, SL_SOL_SOCKET, StartSecOptName[tempSecAttrib->attribName], tempSecAttrib->attribBuff, tempSecAttrib->attribBuffLen);
419  }
420  else
421  {
422  return SLNETERR_RET_CODE_INVALID_INPUT;
423  }
424  tempSecAttrib = tempSecAttrib->next;
425  }
426  }
427 
428  if ( 0 != (flags & SLNETSOCK_SEC_START_SECURITY_SESSION_ONLY) )
429  {
430  /* Start TLS session */
431  retVal = sl_StartTLS(sd);
432  }
433 
434  return retVal;
435 }
436 
437 
438 //*****************************************************************************
439 //
440 // SlNetIfWifi_getHostByName - Obtain the IP Address of machine on network, by
441 // machine name
442 //
443 //*****************************************************************************
444 int32_t SlNetIfWifi_getHostByName(void *ifContext, char *name, const uint16_t nameLen, uint32_t *ipAddr, uint16_t *ipAddrLen, const uint8_t family)
445 {
446  int32_t retVal = SLNETERR_RET_CODE_OK;
447 
448  /* sl_NetAppDnsGetHostByName can receive only one ipAddr variable, so
449  only the first slot of the array will be used and the ipAddrLen will
450  be updated to 1 when function is successfully */
451  retVal = sl_NetAppDnsGetHostByName((signed char *)name, nameLen, (_u32 *)ipAddr, family);
452 
453  if (retVal == SLNETERR_RET_CODE_OK)
454  {
455  *ipAddrLen = 1;
456  }
457 
458  return retVal;
459 
460 }
461 
462 //*****************************************************************************
463 //
464 // SlNetIfWifi_ping - perform a ping request and check its response
465 //
466 //*****************************************************************************
467 uint32_t SlNetIfWifi_ping(void *ifContext, const SlNetSock_Addr_t *addr, SlNetSocklen_t addrLen, uint32_t attempts, uint16_t timeout, uint16_t interval, uint16_t packetSize, int16_t flags)
468 {
469  int32_t retVal;
470  SlNetAppPingReport_t report;
471  SlNetAppPingCommand_t pingCommand;
472 
473  if(addr->sa_family == SLNETSOCK_AF_INET)
474  {
475  /* destination IP of gateway */
476  pingCommand.Ip = ((SlNetSock_AddrIn_t*)addr)->sin_addr.s_addr;
477  }
478  else if(addr->sa_family == SLNETSOCK_AF_INET6)
479  {
480  /* destination IP of gateway */
481  *((SlNetSock_In6Addr_t*)&pingCommand.Ip) = ((SlNetSock_AddrIn6_t*)addr)->sin6_addr;
482  }
483 
484  /* size of ping, in bytes */
485  pingCommand.PingSize = packetSize;
486 
487  /* delay between pings, in milliseconds */
488  pingCommand.PingIntervalTime = interval;
489 
490  /* timeout for every ping in milliseconds */
491  pingCommand.PingRequestTimeout = timeout;
492 
493  /* max number of ping requests. 0 - forever */
494  pingCommand.TotalNumberOfAttempts = attempts;
495 
496  /* report only when finished */
497  pingCommand.Flags = 0;
498 
499  /* Ping Gateway */
500  retVal = sl_NetAppPing( &pingCommand, addr->sa_family, &report, NULL );
501 
502  if(retVal == 0)
503  {
504  return report.PacketsReceived;
505  }
506  else
507  return 0;
508 }
509 
510 //*****************************************************************************
511 //
512 // matchModeByRole - Service function used by SlNetIfWifi_getIPAddr for matching SlNetIfAddressType_e to SlNetCfg_e
513 //
514 //*****************************************************************************
515 int32_t matchModeByRole(SlNetIfAddressType_e addrType,
516  SlNetCfg_e *newAddrType ,
517  uint16_t *ipAddrLen )
518 {
519  SlWlanConnStatusParam_t WlanConnectInfo;
520  uint16_t Len;
521  int32_t retVal = SLNETERR_RET_CODE_OK;
522 
523  switch(addrType)
524  {
525 
526  case SLNETIF_IPV6_ADDR_LOCAL:
527  *newAddrType = SL_NETCFG_IPV6_ADDR_LOCAL;
528  *ipAddrLen = sizeof(SlNetCfgIpV6Args_t);
529  retVal = SLNETERR_RET_CODE_OK;
530  break;
531 
532  case SLNETIF_IPV6_ADDR_GLOBAL:
533  *newAddrType = SL_NETCFG_IPV6_ADDR_GLOBAL;
534  *ipAddrLen = sizeof(SlNetCfgIpV6Args_t);
535  retVal = SLNETERR_RET_CODE_OK;
536  break;
537 
538  /* IPv4 or P2P (GO and CL) */
539  case SLNETIF_IPV4_ADDR:
540  Len = sizeof(SlWlanConnStatusParam_t);
541  *ipAddrLen = sizeof(SlNetCfgIpV4Args_t);
542  retVal = sl_WlanGet(SL_WLAN_CONNECTION_INFO, NULL , &Len, (uint8_t*)&WlanConnectInfo);
543  if(retVal != SLNETERR_RET_CODE_OK)
544  {
545  return retVal;
546  }
547  if(WlanConnectInfo.ConnStatus == SL_WLAN_CONNECTED_STA || WlanConnectInfo.ConnStatus == SL_WLAN_CONNECTED_P2PCL)
548  {
549  *newAddrType = SL_NETCFG_IPV4_STA_ADDR_MODE;
550  retVal = SLNETERR_RET_CODE_OK;
551  }
552  else if(WlanConnectInfo.ConnStatus == SL_WLAN_CONNECTED_P2PGO || WlanConnectInfo.ConnStatus == SL_WLAN_AP_CONNECTED_STATIONS)
553  {
554  *newAddrType = SL_NETCFG_IPV4_AP_ADDR_MODE;
555  retVal = SLNETERR_RET_CODE_OK;
556  }
557  else
558  {
559  retVal = SLNETERR_BSD_ENOTCONN;
560  }
561 
562  }
563  return retVal;
564 }
565 
566 
567 //*****************************************************************************
568 //
569 // SlNetIfWifi_getIPAddr - Get IP Address of specific interface
570 //
571 //*****************************************************************************
572 int32_t SlNetIfWifi_getIPAddr(void *ifContext, SlNetIfAddressType_e addrType, uint16_t *addrConfig, uint32_t *ipAddr)
573 {
574  int32_t retVal;
575  uint16_t ipAddrLen;
576  SlNetCfg_e newAddrType;
577 
578  /* Translate the addrType of SlNetSock type to addrType of SlNetSockIfWifi type */
579  retVal = matchModeByRole(addrType, &newAddrType, &ipAddrLen);
580  if(retVal == SLNETERR_RET_CODE_OK)
581  {
582  retVal = sl_NetCfgGet(newAddrType, addrConfig, &ipAddrLen, (unsigned char *)ipAddr);
583  }
584 
585  /*
586  * If the type is IPv4 we need to reorder the address as the Simplelink CC32xx device
587  * returns the address in host order
588  */
589  if(SLNETIF_IPV4_ADDR == addrType)
590  {
591  *ipAddr = SlNetUtil_htonl(*ipAddr);
592  }
593 
594  return retVal;
595 }
596 
597 
598 //*****************************************************************************
599 //
600 // SlNetIfWifi_getConnectionStatus - Get interface connection status
601 //
602 //*****************************************************************************
603 int32_t SlNetIfWifi_getConnectionStatus(void *ifContext)
604 {
605  SlWlanConnStatusParam_t connectionParams;
606  uint16_t Opt = 0;
607  int32_t retVal = 0;
608  uint16_t Size = 0;
609 
610  Size = sizeof(SlWlanConnStatusParam_t);
611  memset(&connectionParams, 0, Size);
612 
613  retVal = sl_WlanGet(SL_WLAN_CONNECTION_INFO, &Opt, &Size, (uint8_t *)&connectionParams);
614 
615  /* Check if the function returned an error */
616  if (retVal < SLNETERR_RET_CODE_OK)
617  {
618  /* Return error code */
619  return retVal;
620  }
621  return connectionParams.ConnStatus;
622 }
623 
624 
625 //*****************************************************************************
626 //
627 // SlNetIfWifi_loadSecObj - Load secured buffer to the network stack
628 //
629 //*****************************************************************************
630 int32_t SlNetIfWifi_loadSecObj(void *ifContext, uint16_t objType, char *objName, int16_t objNameLen, uint8_t *objBuff, int16_t objBuffLen)
631 {
632  int32_t retVal; /* negative retVal is an error */
633  uint16_t i;
634  uint32_t Offset = 0;
635  uint32_t MasterToken = 0;
636  int32_t OpenFlags = 0;
637  int32_t DeviceFileHandle = (-1);
638  uint16_t macAddressLen = SL_MAC_ADDR_LEN;
639  char *deviceFileName = objName;
640  uint8_t macAddress[SL_MAC_ADDR_LEN];
641 
642  /* Check if the inputs exists */
643  if ((NULL == objName) || (NULL == objBuff))
644  {
645  /* input not valid, return error code */
646  return SLNETERR_RET_CODE_INVALID_INPUT;
647  }
648  /* Print device MAC address */
649  retVal = sl_NetCfgGet(SL_NETCFG_MAC_ADDRESS_GET, 0, &macAddressLen, &macAddress[0]);
650 
651  /* Generating Random MasterPassword but constant per deviceFileName */
652  for (i = 0; i < strlen(deviceFileName); i++)
653  {
654  MasterToken = ((MasterToken << 8) ^ deviceFileName[i]);
655  }
656 
657  /* Create a file and write data. The file is secured, without
658  signature and with a fail safe commit, with vendor token which is
659  a XOR combination between the MAC address of the device and the
660  object file name */
661  OpenFlags = SL_FS_CREATE;
662  OpenFlags |= SL_FS_OVERWRITE;
663  OpenFlags |= SL_FS_CREATE_SECURE;
664  OpenFlags |= SL_FS_CREATE_VENDOR_TOKEN;
665  OpenFlags |= SL_FS_CREATE_NOSIGNATURE;
666  OpenFlags |= SL_FS_CREATE_FAILSAFE;
667 
668  /* Create a secure file if not exists and open it for write. */
669  DeviceFileHandle = sl_FsOpen((unsigned char *)deviceFileName, OpenFlags | SL_FS_CREATE_MAX_SIZE( objBuffLen ), (unsigned long *)&MasterToken);
670 
671  /* Check if file created successfully */
672  if ( DeviceFileHandle < SLNETERR_RET_CODE_OK )
673  {
674  return DeviceFileHandle;
675  }
676 
677  Offset = 0;
678  /* Write the buffer to the new file */
679  retVal = sl_FsWrite(DeviceFileHandle, Offset, (unsigned char *)objBuff, objBuffLen);
680 
681  /* Close the file */
682  retVal = sl_FsClose(DeviceFileHandle, NULL, NULL , 0);
683 
684  return retVal;
685 }
686 
687 
688 //*****************************************************************************
689 //
690 // SlNetIfWifi_CreateContext - Allocates and stores interface data,
691 // registers to wifi event handlers.
692 //
693 //*****************************************************************************
694 int32_t SlNetIfWifi_CreateContext (uint16_t ifID, const char *ifName, void **ifContext, SlNetIf_Event_t ifCallback)
695 {
696  int32_t retVal = 0;
697 
698  gIfID = ifID;
699  retVal = SlWifiConn_registerNetIFCallback(ifCallback, ifID);
700 
701  return (retVal);
702 }
703 
704 //*****************************************************************************
705 //
706 // slNetIfWifi_UnregisterEvent - free allocations,
707 // remove registration of wifi event handlers.
708 //
709 //*****************************************************************************
710 int32_t SlNetIfWifi_DeleteContext (uint16_t ifID, void **ifContext)
711 {
712  return (0);
713 }
714 
int32_t SlNetIfWifi_listen(int16_t sd, void *sdContext, int16_t backlog)
Listen for connections on a socket.
Definition: slnetifwifi.c:208
_i16 sl_Bind(_i16 sd, const SlSockAddr_t *addr, _i16 addrlen)
Assign a name to a socket.
Definition: sl_socket.c:237
int32_t SlNetIfWifi_getIPAddr(void *ifContext, SlNetIfAddressType_e addrType, uint16_t *addrConfig, uint32_t *ipAddr)
Get IP Address of specific interface.
Definition: slnetifwifi.c:572
_i16 sl_Select(_i16 nfds, SlFdSet_t *readsds, SlFdSet_t *writesds, SlFdSet_t *exceptsds, struct SlTimeval_t *timeout)
Monitor socket activity.
Definition: sl_socket.c:1762
int16_t slNetIfWifi_connDisable(void *ifContext)
Gracefully close connection.
Definition: slnetifwifi.c:147
_i16 sl_SetSockOpt(_i16 sd, _i16 level, _i16 optname, const void *optval, SlSocklen_t optlen)
Set socket options.
Definition: sl_socket.c:932
_i16 sl_WlanGet(const _u16 ConfigId, _u16 *pConfigOpt, _u16 *pConfigLen, _u8 *pValues)
Getting WLAN configurations.
Definition: wlan.c:1201
int32_t SlNetIfWifi_setSockOpt(int16_t sd, void *sdContext, int16_t level, int16_t optname, void *optval, SlNetSocklen_t optlen)
Set socket options-.
Definition: slnetifwifi.c:260
int16_t SlNetIfWifi_accept(int16_t sd, void *sdContext, SlNetSock_Addr_t *addr, SlNetSocklen_t *addrlen, uint8_t flags, void **acceptedSdContext)
Accept a connection on a socket.
Definition: slnetifwifi.c:186
_i32 sl_FsOpen(const _u8 *pFileName, const _u32 AccessModeAndMaxSize, _u32 *pToken)
open file for read or write from/to storage device
Definition: fs.c:157
int32_t slNetIfWifi_connEnable(void *ifContext)
Create and maintains a wifi connection to the local network.
Definition: slnetifwifi.c:133
int32_t SlNetIfWifi_recv(int16_t sd, void *sdContext, void *buf, uint32_t len, uint32_t flags)
Read data from TCP socket.
Definition: slnetifwifi.c:358
int32_t SlNetIfWifi_close(int16_t sd, void *sdContext)
Gracefully close socket.
Definition: slnetifwifi.c:174
int32_t SlNetIfWifi_bind(int16_t sd, void *sdContext, const SlNetSock_Addr_t *addr, int16_t addrlen)
Assign a name to a socket.
Definition: slnetifwifi.c:197
int32_t SlNetIfWifi_getConnectionStatus(void *ifContext)
Get interface connection status.
Definition: slnetifwifi.c:603
_i16 sl_FsClose(const _i32 FileHdl, const _u8 *pCeritificateFileName, const _u8 *pSignature, const _u32 SignatureLen)
Close file in storage device.
Definition: fs.c:250
SlNetIf_Config_t SlNetIfConfigWifi
Definition: slnetifwifi.c:68
_i16 sl_StartTLS(_i16 sd)
Initiate TLS connection on a socket.
Definition: sl_socket.c:1972
int32_t SlNetIfWifi_send(int16_t sd, void *sdContext, const void *buf, uint32_t len, uint32_t flags)
Write data to TCP socket.
Definition: slnetifwifi.c:382
int32_t SlNetIfWifi_DeleteContext(uint16_t ifID, void **ifContext)
Free allocations of interface data. Remove registration of interface event handlers.
Definition: slnetifwifi.c:710
uint32_t SlNetIfWifi_ping(void *ifContext, const SlNetSock_Addr_t *addr, SlNetSocklen_t addrLen, uint32_t attempts, uint16_t timeout, uint16_t interval, uint16_t packetSize, int16_t flags)
Performs a ping.
Definition: slnetifwifi.c:467
int16_t SlNetIfWifi_socket(void *ifContext, int16_t Domain, int16_t Type, int16_t Protocol, void **sdContext)
Create an endpoint for communication.
Definition: slnetifwifi.c:161
_i16 sl_Close(_i16 sd)
Gracefully close socket.
Definition: sl_socket.c:176
_i16 sl_Recv(_i16 sd, void *buf, _i16 len, _i16 flags)
Read data from TCP socket.
Definition: sl_socket.c:881
int32_t SlNetIfWifi_select(void *ifContext, int16_t nfds, SlNetSock_SdSet_t *readsds, SlNetSock_SdSet_t *writesds, SlNetSock_SdSet_t *exceptsds, SlNetSock_Timeval_t *timeout)
Monitor socket activity.
Definition: slnetifwifi.c:243
_i16 sl_GetSockOpt(_i16 sd, _i16 level, _i16 optname, void *optval, SlSocklen_t *optlen)
Get socket options.
Definition: sl_socket.c:975
_i16 sl_NetCfgGet(const _u16 ConfigId, _u16 *pConfigOpt, _u16 *pConfigLen, _u8 *pValues)
Getting network configurations.
Definition: netcfg.c:104
int32_t SlNetIfWifi_recvFrom(int16_t sd, void *sdContext, void *buf, uint32_t len, uint32_t flags, SlNetSock_Addr_t *from, SlNetSocklen_t *fromlen)
Read data from socket.
Definition: slnetifwifi.c:370
int32_t SlNetIfWifi_sockstartSec(int16_t sd, void *sdContext, SlNetSockSecAttrib_t *secAttrib, uint8_t flags)
Start a security session on an opened socket.
Definition: slnetifwifi.c:406
_i16 sl_NetAppDnsGetHostByName(_i8 *pHostName, const _u16 NameLen, _u32 *OutIpAddr, const _u8 Family)
Get host IP by name Obtain the IP Address of machine on network, by machine name. ...
Definition: netapp.c:849
_i16 sl_NetAppPing(const SlNetAppPingCommand_t *pPingParams, const _u8 Family, SlNetAppPingReport_t *pReport, const P_SL_DEV_PING_CALLBACK pPingCallback)
send ICMP ECHO_REQUEST to network hosts
Definition: netapp.c:1003
int32_t SlNetIfWifi_sendTo(int16_t sd, void *sdContext, const void *buf, uint32_t len, uint32_t flags, const SlNetSock_Addr_t *to, SlNetSocklen_t tolen)
Write data to socket.
Definition: slnetifwifi.c:394
int32_t SlNetIfWifi_connect(int16_t sd, void *sdContext, const SlNetSock_Addr_t *addr, SlNetSocklen_t addrlen, uint8_t flags)
Initiate a connection on a socket.
Definition: slnetifwifi.c:219
int32_t SlNetIfWifi_loadSecObj(void *ifContext, uint16_t objType, char *objName, int16_t objNameLen, uint8_t *objBuff, int16_t objBuffLen)
Load secured buffer to the network stack.
Definition: slnetifwifi.c:630
_i16 sl_Socket(_i16 Domain, _i16 Type, _i16 Protocol)
Create an endpoint for communication.
Definition: sl_socket.c:133
_i16 sl_RecvFrom(_i16 sd, void *buf, _i16 len, _i16 flags, SlSockAddr_t *from, SlSocklen_t *fromlen)
Read data from socket.
Definition: sl_socket.c:360
_i16 sl_Accept(_i16 sd, SlSockAddr_t *addr, SlSocklen_t *addrlen)
Accept a connection on a socket.
Definition: sl_socket.c:692
_i32 sl_FsWrite(const _i32 FileHdl, _u32 Offset, _u8 *pData, _u32 Len)
Write block of data to a file in storage device.
Definition: fs.c:379
int32_t SlNetIfWifi_getHostByName(void *ifContext, char *name, const uint16_t nameLen, uint32_t *ipAddr, uint16_t *ipAddrLen, const uint8_t family)
Get host IP by name Obtain the IP Address of machine on network, by machine name. ...
Definition: slnetifwifi.c:444
_i16 sl_Connect(_i16 sd, const SlSockAddr_t *addr, _i16 addrlen)
Initiate a connection on a socket.
Definition: sl_socket.c:449
int32_t SlNetIfWifi_getSockOpt(int16_t sd, void *sdContext, int16_t level, int16_t optname, void *optval, SlNetSocklen_t *optlen)
Get socket options.
Definition: slnetifwifi.c:301
_i16 sl_Listen(_i16 sd, _i16 backlog)
Listen for connections on a socket.
Definition: sl_socket.c:658
_i16 sl_SendTo(_i16 sd, const void *buf, _i16 len, _i16 flags, const SlSockAddr_t *to, SlSocklen_t tolen)
Write data to socket.
Definition: sl_socket.c:283
_i16 sl_Send(_i16 sd, const void *buf, _i16 len, _i16 flags)
Write data to TCP socket.
Definition: sl_socket.c:594
int32_t SlNetIfWifi_CreateContext(uint16_t ifID, const char *ifName, void **ifContext, SlNetIf_Event_t ifCallback)
Allocate and store interface data. Registers to interface event handlers.
Definition: slnetifwifi.c:694
int32_t SlNetIfWifi_getSockName(int16_t sd, void *sdContext, SlNetSock_Addr_t *addr, SlNetSocklen_t *addrlen)
Get local address info by socket descriptor Returns the local address info of the socket descriptor...
Definition: slnetifwifi.c:231