• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * admCtrl.c
3  *
4  * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
5  * All rights reserved.
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  *  * Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  *  * Neither the name Texas Instruments nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 /** \file admCtrl.c
35  *  \brief Admission control API implimentation
36  *
37  *  \see admCtrl.h
38  */
39 
40 /****************************************************************************
41  *                                                                          *
42  *   MODULE:  Admission Control                                             *
43  *   PURPOSE: Admission Control Module API                                  *
44  *                                                                          *
45  ****************************************************************************/
46 
47 #define __FILE_ID__  FILE_ID_16
48 #include "osApi.h"
49 #include "paramOut.h"
50 #include "timer.h"
51 #include "fsm.h"
52 #include "report.h"
53 #include "mlmeApi.h"
54 #include "DataCtrl_Api.h"
55 #include "TI_IPC_Api.h"
56 #include "rsn.h"
57 #include "admCtrl.h"
58 #include "admCtrlWpa.h"
59 #include "admCtrlWpa2.h"
60 #include "admCtrlNone.h"
61 #include "admCtrlWep.h"
62 #include "EvHandler.h"
63 
64 /* Constants */
65 
66 /* Enumerations */
67 
68 /* Typedefs */
69 
70 /* Structures */
71 
72 /* External data definitions */
73 
74 /* Local functions definitions */
75 
76 /* Global variables */
77 
78 /* Function prototypes */
79 
80 TI_STATUS admCtrl_setAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite authSuite);
81 
82 TI_STATUS admCtrl_getAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite *pSuite);
83 
84 TI_STATUS admCtrl_setNetworkMode(admCtrl_t *pAdmCtrl, ERsnNetworkMode mode);
85 
86 TI_STATUS admCtrl_setExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode extAuthMode);
87 
88 TI_STATUS admCtrl_getExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode *pExtAuthMode);
89 
90 TI_STATUS admCtrl_setUcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite);
91 
92 TI_STATUS admCtrl_setBcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite);
93 
94 TI_STATUS admCtrl_getCipherSuite(admCtrl_t *pAdmCtrl, ECipherSuite *pSuite);
95 
96 TI_STATUS admCtrl_setKeyMngSuite(admCtrl_t *pAdmCtrl, ERsnKeyMngSuite suite);
97 
98 TI_STATUS admCtrl_getMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL *pMixedMode);
99 
100 TI_STATUS admCtrl_setMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL mixedMode);
101 
102 TI_STATUS admCtrl_getAuthEncrCapability(admCtrl_t *pAdmCtrl,
103                    rsnAuthEncrCapability_t   *authEncrCapability);
104 
105 TI_STATUS admCtrl_getPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 *WPAPromoteFlags);
106 
107 TI_STATUS admCtrl_setPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 WPAPromoteFlags);
108 
109 TI_STATUS admCtrl_getWPAMixedModeSupport(admCtrl_t *pAdmCtrl, TI_UINT32 *support);
110 
111 TI_STATUS admCtrl_checkSetSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite, TI_BOOL Broadcast);
112 
113 #ifdef XCC_MODULE_INCLUDED
114 TI_STATUS admCtrl_setNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP networkEap);
115 
116 TI_STATUS admCtrl_getNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP *networkEap);
117 #endif
118 
119 /**
120 *
121 * admCtrl_create
122 *
123 * \b Description:
124 *
125 * Create the admission control context.
126 *
127 * \b ARGS:
128 *
129 *  I   - role - admission cotrol role (AP or Station)  \n
130 *  I   - authSuite - authentication suite to work with \n
131 *
132 * \b RETURNS:
133 *
134 *  TI_OK on success, TI_NOK on failure.
135 *
136 * \sa
137 */
admCtrl_create(TI_HANDLE hOs)138 admCtrl_t* admCtrl_create(TI_HANDLE hOs)
139 {
140     admCtrl_t       *pHandle;
141 
142     /* allocate rsniation context memory */
143     pHandle = (admCtrl_t*)os_memoryAlloc(hOs, sizeof(admCtrl_t));
144     if (pHandle == NULL)
145     {
146         return NULL;
147     }
148 
149     os_memoryZero(hOs, pHandle, sizeof(admCtrl_t));
150 
151     pHandle->hOs = hOs;
152 
153     return pHandle;
154 }
155 
156 /**
157 *
158 * admCtrl_unload
159 *
160 * \b Description:
161 *
162 * Unload admission control module from memory
163 *
164 * \b ARGS:
165 *
166 *  I   - hAdmCtrl - Admossion control context  \n
167 *
168 * \b RETURNS:
169 *
170 *  TI_OK if successful, TI_NOK otherwise.
171 *
172 * \sa admCtrl_create
173 */
admCtrl_unload(admCtrl_t * pAdmCtrl)174 TI_STATUS admCtrl_unload (admCtrl_t *pAdmCtrl)
175 {
176     if (pAdmCtrl == NULL)
177     {
178         return TI_NOK;
179     }
180 
181     /* Destroy the wpa2 pre-authentication timer and free the module's memory */
182 	if (pAdmCtrl->hPreAuthTimerWpa2)
183 	{
184 		tmr_DestroyTimer (pAdmCtrl->hPreAuthTimerWpa2);
185 	}
186     os_memoryFree (pAdmCtrl->hOs, pAdmCtrl, sizeof(admCtrl_t));
187 
188     return TI_OK;
189 }
190 
191 /**
192 *
193 * admCtrl_config
194 *
195 * \b Description:
196 *
197 * Configure the admission control module.
198 *
199 * \b ARGS:
200 *
201 *  I   - role - admission cotrol role (AP or Station)  \n
202 *  I   - authSuite - authentication suite to work with \n
203 *
204 * \b RETURNS:
205 *
206 *  TI_OK on success, TI_NOK on failure.
207 *
208 * \sa
209 */
admCtrl_config(TI_HANDLE hAdmCtrl,TI_HANDLE hMlme,TI_HANDLE hRx,TI_HANDLE hReport,TI_HANDLE hOs,struct _rsn_t * pRsn,TI_HANDLE hXCCMngr,TI_HANDLE hPowerMgr,TI_HANDLE hEvHandler,TI_HANDLE hTimer,TI_HANDLE hCurrBss,TRsnInitParams * pInitParam)210 TI_STATUS admCtrl_config (TI_HANDLE hAdmCtrl,
211                           TI_HANDLE hMlme,
212                           TI_HANDLE hRx,
213                           TI_HANDLE hReport,
214                           TI_HANDLE hOs,
215                           struct _rsn_t *pRsn,
216                           TI_HANDLE hXCCMngr,
217                           TI_HANDLE hPowerMgr,
218                           TI_HANDLE hEvHandler,
219                           TI_HANDLE hTimer,
220                           TI_HANDLE hCurrBss,
221                           TRsnInitParams *pInitParam)
222 {
223     admCtrl_t       *pAdmCtrl;
224     TI_STATUS           status;
225 
226     if (hAdmCtrl == NULL)
227     {
228         return TI_NOK;
229     }
230 
231     pAdmCtrl = (admCtrl_t*)hAdmCtrl;
232 
233     pAdmCtrl->pRsn = pRsn;
234     pAdmCtrl->hMlme = hMlme;
235     pAdmCtrl->hRx = hRx;
236     pAdmCtrl->hReport = hReport;
237     pAdmCtrl->hOs = hOs;
238     pAdmCtrl->hXCCMngr = hXCCMngr;
239     pAdmCtrl->hPowerMgr = hPowerMgr;
240     pAdmCtrl->hEvHandler = hEvHandler;
241     pAdmCtrl->hTimer = hTimer;
242     pAdmCtrl->hCurrBss = hCurrBss;
243 
244     /* Initialize admission control parameters */
245     pAdmCtrl->role = RSN_PAE_SUPP;
246     pAdmCtrl->networkMode = RSN_INFRASTRUCTURE;
247     pAdmCtrl->authSuite = pInitParam->authSuite;
248     pAdmCtrl->externalAuthMode = pInitParam->externalAuthMode;
249     pAdmCtrl->mixedMode = pInitParam->mixedMode;
250 
251     if (pInitParam->privacyOn)
252     {
253         pAdmCtrl->broadcastSuite = TWD_CIPHER_WEP;
254         pAdmCtrl->unicastSuite = TWD_CIPHER_WEP;
255     } else {
256         pAdmCtrl->broadcastSuite = TWD_CIPHER_NONE;
257         pAdmCtrl->unicastSuite = TWD_CIPHER_NONE;
258     }
259 
260     pAdmCtrl->preAuthSupport     = pInitParam->preAuthSupport;
261     pAdmCtrl->preAuthTimeout     = pInitParam->preAuthTimeout;
262     pAdmCtrl->WPAMixedModeEnable = pInitParam->WPAMixedModeEnable;
263     /*pAdmCtrl->PMKIDCandListDelay = pInitParam->PMKIDCandListDelay;*/
264     pAdmCtrl->MaxNumOfPMKIDs     = PMKID_MAX_NUMBER;
265 
266     /* Initialize admission control member functions */
267     pAdmCtrl->setAuthSuite = admCtrl_setAuthSuite;
268     pAdmCtrl->setNetworkMode = admCtrl_setNetworkMode;
269     pAdmCtrl->getAuthSuite = admCtrl_getAuthSuite;
270     pAdmCtrl->setExtAuthMode = admCtrl_setExtAuthMode;
271     pAdmCtrl->getExtAuthMode = admCtrl_getExtAuthMode;
272     pAdmCtrl->setUcastSuite = admCtrl_setUcastSuite;
273     pAdmCtrl->setBcastSuite = admCtrl_setBcastSuite;
274     pAdmCtrl->getCipherSuite = admCtrl_getCipherSuite;
275     pAdmCtrl->setKeyMngSuite = admCtrl_setKeyMngSuite;
276     pAdmCtrl->getMixedMode = admCtrl_getMixedMode;
277     pAdmCtrl->setMixedMode = admCtrl_setMixedMode;
278     pAdmCtrl->getAuthEncrCap = admCtrl_getAuthEncrCapability;
279     pAdmCtrl->getPmkidList   = admCtrl_nullGetPMKIDlist;
280     pAdmCtrl->setPmkidList   = admCtrl_nullSetPMKIDlist;
281     pAdmCtrl->resetPmkidList = admCtrl_resetPMKIDlist;
282     pAdmCtrl->getPromoteFlags = admCtrl_getPromoteFlags;
283     pAdmCtrl->setPromoteFlags = admCtrl_setPromoteFlags;
284     pAdmCtrl->getWPAMixedModeSupport = admCtrl_getWPAMixedModeSupport;
285 #ifdef XCC_MODULE_INCLUDED
286     pAdmCtrl->setNetworkEap = admCtrl_setNetworkEap;
287     pAdmCtrl->getNetworkEap = admCtrl_getNetworkEap;
288     pAdmCtrl->networkEapMode = OS_XCC_NETWORK_EAP_OFF;
289 #endif
290 
291     pAdmCtrl->getPreAuthStatus = admCtrl_nullGetPreAuthStatus;
292     pAdmCtrl->startPreAuth  = admCtrl_nullStartPreAuth;
293     pAdmCtrl->get802_1x_AkmExists = admCtrl_nullGet802_1x_AkmExists;
294     /* Zero number of sent wpa2 preauthentication candidates */
295     pAdmCtrl->numberOfPreAuthCandidates = 0;
296 
297     /* Create hPreAuthTimerWpa2 timer */
298     pAdmCtrl->hPreAuthTimerWpa2 = tmr_CreateTimer (pAdmCtrl->hTimer);
299     if (pAdmCtrl->hPreAuthTimerWpa2 == NULL)
300     {
301         TRACE0(pAdmCtrl->hReport, REPORT_SEVERITY_ERROR , "admCtrl_config(): Failed to create hPreAuthTimerWpa2!\n");
302     }
303 
304     status = admCtrl_subConfig(pAdmCtrl);
305 
306     return status;
307 }
308 
309 /**
310 *
311 * admCtrl_subConfig
312 *
313 * \b Description:
314 *
315 * Configure the admission control module according to the Privacy Mode.
316 *
317 * \b ARGS:
318 *
319 *  I   - pAdmCtrl - pointer to admission cotrol context  \n
320 *
321 * \b RETURNS:
322 *
323 *  TI_OK on success, TI_NOK on failure.
324 *
325 * \sa
326 */
admCtrl_subConfig(TI_HANDLE hAdmCtrl)327 TI_STATUS admCtrl_subConfig(TI_HANDLE hAdmCtrl)
328 
329 {
330     admCtrl_t* pAdmCtrl = (admCtrl_t*)hAdmCtrl;
331     TI_STATUS status;
332 
333     switch(pAdmCtrl->externalAuthMode)
334     {
335     case RSN_EXT_AUTH_MODE_WPA:
336     case RSN_EXT_AUTH_MODE_WPAPSK:
337     case RSN_EXT_AUTH_MODE_WPANONE:
338         status = admCtrlWpa_config(pAdmCtrl);
339         break;
340 
341     case RSN_EXT_AUTH_MODE_WPA2:
342     case RSN_EXT_AUTH_MODE_WPA2PSK:
343         status = admCtrlWpa2_config(pAdmCtrl);
344         break;
345 
346     default:
347         if(pAdmCtrl->unicastSuite==TWD_CIPHER_NONE)
348         {
349             status = admCtrlNone_config(pAdmCtrl);
350         }
351         else
352         {
353             status = admCtrlWep_config(pAdmCtrl);
354         }
355         break;
356 
357     }
358 
359     return status;
360 
361 }
362 
363 /**
364 *
365 * admCtrl_setNetworkMode - Change current network mode.
366 *
367 * \b Description:
368 *
369 * Change current network mode.
370 *
371 * \b ARGS:
372 *
373 *  I   - pAdmCtrl - context \n
374 *  I   - mode - network association mode (Infustrucure/IBSS) \n
375 *
376 * \b RETURNS:
377 *
378 *  TI_OK on success, TI_NOK on failure.
379 *
380 * \sa
381 */
admCtrl_setNetworkMode(admCtrl_t * pAdmCtrl,ERsnNetworkMode mode)382 TI_STATUS admCtrl_setNetworkMode(admCtrl_t *pAdmCtrl, ERsnNetworkMode mode)
383 {
384     pAdmCtrl->networkMode = mode;
385 
386     return TI_OK;
387 }
388 
389 /**
390 *
391 * admCtrl_setAuthSuite - Change current authentication suite.
392 *
393 * \b Description:
394 *
395 * Change current authentication suite.
396 *
397 * \b ARGS:
398 *
399 *  I   - pAdmCtrl - context \n
400 *  I   - authSuite - authentication suite to work with \n
401 *
402 * \b RETURNS:
403 *
404 *  TI_OK on success, TI_NOK on failure.
405 *
406 * \sa
407 */
admCtrl_setAuthSuite(admCtrl_t * pAdmCtrl,EAuthSuite authSuite)408 TI_STATUS admCtrl_setAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite authSuite)
409 {
410     TI_STATUS       status = TI_NOK;
411 
412     if (pAdmCtrl == NULL)
413     {
414         return TI_NOK;
415     }
416 
417     if (pAdmCtrl->authSuite == authSuite)
418     {
419         return TI_OK;
420     }
421 
422     if (pAdmCtrl->authSuite > RSN_AUTH_AUTO_SWITCH)
423     {
424         return TI_NOK;
425     }
426     pAdmCtrl->externalAuthMode = (EExternalAuthMode)authSuite;
427     pAdmCtrl->authSuite = authSuite;
428     status = admCtrl_subConfig(pAdmCtrl);
429     return status;
430 }
431 
432 
433 /**
434 *
435 * admCtrl_getAuthSuite  - Get current authentication suite.
436 *
437 * \b Description:
438 *
439 * Get current authentication suite.
440 *
441 * \b ARGS:
442 *
443 *  I   - pAdmCtrl - context \n
444 *  O   - suite - key management suite to work with \n
445 *
446 * \b RETURNS:
447 *
448 *  TI_OK on success, TI_NOK on failure.
449 *
450 * \sa
451 */
admCtrl_getAuthSuite(admCtrl_t * pAdmCtrl,EAuthSuite * pSuite)452 TI_STATUS admCtrl_getAuthSuite(admCtrl_t *pAdmCtrl, EAuthSuite *pSuite)
453 {
454     if (pAdmCtrl == NULL)
455     {
456         return TI_NOK;
457     }
458 
459     *pSuite = pAdmCtrl->authSuite;
460 
461     return TI_OK;
462 }
463 
464 /**
465 *
466 * admCtrl_setExtAuthMode  - Set current External authentication Mode Status.
467 *
468 * \b Description:
469 *
470 * Set current External authentication Mode Status.
471 *
472 * \b ARGS:
473 *
474 *  I   - pAdmCtrl - context \n
475 *  I   - extAuthMode - External authentication Mode \n
476 *
477 * \b RETURNS:
478 *
479 *  TI_OK on success, TI_NOK on failure.
480 *
481 * \sa
482 */
admCtrl_setExtAuthMode(admCtrl_t * pAdmCtrl,EExternalAuthMode extAuthMode)483 TI_STATUS admCtrl_setExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode extAuthMode)
484 {
485 
486     if (extAuthMode >= RSN_EXT_AUTH_MODEMAX)
487     {
488         return TI_NOK;
489     }
490 
491 
492     if (pAdmCtrl->externalAuthMode == extAuthMode)
493     {
494         return TI_OK;
495     }
496     pAdmCtrl->externalAuthMode = extAuthMode;
497     if (extAuthMode <= RSN_EXT_AUTH_MODE_AUTO_SWITCH)
498     {
499         pAdmCtrl->authSuite = (EAuthSuite)extAuthMode;
500     }
501     else
502     {
503         pAdmCtrl->authSuite = RSN_AUTH_OPEN;
504     }
505 
506     return (admCtrl_subConfig(pAdmCtrl));
507 }
508 
509 /**
510 *
511 * admCtrl_getExtAuthMode  - Get current External authentication Mode Status.
512 *
513 * \b Description:
514 *
515 * Get current External Mode Status.
516 *
517 * \b ARGS:
518 *
519 *  I   - pAdmCtrl - context \n
520 *  I   - pExtAuthMode - XCC External Mode Status \n
521 *
522 * \b RETURNS:
523 *
524 *  TI_OK on success, TI_NOK on failure.
525 *
526 * \sa
527 */
admCtrl_getExtAuthMode(admCtrl_t * pAdmCtrl,EExternalAuthMode * pExtAuthMode)528 TI_STATUS admCtrl_getExtAuthMode(admCtrl_t *pAdmCtrl, EExternalAuthMode *pExtAuthMode)
529 {
530     *pExtAuthMode = pAdmCtrl->externalAuthMode;
531 
532     return TI_OK;
533 }
534 
535 
536 /**
537 *
538 * admCtrl_checkSetSuite -
539 *
540 * \b Description:
541 *
542 * Check the validity/support of the cipher suite according to
543 * the admission control parameters
544 *
545 * \b ARGS:
546 *
547 *  I   - pAdmCtrl - context \n
548 *  I   - suite - cipher suite to check \n
549 *
550 * \b RETURNS:
551 *
552 *  TI_OK on success, TI_NOK on failure.
553 *
554 * \sa
555 */
admCtrl_checkSetSuite(admCtrl_t * pAdmCtrl,ECipherSuite suite,TI_BOOL Broadcast)556 TI_STATUS admCtrl_checkSetSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite, TI_BOOL Broadcast)
557 {
558     if (pAdmCtrl->externalAuthMode<=RSN_EXT_AUTH_MODE_AUTO_SWITCH)
559     {
560         if ((suite==TWD_CIPHER_NONE) || (suite==TWD_CIPHER_WEP) || (suite==TWD_CIPHER_WEP104))
561         {
562             return TI_OK;
563         }
564 #ifdef GEM_SUPPORTED
565 		else if (suite==TWD_CIPHER_GEM)
566 			{
567 				return TI_OK;
568 			}
569 #endif
570     }
571     else
572     {
573         if ((suite==TWD_CIPHER_TKIP) || (suite==TWD_CIPHER_WEP) ||
574             (suite==TWD_CIPHER_WEP104) || (suite==TWD_CIPHER_AES_CCMP))
575         {
576             return TI_OK;
577         }
578 #ifdef GEM_SUPPORTED
579 		else if (suite==TWD_CIPHER_GEM)
580 			{
581 				return TI_OK;
582 			}
583 #endif
584         else if (!Broadcast && (suite==TWD_CIPHER_NONE))
585         {
586             return TI_OK;
587         }
588     }
589     return TI_NOK;
590 }
591 
592 /**
593 *
594 * admCtrl_setUcastSuite  - Set current unicast cipher suite support.
595 *
596 * \b Description:
597 *
598 * Set current unicast cipher suite support.
599 *
600 * \b ARGS:
601 *
602 *  I   - pAdmCtrl - context \n
603 *  I   - suite - cipher suite to work with \n
604 *
605 * \b RETURNS:
606 *
607 *  TI_OK on success, TI_NOK on failure.
608 *
609 * \sa
610 */
admCtrl_setUcastSuite(admCtrl_t * pAdmCtrl,ECipherSuite suite)611 TI_STATUS admCtrl_setUcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite)
612 {
613     TI_STATUS status;
614 
615     if (suite == pAdmCtrl->unicastSuite)
616     {
617         return TI_OK;
618     }
619     status = admCtrl_checkSetSuite(pAdmCtrl, suite, TI_FALSE);
620     if (status == TI_OK)
621     {
622         pAdmCtrl->unicastSuite = suite;
623         status = admCtrl_subConfig(pAdmCtrl);
624     }
625 
626     return status;
627 }
628 
629 /**
630 *
631 * admCtrl_setBcastSuite  - Set current broadcast cipher suite support.
632 *
633 * \b Description:
634 *
635 * Set current broadcast cipher suite support.
636 *
637 * \b ARGS:
638 *
639 *  I   - pAdmCtrl - context \n
640 *  I   - suite - cipher suite to work with \n
641 *
642 * \b RETURNS:
643 *
644 *  TI_OK on success, TI_NOK on failure.
645 *
646 * \sa
647 */
admCtrl_setBcastSuite(admCtrl_t * pAdmCtrl,ECipherSuite suite)648 TI_STATUS admCtrl_setBcastSuite(admCtrl_t *pAdmCtrl, ECipherSuite suite)
649 {
650     TI_STATUS status;
651 
652     if (suite == pAdmCtrl->broadcastSuite)
653     {
654         return TI_OK;
655     }
656 
657     status = admCtrl_checkSetSuite(pAdmCtrl, suite, TI_TRUE);
658     if (status == TI_OK)
659     {
660         pAdmCtrl->broadcastSuite = suite;
661         status = admCtrl_subConfig(pAdmCtrl);
662     }
663     return status;
664 
665 }
666 
667 /**
668 *
669 * admCtrl_getCipherSuite  - Set current broadcast cipher suite support.
670 *
671 * \b Description:
672 *
673 * Set current broadcast cipher suite support.
674 *
675 * \b ARGS:
676 *
677 *  I   - pAdmCtrl - context \n
678 *  O   - suite - cipher suite to work with \n
679 *
680 * \b RETURNS:
681 *
682 *  TI_OK on success, TI_NOK on failure.
683 *
684 * \sa
685 */
admCtrl_getCipherSuite(admCtrl_t * pAdmCtrl,ECipherSuite * pSuite)686 TI_STATUS admCtrl_getCipherSuite(admCtrl_t *pAdmCtrl, ECipherSuite *pSuite)
687 {
688     if (pAdmCtrl == NULL)
689     {
690         return TI_NOK;
691     }
692 
693     *pSuite = (pAdmCtrl->broadcastSuite > pAdmCtrl->unicastSuite) ? pAdmCtrl->broadcastSuite :pAdmCtrl->unicastSuite;
694 
695     return TI_OK;
696 }
697 
698 /**
699 *
700 * admCtrl_setKeyMngSuite  - Set current key management suite support.
701 *
702 * \b Description:
703 *
704 * Set current key management suite support.
705 *
706 * \b ARGS:
707 *
708 *  I   - pAdmCtrl - context \n
709 *  I   - suite - key management suite to work with \n
710 *
711 * \b RETURNS:
712 *
713 *  TI_OK on success, TI_NOK on failure.
714 *
715 * \sa
716 */
admCtrl_setKeyMngSuite(admCtrl_t * pAdmCtrl,ERsnKeyMngSuite suite)717 TI_STATUS admCtrl_setKeyMngSuite(admCtrl_t *pAdmCtrl, ERsnKeyMngSuite suite)
718 {
719     pAdmCtrl->keyMngSuite = suite;
720 
721     return TI_OK;
722 }
723 
724 
725 /**
726 *
727 * admCtrl_parseIe  - Parse a required information element.
728 *
729 * \b Description:
730 *
731 * Parse an Aironet information element.
732 * Builds a structure of all the capabilities described in the Aironet IE.
733 * We look at Flags field only to determine KP and MIC bits value
734 *
735 * \b ARGS:
736 *
737 *  I   - pAdmCtrl - pointer to admCtrl context
738 *  I   - pAironetIe - pointer to Aironet IE buffer  \n
739 *  O   - pAironetData - capabilities structure
740 *
741 *
742 * \b RETURNS:
743 *
744 * TI_OK on success, TI_NOK on failure.
745 *
746 * \sa
747 */
admCtrl_parseIe(admCtrl_t * pAdmCtrl,TRsnData * pRsnData,TI_UINT8 ** pIe,TI_UINT8 IeId)748 TI_STATUS admCtrl_parseIe(admCtrl_t *pAdmCtrl, TRsnData *pRsnData, TI_UINT8 **pIe, TI_UINT8 IeId)
749 {
750 
751     dot11_eleHdr_t      *eleHdr;
752     TI_INT16             length;
753     TI_UINT8            *pCurIe;
754 
755 
756     *pIe = NULL;
757 
758     if ((pRsnData == NULL) || (pRsnData->ieLen==0))
759     {
760        return TI_OK;
761     }
762 
763     pCurIe = pRsnData->pIe;
764 
765     length = pRsnData->ieLen;
766     while (length>0)
767     {
768         eleHdr = (dot11_eleHdr_t*)pCurIe;
769 
770         if (length<((*eleHdr)[1] + 2))
771         {
772             TRACE2(pAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "admCtrl_parseIe ERROR: pRsnData->ieLen=%d, length=%d\n\n", pRsnData->ieLen,length);
773             return TI_OK;
774         }
775 
776         if ((*eleHdr)[0] == IeId)
777         {
778             *pIe = (TI_UINT8*)eleHdr;
779             break;
780         }
781         length -= (*eleHdr)[1] + 2;
782         pCurIe += (*eleHdr)[1] + 2;
783     }
784     return TI_OK;
785 }
786 
787 /**
788 *
789 * admCtrl_setMixedMode  - Set current mixed Mode Status.
790 *
791 * \b Description:
792 *
793 * Set current mixed Mode Status.
794 *
795 * \b ARGS:
796 *
797 *  I   - pAdmCtrl - context \n
798 *  I   - authMode - mixed Mode \n
799 *
800 * \b RETURNS:
801 *
802 *  TI_OK on success, TI_NOK on failure.
803 *
804 * \sa
805 */
admCtrl_setMixedMode(admCtrl_t * pAdmCtrl,TI_BOOL mixedMode)806 TI_STATUS admCtrl_setMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL mixedMode)
807 {
808 
809     if (pAdmCtrl->mixedMode == mixedMode)
810     {
811         return TI_OK;
812     }
813     pAdmCtrl->mixedMode = mixedMode;
814 
815     return TI_OK;
816 }
817 
818 /**
819 *
820 * admCtrl_getMixedMode  - Get current mixed Mode Status.
821 *
822 * \b Description:
823 *
824 * Get current mixed Mode Status.
825 *
826 * \b ARGS:
827 *
828 *  I   - pAdmCtrl - context \n
829 *  I   - pAuthMode - mixed Mode Status \n
830 *
831 * \b RETURNS:
832 *
833 *  TI_OK on success, TI_NOK on failure.
834 *
835 * \sa
836 */
admCtrl_getMixedMode(admCtrl_t * pAdmCtrl,TI_BOOL * pMixedMode)837 TI_STATUS admCtrl_getMixedMode(admCtrl_t *pAdmCtrl, TI_BOOL *pMixedMode)
838 {
839     *pMixedMode = pAdmCtrl->mixedMode;
840 
841     return TI_OK;
842 }
843 
844 
845 
846 /* This table presents supported pairs of auth.mode/cipher type */
847 static  authEncrPairList_t  supportedAuthEncrPairs[MAX_AUTH_ENCR_PAIR] =
848 {
849     {RSN_EXT_AUTH_MODE_OPEN,       TWD_CIPHER_NONE},
850     {RSN_EXT_AUTH_MODE_OPEN,       TWD_CIPHER_WEP},
851     {RSN_EXT_AUTH_MODE_SHARED_KEY, TWD_CIPHER_NONE},
852     {RSN_EXT_AUTH_MODE_SHARED_KEY, TWD_CIPHER_WEP},
853     {RSN_EXT_AUTH_MODE_WPA,        TWD_CIPHER_TKIP},
854     {RSN_EXT_AUTH_MODE_WPA,        TWD_CIPHER_AES_CCMP},
855     {RSN_EXT_AUTH_MODE_WPAPSK,     TWD_CIPHER_TKIP},
856     {RSN_EXT_AUTH_MODE_WPAPSK,     TWD_CIPHER_AES_CCMP},
857     {RSN_EXT_AUTH_MODE_WPANONE,    TWD_CIPHER_NONE},    /* No encryption in IBSS mode */
858     {RSN_EXT_AUTH_MODE_WPA2,       TWD_CIPHER_TKIP},
859     {RSN_EXT_AUTH_MODE_WPA2,       TWD_CIPHER_AES_CCMP},
860     {RSN_EXT_AUTH_MODE_WPA2PSK,    TWD_CIPHER_TKIP},
861     {RSN_EXT_AUTH_MODE_WPA2PSK,    TWD_CIPHER_AES_CCMP}
862 };
863 
864 /**
865 *
866 * admCtrl_getAuthEncrCapability  - Get all supported pais of
867 *                                  authenticationmode/cipher suite
868 *
869 * \b Description:
870 *
871 *    Returns all supported pais of authenticationmode/cipher suite
872 *
873 * \b ARGS:
874 *
875 *  I   - pAdmCtrl - context \n
876 *  I   - authEncrCapability - ptr to list of auth.mode/cipher pairs \n
877 *
878 * \b RETURNS:
879 *
880 *  TI_OK on success, TI_NOK on failure.
881 *
882 * \sa
883 */
884 
admCtrl_getAuthEncrCapability(admCtrl_t * pAdmCtrl,rsnAuthEncrCapability_t * authEncrCapability)885 TI_STATUS admCtrl_getAuthEncrCapability(admCtrl_t *pAdmCtrl,
886                                         rsnAuthEncrCapability_t   *authEncrCapability)
887 {
888     int i = 0;
889 
890     if(!authEncrCapability)
891         return TI_NOK;
892 
893     /* The current driver code version  uses the above hardcoded list */
894     /* of auth/encr pairs */
895 
896     authEncrCapability->NoOfAuthEncrPairSupported = MAX_AUTH_ENCR_PAIR;
897     authEncrCapability->NoOfPMKIDs                = PMKID_MAX_NUMBER;
898 
899     TRACE2(pAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "admCtrl get AuthEncr capability:  No. of auth/encr pairs = %d, No of PMKIDs = %d \n", authEncrCapability->NoOfAuthEncrPairSupported, authEncrCapability->NoOfPMKIDs);
900 
901     /* Copy the hardcoded table of the auth.mode/cipher type */
902     for (i = 0; i < MAX_AUTH_ENCR_PAIR; i++)
903     {
904         authEncrCapability->authEncrPairs[i].authenticationMode =
905             supportedAuthEncrPairs[i].authenticationMode;
906         authEncrCapability->authEncrPairs[i].cipherSuite        =
907             supportedAuthEncrPairs[i].cipherSuite;
908 
909         TRACE3(pAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "admCtrl get AuthEncr pair list: i = %d, auth mode = %d , cipher suite = %d \n", i, authEncrCapability->authEncrPairs[i].authenticationMode, authEncrCapability->authEncrPairs[i].cipherSuite);
910     }
911 
912     return TI_OK;
913 }
914 
915 
admCtrl_nullSetPMKIDlist(admCtrl_t * pAdmCtrl,OS_802_11_PMKID * pmkIdList)916 TI_STATUS admCtrl_nullSetPMKIDlist(admCtrl_t *pAdmCtrl, OS_802_11_PMKID  *pmkIdList)
917 {
918 
919     return CONFIGURATION_NOT_VALID;
920 }
921 
admCtrl_nullGetPMKIDlist(admCtrl_t * pAdmCtrl,OS_802_11_PMKID * pmkIdList)922 TI_STATUS admCtrl_nullGetPMKIDlist(admCtrl_t *pAdmCtrl, OS_802_11_PMKID  *pmkIdList)
923 {
924 
925     return CONFIGURATION_NOT_VALID;
926 }
927 
928 
admCtrl_resetPMKIDlist(admCtrl_t * pAdmCtrl)929 TI_STATUS admCtrl_resetPMKIDlist(admCtrl_t *pAdmCtrl)
930 {
931 
932     os_memoryZero(pAdmCtrl->hOs, (void*)&pAdmCtrl->pmkid_cache, sizeof(pmkid_cache_t));
933     return TI_OK;
934 }
935 
admCtrl_getWPAMixedModeSupport(admCtrl_t * pAdmCtrl,TI_UINT32 * support)936 TI_STATUS admCtrl_getWPAMixedModeSupport(admCtrl_t *pAdmCtrl, TI_UINT32 *support)
937 {
938 
939     if(pAdmCtrl->WPAMixedModeEnable)
940        *support = ADMCTRL_WPA_OPTION_MAXVALUE;
941     else
942        *support = 0;
943 
944     return TI_OK;
945 }
946 
admCtrl_getPromoteFlags(admCtrl_t * pAdmCtrl,TI_UINT32 * WPAPromoteFlags)947 TI_STATUS admCtrl_getPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 *WPAPromoteFlags)
948 {
949     *WPAPromoteFlags = pAdmCtrl->WPAPromoteFlags;
950     return TI_OK;
951 }
952 
admCtrl_setPromoteFlags(admCtrl_t * pAdmCtrl,TI_UINT32 WPAPromoteFlags)953 TI_STATUS admCtrl_setPromoteFlags(admCtrl_t *pAdmCtrl, TI_UINT32 WPAPromoteFlags)
954 {
955     if(WPAPromoteFlags > ADMCTRL_WPA_OPTION_MAXVALUE)
956         return TI_NOK;
957 
958     if(!pAdmCtrl->WPAMixedModeEnable)
959        return TI_NOK;
960 
961     pAdmCtrl->WPAPromoteFlags = WPAPromoteFlags;
962     return TI_OK;
963 }
964 
admCtrl_nullGetPreAuthStatus(admCtrl_t * pAdmCtrl,TMacAddr * givenAP,TI_UINT8 * cacheIndex)965 TI_BOOL admCtrl_nullGetPreAuthStatus(admCtrl_t *pAdmCtrl, TMacAddr *givenAP, TI_UINT8 *cacheIndex)
966 {
967     return TI_FALSE;
968 }
969 
970 
admCtrl_nullStartPreAuth(admCtrl_t * pAdmCtrl,TBssidList4PreAuth * pBssidList)971 TI_STATUS admCtrl_nullStartPreAuth(admCtrl_t *pAdmCtrl, TBssidList4PreAuth *pBssidList)
972 {
973     return TI_OK;
974 }
975 
admCtrl_nullGet802_1x_AkmExists(admCtrl_t * pAdmCtrl,TI_BOOL * wpa_802_1x_AkmExists)976 TI_STATUS admCtrl_nullGet802_1x_AkmExists (admCtrl_t *pAdmCtrl, TI_BOOL *wpa_802_1x_AkmExists)
977 {
978     *wpa_802_1x_AkmExists = TI_FALSE;
979     return TI_OK;
980 }
981 
982 /*-----------------------------------------------------------------------------
983 Routine Name: admCtrl_notifyPreAuthStatus
984 Routine Description: This routine is used to notify higher level application of the pre-authentication status
985 Arguments: newStatus - pre authentication status
986 Return Value:
987 -----------------------------------------------------------------------------*/
admCtrl_notifyPreAuthStatus(admCtrl_t * pAdmCtrl,preAuthStatusEvent_e newStatus)988 void admCtrl_notifyPreAuthStatus (admCtrl_t *pAdmCtrl, preAuthStatusEvent_e newStatus)
989 {
990     TI_UINT32 memBuff;
991 
992     memBuff = (TI_UINT32) newStatus;
993 
994     EvHandlerSendEvent(pAdmCtrl->hEvHandler, IPC_EVENT_WPA2_PREAUTHENTICATION,
995                             (TI_UINT8*)&memBuff, sizeof(TI_UINT32));
996 
997 }
998 
999 #ifdef XCC_MODULE_INCLUDED
1000 
1001 /**
1002 *
1003 * admCtrl_setNetworkEap  - Set current Network EAP Mode Status.
1004 *
1005 * \b Description:
1006 *
1007 * Set current Network EAP Mode Status..
1008 *
1009 * \b ARGS:
1010 *
1011 *  I   - pAdmCtrl - context \n
1012 *  I   - networkEap - Network EAP Mode \n
1013 *
1014 * \b RETURNS:
1015 *
1016 *  TI_OK on success, TI_NOK on failure.
1017 *
1018 * \sa
1019 */
admCtrl_setNetworkEap(admCtrl_t * pAdmCtrl,OS_XCC_NETWORK_EAP networkEap)1020 TI_STATUS admCtrl_setNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP networkEap)
1021 {
1022     if (pAdmCtrl==NULL)
1023         return TI_NOK;
1024 
1025     if (pAdmCtrl->networkEapMode == networkEap)
1026     {
1027         return TI_OK;
1028     }
1029     pAdmCtrl->networkEapMode = networkEap;
1030 
1031     return TI_OK;
1032 }
1033 
1034 /**
1035 *
1036 * admCtrl_getNetworkEap  - Get current Network EAP Mode Status.
1037 *
1038 * \b Description:
1039 *
1040 * Get current Network EAP Mode Status.
1041 *
1042 * \b ARGS:
1043 *
1044 *  I   - pAdmCtrl - context \n
1045 *  I   - networkEap - Network EAP Mode \n
1046 *
1047 * \b RETURNS:
1048 *
1049 *  TI_OK on success, TI_NOK on failure.
1050 *
1051 * \sa
1052 */
admCtrl_getNetworkEap(admCtrl_t * pAdmCtrl,OS_XCC_NETWORK_EAP * networkEap)1053 TI_STATUS admCtrl_getNetworkEap(admCtrl_t *pAdmCtrl, OS_XCC_NETWORK_EAP *networkEap)
1054 {
1055 
1056     if (pAdmCtrl==NULL)
1057     {
1058         return TI_NOK;
1059     }
1060 
1061     switch (pAdmCtrl->networkEapMode)
1062     {
1063     case OS_XCC_NETWORK_EAP_OFF:
1064         *networkEap = OS_XCC_NETWORK_EAP_OFF;
1065         break;
1066     case OS_XCC_NETWORK_EAP_ON:
1067     case OS_XCC_NETWORK_EAP_ALLOWED:
1068     case OS_XCC_NETWORK_EAP_PREFERRED:
1069         *networkEap = OS_XCC_NETWORK_EAP_ON;
1070         break;
1071     default:
1072         return TI_NOK;
1073 /*      break; - unreachable */
1074     }
1075 
1076     return TI_OK;
1077 }
1078 #endif /* XCC_MODULE_INCLUDED*/
1079 
1080