SimpleLink CC31xx/CC32xx Host Driver  Version 3.0.1.71
Simplifies the implementation of Internet connectivity
wlan.c
1 /*
2  * wlan.c - CC31xx/CC32xx Host Driver Implementation
3  *
4  * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
5  *
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in the
16  * documentation and/or other materials provided with the
17  * distribution.
18  *
19  * Neither the name of Texas Instruments Incorporated nor the names of
20  * its contributors may be used to endorse or promote products derived
21  * from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  *
35 */
36 
37 
38 /*****************************************************************************/
39 /* Include files */
40 /*****************************************************************************/
41 #include <ti/drivers/net/wifi/simplelink.h>
42 #include <ti/drivers/net/wifi/source/protocol.h>
43 #include <ti/drivers/net/wifi/source/driver.h>
44 
45 /*****************************************************************************/
46 /* Macro declarations */
47 /*****************************************************************************/
48 #define MAX_SSID_LEN (32)
49 #define MAX_KEY_LEN (64)
50 #define MAX_USER_LEN (64)
51 #define MAX_ANON_USER_LEN (64)
52 #define MAX_SMART_CONFIG_KEY (16)
53 
54 
55 /*****************************************************************************
56 sl_WlanConnect
57 *****************************************************************************/
58 typedef struct
59 {
61  _i8 Strings[SL_WLAN_SSID_MAX_LENGTH + MAX_KEY_LEN + MAX_USER_LEN + MAX_ANON_USER_LEN];
62 }_WlanConnectCmd_t;
63 
64 typedef union
65 {
66  _WlanConnectCmd_t Cmd;
67  _BasicResponse_t Rsp;
68 }_SlWlanConnectMsg_u;
69 
70 
71 #if _SL_INCLUDE_FUNC(sl_WlanConnect)
72 _i16 sl_WlanConnect(const _i8* pName,const _i16 NameLen,const _u8 *pMacAddr,const SlWlanSecParams_t* pSecParams ,const SlWlanSecParamsExt_t* pSecExtParams)
73 {
74  _SlWlanConnectMsg_u Msg;
75  _SlCmdCtrl_t CmdCtrl = {0,0,0};
76 
77  _SlDrvMemZero(&Msg, (_u16)sizeof(_SlWlanConnectMsg_u));
78 
79  /* verify that this api is allowed. if not allowed then
80  ignore the API execution and return immediately with an error */
81  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
82  CmdCtrl.TxDescLen = 0;/* init */
83  CmdCtrl.RxDescLen = (_SlArgSize_t)sizeof(_BasicResponse_t);
84 
85  /* verify SSID length */
86  VERIFY_PROTOCOL(NameLen >= 0 && NameLen <= SL_WLAN_SSID_MAX_LENGTH);
87  /* verify SSID is not NULL */
88  if( NULL == pName )
89  {
90  return SL_INVALPARAM;
91  }
92  /* update SSID length */
93  Msg.Cmd.Args.Common.SsidLen = (_u8)NameLen;
94 
95  /* Profile with no security */
96  /* Enterprise security profile */
97  if (NULL != pSecExtParams)
98  {
99  /* Update command opcode */
100  CmdCtrl.Opcode = SL_OPCODE_WLAN_WLANCONNECTEAPCOMMAND;
101  CmdCtrl.TxDescLen += sizeof(SlWlanConnectEapCommand_t);
102  /* copy SSID */
103  sl_Memcpy(EAP_SSID_STRING(&Msg), pName, NameLen);
104  CmdCtrl.TxDescLen += NameLen;
105  /* Copy password if supplied */
106  if ((NULL != pSecParams) && (pSecParams->KeyLen > 0))
107  {
108  /* update security type */
109  Msg.Cmd.Args.Common.SecType = pSecParams->Type;
110  /* verify key length */
111  if (pSecParams->KeyLen > MAX_KEY_LEN)
112  {
113  return SL_INVALPARAM;
114  }
115  /* update key length */
116  Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen;
117  ARG_CHECK_PTR(pSecParams->Key);
118  /* copy key */
119  sl_Memcpy(EAP_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen);
120  CmdCtrl.TxDescLen += pSecParams->KeyLen;
121  }
122  else
123  {
124  Msg.Cmd.Args.Common.PasswordLen = 0;
125  }
126 
127  ARG_CHECK_PTR(pSecExtParams);
128  /* Update Eap bitmask */
129  Msg.Cmd.Args.EapBitmask = pSecExtParams->EapMethod;
130  /* Update Certificate file ID index - currently not supported */
131  Msg.Cmd.Args.CertIndex = pSecExtParams->CertIndex;
132  /* verify user length */
133  if (pSecExtParams->UserLen > MAX_USER_LEN)
134  {
135  return SL_INVALPARAM;
136  }
137  Msg.Cmd.Args.UserLen = pSecExtParams->UserLen;
138  /* copy user name (identity) */
139  if(pSecExtParams->UserLen > 0)
140  {
141  sl_Memcpy(EAP_USER_STRING(&Msg), pSecExtParams->User, pSecExtParams->UserLen);
142  CmdCtrl.TxDescLen += pSecExtParams->UserLen;
143  }
144  /* verify Anonymous user length */
145  if (pSecExtParams->AnonUserLen > MAX_ANON_USER_LEN)
146  {
147  return SL_INVALPARAM;
148  }
149  Msg.Cmd.Args.AnonUserLen = pSecExtParams->AnonUserLen;
150  /* copy Anonymous user */
151  if(pSecExtParams->AnonUserLen > 0)
152  {
153  sl_Memcpy(EAP_ANON_USER_STRING(&Msg), pSecExtParams->AnonUser, pSecExtParams->AnonUserLen);
154  CmdCtrl.TxDescLen += pSecExtParams->AnonUserLen;
155  }
156 
157  }
158 
159  /* Regular or open security profile */
160  else
161  {
162  /* Update command opcode */
163  CmdCtrl.Opcode = SL_OPCODE_WLAN_WLANCONNECTCOMMAND;
164  CmdCtrl.TxDescLen += sizeof(SlWlanConnectCommon_t);
165  /* copy SSID */
166  sl_Memcpy(SSID_STRING(&Msg), pName, NameLen);
167  CmdCtrl.TxDescLen += NameLen;
168  /* Copy password if supplied */
169  if( NULL != pSecParams )
170  {
171  /* update security type */
172  Msg.Cmd.Args.Common.SecType = pSecParams->Type;
173  /* verify key length is valid */
174  if (pSecParams->KeyLen > MAX_KEY_LEN)
175  {
176  return SL_INVALPARAM;
177  }
178  /* update key length */
179  Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen;
180  CmdCtrl.TxDescLen += pSecParams->KeyLen;
181  /* copy key (could be no key in case of WPS pin) */
182  if( NULL != pSecParams->Key )
183  {
184  sl_Memcpy(PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen);
185  }
186  }
187  /* Profile with no security */
188  else
189  {
190  Msg.Cmd.Args.Common.PasswordLen = 0;
191  Msg.Cmd.Args.Common.SecType = SL_WLAN_SEC_TYPE_OPEN;
192  }
193  }
194  /* If BSSID is not null, copy to buffer, otherwise set to 0 */
195  if(NULL != pMacAddr)
196  {
197  sl_Memcpy(Msg.Cmd.Args.Common.Bssid, pMacAddr, sizeof(Msg.Cmd.Args.Common.Bssid));
198  }
199  else
200  {
201  _SlDrvMemZero(Msg.Cmd.Args.Common.Bssid, (_u16)sizeof(Msg.Cmd.Args.Common.Bssid));
202  }
203 
204  VERIFY_RET_OK ( _SlDrvCmdOp(&CmdCtrl, &Msg, NULL));
205 
206  return (_i16)Msg.Rsp.status;
207 }
208 #endif
209 
210 /*******************************************************************************/
211 /* sl_Disconnect */
212 /* ******************************************************************************/
213 #if _SL_INCLUDE_FUNC(sl_WlanDisconnect)
215 {
216  /* verify that this api is allowed. if not allowed then
217  ignore the API execution and return immediately with an error */
218  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
219 
220  return _SlDrvBasicCmd(SL_OPCODE_WLAN_WLANDISCONNECTCOMMAND);
221 }
222 #endif
223 
224 /******************************************************************************/
225 /* sl_PolicySet */
226 /******************************************************************************/
227 typedef union
228 {
230  _BasicResponse_t Rsp;
231 }_SlPolicyMsg_u;
232 
233 #if _SL_INCLUDE_FUNC(sl_WlanPolicySet)
234 
235 static const _SlCmdCtrl_t _SlPolicySetCmdCtrl =
236 {
237  SL_OPCODE_WLAN_POLICYSETCOMMAND,
238  (_SlArgSize_t)sizeof(SlWlanPolicySetGet_t),
239  (_SlArgSize_t)sizeof(_BasicResponse_t)
240 };
241 
242 _i16 sl_WlanPolicySet(const _u8 Type , const _u8 Policy, _u8 *pVal,const _u8 ValLen)
243 {
244  _SlPolicyMsg_u Msg;
245  _SlCmdExt_t CmdExt;
246 
247  /* verify that this api is allowed. if not allowed then
248  ignore the API execution and return immediately with an error */
249  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
250 
251  _SlDrvResetCmdExt(&CmdExt);
252  CmdExt.TxPayload1Len = ValLen;
253  CmdExt.pTxPayload1 = (_u8 *)pVal;
254 
255  Msg.Cmd.PolicyType = Type;
256  Msg.Cmd.PolicyOption = Policy;
257  Msg.Cmd.PolicyOptionLen = ValLen;
258 
259  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlPolicySetCmdCtrl, &Msg, &CmdExt));
260 
261  return (_i16)Msg.Rsp.status;
262 }
263 #endif
264 
265 
266 /******************************************************************************/
267 /* sl_PolicyGet */
268 /******************************************************************************/
269 typedef union
270 {
273 }_SlPolicyGetMsg_u;
274 
275 #if _SL_INCLUDE_FUNC(sl_WlanPolicyGet)
276 
277 static const _SlCmdCtrl_t _SlPolicyGetCmdCtrl =
278 {
279  SL_OPCODE_WLAN_POLICYGETCOMMAND,
280  (_SlArgSize_t)sizeof(SlWlanPolicySetGet_t),
281  (_SlArgSize_t)sizeof(SlWlanPolicySetGet_t)
282 };
283 
284 _i16 sl_WlanPolicyGet(const _u8 Type ,_u8 *pPolicy,_u8 *pVal,_u8 *pValLen)
285 {
286  _SlPolicyGetMsg_u Msg;
287  _SlCmdExt_t CmdExt;
288 
289  /* verify that this api is allowed. if not allowed then
290  ignore the API execution and return immediately with an error */
291  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
292 
293  if (*pValLen == 0)
294  {
295  return SL_EZEROLEN;
296  }
297 
298  _SlDrvResetCmdExt(&CmdExt);
299  CmdExt.RxPayloadLen = (_i16)(*pValLen);
300  CmdExt.pRxPayload = pVal;
301 
302  Msg.Cmd.PolicyType = Type;
303 
304  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlPolicyGetCmdCtrl, &Msg, &CmdExt));
305 
306 
307  if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen)
308  {
309  *pValLen = Msg.Rsp.PolicyOptionLen;
310  return SL_ESMALLBUF;
311  }
312  else
313  {
314  /* no pointer valus, fill the results into _i8 */
315  *pValLen = (_u8)CmdExt.ActualRxPayloadLen;
316  *pPolicy = Msg.Rsp.PolicyOption;
317 
318  if( 0 == CmdExt.ActualRxPayloadLen )
319  {
320  *pValLen = 1;
321  }
322 
323  }
324  return (_i16)SL_OS_RET_CODE_OK;
325 }
326 #endif
327 
328 
329 /*******************************************************************************/
330 /* sl_ProfileAdd */
331 /*******************************************************************************/
332 typedef struct
333 {
335  _i8 Strings[SL_WLAN_SSID_MAX_LENGTH + MAX_KEY_LEN + MAX_USER_LEN + MAX_ANON_USER_LEN];
336 }_SlProfileParams_t;
337 
338 typedef union
339 {
340  _SlProfileParams_t Cmd;
341  _BasicResponse_t Rsp;
342 }_SlProfileAddMsg_u;
343 
344 
345 #if _SL_INCLUDE_FUNC(sl_WlanProfileAdd)
346 _i16 sl_WlanProfileAdd(const _i8* pName,const _i16 NameLen,const _u8 *pMacAddr,const SlWlanSecParams_t* pSecParams ,const SlWlanSecParamsExt_t* pSecExtParams,const _u32 Priority,const _u32 Options)
347 {
348  _SlProfileAddMsg_u Msg;
349  _SlCmdCtrl_t CmdCtrl = {0,0,0};
350  CmdCtrl.TxDescLen = 0;/* init */
351  CmdCtrl.RxDescLen = (_SlArgSize_t)(sizeof(_BasicResponse_t));
352 
353 
354  /* Options parameter is currently not in use */
355  (void)Options;
356 
357  /* verify that this api is allowed. if not allowed then
358  ignore the API execution and return immediately with an error */
359  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
360 
361  _SlDrvMemZero(&Msg,sizeof(_SlProfileAddMsg_u));
362 
363  /* update priority */
364  Msg.Cmd.Args.Common.Priority = (_u8)Priority;
365  /* verify SSID is not NULL */
366  if( NULL == pName )
367  {
368  return SL_INVALPARAM;
369  }
370  /* verify SSID length */
371  VERIFY_PROTOCOL(NameLen >= 0 && NameLen <= SL_WLAN_SSID_MAX_LENGTH);
372  /* update SSID length */
373  Msg.Cmd.Args.Common.SsidLen = (_u8)NameLen;
374 
375  /* Enterprise security profile */
376  if (NULL != pSecExtParams)
377  {
378  /* Update command opcode */
379  CmdCtrl.Opcode = SL_OPCODE_WLAN_EAP_PROFILEADDCOMMAND;
380  CmdCtrl.TxDescLen += sizeof(SlWlanAddGetEapProfile_t);
381 
382  /* copy SSID */
383  sl_Memcpy(EAP_PROFILE_SSID_STRING(&Msg), pName, NameLen);
384  CmdCtrl.TxDescLen += NameLen;
385 
386  /* Copy password if supplied */
387  if ((NULL != pSecParams) && (pSecParams->KeyLen > 0))
388  {
389  /* update security type */
390  Msg.Cmd.Args.Common.SecType = (_i8)(pSecParams->Type);
391 
392  if( SL_WLAN_SEC_TYPE_WEP == Msg.Cmd.Args.Common.SecType )
393  {
394  Msg.Cmd.Args.Common.WepKeyId = 0;
395  }
396 
397  /* verify key length */
398  if (pSecParams->KeyLen > MAX_KEY_LEN)
399  {
400  return SL_INVALPARAM;
401  }
402  VERIFY_PROTOCOL(pSecParams->KeyLen <= MAX_KEY_LEN);
403  /* update key length */
404  Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen;
405  CmdCtrl.TxDescLen += pSecParams->KeyLen;
406  ARG_CHECK_PTR(pSecParams->Key);
407  /* copy key */
408  sl_Memcpy(EAP_PROFILE_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen);
409  }
410  else
411  {
412  Msg.Cmd.Args.Common.PasswordLen = 0;
413  }
414 
415  ARG_CHECK_PTR(pSecExtParams);
416  /* Update Eap bitmask */
417  Msg.Cmd.Args.EapBitmask = pSecExtParams->EapMethod;
418  /* Update Certificate file ID index - currently not supported */
419  Msg.Cmd.Args.CertIndex = pSecExtParams->CertIndex;
420  /* verify user length */
421  if (pSecExtParams->UserLen > MAX_USER_LEN)
422  {
423  return SL_INVALPARAM;
424  }
425  Msg.Cmd.Args.UserLen = pSecExtParams->UserLen;
426  /* copy user name (identity) */
427  if(pSecExtParams->UserLen > 0)
428  {
429  sl_Memcpy(EAP_PROFILE_USER_STRING(&Msg), pSecExtParams->User, pSecExtParams->UserLen);
430  CmdCtrl.TxDescLen += pSecExtParams->UserLen;
431  }
432 
433  /* verify Anonymous user length (for tunneled) */
434  if (pSecExtParams->AnonUserLen > MAX_ANON_USER_LEN)
435  {
436  return SL_INVALPARAM;
437  }
438  Msg.Cmd.Args.AnonUserLen = pSecExtParams->AnonUserLen;
439 
440  /* copy Anonymous user */
441  if(pSecExtParams->AnonUserLen > 0)
442  {
443  sl_Memcpy(EAP_PROFILE_ANON_USER_STRING(&Msg), pSecExtParams->AnonUser, pSecExtParams->AnonUserLen);
444  CmdCtrl.TxDescLen += pSecExtParams->AnonUserLen;
445  }
446 
447  }
448  /* Regular or open security profile */
449  else
450  {
451  /* Update command opcode */
452  CmdCtrl.Opcode = SL_OPCODE_WLAN_PROFILEADDCOMMAND;
453  /* update commnad length */
454  CmdCtrl.TxDescLen += sizeof(SlWlanAddGetProfile_t);
455 
456  if (NULL != pName)
457  {
458  /* copy SSID */
459  sl_Memcpy(PROFILE_SSID_STRING(&Msg), pName, NameLen);
460  CmdCtrl.TxDescLen += NameLen;
461  }
462 
463  /* Copy password if supplied */
464  if( NULL != pSecParams )
465  {
466  /* update security type */
467  Msg.Cmd.Args.Common.SecType = (_i8)(pSecParams->Type);
468 
469  if( SL_WLAN_SEC_TYPE_WEP == Msg.Cmd.Args.Common.SecType )
470  {
471  Msg.Cmd.Args.Common.WepKeyId = 0;
472  }
473 
474  /* verify key length */
475  if (pSecParams->KeyLen > MAX_KEY_LEN)
476  {
477  return SL_INVALPARAM;
478  }
479  /* update key length */
480  Msg.Cmd.Args.Common.PasswordLen = pSecParams->KeyLen;
481  CmdCtrl.TxDescLen += pSecParams->KeyLen;
482  /* copy key (could be no key in case of WPS pin) */
483  if( NULL != pSecParams->Key )
484  {
485  sl_Memcpy(PROFILE_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen);
486  }
487  }
488  else
489  {
490  Msg.Cmd.Args.Common.SecType = SL_WLAN_SEC_TYPE_OPEN;
491  Msg.Cmd.Args.Common.PasswordLen = 0;
492  }
493  }
494 
495  /* If BSSID is not null, copy to buffer, otherwise set to 0 */
496  if(NULL != pMacAddr)
497  {
498  sl_Memcpy(Msg.Cmd.Args.Common.Bssid, pMacAddr, sizeof(Msg.Cmd.Args.Common.Bssid));
499  }
500  else
501  {
502  _SlDrvMemZero(Msg.Cmd.Args.Common.Bssid, (_u16)sizeof(Msg.Cmd.Args.Common.Bssid));
503  }
504 
505  VERIFY_RET_OK(_SlDrvCmdOp(&CmdCtrl, &Msg, NULL));
506 
507  return (_i16)Msg.Rsp.status;
508 }
509 #endif
510 
511 
512 /*******************************************************************************/
513 /* sl_ProfileUpdate */
514 /*******************************************************************************/
515 
516 typedef struct
517 {
519  _i8 Strings[MAX_SSID_LEN + MAX_KEY_LEN + MAX_USER_LEN + MAX_ANON_USER_LEN];
520 }_SlProfileUpdateParams_t;
521 
522 typedef union
523 {
524  _SlProfileUpdateParams_t Cmd;
525  _BasicResponse_t Rsp;
526 }_SlProfileUpdateMsg_u;
527 
528 #if _SL_INCLUDE_FUNC(sl_WlanProfileUpdate)
529 _i16 sl_WlanProfileUpdate(const _u32 Index, const _i8* pName,const _i16 NameLen,const _u8 *pMacAddr,const SlWlanSecParams_t* pSecParams ,const SlWlanSecParamsExt_t* pSecExtParams,const _u32 Priority)
530 {
531  _SlProfileUpdateMsg_u Msg;
532  _SlCmdCtrl_t CmdCtrl = {0,0,0};
533  CmdCtrl.TxDescLen = 0;/* init */
534  CmdCtrl.RxDescLen = (_SlArgSize_t)(sizeof(_BasicResponse_t));
535 
536 
537  /* verify that this api is allowed. if not allowed then
538  ignore the API execution and return immediately with an error */
539  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
540 
541  _SlDrvMemZero(&Msg,sizeof(_SlProfileUpdateParams_t));
542 
543  Msg.Cmd.Args.Index = Index;
544  /* update priority */
545  Msg.Cmd.Args.Priority = (_u8)Priority;
546 
547  /* verify SSID length */
548  VERIFY_PROTOCOL(NameLen >= 0 && NameLen <= MAX_SSID_LEN);
549  /* update SSID length */
550  Msg.Cmd.Args.SsidLen = (_u8)NameLen;
551 
552 
553  /* Enterprise security profile */
554  if (NULL != pSecExtParams)
555  {
556  /* Update command opcode */
557  CmdCtrl.Opcode = SL_OPCODE_WLAN_PROFILEEAPUPDATECOMMAND;
558  CmdCtrl.TxDescLen += sizeof(SlWlanUpdateProfile_t);
559 
560  /* If SSID is supplied, copy it */
561  if (NULL != pName)
562  {
563  sl_Memcpy(UPDATE_PROFILE_SSID_STRING(&Msg), pName, NameLen);
564  CmdCtrl.TxDescLen += NameLen;
565  }
566  else
567  {
568  Msg.Cmd.Args.SsidLen = 0;
569  }
570 
571 
572  /* Copy password if supplied */
573  if ((NULL != pSecParams) && (pSecParams->KeyLen > 0))
574  {
575  /* update security type */
576  Msg.Cmd.Args.SecType = (_i8)(pSecParams->Type);
577 
578  if( SL_WLAN_SEC_TYPE_WEP == Msg.Cmd.Args.SecType )
579  {
580  Msg.Cmd.Args.WepKeyId = 0;
581  }
582 
583  /* verify key length */
584  if (pSecParams->KeyLen > MAX_KEY_LEN)
585  {
586  return SL_INVALPARAM;
587  }
588  VERIFY_PROTOCOL(pSecParams->KeyLen <= MAX_KEY_LEN);
589  /* update key length */
590  Msg.Cmd.Args.PasswordLen = pSecParams->KeyLen;
591  CmdCtrl.TxDescLen += pSecParams->KeyLen;
592  ARG_CHECK_PTR(pSecParams->Key);
593  /* copy key */
594  sl_Memcpy(UPDATE_PROFILE_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen);
595  }
596  else
597  {
598  Msg.Cmd.Args.PasswordLen = 0;
599  }
600 
601  ARG_CHECK_PTR(pSecExtParams);
602  /* Update Eap bitmask */
603  Msg.Cmd.Args.EapBitmask = pSecExtParams->EapMethod;
604  /* Update Certificate file ID index - currently not supported */
605  Msg.Cmd.Args.CertIndex = pSecExtParams->CertIndex;
606  /* verify user length */
607  if (pSecExtParams->UserLen > MAX_USER_LEN)
608  {
609  return SL_INVALPARAM;
610  }
611  Msg.Cmd.Args.UserLen = pSecExtParams->UserLen;
612  /* copy user name (identity) */
613  if(pSecExtParams->UserLen > 0)
614  {
615  sl_Memcpy(UPDATE_PROFILE_USER_STRING(&Msg), pSecExtParams->User, pSecExtParams->UserLen);
616  CmdCtrl.TxDescLen += pSecExtParams->UserLen;
617  }
618 
619  /* verify Anonymous user length (for tunneled) */
620  if (pSecExtParams->AnonUserLen > MAX_ANON_USER_LEN)
621  {
622  return SL_INVALPARAM;
623  }
624  Msg.Cmd.Args.AnonUserLen = pSecExtParams->AnonUserLen;
625 
626  /* copy Anonymous user */
627  if(pSecExtParams->AnonUserLen > 0)
628  {
629  sl_Memcpy(UPDATE_PROFILE_ANON_USER_STRING(&Msg), pSecExtParams->AnonUser, pSecExtParams->AnonUserLen);
630  CmdCtrl.TxDescLen += pSecExtParams->AnonUserLen;
631  }
632 
633  }
634  /* Regular or open security profile */
635  else
636  {
637  /* Update command opcode */
638  CmdCtrl.Opcode = SL_OPCODE_WLAN_PROFILEUPDATECOMMAND;
639  /* update commnad length */
640  CmdCtrl.TxDescLen += sizeof(SlWlanUpdateProfile_t);
641 
642  if (NULL != pName)
643  {
644  /* copy SSID */
645  sl_Memcpy(UPDATE_PROFILE_SSID_STRING(&Msg), pName, NameLen);
646  CmdCtrl.TxDescLen += NameLen;
647  }
648  else
649  {
650  Msg.Cmd.Args.SsidLen = 0;
651  }
652 
653  /* Copy password if supplied */
654  if( NULL != pSecParams )
655  {
656  /* update security type */
657  Msg.Cmd.Args.SecType = (_i8)(pSecParams->Type);
658 
659  if( SL_WLAN_SEC_TYPE_WEP == Msg.Cmd.Args.SecType )
660  {
661  Msg.Cmd.Args.WepKeyId = 0;
662  }
663 
664  /* verify key length */
665  if (pSecParams->KeyLen > MAX_KEY_LEN)
666  {
667  return SL_INVALPARAM;
668  }
669  /* update key length */
670  Msg.Cmd.Args.PasswordLen = pSecParams->KeyLen;
671  CmdCtrl.TxDescLen += pSecParams->KeyLen;
672  /* copy key (could be no key in case of WPS pin) */
673  if( NULL != pSecParams->Key )
674  {
675  sl_Memcpy(UPDATE_PROFILE_PASSWORD_STRING(&Msg), pSecParams->Key, pSecParams->KeyLen);
676  }
677  }
678  else
679  {
680  Msg.Cmd.Args.SecType = SL_WLAN_SEC_TYPE_OPEN;
681  Msg.Cmd.Args.PasswordLen = 0;
682  }
683 
684  }
685 
686 
687  /* If BSSID is not null, copy to buffer, otherwise set to 0 */
688  if(NULL != pMacAddr)
689  {
690  sl_Memcpy(Msg.Cmd.Args.Bssid, pMacAddr, sizeof(Msg.Cmd.Args.Bssid));
691  }
692  else
693  {
694  _SlDrvMemZero(Msg.Cmd.Args.Bssid, (_u16)sizeof(Msg.Cmd.Args.Bssid));
695  }
696 
697  VERIFY_RET_OK(_SlDrvCmdOp(&CmdCtrl, &Msg, NULL));
698 
699  return (_i16)Msg.Rsp.status;
700 }
701 #endif
702 /*******************************************************************************/
703 /* sl_ProfileGet */
704 /*******************************************************************************/
705 typedef union
706 {
708  _SlProfileParams_t Rsp;
709 }_SlProfileGetMsg_u;
710 
711 #if _SL_INCLUDE_FUNC(sl_WlanProfileGet)
712 
713 static const _SlCmdCtrl_t _SlProfileGetCmdCtrl =
714 {
715  SL_OPCODE_WLAN_PROFILEGETCOMMAND,
716  (_SlArgSize_t)sizeof(SlWlanProfileDelGetCommand_t),
717  (_SlArgSize_t)sizeof(_SlProfileParams_t)
718 };
719 
720 _i16 sl_WlanProfileGet(const _i16 Index,_i8* pName, _i16 *pNameLen, _u8 *pMacAddr, SlWlanSecParams_t* pSecParams, SlWlanGetSecParamsExt_t* pEntParams, _u32 *pPriority)
721 {
722  _SlProfileGetMsg_u Msg;
723  Msg.Cmd.Index = (_u8)Index;
724 
725  /* verify that this api is allowed. if not allowed then
726  ignore the API execution and return immediately with an error */
727  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
728 
729  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlProfileGetCmdCtrl, &Msg, NULL));
730 
731  pSecParams->Type = (_u8)(Msg.Rsp.Args.Common.SecType);
732  if (Msg.Rsp.Args.Common.SecType >= 0)
733  {
734  /* since password is not transferred in getprofile, password length should always be zero */
735  pSecParams->KeyLen = Msg.Rsp.Args.Common.PasswordLen;
736  if (NULL != pEntParams)
737  {
738  pEntParams->EapMethod = Msg.Rsp.Args.EapBitmask;
739  pEntParams->UserLen = Msg.Rsp.Args.UserLen;
740  /* copy user name */
741  if (pEntParams->UserLen > 0)
742  {
743  sl_Memcpy(pEntParams->User, EAP_PROFILE_USER_STRING(&Msg), pEntParams->UserLen);
744  }
745  pEntParams->AnonUserLen = Msg.Rsp.Args.AnonUserLen;
746  /* copy anonymous user name */
747  if (pEntParams->AnonUserLen > 0)
748  {
749  sl_Memcpy(pEntParams->AnonUser, EAP_PROFILE_ANON_USER_STRING(&Msg), pEntParams->AnonUserLen);
750  }
751  }
752 
753  *pNameLen = (_i16)(Msg.Rsp.Args.Common.SsidLen);
754  *pPriority = Msg.Rsp.Args.Common.Priority;
755  if (NULL != pMacAddr)
756  {
757  sl_Memcpy(pMacAddr, Msg.Rsp.Args.Common.Bssid, sizeof(Msg.Rsp.Args.Common.Bssid));
758  }
759  sl_Memset(pName, 0, SL_WLAN_SSID_MAX_LENGTH);
760  sl_Memcpy(pName, EAP_PROFILE_SSID_STRING(&Msg), *pNameLen);
761  }
762  return (_i16)Msg.Rsp.Args.Common.SecType;
763 }
764 #endif
765 /*******************************************************************************/
766 /* sl_ProfileDel */
767 /*******************************************************************************/
768 typedef union
769 {
771  _BasicResponse_t Rsp;
772 }_SlProfileDelMsg_u;
773 
774 
775 #if _SL_INCLUDE_FUNC(sl_WlanProfileDel)
776 
777 static const _SlCmdCtrl_t _SlProfileDelCmdCtrl =
778 {
779  SL_OPCODE_WLAN_PROFILEDELCOMMAND,
780  (_SlArgSize_t)sizeof(SlWlanProfileDelGetCommand_t),
781  (_SlArgSize_t)sizeof(_BasicResponse_t)
782 };
783 
784 _i16 sl_WlanProfileDel(const _i16 Index)
785 {
786  _SlProfileDelMsg_u Msg;
787 
788  /* verify that this api is allowed. if not allowed then
789  ignore the API execution and return immediately with an error */
790  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
791 
792  Msg.Cmd.Index = (_u8)Index;
793 
794  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlProfileDelCmdCtrl, &Msg, NULL));
795 
796  return (_i16)Msg.Rsp.status;
797 }
798 #endif
799 
800 
801 /******************************************************************************/
802 /* sl_WlanGetNetworkList */
803 /******************************************************************************/
804 typedef union
805 {
808 }_SlWlanGetNetworkListMsg_u;
809 
810 
811 #if _SL_INCLUDE_FUNC(sl_WlanGetNetworkList)
812 
813 static const _SlCmdCtrl_t _SlWlanGetNetworkListCtrl =
814 {
815  SL_OPCODE_WLAN_SCANRESULTSGETCOMMAND,
816  (_SlArgSize_t)sizeof(SlWlanGetNetworkListCommand_t),
817  (_SlArgSize_t)sizeof(_WlanGetNetworkListResponse_t)
818 };
819 
820 _i16 sl_WlanGetNetworkList(const _u8 Index,const _u8 Count, SlWlanNetworkEntry_t *pEntries)
821 {
822  _i16 retVal = 0;
823  _SlWlanGetNetworkListMsg_u Msg;
824  _SlCmdExt_t CmdExt;
825 
826  /* verify that this api is allowed. if not allowed then
827  ignore the API execution and return immediately with an error */
828  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
829 
830  if (Count == 0)
831  {
832  return SL_EZEROLEN;
833  }
834 
835  _SlDrvResetCmdExt(&CmdExt);
836  CmdExt.RxPayloadLen = (_i16)(sizeof(SlWlanNetworkEntry_t)*(Count));
837  CmdExt.pRxPayload = (_u8 *)pEntries;
838 
839  Msg.Cmd.Index = Index;
840  Msg.Cmd.Count = Count;
841 
842  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanGetNetworkListCtrl, &Msg, &CmdExt));
843  retVal = Msg.Rsp.status;
844 
845  return (_i16)retVal;
846 }
847 #endif
848 
849 /******************************************************************************/
850 /* sl_WlanGetExtNetworkList */
851 /******************************************************************************/
852 typedef union
853 {
856 }_SlWlanGetExtNetworkListMsg_u;
857 
858 
859 #if _SL_INCLUDE_FUNC(sl_WlanGetExtNetworkList)
860 
861 static const _SlCmdCtrl_t _SlWlanGetExtNetworkListCtrl =
862 {
863  SL_OPCODE_WLAN_EXTSCANRESULTSGETCOMMAND,
864  (_SlArgSize_t)sizeof(SlWlanGetExtNetworkListCommand_t),
865  (_SlArgSize_t)sizeof(_WlanGetExtNetworkListResponse_t)
866 };
867 
868 _i16 sl_WlanGetExtNetworkList(const _u8 Index,const _u8 Count, SlWlanExtNetworkEntry_t *pEntries)
869 {
870  _i16 retVal = 0;
871  _SlWlanGetExtNetworkListMsg_u Msg;
872  _SlCmdExt_t CmdExt;
873 
874  /* verify that this api is allowed. if not allowed then
875  ignore the API execution and return immediately with an error */
876  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
877 
878  if (Count == 0)
879  {
880  return SL_EZEROLEN;
881  }
882 
883  _SlDrvResetCmdExt(&CmdExt);
884  CmdExt.RxPayloadLen = (_i16)(sizeof(SlWlanExtNetworkEntry_t)*(Count));
885  CmdExt.pRxPayload = (_u8 *)pEntries;
886 
887  Msg.Cmd.Index = Index;
888  Msg.Cmd.Count = Count;
889 
890  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanGetExtNetworkListCtrl, &Msg, &CmdExt));
891  retVal = Msg.Rsp.status;
892 
893  return (_i16)retVal;
894 }
895 #endif
896 
897 
898 /******************************************************************************/
899 /* RX filters message command response structures */
900 /******************************************************************************/
901 
902 
903 typedef union
904 {
907 }_SlWlanRxFilterAddMsg_u;
908 
909 
910 #if _SL_INCLUDE_FUNC(sl_WlanRxFilterAdd)
911 
912 static const _SlCmdCtrl_t _SlWlanRxFilterAddtCmdCtrl =
913 {
914  SL_OPCODE_WLAN_WLANRXFILTERADDCOMMAND,
915  (_SlArgSize_t)sizeof(SlWlanRxFilterAddCommand_t),
916  (_SlArgSize_t)sizeof(SlWlanRxFilterAddCommandReponse_t)
917 };
918 
919 
920 /*****************************************************************************
921  RX filters
922 *****************************************************************************/
923 _i16 sl_WlanRxFilterAdd(SlWlanRxFilterRuleType_t RuleType,
924  SlWlanRxFilterFlags_u Flags,
925  const SlWlanRxFilterRule_u* const pRule,
926  const SlWlanRxFilterTrigger_t* const pTrigger,
927  const SlWlanRxFilterAction_t* const pAction,
928  SlWlanRxFilterID_t* pFilterId)
929 {
930  _SlWlanRxFilterAddMsg_u Msg;
931 
932  /* verify that this api is allowed. if not allowed then
933  ignore the API execution and return immediately with an error */
934  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
935 
936  Msg.Cmd.RuleType = RuleType;
937  /* filterId is zero */
938  Msg.Cmd.FilterId = 0;
939  Msg.Cmd.Flags = Flags;
940  sl_Memcpy( &(Msg.Cmd.Rule), pRule, sizeof(SlWlanRxFilterRule_u) );
941  sl_Memcpy( &(Msg.Cmd.Trigger), pTrigger, sizeof(SlWlanRxFilterTrigger_t) );
942  sl_Memcpy( &(Msg.Cmd.Action), pAction, sizeof(SlWlanRxFilterAction_t) );
943  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanRxFilterAddtCmdCtrl, &Msg, NULL) );
944  *pFilterId = Msg.Rsp.FilterId;
945  return (_i16)Msg.Rsp.Status;
946 }
947 #endif
948 
949 
950 /*******************************************************************************/
951 /* sl_WlanRxStatStart */
952 /*******************************************************************************/
953 #if _SL_INCLUDE_FUNC(sl_WlanRxStatStart)
955 {
956  SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
957  if(SL_IS_DEVICE_STAT_IN_PROGRESS)
958  {
959  SL_DRV_PROTECTION_OBJ_UNLOCK();
960  return SL_RET_CODE_DEVICE_STAT_IN_PROGRESS;
961  }
962  else
963  {
964  /* turn on flag indication for RX statistics is in progress
965  * to avoid parallel "starts" between
966  * Device statistics API and RX statistics API */
967  SL_SET_WLAN_RX_STAT_IN_PROGRESS;
968  SL_DRV_PROTECTION_OBJ_UNLOCK();
969  /* verify that this api is allowed. if not allowed then
970  ignore the API execution and return immediately with an error */
971  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
972 
973  }
974  return _SlDrvBasicCmd(SL_OPCODE_WLAN_STARTRXSTATCOMMAND);
975 }
976 #endif
977 
978 
979 
980 #if _SL_INCLUDE_FUNC(sl_WlanRxStatGet)
981 _i16 sl_WlanRxStatGet(SlWlanGetRxStatResponse_t *pRxStat,const _u32 Flags)
982 {
983  SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
984  if(SL_IS_DEVICE_STAT_IN_PROGRESS)
985  {
986  SL_DRV_PROTECTION_OBJ_UNLOCK();
987  return SL_RET_CODE_DEVICE_STAT_IN_PROGRESS;
988  }
989  SL_DRV_PROTECTION_OBJ_UNLOCK();
990 
991  _SlCmdCtrl_t CmdCtrl = {SL_OPCODE_WLAN_GETRXSTATCOMMAND, 0, (_SlArgSize_t)sizeof(SlWlanGetRxStatResponse_t)};
992  /* Flags parameter is currently not in use */
993  (void)Flags;
994 
995  /* verify that this api is allowed. if not allowed then
996  ignore the API execution and return immediately with an error */
997  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
998 
999  _SlDrvMemZero(pRxStat, (_u16)sizeof(SlWlanGetRxStatResponse_t));
1000  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&CmdCtrl, pRxStat, NULL));
1001  return 0;
1002 }
1003 #endif
1004 
1005 
1006 #if _SL_INCLUDE_FUNC(sl_WlanRxStatStop)
1008 {
1009  SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
1010  if(SL_IS_DEVICE_STAT_IN_PROGRESS)
1011  {
1012  SL_DRV_PROTECTION_OBJ_UNLOCK();
1013  return SL_RET_CODE_DEVICE_STAT_IN_PROGRESS;
1014  }
1015 
1016  else
1017  {
1018  SL_UNSET_WLAN_RX_STAT_IN_PROGRESS;
1019  SL_DRV_PROTECTION_OBJ_UNLOCK();
1020  /* verify that this api is allowed. if not allowed then
1021  ignore the API execution and return immediately with an error */
1022  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
1023  return _SlDrvBasicCmd(SL_OPCODE_WLAN_STOPRXSTATCOMMAND);
1024 
1025  }
1026 }
1027 #endif
1028 
1029 /******************************************************************************/
1030 /* sl_WlanProvisioning */
1031 /******************************************************************************/
1032 
1033 typedef struct
1034 {
1036  _i8 Key[MAX_SMART_CONFIG_KEY]; /* public key + groupId1 key + groupId2 key */
1037 }_SlSmartConfigArgs_t;
1038 
1039 typedef struct
1040 {
1041  SlWlanProvisioningParams_t ProvParams;
1042  _SlSmartConfigArgs_t SmartConfigParams;
1043 }_SlProvisioning_t;
1044 
1045 typedef union
1046 {
1047  _SlProvisioning_t Cmd;
1048  _BasicResponse_t Rsp;
1049 }_SlProvisioningStartMsg_u;
1050 
1051 #if _SL_INCLUDE_FUNC(sl_WlanProvisioning)
1052 
1053 const _SlCmdCtrl_t _SlProvisioningCmdCtrl =
1054 {
1055  SL_OPCODE_WLAN_PROVISIONING_COMMAND,
1056  sizeof(_SlProvisioning_t),
1057  sizeof(_BasicResponse_t)
1058 };
1059 
1060 _i16 sl_WlanProvisioning(_u8 ProvisioningCmd, _u8 RequestedRoleAfterSuccess, _u16 InactivityTimeoutSec, char *pSmartConfigKey, _u32 Flags)
1061 {
1062  _SlProvisioningStartMsg_u Msg;
1063 
1064  /* Verify if we can send this command to the NWP
1065  We can send only prov. stop command if command is not allowed */
1066  if ((!SL_IS_COMMAND_ALLOWED) && (!SL_IS_PROVISIONING_ACTIVE) && (InactivityTimeoutSec != 0))
1067  {
1068  /* return with the correct error code */
1069  return _SlDrvDriverIsApiAllowed(SL_OPCODE_SILO_WLAN);
1070  }
1071 
1072  /* If there is an API in progress and the timeout is not zero (it means the
1073  command is not prov. stop) then abort and return an error code */
1074  if (_SlDrvIsApiInProgress() && (InactivityTimeoutSec !=0))
1075  {
1076  return SL_RET_CODE_API_COMMAND_IN_PROGRESS;
1077  }
1078 
1079  _SlDrvMemZero(&Msg, (_u16)sizeof (_SlProvisioningStartMsg_u));
1080 
1081  Msg.Cmd.ProvParams.ProvisioningCmd = (_u8)ProvisioningCmd;
1082  Msg.Cmd.ProvParams.RequestedRoleAfterSuccess = (_u8)RequestedRoleAfterSuccess;
1083  Msg.Cmd.ProvParams.InactivityTimeoutSec = (_u16)InactivityTimeoutSec;
1084  Msg.Cmd.ProvParams.Flags = Flags;
1085 
1086  /* Smart Config parameters */
1087  if (NULL != pSmartConfigKey)
1088  {
1089  Msg.Cmd.SmartConfigParams.Args.GroupIdBitmask = SL_WLAN_SMART_CONFIG_DEFAULT_GROUP;
1090  Msg.Cmd.SmartConfigParams.Args.Cipher = SL_WLAN_SMART_CONFIG_DEFAULT_CIPHER;
1091  Msg.Cmd.SmartConfigParams.Args.PublicKeyLen = SL_WLAN_SMART_CONFIG_KEY_LENGTH;
1092 
1093  /* copy keys (if exist) after command (one after another) */
1094  sl_Memcpy(Msg.Cmd.SmartConfigParams.Key, pSmartConfigKey, SL_WLAN_SMART_CONFIG_KEY_LENGTH);
1095  }
1096  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlProvisioningCmdCtrl , &Msg, NULL));
1097 
1098  return (_i16)Msg.Rsp.status;
1099 }
1100 #endif
1101 
1102 /*******************************************************************************/
1103 /* sl_WlanSetMode */
1104 /*******************************************************************************/
1105 typedef union
1106 {
1107  SlWlanSetMode_t Cmd;
1108  _BasicResponse_t Rsp;
1109 }_SlwlanSetModeMsg_u;
1110 
1111 #if _SL_INCLUDE_FUNC(sl_WlanSetMode)
1112 
1113 static const _SlCmdCtrl_t _SlWlanSetModeCmdCtrl =
1114 {
1115  SL_OPCODE_WLAN_SET_MODE,
1116  (_SlArgSize_t)sizeof(SlWlanSetMode_t),
1117  (_SlArgSize_t)sizeof(_BasicResponse_t)
1118 };
1119 
1120 /* possible values are:
1121 WLAN_SET_STA_MODE = 1
1122 WLAN_SET_AP_MODE = 2
1123 WLAN_SET_P2P_MODE = 3 */
1124 _i16 sl_WlanSetMode(const _u8 Mode)
1125 {
1126  _SlwlanSetModeMsg_u Msg;
1127 
1128  /* verify that this api is allowed. if not allowed then
1129  ignore the API execution and return immediately with an error */
1130  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
1131 
1132  Msg.Cmd.Mode = Mode;
1133 
1134  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanSetModeCmdCtrl , &Msg, NULL));
1135 
1136  return (_i16)Msg.Rsp.status;
1137 }
1138 #endif
1139 
1140 /*******************************************************************************/
1141 /* sl_WlanSet */
1142 /* ******************************************************************************/
1143 typedef union
1144 {
1145  SlWlanCfgSetGet_t Cmd;
1146  _BasicResponse_t Rsp;
1147 }_SlWlanCfgSetMsg_u;
1148 
1149 
1150 #if _SL_INCLUDE_FUNC(sl_WlanSet)
1151 
1152 static const _SlCmdCtrl_t _SlWlanCfgSetCmdCtrl =
1153 {
1154  SL_OPCODE_WLAN_CFG_SET,
1155  (_SlArgSize_t)sizeof(SlWlanCfgSetGet_t),
1156  (_SlArgSize_t)sizeof(_BasicResponse_t)
1157 };
1158 
1159 _i16 sl_WlanSet(const _u16 ConfigId ,const _u16 ConfigOpt,const _u16 ConfigLen,const _u8 *pValues)
1160 {
1161  _SlWlanCfgSetMsg_u Msg;
1162  _SlCmdExt_t CmdExt;
1163 
1164  /* verify that this api is allowed. if not allowed then
1165  ignore the API execution and return immediately with an error */
1166  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
1167 
1168  _SlDrvResetCmdExt(&CmdExt);
1169  CmdExt.TxPayload1Len = (_u16)((ConfigLen+3) & (~3));
1170  CmdExt.pTxPayload1 = (_u8 *)pValues;
1171 
1172  Msg.Cmd.ConfigId = ConfigId;
1173  Msg.Cmd.ConfigLen = ConfigLen;
1174  Msg.Cmd.ConfigOpt = ConfigOpt;
1175 
1176  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanCfgSetCmdCtrl, &Msg, &CmdExt));
1177 
1178  return (_i16)Msg.Rsp.status;
1179 }
1180 #endif
1181 
1182 
1183 /******************************************************************************/
1184 /* sl_WlanGet */
1185 /******************************************************************************/
1186 typedef union
1187 {
1188  SlWlanCfgSetGet_t Cmd;
1189  SlWlanCfgSetGet_t Rsp;
1190 }_SlWlanCfgMsgGet_u;
1191 
1192 #if _SL_INCLUDE_FUNC(sl_WlanGet)
1193 
1194 static const _SlCmdCtrl_t _SlWlanCfgGetCmdCtrl =
1195 {
1196  SL_OPCODE_WLAN_CFG_GET,
1197  (_SlArgSize_t)sizeof(SlWlanCfgSetGet_t),
1198  (_SlArgSize_t)sizeof(SlWlanCfgSetGet_t)
1199 };
1200 
1201 _i16 sl_WlanGet(const _u16 ConfigId, _u16 *pConfigOpt,_u16 *pConfigLen, _u8 *pValues)
1202 {
1203  _SlWlanCfgMsgGet_u Msg;
1204  _SlCmdExt_t CmdExt;
1205 
1206  /* verify that this api is allowed. if not allowed then
1207  ignore the API execution and return immediately with an error */
1208  VERIFY_API_ALLOWED(SL_OPCODE_SILO_WLAN);
1209 
1210  if (*pConfigLen == 0)
1211  {
1212  return SL_EZEROLEN;
1213  }
1214 
1215  _SlDrvResetCmdExt(&CmdExt);
1216  CmdExt.RxPayloadLen = (_i16)*pConfigLen;
1217  CmdExt.pRxPayload = (_u8 *)pValues;
1218  Msg.Cmd.ConfigLen = *pConfigLen;
1219  Msg.Cmd.ConfigId = ConfigId;
1220  if( pConfigOpt )
1221  {
1222  Msg.Cmd.ConfigOpt = (_u16)*pConfigOpt;
1223  }
1224  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanCfgGetCmdCtrl, &Msg, &CmdExt));
1225 
1226  if( pConfigOpt )
1227  {
1228  *pConfigOpt = (_u8)Msg.Rsp.ConfigOpt;
1229  }
1230  if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen)
1231  {
1232  *pConfigLen = (_u8)CmdExt.RxPayloadLen;
1233  return SL_ESMALLBUF;
1234  }
1235  else
1236  {
1237  *pConfigLen = (_u8)CmdExt.ActualRxPayloadLen;
1238  }
1239 
1240  return (_i16)Msg.Rsp.Status;
1241 }
1242 #endif
_i16 sl_WlanSetMode(const _u8 Mode)
Wlan set mode.
Definition: wlan.c:1124
_i16 sl_WlanRxFilterAdd(SlWlanRxFilterRuleType_t RuleType, SlWlanRxFilterFlags_u Flags, const SlWlanRxFilterRule_u *const pRule, const SlWlanRxFilterTrigger_t *const pTrigger, const SlWlanRxFilterAction_t *const pAction, SlWlanRxFilterID_t *pFilterId)
Adds new filter rule to the system.
Definition: wlan.c:923
_i16 sl_WlanConnect(const _i8 *pName, const _i16 NameLen, const _u8 *pMacAddr, const SlWlanSecParams_t *pSecParams, const SlWlanSecParamsExt_t *pSecExtParams)
Connect to wlan network as a station.
Definition: wlan.c:72
_i16 sl_WlanGet(const _u16 ConfigId, _u16 *pConfigOpt, _u16 *pConfigLen, _u8 *pValues)
Getting WLAN configurations.
Definition: wlan.c:1201
_i16 sl_WlanProvisioning(_u8 ProvisioningCmd, _u8 RequestedRoleAfterSuccess, _u16 InactivityTimeoutSec, char *pSmartConfigKey, _u32 Flags)
The simpleLink will switch to the appropriate role according to the provisioning mode requested and w...
Definition: wlan.c:1060
Definition: wlan.h:716
_i16 sl_WlanPolicySet(const _u8 Type, const _u8 Policy, _u8 *pVal, const _u8 ValLen)
Set policy values.
Definition: wlan.c:242
_i16 sl_WlanProfileAdd(const _i8 *pName, const _i16 NameLen, const _u8 *pMacAddr, const SlWlanSecParams_t *pSecParams, const SlWlanSecParamsExt_t *pSecExtParams, const _u32 Priority, const _u32 Options)
Add profile.
Definition: wlan.c:346
_i16 sl_WlanRxStatStop(void)
Stop collecting wlan RX statistic, (if previous called sl_WlanRxStatStart)
Definition: wlan.c:1007
_i16 sl_WlanProfileGet(const _i16 Index, _i8 *pName, _i16 *pNameLen, _u8 *pMacAddr, SlWlanSecParams_t *pSecParams, SlWlanGetSecParamsExt_t *pEntParams, _u32 *pPriority)
Get profile.
Definition: wlan.c:720
_i16 sl_WlanSet(const _u16 ConfigId, const _u16 ConfigOpt, const _u16 ConfigLen, const _u8 *pValues)
Setting WLAN configurations.
Definition: wlan.c:1159
Definition: wlan.h:727
_i16 sl_WlanProfileDel(const _i16 Index)
Delete WLAN profile.
Definition: wlan.c:784
_i16 sl_WlanDisconnect(void)
Wlan disconnect.
Definition: wlan.c:214
_i16 sl_WlanPolicyGet(const _u8 Type, _u8 *pPolicy, _u8 *pVal, _u8 *pValLen)
Get policy values.
Definition: wlan.c:284
_i16 sl_WlanRxStatStart(void)
Start collecting wlan RX statistics, for unlimited time.
Definition: wlan.c:954
_i16 sl_WlanGetExtNetworkList(const _u8 Index, const _u8 Count, SlWlanExtNetworkEntry_t *pEntries)
Gets the WLAN scan operation results.
Definition: wlan.c:868
_i16 sl_WlanProfileUpdate(const _u32 Index, const _i8 *pName, const _i16 NameLen, const _u8 *pMacAddr, const SlWlanSecParams_t *pSecParams, const SlWlanSecParamsExt_t *pSecExtParams, const _u32 Priority)
Profile Update.
Definition: wlan.c:529
_i16 sl_WlanRxStatGet(SlWlanGetRxStatResponse_t *pRxStat, const _u32 Flags)
Get wlan RX statistics. Upon calling this command, the statistics counters will be cleared...
Definition: wlan.c:981
_i16 sl_WlanGetNetworkList(const _u8 Index, const _u8 Count, SlWlanNetworkEntry_t *pEntries)
Gets the WLAN scan operation results.
Definition: wlan.c:820