164064216a8433360745f69edddce19a606659163The Android Open Source Project/****************************************************************************
264064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
364064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
464064216a8433360745f69edddce19a606659163The Android Open Source Project**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
564064216a8433360745f69edddce19a606659163The Android Open Source Project**| All rights reserved.                                                  |**
664064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
764064216a8433360745f69edddce19a606659163The Android Open Source Project**| Redistribution and use in source and binary forms, with or without    |**
864064216a8433360745f69edddce19a606659163The Android Open Source Project**| modification, are permitted provided that the following conditions    |**
964064216a8433360745f69edddce19a606659163The Android Open Source Project**| are met:                                                              |**
1064064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1164064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions of source code must retain the above copyright     |**
1264064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer.      |**
1364064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions in binary form must reproduce the above copyright  |**
1464064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer in    |**
1564064216a8433360745f69edddce19a606659163The Android Open Source Project**|    the documentation and/or other materials provided with the         |**
1664064216a8433360745f69edddce19a606659163The Android Open Source Project**|    distribution.                                                      |**
1764064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Neither the name Texas Instruments nor the names of its            |**
1864064216a8433360745f69edddce19a606659163The Android Open Source Project**|    contributors may be used to endorse or promote products derived    |**
1964064216a8433360745f69edddce19a606659163The Android Open Source Project**|    from this software without specific prior written permission.      |**
2064064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
2164064216a8433360745f69edddce19a606659163The Android Open Source Project**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
2264064216a8433360745f69edddce19a606659163The Android Open Source Project**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
2364064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
2464064216a8433360745f69edddce19a606659163The Android Open Source Project**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
2564064216a8433360745f69edddce19a606659163The Android Open Source Project**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
2664064216a8433360745f69edddce19a606659163The Android Open Source Project**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
2764064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
2864064216a8433360745f69edddce19a606659163The Android Open Source Project**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
2964064216a8433360745f69edddce19a606659163The Android Open Source Project**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
3064064216a8433360745f69edddce19a606659163The Android Open Source Project**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
3164064216a8433360745f69edddce19a606659163The Android Open Source Project**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
3264064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
3364064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
3464064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************/
3564064216a8433360745f69edddce19a606659163The Android Open Source Project
3664064216a8433360745f69edddce19a606659163The Android Open Source Project/** \file admCtrlWpa2.c
3764064216a8433360745f69edddce19a606659163The Android Open Source Project *  \brief WPA2 Admission control methods
3864064216a8433360745f69edddce19a606659163The Android Open Source Project *
3964064216a8433360745f69edddce19a606659163The Android Open Source Project *  \see admCtrl.h
4064064216a8433360745f69edddce19a606659163The Android Open Source Project */
4164064216a8433360745f69edddce19a606659163The Android Open Source Project
4264064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osApi.h"
4364064216a8433360745f69edddce19a606659163The Android Open Source Project
4464064216a8433360745f69edddce19a606659163The Android Open Source Project#include "utils.h"
4564064216a8433360745f69edddce19a606659163The Android Open Source Project#include "paramOut.h"
4664064216a8433360745f69edddce19a606659163The Android Open Source Project#include "paramIn.h"
4764064216a8433360745f69edddce19a606659163The Android Open Source Project#include "mlmeApi.h"
4864064216a8433360745f69edddce19a606659163The Android Open Source Project#include "802_11Defs.h"
4964064216a8433360745f69edddce19a606659163The Android Open Source Project#include "DataCtrl_Api.h"
5064064216a8433360745f69edddce19a606659163The Android Open Source Project#include "report.h"
5164064216a8433360745f69edddce19a606659163The Android Open Source Project
5264064216a8433360745f69edddce19a606659163The Android Open Source Project/*
5364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "fsm.h"
5464064216a8433360745f69edddce19a606659163The Android Open Source Project#include "utils.h"
5564064216a8433360745f69edddce19a606659163The Android Open Source Project*/
5664064216a8433360745f69edddce19a606659163The Android Open Source Project
5764064216a8433360745f69edddce19a606659163The Android Open Source Project#include "rsn.h"
5864064216a8433360745f69edddce19a606659163The Android Open Source Project#include "admCtrl.h"
5964064216a8433360745f69edddce19a606659163The Android Open Source Project#include "admCtrlWpa2.h"
6064064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osDot11.h"
6164064216a8433360745f69edddce19a606659163The Android Open Source Project#include "siteMgrApi.h"
6264064216a8433360745f69edddce19a606659163The Android Open Source Project#include "EvHandler.h"
6364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "admCtrl.h"
6464064216a8433360745f69edddce19a606659163The Android Open Source Project
6564064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef EXC_MODULE_INCLUDED
6664064216a8433360745f69edddce19a606659163The Android Open Source Project#include "admCtrlWpa.h"
6764064216a8433360745f69edddce19a606659163The Android Open Source Project#include "admCtrlExc.h"
6864064216a8433360745f69edddce19a606659163The Android Open Source Project#include "excMngr.h"
6964064216a8433360745f69edddce19a606659163The Android Open Source Project#endif
7064064216a8433360745f69edddce19a606659163The Android Open Source Project
7164064216a8433360745f69edddce19a606659163The Android Open Source Project/* Constants */
7264064216a8433360745f69edddce19a606659163The Android Open Source Project#define MAX_NETWORK_MODE 2
7364064216a8433360745f69edddce19a606659163The Android Open Source Project#define MAX_WPA2_CIPHER_SUITE 6
7464064216a8433360745f69edddce19a606659163The Android Open Source Project
7564064216a8433360745f69edddce19a606659163The Android Open Source Project#define PMKID_CAND_LIST_MEMBUFF_SIZE  (2*sizeof(UINT32) + (sizeof(OS_802_11_PMKID_CANDIDATE) * PMKID_MAX_NUMBER))
7664064216a8433360745f69edddce19a606659163The Android Open Source Project#define PMKID_MIN_BUFFER_SIZE    2*sizeof(UINT32) + MAC_ADDR_LEN + PMKID_VALUE_SIZE
7764064216a8433360745f69edddce19a606659163The Android Open Source Project
7864064216a8433360745f69edddce19a606659163The Android Open Source Project#define TI_WLAN_COPY_UINT16_UNALIGNED(addr, val) {\
7964064216a8433360745f69edddce19a606659163The Android Open Source Project    *((UINT8 *) &(addr))   = (UINT8)(val & 0x00FF); \
8064064216a8433360745f69edddce19a606659163The Android Open Source Project    *((UINT8 *) &(addr) + 1)   = (UINT8)((val & 0xFF00) >> 8);}
8164064216a8433360745f69edddce19a606659163The Android Open Source Project
8264064216a8433360745f69edddce19a606659163The Android Open Source Project
8364064216a8433360745f69edddce19a606659163The Android Open Source Project/* Enumerations */
8464064216a8433360745f69edddce19a606659163The Android Open Source Project
8564064216a8433360745f69edddce19a606659163The Android Open Source Project/* Typedefs */
8664064216a8433360745f69edddce19a606659163The Android Open Source Project
8764064216a8433360745f69edddce19a606659163The Android Open Source Project/* Structures */
8864064216a8433360745f69edddce19a606659163The Android Open Source Project
8964064216a8433360745f69edddce19a606659163The Android Open Source Project/* External data definitions */
9064064216a8433360745f69edddce19a606659163The Android Open Source Project
9164064216a8433360745f69edddce19a606659163The Android Open Source Project/* Local functions definitions */
9264064216a8433360745f69edddce19a606659163The Android Open Source Project
9364064216a8433360745f69edddce19a606659163The Android Open Source Project/* Global variables */
9464064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic UINT8 wpa2IeOuiIe[3] = { 0x00, 0x0f, 0xac};
9564064216a8433360745f69edddce19a606659163The Android Open Source Project
9645544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt/**************************************************************/
9745544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt/* reduce stack usage (admCtrlWpa_setSite)*/
9845544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt/**************************************************************/
9945544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidtstatic   paramInfo_t         param;
10045544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidtstatic   whalParamInfo_t     whalParam;
10145544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidtstatic   wpa2IeData_t        wpa2DataIE;
10245544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt/**************************************************************/
10345544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt
10464064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic BOOL broadcastCipherSuiteValidity[MAX_NETWORK_MODE][MAX_WPA2_CIPHER_SUITE]=
10564064216a8433360745f69edddce19a606659163The Android Open Source Project{
10664064216a8433360745f69edddce19a606659163The Android Open Source Project    /* RSN_IBSS */  {
10764064216a8433360745f69edddce19a606659163The Android Open Source Project/* NONE       */    FALSE,
10864064216a8433360745f69edddce19a606659163The Android Open Source Project/* WEP40      */    FALSE,
10964064216a8433360745f69edddce19a606659163The Android Open Source Project/* TKIP       */    TRUE,
11064064216a8433360745f69edddce19a606659163The Android Open Source Project/* AES_WRAP   */    FALSE,
11164064216a8433360745f69edddce19a606659163The Android Open Source Project/* AES_CCMP   */    TRUE,
11264064216a8433360745f69edddce19a606659163The Android Open Source Project/* WEP104     */    FALSE},
11364064216a8433360745f69edddce19a606659163The Android Open Source Project
11464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* RSN_INFRASTRUCTURE */  {
11564064216a8433360745f69edddce19a606659163The Android Open Source Project/* NONE       */    FALSE,
11664064216a8433360745f69edddce19a606659163The Android Open Source Project/* WEP        */    TRUE,
11764064216a8433360745f69edddce19a606659163The Android Open Source Project/* TKIP       */    TRUE,
11864064216a8433360745f69edddce19a606659163The Android Open Source Project/* AES_WRAP   */    FALSE,
11964064216a8433360745f69edddce19a606659163The Android Open Source Project/* AES_CCMP   */    TRUE,
12064064216a8433360745f69edddce19a606659163The Android Open Source Project/* WEP104     */    TRUE}
12164064216a8433360745f69edddce19a606659163The Android Open Source Project};
12264064216a8433360745f69edddce19a606659163The Android Open Source Project
12364064216a8433360745f69edddce19a606659163The Android Open Source Project/** WPA2 admission table. Used to verify admission parameters to an AP */
12464064216a8433360745f69edddce19a606659163The Android Open Source Project/* table parameters:
12564064216a8433360745f69edddce19a606659163The Android Open Source Project    Max unicast cipher in the IE
12664064216a8433360745f69edddce19a606659163The Android Open Source Project    Max broadcast cipher in the IE
12764064216a8433360745f69edddce19a606659163The Android Open Source Project    Encryption status
12864064216a8433360745f69edddce19a606659163The Android Open Source Project*/
12964064216a8433360745f69edddce19a606659163The Android Open Source Projecttypedef struct
13064064216a8433360745f69edddce19a606659163The Android Open Source Project{
13164064216a8433360745f69edddce19a606659163The Android Open Source Project    TI_STATUS        status;
13264064216a8433360745f69edddce19a606659163The Android Open Source Project    cipherSuite_e    unicast;
13364064216a8433360745f69edddce19a606659163The Android Open Source Project    cipherSuite_e    broadcast;
13464064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8            evaluation;
13564064216a8433360745f69edddce19a606659163The Android Open Source Project} admCtrlWpa2_validity_t;
13664064216a8433360745f69edddce19a606659163The Android Open Source Project
13764064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic admCtrlWpa2_validity_t    admCtrlWpa2_validityTable[MAX_WPA2_CIPHER_SUITE][MAX_WPA2_CIPHER_SUITE][MAX_WPA2_CIPHER_SUITE] =
13864064216a8433360745f69edddce19a606659163The Android Open Source Project{
13964064216a8433360745f69edddce19a606659163The Android Open Source Project/* AP unicast NONE */ {
14064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast NONE */ {
14164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
14264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP40 */ { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
14364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
14464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WRAP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
14564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
14664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
14764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP40 */ {
14864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
14964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP40 */ { OK,  RSN_CIPHER_NONE, RSN_CIPHER_WEP ,1},
15064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
15164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WRAP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
15264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
15364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ OK,  RSN_CIPHER_NONE, RSN_CIPHER_WEP104 ,1}},
15464064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast TKIP */ {
15564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
15664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
15764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { OK,  RSN_CIPHER_NONE, RSN_CIPHER_TKIP ,2},
15864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WRAP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
15964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
16064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
16164064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WRAP */ {
16264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
16364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
16464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
16564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WRAP */  { OK,  RSN_CIPHER_NONE, RSN_CIPHER_AES_WRAP ,3},
16664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
16764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
16864064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast CCMP */ {
16964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
17064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
17164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
17264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WRAP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
17364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { OK,  RSN_CIPHER_NONE, RSN_CIPHER_AES_CCMP ,3},
17464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
17564064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP104 */ {
17664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
17764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP40 */ { OK,  RSN_CIPHER_NONE, RSN_CIPHER_WEP ,1},
17864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
17964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WRAP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
18064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
18164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ OK,  RSN_CIPHER_NONE, RSN_CIPHER_WEP104 ,1}}},
18264064216a8433360745f69edddce19a606659163The Android Open Source Project/* AP unicast WEP */  {
18364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast NONE */ {
18464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
18564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
18664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
18764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WRAP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
18864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
18964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
19064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP */ {
19164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
19264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
19364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
19464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WRAP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
19564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
19664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
19764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast TKIP */ {
19864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
19964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
20064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
20164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
20264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
20364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
20464064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WRAP */ {
20564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
20664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
20764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
20864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WRAP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
20964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
21064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
21164064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast CCMP */ {
21264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
21364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
21464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
21564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
21664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
21764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
21864064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP104 */ {
21964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
22064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
22164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
22264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
22364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
22464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}}},
22564064216a8433360745f69edddce19a606659163The Android Open Source Project/* AP unicast TKIP */  {
22664064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast NONE */ {
22764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
22864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
22964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
23064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
23164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
23264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
23364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP */ {
23464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
23564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
23664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { OK,  RSN_CIPHER_TKIP, RSN_CIPHER_WEP  ,4},
23764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
23864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
23964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
24064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast TKIP */ {
24164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
24264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
24364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { OK,  RSN_CIPHER_TKIP, RSN_CIPHER_TKIP ,7},
24464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
24564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
24664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
24764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WRAP */ {
24864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
24964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
25064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
25164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
25264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
25364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
25464064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast CCMP */ {
25564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
25664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
25764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
25864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
25964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
26064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
26164064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP104 */ {
26264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
26364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
26464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { OK,  RSN_CIPHER_TKIP, RSN_CIPHER_WEP104 ,4},
26564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
26664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
26764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}}},
26864064216a8433360745f69edddce19a606659163The Android Open Source Project/* AP unicast AES_WRAP */ {
26964064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast NONE */ {
27064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
27164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
27264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
27364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
27464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
27564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
27664064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP40 */ {
27764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
27864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
27964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
28064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { OK,  RSN_CIPHER_AES_WRAP, RSN_CIPHER_WEP ,5},
28164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
28264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
28364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast TKIP */ {
28464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
28564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
28664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
28764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { OK,  RSN_CIPHER_AES_WRAP, RSN_CIPHER_TKIP ,6},
28864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
28964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
29064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WRAP */ {
29164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
29264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
29364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
29464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { OK,  RSN_CIPHER_AES_WRAP, RSN_CIPHER_AES_WRAP ,8},
29564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
29664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
29764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast CCMP */ {
29864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
29964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
30064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
30164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
30264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
30364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
30464064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP104 */ {
30564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
30664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
30764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
30864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { OK,  RSN_CIPHER_AES_WRAP, RSN_CIPHER_WEP104 ,5},
30964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
31064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}}},
31164064216a8433360745f69edddce19a606659163The Android Open Source Project/* AP unicast AES_CCMP */ {
31264064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast NONE */ {
31364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
31464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
31564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
31664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
31764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
31864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
31964064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP */ {
32064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
32164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
32264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
32364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
32464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { OK,  RSN_CIPHER_AES_CCMP, RSN_CIPHER_WEP ,5},
32564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
32664064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast TKIP */ {
32764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
32864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
32964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { OK, RSN_CIPHER_AES_CCMP, RSN_CIPHER_TKIP ,6},
33064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
33164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { OK,  RSN_CIPHER_AES_CCMP, RSN_CIPHER_TKIP ,6},
33264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
33364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WRAP */ {
33464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
33564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
33664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
33764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
33864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
33964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
34064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast CCMP */ {
34164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
34264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
34364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { OK, RSN_CIPHER_AES_CCMP, RSN_CIPHER_AES_CCMP ,6},
34464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
34564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { OK, RSN_CIPHER_AES_CCMP, RSN_CIPHER_AES_CCMP ,8},
34664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
34764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP */ {
34864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
34964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
35064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
35164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
35264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { OK,  RSN_CIPHER_AES_CCMP, RSN_CIPHER_WEP104 ,5},
35364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}}},
35464064216a8433360745f69edddce19a606659163The Android Open Source Project/* AP unicast WEP104 */  {
35564064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast NONE */ {
35664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
35764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
35864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
35964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
36064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
36164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
36264064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP */ {
36364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
36464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
36564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
36664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
36764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
36864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
36964064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast TKIP */ {
37064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
37164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
37264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
37364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
37464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
37564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
37664064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WRAP */ {
37764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
37864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
37964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
38064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
38164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
38264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
38364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast CCMP */ {
38464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
38564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
38664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
38764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
38864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
38964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}},
39064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* AP multicast WEP104 */ {
39164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA NONE */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
39264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
39364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA TKIP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
39464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA AES */   { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
39564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA CCMP */  { NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0},
39664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* STA WEP104 */{ NOK, RSN_CIPHER_NONE, RSN_CIPHER_NONE ,0}}}
39764064216a8433360745f69edddce19a606659163The Android Open Source Project
39864064216a8433360745f69edddce19a606659163The Android Open Source Project
39964064216a8433360745f69edddce19a606659163The Android Open Source Project};
40064064216a8433360745f69edddce19a606659163The Android Open Source Project
40164064216a8433360745f69edddce19a606659163The Android Open Source Project
40264064216a8433360745f69edddce19a606659163The Android Open Source Project/* PMKID cache */
40364064216a8433360745f69edddce19a606659163The Android Open Source Project/* static wpa2_pmkid_cache_t wpa2_pmkid_cache; */
40464064216a8433360745f69edddce19a606659163The Android Open Source Project
40564064216a8433360745f69edddce19a606659163The Android Open Source Project/* Function prototypes */
40664064216a8433360745f69edddce19a606659163The Android Open Source Project
40764064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_parseIe(admCtrl_t *pAdmCtrl, UINT8 *pWpa2Ie, wpa2IeData_t *pWpa2Data);
40864064216a8433360745f69edddce19a606659163The Android Open Source ProjectUINT16 admCtrlWpa2_buildCapabilities(admCtrl_t *pAdmCtrl);
40964064216a8433360745f69edddce19a606659163The Android Open Source ProjectUINT32  admCtrlWpa2_parseSuiteVal(admCtrl_t *pAdmCtrl, UINT8* suiteVal, UINT32 maxVal, UINT32 unknownVal);
41064064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_checkCipherSuiteValidity(cipherSuite_e unicastSuite, cipherSuite_e broadcastSuite, cipherSuite_e encryptionStatus);
41164064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_getCipherSuiteMetric (admCtrl_t *pAdmCtrl, wpa2IeData_t *pWpa2Data, UINT32 *metric,
41264064216a8433360745f69edddce19a606659163The Android Open Source Project                                            cipherSuite_e *uSuite,  cipherSuite_e  *bSuite);
41364064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_DynamicConfig(admCtrl_t *pAdmCtrl, rsn_paeConfig_t *pPaeConfig);
41464064216a8433360745f69edddce19a606659163The Android Open Source Project
41564064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_resetPMKIDCache(admCtrl_t *pAdmCtrl);
41664064216a8433360745f69edddce19a606659163The Android Open Source Project/*TI_STATUS admCtrlWpa2_sendPMKIDCandListAfterDelay(admCtrl_t * pAdmCtrl, UINT32 delay);*/
41764064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_getPMKIDList(admCtrl_t * pAdmCtrl,OS_802_11_PMKID *pmkidList);
41864064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_setPMKIDList(admCtrl_t * pAdmCtrl, OS_802_11_PMKID *pmkidList);
41964064216a8433360745f69edddce19a606659163The Android Open Source Project
42064064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_addPMKID(admCtrl_t * pAdmCtrl, macAddress_t * pBSSID, pmkidValue_t pmkID);
42164064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_findPMKID(admCtrl_t * pAdmCtrl, macAddress_t *pBSSID,
42264064216a8433360745f69edddce19a606659163The Android Open Source Project                                pmkidValue_t *pPMKID, UINT8  *cacheIndex);
42364064216a8433360745f69edddce19a606659163The Android Open Source Project
42464064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic BOOL admCtrlWpa2_getPreAuthStatus(admCtrl_t *pAdmCtrl, macAddress_t *givenAP, UINT8  *cacheIndex);
42564064216a8433360745f69edddce19a606659163The Android Open Source Project
42664064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic TI_STATUS admCtrlWpa2_startPreAuth(admCtrl_t *pAdmCtrl, bssidList4PreAuth_t *pBssidList);
42764064216a8433360745f69edddce19a606659163The Android Open Source Project
42864064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic void admCtrlWpa2_buildAndSendPMKIDCandList(TI_HANDLE hHandle, bssidList4PreAuth_t *apList);
42964064216a8433360745f69edddce19a606659163The Android Open Source Project
43064064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic TI_STATUS admCtrlWpa2_get802_1x_AkmExists (admCtrl_t *pAdmCtrl, BOOL *wpa_802_1x_AkmExists);
43164064216a8433360745f69edddce19a606659163The Android Open Source Project
43264064216a8433360745f69edddce19a606659163The Android Open Source Project/**
43364064216a8433360745f69edddce19a606659163The Android Open Source Project*
43464064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa_config  - Configure EXC admission control.
43564064216a8433360745f69edddce19a606659163The Android Open Source Project*
43664064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
43764064216a8433360745f69edddce19a606659163The Android Open Source Project*
43864064216a8433360745f69edddce19a606659163The Android Open Source Project* Configure EXC admission control.
43964064216a8433360745f69edddce19a606659163The Android Open Source Project*
44064064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
44164064216a8433360745f69edddce19a606659163The Android Open Source Project*
44264064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl - context \n
44364064216a8433360745f69edddce19a606659163The Android Open Source Project*
44464064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
44564064216a8433360745f69edddce19a606659163The Android Open Source Project*
44664064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK on failure.
44764064216a8433360745f69edddce19a606659163The Android Open Source Project*
44864064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
44964064216a8433360745f69edddce19a606659163The Android Open Source Project*/
45064064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_config(admCtrl_t *pAdmCtrl)
45164064216a8433360745f69edddce19a606659163The Android Open Source Project{
45264064216a8433360745f69edddce19a606659163The Android Open Source Project    TI_STATUS           status;
45364064216a8433360745f69edddce19a606659163The Android Open Source Project    rsn_paeConfig_t     paeConfig;
45464064216a8433360745f69edddce19a606659163The Android Open Source Project
45564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* check and set admission control default parameters */
45664064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->authSuite =   RSN_AUTH_OPEN;
45764064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pAdmCtrl->unicastSuite == RSN_CIPHER_NONE)
45864064216a8433360745f69edddce19a606659163The Android Open Source Project    {
45964064216a8433360745f69edddce19a606659163The Android Open Source Project        pAdmCtrl->unicastSuite = RSN_CIPHER_AES_CCMP;
46064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
46164064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pAdmCtrl->broadcastSuite == RSN_CIPHER_NONE)
46264064216a8433360745f69edddce19a606659163The Android Open Source Project    {
46364064216a8433360745f69edddce19a606659163The Android Open Source Project        pAdmCtrl->broadcastSuite = RSN_CIPHER_AES_CCMP;
46464064216a8433360745f69edddce19a606659163The Android Open Source Project    }
46564064216a8433360745f69edddce19a606659163The Android Open Source Project
46664064216a8433360745f69edddce19a606659163The Android Open Source Project    /* set callback functions (API) */
46764064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->getInfoElement = admCtrlWpa2_getInfoElement;
46864064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->setSite  = admCtrlWpa2_setSite;
46964064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->evalSite = admCtrlWpa2_evalSite;
47064064216a8433360745f69edddce19a606659163The Android Open Source Project
47164064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->getPmkidList      = admCtrlWpa2_getPMKIDList;
47264064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->setPmkidList      = admCtrlWpa2_setPMKIDList;
47364064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->resetPmkidList    = admCtrlWpa2_resetPMKIDCache;
47464064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->getPreAuthStatus = admCtrlWpa2_getPreAuthStatus;
47564064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->startPreAuth = admCtrlWpa2_startPreAuth;
47664064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->get802_1x_AkmExists = admCtrlWpa2_get802_1x_AkmExists;
47764064216a8433360745f69edddce19a606659163The Android Open Source Project
47864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* set key management suite (AKMP) */
47964064216a8433360745f69edddce19a606659163The Android Open Source Project    switch (pAdmCtrl->externalAuthMode)
48064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
48164064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPA2:
48264064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPA2PSK:
48364064216a8433360745f69edddce19a606659163The Android Open Source Project        pAdmCtrl->keyMngSuite = RSN_KEY_MNG_802_1X;
48464064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
48564064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPANONE:
48664064216a8433360745f69edddce19a606659163The Android Open Source Project        pAdmCtrl->keyMngSuite = RSN_KEY_MNG_NONE;
48764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Not supported */
48864064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
48964064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
49064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
49164064216a8433360745f69edddce19a606659163The Android Open Source Project
49264064216a8433360745f69edddce19a606659163The Android Open Source Project
49364064216a8433360745f69edddce19a606659163The Android Open Source Project    paeConfig.authProtocol = pAdmCtrl->externalAuthMode;
49464064216a8433360745f69edddce19a606659163The Android Open Source Project    paeConfig.unicastSuite = pAdmCtrl->unicastSuite;
49564064216a8433360745f69edddce19a606659163The Android Open Source Project    paeConfig.broadcastSuite = pAdmCtrl->broadcastSuite;
49664064216a8433360745f69edddce19a606659163The Android Open Source Project    paeConfig.keyExchangeProtocol = pAdmCtrl->keyMngSuite;
49764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* set default PAE configuration */
49864064216a8433360745f69edddce19a606659163The Android Open Source Project    status = pAdmCtrl->pRsn->setPaeConfig(pAdmCtrl->pRsn, &paeConfig);
49964064216a8433360745f69edddce19a606659163The Android Open Source Project
50064064216a8433360745f69edddce19a606659163The Android Open Source Project    return status;
50164064216a8433360745f69edddce19a606659163The Android Open Source Project}
50264064216a8433360745f69edddce19a606659163The Android Open Source Project
50364064216a8433360745f69edddce19a606659163The Android Open Source Project
50464064216a8433360745f69edddce19a606659163The Android Open Source Project/**
50564064216a8433360745f69edddce19a606659163The Android Open Source Project*
50664064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_getInfoElement - Get the current information element.
50764064216a8433360745f69edddce19a606659163The Android Open Source Project*
50864064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
50964064216a8433360745f69edddce19a606659163The Android Open Source Project*
51064064216a8433360745f69edddce19a606659163The Android Open Source Project* Get the current information element.
51164064216a8433360745f69edddce19a606659163The Android Open Source Project*
51264064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
51364064216a8433360745f69edddce19a606659163The Android Open Source Project*
51464064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl - context \n
51564064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pIe - IE buffer \n
51664064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pLength - length of IE \n
51764064216a8433360745f69edddce19a606659163The Android Open Source Project*
51864064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
51964064216a8433360745f69edddce19a606659163The Android Open Source Project*
52064064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK on failure.
52164064216a8433360745f69edddce19a606659163The Android Open Source Project*
52264064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
52364064216a8433360745f69edddce19a606659163The Android Open Source Project*/
52464064216a8433360745f69edddce19a606659163The Android Open Source Project
52564064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_getInfoElement(admCtrl_t *pAdmCtrl, UINT8 *pIe, UINT8 *pLength)
52664064216a8433360745f69edddce19a606659163The Android Open Source Project{
52764064216a8433360745f69edddce19a606659163The Android Open Source Project    wpa2IePacket_t     *pWpa2IePacket;
52864064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8              length = 0;
52964064216a8433360745f69edddce19a606659163The Android Open Source Project    macAddress_t       assocBssid;
53064064216a8433360745f69edddce19a606659163The Android Open Source Project    paramInfo_t        param;
53164064216a8433360745f69edddce19a606659163The Android Open Source Project    pmkidValue_t       pmkId;
53264064216a8433360745f69edddce19a606659163The Android Open Source Project    TI_STATUS          status;
53364064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8              index;
53464064216a8433360745f69edddce19a606659163The Android Open Source Project
53564064216a8433360745f69edddce19a606659163The Android Open Source Project    #ifdef FOUR_ALIGNMENT
53664064216a8433360745f69edddce19a606659163The Android Open Source Project	  UINT16				tempInt;
53764064216a8433360745f69edddce19a606659163The Android Open Source Project    #endif
53864064216a8433360745f69edddce19a606659163The Android Open Source Project
53964064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pIe==NULL)
54064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
54164064216a8433360745f69edddce19a606659163The Android Open Source Project        *pLength = 0;
54264064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
54364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
54464064216a8433360745f69edddce19a606659163The Android Open Source Project
54564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* check Group suite validity */
54664064216a8433360745f69edddce19a606659163The Android Open Source Project    if (!broadcastCipherSuiteValidity[pAdmCtrl->networkMode][pAdmCtrl->broadcastSuite])
54764064216a8433360745f69edddce19a606659163The Android Open Source Project    {
54864064216a8433360745f69edddce19a606659163The Android Open Source Project        *pLength = 0;
54964064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
55064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
55164064216a8433360745f69edddce19a606659163The Android Open Source Project
55264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Init Wpa2 IE (RSN IE) */
55364064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2IePacket = (wpa2IePacket_t*)pIe;
55464064216a8433360745f69edddce19a606659163The Android Open Source Project    os_memoryZero(pAdmCtrl->hOs, pWpa2IePacket, sizeof(wpa2IePacket_t));
55564064216a8433360745f69edddce19a606659163The Android Open Source Project
55664064216a8433360745f69edddce19a606659163The Android Open Source Project
55764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Fill the element ID */
55864064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2IePacket->elementid = RSN_IE_ID;
55964064216a8433360745f69edddce19a606659163The Android Open Source Project
56064064216a8433360745f69edddce19a606659163The Android Open Source Project
56164064216a8433360745f69edddce19a606659163The Android Open Source Project    #ifndef FOUR_ALIGNMENT
56264064216a8433360745f69edddce19a606659163The Android Open Source Project       pWpa2IePacket->version   = ENDIAN_HANDLE_WORD(WPA2_OUI_MAX_VERSION);
56364064216a8433360745f69edddce19a606659163The Android Open Source Project    #else
56464064216a8433360745f69edddce19a606659163The Android Open Source Project      /* required for WinCe, when the pointer is not even */
56564064216a8433360745f69edddce19a606659163The Android Open Source Project      tempInt = ENDIAN_HANDLE_WORD(WPA2_OUI_MAX_VERSION);
56664064216a8433360745f69edddce19a606659163The Android Open Source Project      os_memoryCopy(pAdmCtrl->hOs, (UINT8 *)&pWpa2IePacket->version, &tempInt, sizeof(pWpa2IePacket->version));
56764064216a8433360745f69edddce19a606659163The Android Open Source Project    #endif
56864064216a8433360745f69edddce19a606659163The Android Open Source Project    length += 2;
56964064216a8433360745f69edddce19a606659163The Android Open Source Project
57064064216a8433360745f69edddce19a606659163The Android Open Source Project    /* build group suite */
57164064216a8433360745f69edddce19a606659163The Android Open Source Project    os_memoryCopy(pAdmCtrl->hOs, (void *)pWpa2IePacket->groupSuite, wpa2IeOuiIe, 3);
57264064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2IePacket->groupSuite[3] = (UINT8)pAdmCtrl->pRsn->paeConfig.broadcastSuite;
57364064216a8433360745f69edddce19a606659163The Android Open Source Project    length += 4;
57464064216a8433360745f69edddce19a606659163The Android Open Source Project
57564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* build pairwise suite - we always send only one pairwise suite */
57664064216a8433360745f69edddce19a606659163The Android Open Source Project    #ifndef FOUR_ALIGNMENT
57764064216a8433360745f69edddce19a606659163The Android Open Source Project      pWpa2IePacket->pairwiseSuiteCnt = ENDIAN_HANDLE_WORD(0x0001);
57864064216a8433360745f69edddce19a606659163The Android Open Source Project    #else
57964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* required for WinCe, when the pointer is not even */
58064064216a8433360745f69edddce19a606659163The Android Open Source Project      tempInt = ENDIAN_HANDLE_WORD(0x0001);
58164064216a8433360745f69edddce19a606659163The Android Open Source Project      os_memoryCopy(pAdmCtrl->hOs, (UINT8 *)&pWpa2IePacket->pairwiseSuiteCnt, &tempInt, sizeof(pWpa2IePacket->pairwiseSuiteCnt));
58264064216a8433360745f69edddce19a606659163The Android Open Source Project    #endif
58364064216a8433360745f69edddce19a606659163The Android Open Source Project
58464064216a8433360745f69edddce19a606659163The Android Open Source Project    length += 2;
58564064216a8433360745f69edddce19a606659163The Android Open Source Project
58664064216a8433360745f69edddce19a606659163The Android Open Source Project    os_memoryCopy(pAdmCtrl->hOs, (void *)pWpa2IePacket->pairwiseSuite, wpa2IeOuiIe, 3);
58764064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2IePacket->pairwiseSuite[3] = (UINT8)pAdmCtrl->pRsn->paeConfig.unicastSuite;
58864064216a8433360745f69edddce19a606659163The Android Open Source Project    length += 4;
58964064216a8433360745f69edddce19a606659163The Android Open Source Project
59064064216a8433360745f69edddce19a606659163The Android Open Source Project
59164064216a8433360745f69edddce19a606659163The Android Open Source Project    /* build keyMng suite - we always send only one key mgmt  suite*/
59264064216a8433360745f69edddce19a606659163The Android Open Source Project    #ifndef FOUR_ALIGNMENT
59364064216a8433360745f69edddce19a606659163The Android Open Source Project       pWpa2IePacket->authKeyMngSuiteCnt = ENDIAN_HANDLE_WORD(0x0001);
59464064216a8433360745f69edddce19a606659163The Android Open Source Project    #else
59564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* required for WinCe, when the pointer is not even */
59664064216a8433360745f69edddce19a606659163The Android Open Source Project      tempInt = ENDIAN_HANDLE_WORD(0x0001);
59764064216a8433360745f69edddce19a606659163The Android Open Source Project      os_memoryCopy(pAdmCtrl->hOs, (UINT8 *)&pWpa2IePacket->authKeyMngSuiteCnt, &tempInt, sizeof(pWpa2IePacket->authKeyMngSuiteCnt));
59864064216a8433360745f69edddce19a606659163The Android Open Source Project    #endif
59964064216a8433360745f69edddce19a606659163The Android Open Source Project
60064064216a8433360745f69edddce19a606659163The Android Open Source Project    length += 2;
60164064216a8433360745f69edddce19a606659163The Android Open Source Project
60264064216a8433360745f69edddce19a606659163The Android Open Source Project    os_memoryCopy(pAdmCtrl->hOs, (void *)pWpa2IePacket->authKeyMngSuite, wpa2IeOuiIe, 3);
60364064216a8433360745f69edddce19a606659163The Android Open Source Project
60464064216a8433360745f69edddce19a606659163The Android Open Source Project    switch (pAdmCtrl->externalAuthMode)
60564064216a8433360745f69edddce19a606659163The Android Open Source Project    {
60664064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_OPEN:
60764064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_SHARED_KEY:
60864064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_AUTO_SWITCH:
60964064216a8433360745f69edddce19a606659163The Android Open Source Project        pWpa2IePacket->authKeyMngSuite[3] = WPA2_IE_KEY_MNG_NONE;
61064064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
61164064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPA2:
61264064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPA:   /* for Any-WPA/WPA-Mixed mode */
61364064216a8433360745f69edddce19a606659163The Android Open Source Project        {
61464064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef EXC_MODULE_INCLUDED
61564064216a8433360745f69edddce19a606659163The Android Open Source Project            UINT8   akmSuite[DOT11_OUI_LEN+1];
61664064216a8433360745f69edddce19a606659163The Android Open Source Project
61764064216a8433360745f69edddce19a606659163The Android Open Source Project            if (admCtrlExc_getCckmAkm(pAdmCtrl, akmSuite))
61864064216a8433360745f69edddce19a606659163The Android Open Source Project            {
61964064216a8433360745f69edddce19a606659163The Android Open Source Project                os_memoryCopy(pAdmCtrl->hOs, (PVOID)pWpa2IePacket->authKeyMngSuite, akmSuite, DOT11_OUI_LEN+1);
62064064216a8433360745f69edddce19a606659163The Android Open Source Project            }
62164064216a8433360745f69edddce19a606659163The Android Open Source Project            else
62264064216a8433360745f69edddce19a606659163The Android Open Source Project#endif
62364064216a8433360745f69edddce19a606659163The Android Open Source Project            {
62464064216a8433360745f69edddce19a606659163The Android Open Source Project                pWpa2IePacket->authKeyMngSuite[3] = WPA2_IE_KEY_MNG_801_1X;
62564064216a8433360745f69edddce19a606659163The Android Open Source Project            }
62664064216a8433360745f69edddce19a606659163The Android Open Source Project        }
62764064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
62864064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPA2PSK:
62964064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPAPSK:
63064064216a8433360745f69edddce19a606659163The Android Open Source Project        pWpa2IePacket->authKeyMngSuite[3] = WPA2_IE_KEY_MNG_PSK_801_1X;
63164064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
63264064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
63364064216a8433360745f69edddce19a606659163The Android Open Source Project        pWpa2IePacket->authKeyMngSuite[3] = WPA2_IE_KEY_MNG_NONE;
63464064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
63564064216a8433360745f69edddce19a606659163The Android Open Source Project    }
63664064216a8433360745f69edddce19a606659163The Android Open Source Project
63764064216a8433360745f69edddce19a606659163The Android Open Source Project    length += 4;
63864064216a8433360745f69edddce19a606659163The Android Open Source Project
63964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* build Capabilities */
64064064216a8433360745f69edddce19a606659163The Android Open Source Project    #ifndef FOUR_ALIGNMENT
64164064216a8433360745f69edddce19a606659163The Android Open Source Project       pWpa2IePacket->capabilities = ENDIAN_HANDLE_WORD(admCtrlWpa2_buildCapabilities(pAdmCtrl));
64264064216a8433360745f69edddce19a606659163The Android Open Source Project    #else
64364064216a8433360745f69edddce19a606659163The Android Open Source Project	/* required for WinCe, when the pointer is not even */
64464064216a8433360745f69edddce19a606659163The Android Open Source Project      tempInt = ENDIAN_HANDLE_WORD(admCtrlWpa2_buildCapabilities(pAdmCtrl));
64564064216a8433360745f69edddce19a606659163The Android Open Source Project      os_memoryCopy(pAdmCtrl->hOs, (UINT8 *)&pWpa2IePacket->capabilities, &tempInt, sizeof(pWpa2IePacket->capabilities));
64664064216a8433360745f69edddce19a606659163The Android Open Source Project    #endif
64764064216a8433360745f69edddce19a606659163The Android Open Source Project
64864064216a8433360745f69edddce19a606659163The Android Open Source Project    length += 2;
64964064216a8433360745f69edddce19a606659163The Android Open Source Project
65064064216a8433360745f69edddce19a606659163The Android Open Source Project    /* build PMKID list: we support no more than 1 PMKSA per AP, */
65164064216a8433360745f69edddce19a606659163The Android Open Source Project    /* so no more than 1 PMKID can be sent in the RSN IE         */
65264064216a8433360745f69edddce19a606659163The Android Open Source Project    if(pAdmCtrl->preAuthSupport &&
65364064216a8433360745f69edddce19a606659163The Android Open Source Project       (pAdmCtrl->pRsn->paeConfig.authProtocol == RSN_EXT_AUTH_MODE_WPA2))
65464064216a8433360745f69edddce19a606659163The Android Open Source Project    {
65564064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Init value of PMKID count is 0 */
65664064216a8433360745f69edddce19a606659163The Android Open Source Project	#ifndef FOUR_ALIGNMENT
65764064216a8433360745f69edddce19a606659163The Android Open Source Project           pWpa2IePacket->pmkIdCnt = ENDIAN_HANDLE_WORD(0);
65864064216a8433360745f69edddce19a606659163The Android Open Source Project	#else
65964064216a8433360745f69edddce19a606659163The Android Open Source Project          /* required for WinCe, when the pointer is not even */
66064064216a8433360745f69edddce19a606659163The Android Open Source Project          tempInt = ENDIAN_HANDLE_WORD(0);
66164064216a8433360745f69edddce19a606659163The Android Open Source Project 	  os_memoryCopy(pAdmCtrl->hOs, (UINT8 *)&pWpa2IePacket->pmkIdCnt, &tempInt, sizeof(pWpa2IePacket->pmkIdCnt));
66264064216a8433360745f69edddce19a606659163The Android Open Source Project	#endif
66364064216a8433360745f69edddce19a606659163The Android Open Source Project
66464064216a8433360745f69edddce19a606659163The Android Open Source Project        length += 2;
66564064216a8433360745f69edddce19a606659163The Android Open Source Project
66664064216a8433360745f69edddce19a606659163The Android Open Source Project        param.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
66764064216a8433360745f69edddce19a606659163The Android Open Source Project        status          = ctrlData_getParam(pAdmCtrl->pRsn->hCtrlData, &param);
66864064216a8433360745f69edddce19a606659163The Android Open Source Project
66964064216a8433360745f69edddce19a606659163The Android Open Source Project        assocBssid      = param.content.ctrlDataCurrentBSSID;
67064064216a8433360745f69edddce19a606659163The Android Open Source Project
67164064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
67264064216a8433360745f69edddce19a606659163The Android Open Source Project                                ("admCtrlWpa2_getInfoElement - find PMKID \n"));
67364064216a8433360745f69edddce19a606659163The Android Open Source Project
67464064216a8433360745f69edddce19a606659163The Android Open Source Project        status = admCtrlWpa2_findPMKID(pAdmCtrl, &assocBssid, &pmkId, &index);
67564064216a8433360745f69edddce19a606659163The Android Open Source Project        if(status == OK)
67664064216a8433360745f69edddce19a606659163The Android Open Source Project        {
67764064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
67864064216a8433360745f69edddce19a606659163The Android Open Source Project                                    ("admCtrlWpa2_getInfoElement - PMKID was found! \n"));
67964064216a8433360745f69edddce19a606659163The Android Open Source Project
68064064216a8433360745f69edddce19a606659163The Android Open Source Project	#ifndef FOUR_ALIGNMENT
68164064216a8433360745f69edddce19a606659163The Android Open Source Project            pWpa2IePacket->pmkIdCnt = ENDIAN_HANDLE_WORD(1);
68264064216a8433360745f69edddce19a606659163The Android Open Source Project        #else
68364064216a8433360745f69edddce19a606659163The Android Open Source Project           /* required for WinCe, when the pointer is not even */
68464064216a8433360745f69edddce19a606659163The Android Open Source Project           tempInt = ENDIAN_HANDLE_WORD(1);
68564064216a8433360745f69edddce19a606659163The Android Open Source Project           os_memoryCopy(pAdmCtrl->hOs, (UINT8 *)&pWpa2IePacket->pmkIdCnt, &tempInt, sizeof(pWpa2IePacket->pmkIdCnt));
68664064216a8433360745f69edddce19a606659163The Android Open Source Project        #endif
68764064216a8433360745f69edddce19a606659163The Android Open Source Project
68864064216a8433360745f69edddce19a606659163The Android Open Source Project            os_memoryCopy(pAdmCtrl->hOs, (UINT8 *)pWpa2IePacket->pmkId,
68964064216a8433360745f69edddce19a606659163The Android Open Source Project                      (UINT8 *)pmkId, PMKID_VALUE_SIZE);
69064064216a8433360745f69edddce19a606659163The Android Open Source Project
69164064216a8433360745f69edddce19a606659163The Android Open Source Project            length += PMKID_VALUE_SIZE;
69264064216a8433360745f69edddce19a606659163The Android Open Source Project        }
69364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
69464064216a8433360745f69edddce19a606659163The Android Open Source Project
69564064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2IePacket->length = length;    /* RSN IE length without IEid and length field */
69664064216a8433360745f69edddce19a606659163The Android Open Source Project    *pLength              = length+2;  /* The whole length of the RSN IE */
69764064216a8433360745f69edddce19a606659163The Android Open Source Project
69864064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_HEX_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
69964064216a8433360745f69edddce19a606659163The Android Open Source Project                                    pIe, *pLength);
70064064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
70164064216a8433360745f69edddce19a606659163The Android Open Source Project
70264064216a8433360745f69edddce19a606659163The Android Open Source Project}
70364064216a8433360745f69edddce19a606659163The Android Open Source Project/**
70464064216a8433360745f69edddce19a606659163The Android Open Source Project*
70564064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_setSite  - Set current primary site parameters for registration.
70664064216a8433360745f69edddce19a606659163The Android Open Source Project*
70764064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
70864064216a8433360745f69edddce19a606659163The Android Open Source Project*
70964064216a8433360745f69edddce19a606659163The Android Open Source Project* Set current primary site parameters for registration.
71064064216a8433360745f69edddce19a606659163The Android Open Source Project*
71164064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
71264064216a8433360745f69edddce19a606659163The Android Open Source Project*
71364064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl - context \n
71464064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pRsnData - site's RSN data \n
71564064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - pAssocIe - result IE of evaluation \n
71664064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - pAssocIeLen - length of result IE of evaluation \n
71764064216a8433360745f69edddce19a606659163The Android Open Source Project*
71864064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
71964064216a8433360745f69edddce19a606659163The Android Open Source Project*
72064064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on site is aproved, NOK on site is rejected.
72164064216a8433360745f69edddce19a606659163The Android Open Source Project*
72264064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
72364064216a8433360745f69edddce19a606659163The Android Open Source Project*/
72464064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_setSite(admCtrl_t *pAdmCtrl, rsnData_t *pRsnData, UINT8 *pAssocIe, UINT8 *pAssocIeLen)
72564064216a8433360745f69edddce19a606659163The Android Open Source Project{
72664064216a8433360745f69edddce19a606659163The Android Open Source Project    TI_STATUS               status;
72764064216a8433360745f69edddce19a606659163The Android Open Source Project    rsn_paeConfig_t         paeConfig;
72864064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8                   *pWpa2Ie;
72964064216a8433360745f69edddce19a606659163The Android Open Source Project    cipherSuite_e           uSuite, bSuite;
73064064216a8433360745f69edddce19a606659163The Android Open Source Project
73164064216a8433360745f69edddce19a606659163The Android Open Source Project
73264064216a8433360745f69edddce19a606659163The Android Open Source Project    *pAssocIeLen = 0;
73364064216a8433360745f69edddce19a606659163The Android Open Source Project
73464064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pRsnData==NULL)
73564064216a8433360745f69edddce19a606659163The Android Open Source Project    {
73664064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
73764064216a8433360745f69edddce19a606659163The Android Open Source Project    }
73864064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pRsnData->pIe==NULL)
73964064216a8433360745f69edddce19a606659163The Android Open Source Project    {
74064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* configure the MLME module with the 802.11 OPEN authentication suite,
74164064216a8433360745f69edddce19a606659163The Android Open Source Project            THe MLME will configure later the authentication module */
74264064216a8433360745f69edddce19a606659163The Android Open Source Project        param.paramType = MLME_LEGACY_TYPE_PARAM;
74364064216a8433360745f69edddce19a606659163The Android Open Source Project        param.content.mlmeLegacyAuthType = AUTH_LEGACY_OPEN_SYSTEM;
74464064216a8433360745f69edddce19a606659163The Android Open Source Project        status = mlme_setParam(pAdmCtrl->hMlme, &param);
74564064216a8433360745f69edddce19a606659163The Android Open Source Project        if (status != OK)
74664064216a8433360745f69edddce19a606659163The Android Open Source Project        {
74764064216a8433360745f69edddce19a606659163The Android Open Source Project            return status;
74864064216a8433360745f69edddce19a606659163The Android Open Source Project        }
74964064216a8433360745f69edddce19a606659163The Android Open Source Project
75064064216a8433360745f69edddce19a606659163The Android Open Source Project        return OK;
75164064216a8433360745f69edddce19a606659163The Android Open Source Project    }
75264064216a8433360745f69edddce19a606659163The Android Open Source Project
75364064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef EXC_MODULE_INCLUDED
75464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Clean MIC and KP flags in the HAL.                */
75564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* It is needed if the previous privacy mode was EXC */
75664064216a8433360745f69edddce19a606659163The Android Open Source Project    whalParam.paramType = HAL_CTRL_RSN_EXC_SW_ENC_ENABLE_PARAM;
75764064216a8433360745f69edddce19a606659163The Android Open Source Project    whalParam.content.rsnExcSwEncFlag = FALSE;
75864064216a8433360745f69edddce19a606659163The Android Open Source Project    status = whalCtrl_SetParam(pAdmCtrl->pRsn->hWhalCtrl, &whalParam);
75964064216a8433360745f69edddce19a606659163The Android Open Source Project
76064064216a8433360745f69edddce19a606659163The Android Open Source Project    whalParam.paramType = HAL_CTRL_RSN_EXC_MIC_FIELD_ENABLE_PARAM;
76164064216a8433360745f69edddce19a606659163The Android Open Source Project    whalParam.content.rsnExcMicFieldFlag = FALSE;
76264064216a8433360745f69edddce19a606659163The Android Open Source Project    status = whalCtrl_SetParam(pAdmCtrl->pRsn->hWhalCtrl, &whalParam);
76364064216a8433360745f69edddce19a606659163The Android Open Source Project
76464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Check if Aironet IE exists */
76564064216a8433360745f69edddce19a606659163The Android Open Source Project    admCtrlExc_setExtendedParams(pAdmCtrl, pRsnData);
76664064216a8433360745f69edddce19a606659163The Android Open Source Project
76764064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /*EXC_MODULE_INCLUDED*/
76864064216a8433360745f69edddce19a606659163The Android Open Source Project
76964064216a8433360745f69edddce19a606659163The Android Open Source Project    status = admCtrl_parseIe(pAdmCtrl, pRsnData, &pWpa2Ie, RSN_IE_ID);
77064064216a8433360745f69edddce19a606659163The Android Open Source Project    if (status != OK)
77164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
77264064216a8433360745f69edddce19a606659163The Android Open Source Project        return status;
77364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
77464064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
77564064216a8433360745f69edddce19a606659163The Android Open Source Project                            ("admCtrlWpa2_setSite: RSN_IE=\n"));
77664064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_HEX_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG, pRsnData->pIe, pRsnData->ieLen);
77745544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt    status = admCtrlWpa2_parseIe(pAdmCtrl, pWpa2Ie, &wpa2DataIE);
77864064216a8433360745f69edddce19a606659163The Android Open Source Project    if (status != OK)
77964064216a8433360745f69edddce19a606659163The Android Open Source Project    {
78064064216a8433360745f69edddce19a606659163The Android Open Source Project        return status;
78164064216a8433360745f69edddce19a606659163The Android Open Source Project    }
78245544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt    if ((wpa2DataIE.unicastSuite[0]>=MAX_WPA2_CIPHER_SUITE) ||
78345544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt        (wpa2DataIE.broadcastSuite>=MAX_WPA2_CIPHER_SUITE) ||
78464064216a8433360745f69edddce19a606659163The Android Open Source Project        (pAdmCtrl->unicastSuite>=MAX_WPA2_CIPHER_SUITE))
78564064216a8433360745f69edddce19a606659163The Android Open Source Project    {
78664064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
78764064216a8433360745f69edddce19a606659163The Android Open Source Project    }
78864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Check validity of Group suite */
78945544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt    if (!broadcastCipherSuiteValidity[pAdmCtrl->networkMode][wpa2DataIE.broadcastSuite])
79064064216a8433360745f69edddce19a606659163The Android Open Source Project    {   /* check Group suite validity */
79164064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
79264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
79364064216a8433360745f69edddce19a606659163The Android Open Source Project
79464064216a8433360745f69edddce19a606659163The Android Open Source Project
79545544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt    if(admCtrlWpa2_getCipherSuiteMetric (pAdmCtrl, &wpa2DataIE, NULL, &uSuite, &bSuite) != OK)
79664064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
79764064216a8433360745f69edddce19a606659163The Android Open Source Project
79864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* set replay counter */
79945544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt    pAdmCtrl->replayCnt = wpa2DataIE.ptkReplayCounters;
80064064216a8433360745f69edddce19a606659163The Android Open Source Project
80164064216a8433360745f69edddce19a606659163The Android Open Source Project    *pAssocIeLen = pRsnData->ieLen;
80264064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pAssocIe != NULL)
80364064216a8433360745f69edddce19a606659163The Android Open Source Project    {
80445544f73189f4649d4afb21a0dab72cd70971e2fDmitry Shmidt        os_memoryCopy(pAdmCtrl->hOs, pAssocIe, &wpa2DataIE, sizeof(wpa2IeData_t));
80564064216a8433360745f69edddce19a606659163The Android Open Source Project    }
80664064216a8433360745f69edddce19a606659163The Android Open Source Project
80764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* re-config PAE with updated unicast and broadcast suite values            */
80864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* If STA works in WpaMixed mode/AnyWpa mode, set PAE auth. mode to WPA2    */
80964064216a8433360745f69edddce19a606659163The Android Open Source Project    paeConfig.authProtocol = pAdmCtrl->externalAuthMode;
81064064216a8433360745f69edddce19a606659163The Android Open Source Project
81164064216a8433360745f69edddce19a606659163The Android Open Source Project    if(pAdmCtrl->WPAPromoteFlags)
81264064216a8433360745f69edddce19a606659163The Android Open Source Project    {
81364064216a8433360745f69edddce19a606659163The Android Open Source Project       if(pAdmCtrl->externalAuthMode == RSN_EXT_AUTH_MODE_WPA)
81464064216a8433360745f69edddce19a606659163The Android Open Source Project          paeConfig.authProtocol   = RSN_EXT_AUTH_MODE_WPA2;
81564064216a8433360745f69edddce19a606659163The Android Open Source Project       if(pAdmCtrl->externalAuthMode == RSN_EXT_AUTH_MODE_WPAPSK)
81664064216a8433360745f69edddce19a606659163The Android Open Source Project          paeConfig.authProtocol   = RSN_EXT_AUTH_MODE_WPA2PSK;
81764064216a8433360745f69edddce19a606659163The Android Open Source Project    }
81864064216a8433360745f69edddce19a606659163The Android Open Source Project
81964064216a8433360745f69edddce19a606659163The Android Open Source Project
82064064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef EXC_MODULE_INCLUDED
82164064216a8433360745f69edddce19a606659163The Android Open Source Project    param.paramType = EXC_CCKM_EXISTS;
82264064216a8433360745f69edddce19a606659163The Android Open Source Project    param.content.excCckmExists = (wpa2Data.KeyMngSuite[0]==WPA2_IE_KEY_MNG_CCKM) ? TRUE : FALSE;
82364064216a8433360745f69edddce19a606659163The Android Open Source Project    excMngr_setParam(pAdmCtrl->hExcMngr, &param);
82464064216a8433360745f69edddce19a606659163The Android Open Source Project#endif
82564064216a8433360745f69edddce19a606659163The Android Open Source Project
82664064216a8433360745f69edddce19a606659163The Android Open Source Project
82764064216a8433360745f69edddce19a606659163The Android Open Source Project    paeConfig.keyExchangeProtocol = pAdmCtrl->keyMngSuite;
82864064216a8433360745f69edddce19a606659163The Android Open Source Project    paeConfig.unicastSuite        = uSuite;    /* Updated value */
82964064216a8433360745f69edddce19a606659163The Android Open Source Project    paeConfig.broadcastSuite      = bSuite;    /* Updated value */
83064064216a8433360745f69edddce19a606659163The Android Open Source Project    status = admCtrlWpa2_DynamicConfig(pAdmCtrl, &paeConfig);
83164064216a8433360745f69edddce19a606659163The Android Open Source Project
83264064216a8433360745f69edddce19a606659163The Android Open Source Project    if (status != OK)
83364064216a8433360745f69edddce19a606659163The Android Open Source Project    {
83464064216a8433360745f69edddce19a606659163The Android Open Source Project        return status;
83564064216a8433360745f69edddce19a606659163The Android Open Source Project    }
83664064216a8433360745f69edddce19a606659163The Android Open Source Project
83764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Now we configure the MLME module with the 802.11 legacy authentication suite,
83864064216a8433360745f69edddce19a606659163The Android Open Source Project        THe MLME will configure later the authentication module */
83964064216a8433360745f69edddce19a606659163The Android Open Source Project    param.paramType = MLME_LEGACY_TYPE_PARAM;
84064064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef EXC_MODULE_INCLUDED
84164064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pAdmCtrl->networkEapMode!=OS_EXC_NETWORK_EAP_OFF)
84264064216a8433360745f69edddce19a606659163The Android Open Source Project    {
84364064216a8433360745f69edddce19a606659163The Android Open Source Project        param.content.mlmeLegacyAuthType = AUTH_LEGACY_RESERVED1;
84464064216a8433360745f69edddce19a606659163The Android Open Source Project    }
84564064216a8433360745f69edddce19a606659163The Android Open Source Project    else
84664064216a8433360745f69edddce19a606659163The Android Open Source Project#endif
84764064216a8433360745f69edddce19a606659163The Android Open Source Project    {
84864064216a8433360745f69edddce19a606659163The Android Open Source Project        param.content.mlmeLegacyAuthType = AUTH_LEGACY_OPEN_SYSTEM;
84964064216a8433360745f69edddce19a606659163The Android Open Source Project    }
85064064216a8433360745f69edddce19a606659163The Android Open Source Project    status = mlme_setParam(pAdmCtrl->hMlme, &param);
85164064216a8433360745f69edddce19a606659163The Android Open Source Project    if (status != OK)
85264064216a8433360745f69edddce19a606659163The Android Open Source Project    {
85364064216a8433360745f69edddce19a606659163The Android Open Source Project        return status;
85464064216a8433360745f69edddce19a606659163The Android Open Source Project    }
85564064216a8433360745f69edddce19a606659163The Android Open Source Project
85664064216a8433360745f69edddce19a606659163The Android Open Source Project    param.paramType = RX_DATA_EAPOL_DESTINATION_PARAM;
85764064216a8433360745f69edddce19a606659163The Android Open Source Project    param.content.rxDataEapolDestination = OS_ABS_LAYER;
85864064216a8433360745f69edddce19a606659163The Android Open Source Project    status = rxData_setParam(pAdmCtrl->hRx, &param);
85964064216a8433360745f69edddce19a606659163The Android Open Source Project    if (status != OK)
86064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
86164064216a8433360745f69edddce19a606659163The Android Open Source Project        return status;
86264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
86364064216a8433360745f69edddce19a606659163The Android Open Source Project
86464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Configure privacy status in HAL so that HW is prepared to recieve keys */
86564064216a8433360745f69edddce19a606659163The Android Open Source Project    whalParam.paramType = HAL_CTRL_RSN_SECURITY_MODE_PARAM;
86664064216a8433360745f69edddce19a606659163The Android Open Source Project    whalParam.content.rsnEncryptionStatus = (halCtrl_CipherSuite_e)paeConfig.unicastSuite;
86764064216a8433360745f69edddce19a606659163The Android Open Source Project    status = whalCtrl_SetParam(pAdmCtrl->pRsn->hWhalCtrl, &whalParam);
86864064216a8433360745f69edddce19a606659163The Android Open Source Project
86964064216a8433360745f69edddce19a606659163The Android Open Source Project    return status;
87064064216a8433360745f69edddce19a606659163The Android Open Source Project}
87164064216a8433360745f69edddce19a606659163The Android Open Source Project
87264064216a8433360745f69edddce19a606659163The Android Open Source Project/**
87364064216a8433360745f69edddce19a606659163The Android Open Source Project*
87464064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa_evalSite  - Evaluate site for registration.
87564064216a8433360745f69edddce19a606659163The Android Open Source Project*
87664064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
87764064216a8433360745f69edddce19a606659163The Android Open Source Project*
87864064216a8433360745f69edddce19a606659163The Android Open Source Project* evaluate site RSN capabilities against the station's cap.
87964064216a8433360745f69edddce19a606659163The Android Open Source Project* If the BSS type is infrastructure, the station matches the site only if it's WEP status is same as the site
88064064216a8433360745f69edddce19a606659163The Android Open Source Project* In IBSS, it does not matter
88164064216a8433360745f69edddce19a606659163The Android Open Source Project*
88264064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
88364064216a8433360745f69edddce19a606659163The Android Open Source Project*
88464064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl - Context \n
88564064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pRsnData - site's RSN data \n
88664064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - pEvaluation - Result of evaluation \n
88764064216a8433360745f69edddce19a606659163The Android Open Source Project*
88864064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
88964064216a8433360745f69edddce19a606659163The Android Open Source Project*
89064064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK
89164064216a8433360745f69edddce19a606659163The Android Open Source Project*
89264064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
89364064216a8433360745f69edddce19a606659163The Android Open Source Project*/
89464064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_evalSite(admCtrl_t *pAdmCtrl, rsnData_t *pRsnData, bssType_e bssType, UINT32 *pEvaluation)
89564064216a8433360745f69edddce19a606659163The Android Open Source Project{
89664064216a8433360745f69edddce19a606659163The Android Open Source Project    TI_STATUS               status;
89764064216a8433360745f69edddce19a606659163The Android Open Source Project    wpa2IeData_t            wpa2Data;
89864064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8                   *pWpa2Ie;
89964064216a8433360745f69edddce19a606659163The Android Open Source Project    cipherSuite_e           uSuite, bSuite;
90064064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8                   i = 0;
90164064216a8433360745f69edddce19a606659163The Android Open Source Project
90264064216a8433360745f69edddce19a606659163The Android Open Source Project
90364064216a8433360745f69edddce19a606659163The Android Open Source Project    *pEvaluation = 0;
90464064216a8433360745f69edddce19a606659163The Android Open Source Project
90564064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pRsnData==NULL)
90664064216a8433360745f69edddce19a606659163The Android Open Source Project    {
90764064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
90864064216a8433360745f69edddce19a606659163The Android Open Source Project    }
90964064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pRsnData->pIe==NULL)
91064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
91164064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
91264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
91364064216a8433360745f69edddce19a606659163The Android Open Source Project
91464064216a8433360745f69edddce19a606659163The Android Open Source Project    if (bssType != BSS_INFRASTRUCTURE)
91564064216a8433360745f69edddce19a606659163The Android Open Source Project    {
91664064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
91764064216a8433360745f69edddce19a606659163The Android Open Source Project    }
91864064216a8433360745f69edddce19a606659163The Android Open Source Project
91964064216a8433360745f69edddce19a606659163The Android Open Source Project    status = admCtrl_parseIe(pAdmCtrl, pRsnData, &pWpa2Ie, RSN_IE_ID);
92064064216a8433360745f69edddce19a606659163The Android Open Source Project    if (status != OK)
92164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
92264064216a8433360745f69edddce19a606659163The Android Open Source Project        return status;
92364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
92464064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
92564064216a8433360745f69edddce19a606659163The Android Open Source Project                            ("admCtrlWpa2_evalSite, IE=\n"));
92664064216a8433360745f69edddce19a606659163The Android Open Source Project
92764064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_HEX_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG, pRsnData->pIe, pRsnData->ieLen);
92864064216a8433360745f69edddce19a606659163The Android Open Source Project
92964064216a8433360745f69edddce19a606659163The Android Open Source Project    status = admCtrlWpa2_parseIe(pAdmCtrl, pWpa2Ie, &wpa2Data);
93064064216a8433360745f69edddce19a606659163The Android Open Source Project    if (status != OK)
93164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
93264064216a8433360745f69edddce19a606659163The Android Open Source Project        return status;
93364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
93464064216a8433360745f69edddce19a606659163The Android Open Source Project
93564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* check keyMngSuite validity */
93664064216a8433360745f69edddce19a606659163The Android Open Source Project    status = NOK;
93764064216a8433360745f69edddce19a606659163The Android Open Source Project    for(i = 0;
93864064216a8433360745f69edddce19a606659163The Android Open Source Project       (i < wpa2Data.KeyMngSuiteCnt) &&(i<MAX_WPA2_KEY_MNG_SUITES)&& (status != OK);
93964064216a8433360745f69edddce19a606659163The Android Open Source Project        i++)
94064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
94164064216a8433360745f69edddce19a606659163The Android Open Source Project       switch (wpa2Data.KeyMngSuite[i])
94264064216a8433360745f69edddce19a606659163The Android Open Source Project       {
94364064216a8433360745f69edddce19a606659163The Android Open Source Project          case WPA2_IE_KEY_MNG_NONE:
94464064216a8433360745f69edddce19a606659163The Android Open Source Project              status = (pAdmCtrl->externalAuthMode <= RSN_EXT_AUTH_MODE_AUTO_SWITCH) ? OK : NOK;
94564064216a8433360745f69edddce19a606659163The Android Open Source Project              break;
94664064216a8433360745f69edddce19a606659163The Android Open Source Project          case WPA2_IE_KEY_MNG_801_1X:
94764064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef EXC_MODULE_INCLUDED
94864064216a8433360745f69edddce19a606659163The Android Open Source Project          case WPA2_IE_KEY_MNG_CCKM:
94964064216a8433360745f69edddce19a606659163The Android Open Source Project                /* CCKM is allowed only in 802.1x auth */
95064064216a8433360745f69edddce19a606659163The Android Open Source Project#endif
95164064216a8433360745f69edddce19a606659163The Android Open Source Project
95264064216a8433360745f69edddce19a606659163The Android Open Source Project              if(!pAdmCtrl->WPAPromoteFlags)
95364064216a8433360745f69edddce19a606659163The Android Open Source Project               status = (pAdmCtrl->externalAuthMode == RSN_EXT_AUTH_MODE_WPA2) ? OK : NOK;
95464064216a8433360745f69edddce19a606659163The Android Open Source Project              else
95564064216a8433360745f69edddce19a606659163The Android Open Source Project                 /* Any-WPA mode is supported */
95664064216a8433360745f69edddce19a606659163The Android Open Source Project                 status = ((pAdmCtrl->externalAuthMode == RSN_EXT_AUTH_MODE_WPA2) ||
95764064216a8433360745f69edddce19a606659163The Android Open Source Project                        (pAdmCtrl->externalAuthMode == RSN_EXT_AUTH_MODE_WPA)) ? OK : NOK;
95864064216a8433360745f69edddce19a606659163The Android Open Source Project              break;
95964064216a8433360745f69edddce19a606659163The Android Open Source Project          case WPA2_IE_KEY_MNG_PSK_801_1X:
96064064216a8433360745f69edddce19a606659163The Android Open Source Project             if(!pAdmCtrl->WPAPromoteFlags)
96164064216a8433360745f69edddce19a606659163The Android Open Source Project                 status = (pAdmCtrl->externalAuthMode == RSN_EXT_AUTH_MODE_WPA2PSK) ? OK : NOK;
96264064216a8433360745f69edddce19a606659163The Android Open Source Project             else
96364064216a8433360745f69edddce19a606659163The Android Open Source Project                 /* Any-WPA mode is supported */
96464064216a8433360745f69edddce19a606659163The Android Open Source Project                status = ((pAdmCtrl->externalAuthMode == RSN_EXT_AUTH_MODE_WPA2PSK) ||
96564064216a8433360745f69edddce19a606659163The Android Open Source Project                       (pAdmCtrl->externalAuthMode == RSN_EXT_AUTH_MODE_WPAPSK)) ? OK : NOK;
96664064216a8433360745f69edddce19a606659163The Android Open Source Project             break;
96764064216a8433360745f69edddce19a606659163The Android Open Source Project       default:
96864064216a8433360745f69edddce19a606659163The Android Open Source Project           WLAN_REPORT_ERROR(pAdmCtrl->hReport, RSN_MODULE_LOG,
96964064216a8433360745f69edddce19a606659163The Android Open Source Project                            ("admCtrlWpa2_evalSite, default, wpa2Data.KeyMngSuite[i]=%d \n",wpa2Data.KeyMngSuite[i]));
97064064216a8433360745f69edddce19a606659163The Android Open Source Project             status = NOK;
97164064216a8433360745f69edddce19a606659163The Android Open Source Project             break;
97264064216a8433360745f69edddce19a606659163The Android Open Source Project       }
97364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
97464064216a8433360745f69edddce19a606659163The Android Open Source Project
97564064216a8433360745f69edddce19a606659163The Android Open Source Project    if (status != OK)
97664064216a8433360745f69edddce19a606659163The Android Open Source Project    {
97764064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR(pAdmCtrl->hReport, RSN_MODULE_LOG,
97864064216a8433360745f69edddce19a606659163The Android Open Source Project                         ("admCtrlWpa2_evalSite, status=%d, externalAuthMode=%d, WPAPromoteFlags=%d \n",
97964064216a8433360745f69edddce19a606659163The Android Open Source Project                          status, pAdmCtrl->externalAuthMode,
98064064216a8433360745f69edddce19a606659163The Android Open Source Project                          pAdmCtrl->WPAPromoteFlags));
98164064216a8433360745f69edddce19a606659163The Android Open Source Project        return status;
98264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
98364064216a8433360745f69edddce19a606659163The Android Open Source Project
98464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Check cipher suite validity */
98564064216a8433360745f69edddce19a606659163The Android Open Source Project    if(admCtrlWpa2_getCipherSuiteMetric(pAdmCtrl, &wpa2Data, pEvaluation, &uSuite, &bSuite) != OK)
98664064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
98764064216a8433360745f69edddce19a606659163The Android Open Source Project
98864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Check privacy bit if not in mixed mode */
98964064216a8433360745f69edddce19a606659163The Android Open Source Project    if (!pAdmCtrl->mixedMode)
99064064216a8433360745f69edddce19a606659163The Android Open Source Project    {   /* There's no mixed mode, so make sure that the privacy Bit matches the privacy mode*/
99164064216a8433360745f69edddce19a606659163The Android Open Source Project        if (((pRsnData->privacy) && (uSuite == RSN_CIPHER_NONE)) ||
99264064216a8433360745f69edddce19a606659163The Android Open Source Project            ((!pRsnData->privacy) && (uSuite > RSN_CIPHER_NONE)))
99364064216a8433360745f69edddce19a606659163The Android Open Source Project        {
99464064216a8433360745f69edddce19a606659163The Android Open Source Project            *pEvaluation = 0;
99564064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
99664064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("admCtrlWpa2_evalSite, mixedMode is FALSE, privacy=%d, uSuite=%d\n",
99764064216a8433360745f69edddce19a606659163The Android Open Source Project                              pRsnData->privacy, uSuite));
99864064216a8433360745f69edddce19a606659163The Android Open Source Project            return NOK;
99964064216a8433360745f69edddce19a606659163The Android Open Source Project        }
100064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
100164064216a8433360745f69edddce19a606659163The Android Open Source Project
100264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* always return OK */
100364064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
100464064216a8433360745f69edddce19a606659163The Android Open Source Project}
100564064216a8433360745f69edddce19a606659163The Android Open Source Project
100664064216a8433360745f69edddce19a606659163The Android Open Source Project
100764064216a8433360745f69edddce19a606659163The Android Open Source Project/**
100864064216a8433360745f69edddce19a606659163The Android Open Source Project*
100964064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_parseIe  - Parse an WPA information element.
101064064216a8433360745f69edddce19a606659163The Android Open Source Project*
101164064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
101264064216a8433360745f69edddce19a606659163The Android Open Source Project*
101364064216a8433360745f69edddce19a606659163The Android Open Source Project* Parse an WPA information element.
101464064216a8433360745f69edddce19a606659163The Android Open Source Project* Builds a structure of the unicast adn broadcast cihper suites,
101564064216a8433360745f69edddce19a606659163The Android Open Source Project* the key management suite and the capabilities.
101664064216a8433360745f69edddce19a606659163The Android Open Source Project*
101764064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
101864064216a8433360745f69edddce19a606659163The Android Open Source Project*
101964064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl - pointer to admCtrl context
102064064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pWpa2Ie  - pointer to WPA IE (RSN IE) buffer  \n
102164064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - pWpa2Data - WPA2 IE (RSN IE) structure after parsing
102264064216a8433360745f69edddce19a606659163The Android Open Source Project*
102364064216a8433360745f69edddce19a606659163The Android Open Source Project*
102464064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
102564064216a8433360745f69edddce19a606659163The Android Open Source Project*
102664064216a8433360745f69edddce19a606659163The Android Open Source Project* OK on success, NOK on failure.
102764064216a8433360745f69edddce19a606659163The Android Open Source Project*
102864064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
102964064216a8433360745f69edddce19a606659163The Android Open Source Project*/
103064064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_parseIe(admCtrl_t *pAdmCtrl, UINT8 *pWpa2Ie, wpa2IeData_t *pWpa2Data)
103164064216a8433360745f69edddce19a606659163The Android Open Source Project{
103264064216a8433360745f69edddce19a606659163The Android Open Source Project    dot11_RSN_t      *wpa2Ie       =  (dot11_RSN_t *)pWpa2Ie;
103364064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT16            temp2bytes, capabilities;
103464064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT16 KeyMngSuiteCntTemp=0;
103564064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8             dataOffset = 0, i = 0, j = 0, curKeyMngSuite = 0;
103664064216a8433360745f69edddce19a606659163The Android Open Source Project    cipherSuite_e     curCipherSuite = RSN_CIPHER_NONE;
103764064216a8433360745f69edddce19a606659163The Android Open Source Project
103864064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
103964064216a8433360745f69edddce19a606659163The Android Open Source Project                            ("Wpa2_IE: DEBUG: admCtrlWpa2_parseIe\n\n"));
104064064216a8433360745f69edddce19a606659163The Android Open Source Project
104164064216a8433360745f69edddce19a606659163The Android Open Source Project    if ((pWpa2Data == NULL) || (pWpa2Ie == NULL))
104264064216a8433360745f69edddce19a606659163The Android Open Source Project    {
104364064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
104464064216a8433360745f69edddce19a606659163The Android Open Source Project    }
104564064216a8433360745f69edddce19a606659163The Android Open Source Project
104664064216a8433360745f69edddce19a606659163The Android Open Source Project    /* get Version value from the info element */
104764064216a8433360745f69edddce19a606659163The Android Open Source Project    temp2bytes = ENDIAN_HANDLE_WORD(*wpa2Ie->rsnIeData);
104864064216a8433360745f69edddce19a606659163The Android Open Source Project    dataOffset += 2;
104964064216a8433360745f69edddce19a606659163The Android Open Source Project
105064064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Check the header fields and the version */
105164064216a8433360745f69edddce19a606659163The Android Open Source Project    if((wpa2Ie->hdr.eleId != RSN_IE_ID) || (wpa2Ie->hdr.eleLen < WPA2_IE_MIN_LENGTH) ||
105264064216a8433360745f69edddce19a606659163The Android Open Source Project       (temp2bytes != WPA2_OUI_MAX_VERSION))
105364064216a8433360745f69edddce19a606659163The Android Open Source Project    {
105464064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR(pAdmCtrl->hReport, RSN_MODULE_LOG,
105564064216a8433360745f69edddce19a606659163The Android Open Source Project           ("Wpa2_ParseIe Error: length=0x%x, elementid=0x%x, version=0x%x\n",
105664064216a8433360745f69edddce19a606659163The Android Open Source Project             wpa2Ie->hdr.eleLen,wpa2Ie->hdr.eleId,temp2bytes));
105764064216a8433360745f69edddce19a606659163The Android Open Source Project
105864064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
105964064216a8433360745f69edddce19a606659163The Android Open Source Project    }
106064064216a8433360745f69edddce19a606659163The Android Open Source Project
106164064216a8433360745f69edddce19a606659163The Android Open Source Project
106264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Set default values */
106364064216a8433360745f69edddce19a606659163The Android Open Source Project    os_memoryZero(pAdmCtrl->hOs, pWpa2Data, sizeof(wpa2IeData_t));
106464064216a8433360745f69edddce19a606659163The Android Open Source Project
106564064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2Data->broadcastSuite = RSN_CIPHER_AES_CCMP;
106664064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2Data->unicastSuiteCnt = 1;
106764064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2Data->unicastSuite[0] = RSN_CIPHER_AES_CCMP;
106864064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2Data->KeyMngSuiteCnt = 1;
106964064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2Data->KeyMngSuite[0] = WPA2_IE_KEY_MNG_801_1X;
107064064216a8433360745f69edddce19a606659163The Android Open Source Project
107164064216a8433360745f69edddce19a606659163The Android Open Source Project    /* If we've reached the end of the received RSN IE */
107264064216a8433360745f69edddce19a606659163The Android Open Source Project    if(wpa2Ie->hdr.eleLen < WPA2_IE_GROUP_SUITE_LENGTH)
107364064216a8433360745f69edddce19a606659163The Android Open Source Project        return OK;
107464064216a8433360745f69edddce19a606659163The Android Open Source Project
107564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Processing of Group Suite field - 4 bytes*/
107664064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2Data->broadcastSuite = (cipherSuite_e)admCtrlWpa2_parseSuiteVal(pAdmCtrl, (UINT8 *)wpa2Ie->rsnIeData + dataOffset,
107764064216a8433360745f69edddce19a606659163The Android Open Source Project                                                          RSN_CIPHER_WEP104, RSN_CIPHER_UNKNOWN);
107864064216a8433360745f69edddce19a606659163The Android Open Source Project    dataOffset +=4;
107964064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
108064064216a8433360745f69edddce19a606659163The Android Open Source Project           ("Wpa2_IE: GroupSuite %x \n", pWpa2Data->broadcastSuite));
108164064216a8433360745f69edddce19a606659163The Android Open Source Project
108264064216a8433360745f69edddce19a606659163The Android Open Source Project
108364064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Processing of Pairwise (Unicast) Cipher Suite - 2 bytes counter and list of 4-byte entries */
108464064216a8433360745f69edddce19a606659163The Android Open Source Project    if(wpa2Ie->hdr.eleLen < WPA2_IE_MIN_PAIRWISE_SUITE_LENGTH)
108564064216a8433360745f69edddce19a606659163The Android Open Source Project        return OK;
108664064216a8433360745f69edddce19a606659163The Android Open Source Project
108764064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2Data->unicastSuiteCnt = ENDIAN_HANDLE_WORD(*(wpa2Ie->rsnIeData + dataOffset));
108864064216a8433360745f69edddce19a606659163The Android Open Source Project    dataOffset += 2;
108964064216a8433360745f69edddce19a606659163The Android Open Source Project
109064064216a8433360745f69edddce19a606659163The Android Open Source Project    if(pWpa2Data->unicastSuiteCnt > UNICAST_CIPHER_MAXNO_IN_RSNIE)
109164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
109264064216a8433360745f69edddce19a606659163The Android Open Source Project        /* something wrong in the RSN IE */
109364064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR(pAdmCtrl->hReport, RSN_MODULE_LOG,
109464064216a8433360745f69edddce19a606659163The Android Open Source Project           ("Wpa2_ParseIe Error: Pairwise cipher suite count is  %d \n", pWpa2Data->unicastSuiteCnt));
109564064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
109664064216a8433360745f69edddce19a606659163The Android Open Source Project    }
109764064216a8433360745f69edddce19a606659163The Android Open Source Project
109864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Get unicast cipher suites */
109964064216a8433360745f69edddce19a606659163The Android Open Source Project    for(i = 0; i < pWpa2Data->unicastSuiteCnt; i++)
110064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
110164064216a8433360745f69edddce19a606659163The Android Open Source Project        curCipherSuite = (cipherSuite_e)admCtrlWpa2_parseSuiteVal(pAdmCtrl, (UINT8 *)wpa2Ie->rsnIeData + dataOffset,
110264064216a8433360745f69edddce19a606659163The Android Open Source Project                                                   RSN_CIPHER_WEP104, RSN_CIPHER_UNKNOWN);
110364064216a8433360745f69edddce19a606659163The Android Open Source Project        if(curCipherSuite == RSN_CIPHER_NONE)
110464064216a8433360745f69edddce19a606659163The Android Open Source Project            curCipherSuite = pWpa2Data->broadcastSuite;
110564064216a8433360745f69edddce19a606659163The Android Open Source Project
110664064216a8433360745f69edddce19a606659163The Android Open Source Project        pWpa2Data->unicastSuite[i] = curCipherSuite;
110764064216a8433360745f69edddce19a606659163The Android Open Source Project        dataOffset +=4;
110864064216a8433360745f69edddce19a606659163The Android Open Source Project
110964064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
111064064216a8433360745f69edddce19a606659163The Android Open Source Project                               ("Wpa_IE: unicast suite %x \n", curCipherSuite));
111164064216a8433360745f69edddce19a606659163The Android Open Source Project    }
111264064216a8433360745f69edddce19a606659163The Android Open Source Project
111364064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Sort all the unicast suites supported by the AP in the decreasing order */
111464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* (so the best cipher suite will be the first)                            */
111564064216a8433360745f69edddce19a606659163The Android Open Source Project    if(pWpa2Data->unicastSuiteCnt > 1)
111664064216a8433360745f69edddce19a606659163The Android Open Source Project    {
111764064216a8433360745f69edddce19a606659163The Android Open Source Project       for(i = 0; i < (pWpa2Data->unicastSuiteCnt -1); i ++)
111864064216a8433360745f69edddce19a606659163The Android Open Source Project       {
111964064216a8433360745f69edddce19a606659163The Android Open Source Project           for(j = 0; j < i; j ++)
112064064216a8433360745f69edddce19a606659163The Android Open Source Project           {
112164064216a8433360745f69edddce19a606659163The Android Open Source Project               if(pWpa2Data->unicastSuite[j] > pWpa2Data->unicastSuite[j + 1])
112264064216a8433360745f69edddce19a606659163The Android Open Source Project               {
112364064216a8433360745f69edddce19a606659163The Android Open Source Project                   curCipherSuite               = pWpa2Data->unicastSuite[j];
112464064216a8433360745f69edddce19a606659163The Android Open Source Project                   pWpa2Data->unicastSuite[j]   = pWpa2Data->unicastSuite[j+1];
112564064216a8433360745f69edddce19a606659163The Android Open Source Project                   pWpa2Data->unicastSuite[j+1] = curCipherSuite;
112664064216a8433360745f69edddce19a606659163The Android Open Source Project               }
112764064216a8433360745f69edddce19a606659163The Android Open Source Project           }
112864064216a8433360745f69edddce19a606659163The Android Open Source Project       }
112964064216a8433360745f69edddce19a606659163The Android Open Source Project    }
113064064216a8433360745f69edddce19a606659163The Android Open Source Project
113164064216a8433360745f69edddce19a606659163The Android Open Source Project    /* If we've reached the end of the received RSN IE */
113264064216a8433360745f69edddce19a606659163The Android Open Source Project    if (wpa2Ie->hdr.eleLen == dataOffset)
113364064216a8433360745f69edddce19a606659163The Android Open Source Project        return OK;
113464064216a8433360745f69edddce19a606659163The Android Open Source Project
113564064216a8433360745f69edddce19a606659163The Android Open Source Project     /* KeyMng Suite */
113664064216a8433360745f69edddce19a606659163The Android Open Source Project/*     pWpa2Data->KeyMngSuiteCnt = ENDIAN_HANDLE_WORD(*((UINT16 *)(wpa2Ie->rsnIeData + dataOffset))); */
113764064216a8433360745f69edddce19a606659163The Android Open Source Project
113864064216a8433360745f69edddce19a606659163The Android Open Source Project     /*Fixing unaligned half word access */
113964064216a8433360745f69edddce19a606659163The Android Open Source Project
114064064216a8433360745f69edddce19a606659163The Android Open Source Project     COPY_UNALIGNED_WORD(&KeyMngSuiteCntTemp,((UINT16 *)(wpa2Ie->rsnIeData + dataOffset)));
114164064216a8433360745f69edddce19a606659163The Android Open Source Project     KeyMngSuiteCntTemp = ENDIAN_HANDLE_WORD(KeyMngSuiteCntTemp);
114264064216a8433360745f69edddce19a606659163The Android Open Source Project     TI_WLAN_COPY_UINT16_UNALIGNED(pWpa2Data->KeyMngSuiteCnt, KeyMngSuiteCntTemp);
114364064216a8433360745f69edddce19a606659163The Android Open Source Project
114464064216a8433360745f69edddce19a606659163The Android Open Source Project
114564064216a8433360745f69edddce19a606659163The Android Open Source Project     dataOffset += 2;
114664064216a8433360745f69edddce19a606659163The Android Open Source Project     pAdmCtrl->wpaAkmExists = FALSE;
114764064216a8433360745f69edddce19a606659163The Android Open Source Project     for(i = 0; i < pWpa2Data->KeyMngSuiteCnt; i++)
114864064216a8433360745f69edddce19a606659163The Android Open Source Project     {
114964064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef EXC_MODULE_INCLUDED
115064064216a8433360745f69edddce19a606659163The Android Open Source Project            curKeyMngSuite = admCtrlExc_parseCckmSuiteVal4Wpa2(pAdmCtrl, (UINT8 *)(wpa2Ie->rsnIeData + dataOffset));
115164064216a8433360745f69edddce19a606659163The Android Open Source Project            if (curKeyMngSuite == WPA2_IE_KEY_MNG_CCKM)
115264064216a8433360745f69edddce19a606659163The Android Open Source Project            {  /* CCKM is the maximum AKM */
115364064216a8433360745f69edddce19a606659163The Android Open Source Project                pWpa2Data->KeyMngSuite[i] = curKeyMngSuite;
115464064216a8433360745f69edddce19a606659163The Android Open Source Project            }
115564064216a8433360745f69edddce19a606659163The Android Open Source Project            else
115664064216a8433360745f69edddce19a606659163The Android Open Source Project#endif
115764064216a8433360745f69edddce19a606659163The Android Open Source Project            {
115864064216a8433360745f69edddce19a606659163The Android Open Source Project                curKeyMngSuite = admCtrlWpa2_parseSuiteVal(pAdmCtrl, (UINT8 *)wpa2Ie->rsnIeData + dataOffset,
115964064216a8433360745f69edddce19a606659163The Android Open Source Project                            WPA2_IE_KEY_MNG_PSK_801_1X, WPA2_IE_KEY_MNG_NA);
116064064216a8433360745f69edddce19a606659163The Android Open Source Project            }
116164064216a8433360745f69edddce19a606659163The Android Open Source Project
116264064216a8433360745f69edddce19a606659163The Android Open Source Project
116364064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
116464064216a8433360745f69edddce19a606659163The Android Open Source Project           ("Wpa2_IE: authKeyMng %x  \n", curKeyMngSuite));
116564064216a8433360745f69edddce19a606659163The Android Open Source Project
116664064216a8433360745f69edddce19a606659163The Android Open Source Project         if ((curKeyMngSuite != WPA2_IE_KEY_MNG_NA) &&
116764064216a8433360745f69edddce19a606659163The Android Open Source Project             (curKeyMngSuite != WPA2_IE_KEY_MNG_CCKM))
116864064216a8433360745f69edddce19a606659163The Android Open Source Project         {
116964064216a8433360745f69edddce19a606659163The Android Open Source Project             pWpa2Data->KeyMngSuite[i] = curKeyMngSuite;
117064064216a8433360745f69edddce19a606659163The Android Open Source Project         }
117164064216a8433360745f69edddce19a606659163The Android Open Source Project
117264064216a8433360745f69edddce19a606659163The Android Open Source Project         if (curKeyMngSuite==WPA2_IE_KEY_MNG_801_1X)
117364064216a8433360745f69edddce19a606659163The Android Open Source Project         {   /* If 2 AKM exist, save also the second priority */
117464064216a8433360745f69edddce19a606659163The Android Open Source Project             pAdmCtrl->wpaAkmExists = TRUE;
117564064216a8433360745f69edddce19a606659163The Android Open Source Project         }
117664064216a8433360745f69edddce19a606659163The Android Open Source Project
117764064216a8433360745f69edddce19a606659163The Android Open Source Project         dataOffset += 4;
117864064216a8433360745f69edddce19a606659163The Android Open Source Project     }
117964064216a8433360745f69edddce19a606659163The Android Open Source Project
118064064216a8433360745f69edddce19a606659163The Android Open Source Project    /* If we've reached the end of the received RSN IE */
118164064216a8433360745f69edddce19a606659163The Android Open Source Project    if (wpa2Ie->hdr.eleLen == dataOffset)
118264064216a8433360745f69edddce19a606659163The Android Open Source Project        return OK;
118364064216a8433360745f69edddce19a606659163The Android Open Source Project
118464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Parse capabilities */
118564064216a8433360745f69edddce19a606659163The Android Open Source Project
118664064216a8433360745f69edddce19a606659163The Android Open Source Project/*    capabilities = ENDIAN_HANDLE_WORD(*((UINT16 *)(wpa2Ie->rsnIeData + dataOffset))); */
118764064216a8433360745f69edddce19a606659163The Android Open Source Project
118864064216a8433360745f69edddce19a606659163The Android Open Source Project   /* Fixing unaligned half word access */
118964064216a8433360745f69edddce19a606659163The Android Open Source Project
119064064216a8433360745f69edddce19a606659163The Android Open Source Project    COPY_UNALIGNED_WORD(&capabilities,((UINT16 *)(wpa2Ie->rsnIeData + dataOffset)));
119164064216a8433360745f69edddce19a606659163The Android Open Source Project    capabilities = ENDIAN_HANDLE_WORD(capabilities);
119264064216a8433360745f69edddce19a606659163The Android Open Source Project
119364064216a8433360745f69edddce19a606659163The Android Open Source Project
119464064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2Data->bcastForUnicatst  = (UINT8)(capabilities & WPA2_GROUP_4_UNICAST_CAPABILITY_MASK)>>
119564064216a8433360745f69edddce19a606659163The Android Open Source Project                                           WPA2_GROUP_4_UNICAST_CAPABILITY_SHIFT;
119664064216a8433360745f69edddce19a606659163The Android Open Source Project    pWpa2Data->ptkReplayCounters = (UINT8)(capabilities &  WPA2_PTK_REPLAY_COUNTERS_CAPABILITY_MASK)>>
119764064216a8433360745f69edddce19a606659163The Android Open Source Project                                           WPA2_PTK_REPLAY_COUNTERS_CAPABILITY_SHIFT;
119864064216a8433360745f69edddce19a606659163The Android Open Source Project
119964064216a8433360745f69edddce19a606659163The Android Open Source Project    switch (pWpa2Data->ptkReplayCounters)
120064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
120164064216a8433360745f69edddce19a606659163The Android Open Source Project    case 0: pWpa2Data->ptkReplayCounters=1;
120264064216a8433360745f69edddce19a606659163The Android Open Source Project            break;
120364064216a8433360745f69edddce19a606659163The Android Open Source Project    case 1: pWpa2Data->ptkReplayCounters=2;
120464064216a8433360745f69edddce19a606659163The Android Open Source Project            break;
120564064216a8433360745f69edddce19a606659163The Android Open Source Project    case 2: pWpa2Data->ptkReplayCounters=4;
120664064216a8433360745f69edddce19a606659163The Android Open Source Project            break;
120764064216a8433360745f69edddce19a606659163The Android Open Source Project    case 3: pWpa2Data->ptkReplayCounters=16;
120864064216a8433360745f69edddce19a606659163The Android Open Source Project            break;
120964064216a8433360745f69edddce19a606659163The Android Open Source Project    default: pWpa2Data->ptkReplayCounters=1;
121064064216a8433360745f69edddce19a606659163The Android Open Source Project            break;
121164064216a8433360745f69edddce19a606659163The Android Open Source Project   }
121264064216a8433360745f69edddce19a606659163The Android Open Source Project   pWpa2Data->gtkReplayCounters = (UINT8)(capabilities &
121364064216a8433360745f69edddce19a606659163The Android Open Source Project                                        WPA2_GTK_REPLAY_COUNTERS_CAPABILITY_MASK) >>
121464064216a8433360745f69edddce19a606659163The Android Open Source Project                                        WPA2_GTK_REPLAY_COUNTERS_CAPABILITY_SHIFT;
121564064216a8433360745f69edddce19a606659163The Android Open Source Project   switch (pWpa2Data->gtkReplayCounters)
121664064216a8433360745f69edddce19a606659163The Android Open Source Project   {
121764064216a8433360745f69edddce19a606659163The Android Open Source Project   case 0: pWpa2Data->gtkReplayCounters=1;
121864064216a8433360745f69edddce19a606659163The Android Open Source Project            break;
121964064216a8433360745f69edddce19a606659163The Android Open Source Project   case 1: pWpa2Data->gtkReplayCounters=2;
122064064216a8433360745f69edddce19a606659163The Android Open Source Project            break;
122164064216a8433360745f69edddce19a606659163The Android Open Source Project   case 2: pWpa2Data->gtkReplayCounters=4;
122264064216a8433360745f69edddce19a606659163The Android Open Source Project            break;
122364064216a8433360745f69edddce19a606659163The Android Open Source Project   case 3: pWpa2Data->gtkReplayCounters=16;
122464064216a8433360745f69edddce19a606659163The Android Open Source Project            break;
122564064216a8433360745f69edddce19a606659163The Android Open Source Project   default: pWpa2Data->gtkReplayCounters=1;
122664064216a8433360745f69edddce19a606659163The Android Open Source Project            break;
122764064216a8433360745f69edddce19a606659163The Android Open Source Project   }
122864064216a8433360745f69edddce19a606659163The Android Open Source Project
122964064216a8433360745f69edddce19a606659163The Android Open Source Project   pWpa2Data->preAuthentication = (UINT8)(capabilities & WPA2_PRE_AUTH_CAPABILITY_MASK);
123064064216a8433360745f69edddce19a606659163The Android Open Source Project
123164064216a8433360745f69edddce19a606659163The Android Open Source Project   WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
123264064216a8433360745f69edddce19a606659163The Android Open Source Project                                ("Wpa2_IE: capabilities %x, preAuthentication = %x, bcastForUnicatst %x, ptk = %x, gtk = %x\n",
123364064216a8433360745f69edddce19a606659163The Android Open Source Project                                 capabilities, pWpa2Data->preAuthentication,
123464064216a8433360745f69edddce19a606659163The Android Open Source Project                                 pWpa2Data->bcastForUnicatst, pWpa2Data->ptkReplayCounters,
123564064216a8433360745f69edddce19a606659163The Android Open Source Project                                 pWpa2Data->gtkReplayCounters));
123664064216a8433360745f69edddce19a606659163The Android Open Source Project
123764064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
123864064216a8433360745f69edddce19a606659163The Android Open Source Project
123964064216a8433360745f69edddce19a606659163The Android Open Source Project}
124064064216a8433360745f69edddce19a606659163The Android Open Source Project
124164064216a8433360745f69edddce19a606659163The Android Open Source Project
124264064216a8433360745f69edddce19a606659163The Android Open Source ProjectUINT16 admCtrlWpa2_buildCapabilities(admCtrl_t *pAdmCtrl)
124364064216a8433360745f69edddce19a606659163The Android Open Source Project{
124464064216a8433360745f69edddce19a606659163The Android Open Source Project   UINT16 capabilities = 0;
124564064216a8433360745f69edddce19a606659163The Android Open Source Project   UINT16 replayCnt;
124664064216a8433360745f69edddce19a606659163The Android Open Source Project
124764064216a8433360745f69edddce19a606659163The Android Open Source Project
124864064216a8433360745f69edddce19a606659163The Android Open Source Project   /* Bit 0 - Pre-authentication is set to 0             */
124964064216a8433360745f69edddce19a606659163The Android Open Source Project   /* when RSN IE is sent from a STA (in assoc request)  */
125064064216a8433360745f69edddce19a606659163The Android Open Source Project
125164064216a8433360745f69edddce19a606659163The Android Open Source Project   /* Bit1: group key for unicast is set to 0*/
125264064216a8433360745f69edddce19a606659163The Android Open Source Project
125364064216a8433360745f69edddce19a606659163The Android Open Source Project   /* Bits 2&3: PTKSA Replay counter; bits 4&5 GTKSA replay Counters */
125464064216a8433360745f69edddce19a606659163The Android Open Source Project   switch (pAdmCtrl->replayCnt)
125564064216a8433360745f69edddce19a606659163The Android Open Source Project   {
125664064216a8433360745f69edddce19a606659163The Android Open Source Project   case 1:  replayCnt=0;
125764064216a8433360745f69edddce19a606659163The Android Open Source Project       break;
125864064216a8433360745f69edddce19a606659163The Android Open Source Project   case 2:  replayCnt=1;
125964064216a8433360745f69edddce19a606659163The Android Open Source Project       break;
126064064216a8433360745f69edddce19a606659163The Android Open Source Project   case 4:  replayCnt=2;
126164064216a8433360745f69edddce19a606659163The Android Open Source Project       break;
126264064216a8433360745f69edddce19a606659163The Android Open Source Project   case 16: replayCnt=3;
126364064216a8433360745f69edddce19a606659163The Android Open Source Project       break;
126464064216a8433360745f69edddce19a606659163The Android Open Source Project   default: replayCnt=0;
126564064216a8433360745f69edddce19a606659163The Android Open Source Project       break;
126664064216a8433360745f69edddce19a606659163The Android Open Source Project   }
126764064216a8433360745f69edddce19a606659163The Android Open Source Project
126864064216a8433360745f69edddce19a606659163The Android Open Source Project   capabilities |= replayCnt << WPA2_PTK_REPLAY_COUNTERS_CAPABILITY_SHIFT;
126964064216a8433360745f69edddce19a606659163The Android Open Source Project   capabilities |= replayCnt << WPA2_GTK_REPLAY_COUNTERS_CAPABILITY_SHIFT;
127064064216a8433360745f69edddce19a606659163The Android Open Source Project
127164064216a8433360745f69edddce19a606659163The Android Open Source Project   return   capabilities;
127264064216a8433360745f69edddce19a606659163The Android Open Source Project
127364064216a8433360745f69edddce19a606659163The Android Open Source Project}
127464064216a8433360745f69edddce19a606659163The Android Open Source Project
127564064216a8433360745f69edddce19a606659163The Android Open Source Project
127664064216a8433360745f69edddce19a606659163The Android Open Source ProjectUINT32  admCtrlWpa2_parseSuiteVal(admCtrl_t *pAdmCtrl, UINT8* suiteVal, UINT32 maxVal, UINT32 unknownVal)
127764064216a8433360745f69edddce19a606659163The Android Open Source Project{
127864064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT32  suite;
127964064216a8433360745f69edddce19a606659163The Android Open Source Project
128064064216a8433360745f69edddce19a606659163The Android Open Source Project    if ((pAdmCtrl==NULL) || (suiteVal==NULL))
128164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
128264064216a8433360745f69edddce19a606659163The Android Open Source Project        return RSN_CIPHER_UNKNOWN;
128364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
128464064216a8433360745f69edddce19a606659163The Android Open Source Project    if (!os_memoryCompare(pAdmCtrl->hOs, suiteVal, wpa2IeOuiIe, 3))
128564064216a8433360745f69edddce19a606659163The Android Open Source Project    {
128664064216a8433360745f69edddce19a606659163The Android Open Source Project        suite =  (cipherSuite_e)((suiteVal[3]<=maxVal) ? suiteVal[3] : unknownVal);
128764064216a8433360745f69edddce19a606659163The Android Open Source Project    } else
128864064216a8433360745f69edddce19a606659163The Android Open Source Project    {
128964064216a8433360745f69edddce19a606659163The Android Open Source Project        suite = unknownVal;
129064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
129164064216a8433360745f69edddce19a606659163The Android Open Source Project    return  suite;
129264064216a8433360745f69edddce19a606659163The Android Open Source Project
129364064216a8433360745f69edddce19a606659163The Android Open Source Project}
129464064216a8433360745f69edddce19a606659163The Android Open Source Project
129564064216a8433360745f69edddce19a606659163The Android Open Source Project
129664064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_checkCipherSuiteValidity (cipherSuite_e unicastSuite, cipherSuite_e broadcastSuite, cipherSuite_e encryptionStatus)
129764064216a8433360745f69edddce19a606659163The Android Open Source Project{
129864064216a8433360745f69edddce19a606659163The Android Open Source Project    cipherSuite_e maxCipher;
129964064216a8433360745f69edddce19a606659163The Android Open Source Project
130064064216a8433360745f69edddce19a606659163The Android Open Source Project    maxCipher = (unicastSuite>=broadcastSuite) ? unicastSuite : broadcastSuite ;
130164064216a8433360745f69edddce19a606659163The Android Open Source Project    if (maxCipher != encryptionStatus)
130264064216a8433360745f69edddce19a606659163The Android Open Source Project    {
130364064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
130464064216a8433360745f69edddce19a606659163The Android Open Source Project    }
130564064216a8433360745f69edddce19a606659163The Android Open Source Project    if ((unicastSuite != RSN_CIPHER_NONE) && (broadcastSuite>unicastSuite))
130664064216a8433360745f69edddce19a606659163The Android Open Source Project    {
130764064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
130864064216a8433360745f69edddce19a606659163The Android Open Source Project    }
130964064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
131064064216a8433360745f69edddce19a606659163The Android Open Source Project}
131164064216a8433360745f69edddce19a606659163The Android Open Source Project
131264064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_getCipherSuiteMetric (admCtrl_t *pAdmCtrl, wpa2IeData_t *pWpa2Data, UINT32 *metric,
131364064216a8433360745f69edddce19a606659163The Android Open Source Project                                            cipherSuite_e *uSuite, cipherSuite_e  *bSuite)
131464064216a8433360745f69edddce19a606659163The Android Open Source Project{
131564064216a8433360745f69edddce19a606659163The Android Open Source Project   cipherSuite_e   encryption   = RSN_CIPHER_NONE;
131664064216a8433360745f69edddce19a606659163The Android Open Source Project   cipherSuite_e   unicastSuite = RSN_CIPHER_NONE, brdcstSuite = RSN_CIPHER_NONE;
131764064216a8433360745f69edddce19a606659163The Android Open Source Project   admCtrlWpa2_validity_t  admCtrlWpa2_validity;
131864064216a8433360745f69edddce19a606659163The Android Open Source Project   UINT32     maxMetric = 0, index = 0;
131964064216a8433360745f69edddce19a606659163The Android Open Source Project   TI_STATUS  status = NOK;
132064064216a8433360745f69edddce19a606659163The Android Open Source Project
132164064216a8433360745f69edddce19a606659163The Android Open Source Project   /* Set admCtrlWpa2_validity initial values */
132264064216a8433360745f69edddce19a606659163The Android Open Source Project   admCtrlWpa2_validity = admCtrlWpa2_validityTable[RSN_CIPHER_NONE][RSN_CIPHER_NONE][RSN_CIPHER_NONE];
132364064216a8433360745f69edddce19a606659163The Android Open Source Project
132464064216a8433360745f69edddce19a606659163The Android Open Source Project   /* Check validity of configured encryption (cipher) and validity of */
132564064216a8433360745f69edddce19a606659163The Android Open Source Project   /* promoted cipher (in case of AnyWPA (WPAmixed mode))              */
132664064216a8433360745f69edddce19a606659163The Android Open Source Project   pAdmCtrl->getCipherSuite(pAdmCtrl, &encryption);
132764064216a8433360745f69edddce19a606659163The Android Open Source Project   WLAN_REPORT_INFORMATION (pAdmCtrl->hReport, RSN_MODULE_LOG,
132864064216a8433360745f69edddce19a606659163The Android Open Source Project                               ("admCtrlWpa2_getCipherSuiteMetric, encryption=%d\n", encryption));
132964064216a8433360745f69edddce19a606659163The Android Open Source Project
133064064216a8433360745f69edddce19a606659163The Android Open Source Project   while(encryption != RSN_CIPHER_NONE)
133164064216a8433360745f69edddce19a606659163The Android Open Source Project   {
133264064216a8433360745f69edddce19a606659163The Android Open Source Project      for (index=0; index<pWpa2Data->unicastSuiteCnt; index++)
133364064216a8433360745f69edddce19a606659163The Android Open Source Project      {
133464064216a8433360745f69edddce19a606659163The Android Open Source Project          admCtrlWpa2_validity =
133564064216a8433360745f69edddce19a606659163The Android Open Source Project          admCtrlWpa2_validityTable[pWpa2Data->unicastSuite[index]][pWpa2Data->broadcastSuite][encryption];
133664064216a8433360745f69edddce19a606659163The Android Open Source Project          if (admCtrlWpa2_validity.status == OK)
133764064216a8433360745f69edddce19a606659163The Android Open Source Project          {
133864064216a8433360745f69edddce19a606659163The Android Open Source Project              WLAN_REPORT_INFORMATION (pAdmCtrl->hReport, RSN_MODULE_LOG,
133964064216a8433360745f69edddce19a606659163The Android Open Source Project                                          ("admCtrlWpa2_getCipherSuiteMetric, break: validity.evaluation=%d\n",
134064064216a8433360745f69edddce19a606659163The Android Open Source Project                                           admCtrlWpa2_validity.evaluation));
134164064216a8433360745f69edddce19a606659163The Android Open Source Project              break;
134264064216a8433360745f69edddce19a606659163The Android Open Source Project          }
134364064216a8433360745f69edddce19a606659163The Android Open Source Project      }
134464064216a8433360745f69edddce19a606659163The Android Open Source Project
134564064216a8433360745f69edddce19a606659163The Android Open Source Project      if ((admCtrlWpa2_validity.status == OK) && (admCtrlWpa2_validity.evaluation > maxMetric))
134664064216a8433360745f69edddce19a606659163The Android Open Source Project      {
134764064216a8433360745f69edddce19a606659163The Android Open Source Project          WLAN_REPORT_INFORMATION (pAdmCtrl->hReport, RSN_MODULE_LOG,
134864064216a8433360745f69edddce19a606659163The Android Open Source Project                                      ("admCtrlWpa2_getCipherSuiteMetric, validity.evaluation=%d, maxMetric=%d\n",
134964064216a8433360745f69edddce19a606659163The Android Open Source Project                                       admCtrlWpa2_validity.evaluation, maxMetric));
135064064216a8433360745f69edddce19a606659163The Android Open Source Project
135164064216a8433360745f69edddce19a606659163The Android Open Source Project          maxMetric       = admCtrlWpa2_validity.evaluation;
135264064216a8433360745f69edddce19a606659163The Android Open Source Project          status          = admCtrlWpa2_validity.status;
135364064216a8433360745f69edddce19a606659163The Android Open Source Project          unicastSuite    = admCtrlWpa2_validity.unicast;
135464064216a8433360745f69edddce19a606659163The Android Open Source Project          brdcstSuite     = admCtrlWpa2_validity.broadcast;
135564064216a8433360745f69edddce19a606659163The Android Open Source Project      }
135664064216a8433360745f69edddce19a606659163The Android Open Source Project
135764064216a8433360745f69edddce19a606659163The Android Open Source Project      if((pAdmCtrl->WPAPromoteFlags & ADMCTRL_WPA_OPTION_ENABLE_PROMOTE_CIPHER) &&
135864064216a8433360745f69edddce19a606659163The Android Open Source Project         (encryption != RSN_CIPHER_AES_CCMP))
135964064216a8433360745f69edddce19a606659163The Android Open Source Project         encryption = RSN_CIPHER_AES_CCMP;
136064064216a8433360745f69edddce19a606659163The Android Open Source Project      else
136164064216a8433360745f69edddce19a606659163The Android Open Source Project         encryption = RSN_CIPHER_NONE;
136264064216a8433360745f69edddce19a606659163The Android Open Source Project
136364064216a8433360745f69edddce19a606659163The Android Open Source Project    }  /* End of "while encryption" stmt */
136464064216a8433360745f69edddce19a606659163The Android Open Source Project
136564064216a8433360745f69edddce19a606659163The Android Open Source Project   if(metric)
136664064216a8433360745f69edddce19a606659163The Android Open Source Project      *metric = maxMetric;
136764064216a8433360745f69edddce19a606659163The Android Open Source Project
136864064216a8433360745f69edddce19a606659163The Android Open Source Project   if(uSuite)
136964064216a8433360745f69edddce19a606659163The Android Open Source Project      *uSuite = unicastSuite;
137064064216a8433360745f69edddce19a606659163The Android Open Source Project
137164064216a8433360745f69edddce19a606659163The Android Open Source Project   if(bSuite)
137264064216a8433360745f69edddce19a606659163The Android Open Source Project      *bSuite = brdcstSuite;
137364064216a8433360745f69edddce19a606659163The Android Open Source Project
137464064216a8433360745f69edddce19a606659163The Android Open Source Project    return status;
137564064216a8433360745f69edddce19a606659163The Android Open Source Project}
137664064216a8433360745f69edddce19a606659163The Android Open Source Project
137764064216a8433360745f69edddce19a606659163The Android Open Source Project
137864064216a8433360745f69edddce19a606659163The Android Open Source Project/**
137964064216a8433360745f69edddce19a606659163The Android Open Source Project*
138064064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_DynamicConfig  - Dynamic setting of WPA2 config parameters.
138164064216a8433360745f69edddce19a606659163The Android Open Source Project*
138264064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
138364064216a8433360745f69edddce19a606659163The Android Open Source Project*
138464064216a8433360745f69edddce19a606659163The Android Open Source Project*   Sets  WPA2 callback procedures and PAE configuration parameters.
138564064216a8433360745f69edddce19a606659163The Android Open Source Project*   This procedure is similar to admCtrlWpa2_Config procedure.
138664064216a8433360745f69edddce19a606659163The Android Open Source Project*   The main difference is that admCtrlWpa2_Config sets the DEFAULT VALUES
138764064216a8433360745f69edddce19a606659163The Android Open Source Project*   of the configuration parameters and so it should be called during
138864064216a8433360745f69edddce19a606659163The Android Open Source Project*   initialization of the driver code or when Auth mode or Encryption status
138964064216a8433360745f69edddce19a606659163The Android Open Source Project*   parameters are beeing set.
139064064216a8433360745f69edddce19a606659163The Android Open Source Project*   admCtrlWpa2_DynamicConfig set the updated values of WPA2 configuration
139164064216a8433360745f69edddce19a606659163The Android Open Source Project*   parameters which gets after negotiation with an AP. So the procedure
139264064216a8433360745f69edddce19a606659163The Android Open Source Project*   should be called during setSite stage.
139364064216a8433360745f69edddce19a606659163The Android Open Source Project*
139464064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
139564064216a8433360745f69edddce19a606659163The Android Open Source Project*
139664064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl    - pointer to admCtrl context
139764064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pPaeConfig  - pointer to PAE structure
139864064216a8433360745f69edddce19a606659163The Android Open Source Project*
139964064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
140064064216a8433360745f69edddce19a606659163The Android Open Source Project*
140164064216a8433360745f69edddce19a606659163The Android Open Source Project* OK on success, NOK on failure.
140264064216a8433360745f69edddce19a606659163The Android Open Source Project*
140364064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
140464064216a8433360745f69edddce19a606659163The Android Open Source Project*/
140564064216a8433360745f69edddce19a606659163The Android Open Source Project
140664064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_DynamicConfig(admCtrl_t *pAdmCtrl, rsn_paeConfig_t *pPaeConfig)
140764064216a8433360745f69edddce19a606659163The Android Open Source Project{
140864064216a8433360745f69edddce19a606659163The Android Open Source Project    TI_STATUS status = OK;
140964064216a8433360745f69edddce19a606659163The Android Open Source Project
141064064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Set those WPA2 params and callback procedures used after setSite stage */
141164064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->getInfoElement = admCtrlWpa2_getInfoElement;
141264064216a8433360745f69edddce19a606659163The Android Open Source Project
141364064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->getPmkidList      = admCtrlWpa2_getPMKIDList;
141464064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->setPmkidList      = admCtrlWpa2_setPMKIDList;
141564064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->resetPmkidList    = admCtrlWpa2_resetPMKIDCache;
141664064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->getPreAuthStatus = admCtrlWpa2_getPreAuthStatus;
141764064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->startPreAuth = admCtrlWpa2_startPreAuth;
141864064216a8433360745f69edddce19a606659163The Android Open Source Project
141964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* set key management suite */
142064064216a8433360745f69edddce19a606659163The Android Open Source Project    switch (pAdmCtrl->externalAuthMode)
142164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
142264064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPA2:
142364064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPA2PSK:
142464064216a8433360745f69edddce19a606659163The Android Open Source Project        pAdmCtrl->keyMngSuite = RSN_KEY_MNG_802_1X;
142564064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
142664064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPA:  /* It is any-WPA (WPA-mixed mode ) */
142764064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPAPSK:
142864064216a8433360745f69edddce19a606659163The Android Open Source Project        pAdmCtrl->keyMngSuite = RSN_KEY_MNG_802_1X;
142964064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
143064064216a8433360745f69edddce19a606659163The Android Open Source Project    case RSN_EXT_AUTH_MODE_WPANONE:
143164064216a8433360745f69edddce19a606659163The Android Open Source Project        pAdmCtrl->keyMngSuite = RSN_KEY_MNG_NONE;
143264064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Not supported */
143364064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
143464064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
143564064216a8433360745f69edddce19a606659163The Android Open Source Project    }
143664064216a8433360745f69edddce19a606659163The Android Open Source Project
143764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Config PAE (if needed) */
143864064216a8433360745f69edddce19a606659163The Android Open Source Project    if(pPaeConfig)
143964064216a8433360745f69edddce19a606659163The Android Open Source Project       status = pAdmCtrl->pRsn->setPaeConfig(pAdmCtrl->pRsn, pPaeConfig);
144064064216a8433360745f69edddce19a606659163The Android Open Source Project
144164064216a8433360745f69edddce19a606659163The Android Open Source Project    return status;
144264064216a8433360745f69edddce19a606659163The Android Open Source Project}
144364064216a8433360745f69edddce19a606659163The Android Open Source Project
144464064216a8433360745f69edddce19a606659163The Android Open Source Project
144564064216a8433360745f69edddce19a606659163The Android Open Source Project
144664064216a8433360745f69edddce19a606659163The Android Open Source Project
144764064216a8433360745f69edddce19a606659163The Android Open Source Project/**
144864064216a8433360745f69edddce19a606659163The Android Open Source Project*
144964064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_findPMKID
145064064216a8433360745f69edddce19a606659163The Android Open Source Project*
145164064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
145264064216a8433360745f69edddce19a606659163The Android Open Source Project*
145364064216a8433360745f69edddce19a606659163The Android Open Source Project* Retrieve an AP's PMKID (if exist)
145464064216a8433360745f69edddce19a606659163The Android Open Source Project
145564064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
145664064216a8433360745f69edddce19a606659163The Android Open Source Project*
145764064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl - pointer to admCtrl context
145864064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pBSSID   - pointer to AP's BSSID address
145964064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - pmkID    - pointer to AP's PMKID (if it is NULL ptr, only
146064064216a8433360745f69edddce19a606659163The Android Open Source Project*                   cache index will be returned to the caller)
146164064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - cacheIndex  - index of the cache table entry containing the
146264064216a8433360745f69edddce19a606659163The Android Open Source Project                       bssid
146364064216a8433360745f69edddce19a606659163The Android Open Source Project*
146464064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
146564064216a8433360745f69edddce19a606659163The Android Open Source Project*
146664064216a8433360745f69edddce19a606659163The Android Open Source Project* OK on success, NOK on failure.
146764064216a8433360745f69edddce19a606659163The Android Open Source Project*
146864064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
146964064216a8433360745f69edddce19a606659163The Android Open Source Project*/
147064064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_findPMKID (admCtrl_t * pAdmCtrl, macAddress_t *pBSSID,
147164064216a8433360745f69edddce19a606659163The Android Open Source Project                                 pmkidValue_t *pPMKID, UINT8  *cacheIndex)
147264064216a8433360745f69edddce19a606659163The Android Open Source Project{
147364064216a8433360745f69edddce19a606659163The Android Open Source Project
147464064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8           i     = 0;
147564064216a8433360745f69edddce19a606659163The Android Open Source Project    BOOL            found = FALSE;
147664064216a8433360745f69edddce19a606659163The Android Open Source Project    macAddress_t    entryMac;
147764064216a8433360745f69edddce19a606659163The Android Open Source Project    TI_STATUS       status = NOK;
147864064216a8433360745f69edddce19a606659163The Android Open Source Project
147964064216a8433360745f69edddce19a606659163The Android Open Source Project    while(!found && (i < ADMCTRL_PMKID_CACHE_SIZE) &&
148064064216a8433360745f69edddce19a606659163The Android Open Source Project                    (i <= pAdmCtrl->pmkid_cache.entriesNumber))
148164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
148264064216a8433360745f69edddce19a606659163The Android Open Source Project        entryMac = pAdmCtrl->pmkid_cache.pmkidTbl[i].bssId;
148364064216a8433360745f69edddce19a606659163The Android Open Source Project        if(MAC_EQUAL ((&entryMac),pBSSID))
148464064216a8433360745f69edddce19a606659163The Android Open Source Project        {
148564064216a8433360745f69edddce19a606659163The Android Open Source Project            found       = TRUE;
148664064216a8433360745f69edddce19a606659163The Android Open Source Project            *cacheIndex = i;
148764064216a8433360745f69edddce19a606659163The Android Open Source Project            if(pPMKID)
148864064216a8433360745f69edddce19a606659163The Android Open Source Project            {
148964064216a8433360745f69edddce19a606659163The Android Open Source Project               os_memoryCopy(pAdmCtrl->hOs, (PVOID)pPMKID,
149064064216a8433360745f69edddce19a606659163The Android Open Source Project                             pAdmCtrl->pmkid_cache.pmkidTbl[i].pmkId,
149164064216a8433360745f69edddce19a606659163The Android Open Source Project                             PMKID_VALUE_SIZE);
149264064216a8433360745f69edddce19a606659163The Android Open Source Project            }
149364064216a8433360745f69edddce19a606659163The Android Open Source Project        }
149464064216a8433360745f69edddce19a606659163The Android Open Source Project        i++;
149564064216a8433360745f69edddce19a606659163The Android Open Source Project    }
149664064216a8433360745f69edddce19a606659163The Android Open Source Project
149764064216a8433360745f69edddce19a606659163The Android Open Source Project    if(found)
149864064216a8433360745f69edddce19a606659163The Android Open Source Project        status = OK;
149964064216a8433360745f69edddce19a606659163The Android Open Source Project
150064064216a8433360745f69edddce19a606659163The Android Open Source Project    return status;
150164064216a8433360745f69edddce19a606659163The Android Open Source Project
150264064216a8433360745f69edddce19a606659163The Android Open Source Project}
150364064216a8433360745f69edddce19a606659163The Android Open Source Project
150464064216a8433360745f69edddce19a606659163The Android Open Source Project
150564064216a8433360745f69edddce19a606659163The Android Open Source Project/**
150664064216a8433360745f69edddce19a606659163The Android Open Source Project*
150764064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_getPMKIDList
150864064216a8433360745f69edddce19a606659163The Android Open Source Project*
150964064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
151064064216a8433360745f69edddce19a606659163The Android Open Source Project*
151164064216a8433360745f69edddce19a606659163The Android Open Source Project* Returns content of the PMKID cache
151264064216a8433360745f69edddce19a606659163The Android Open Source Project*
151364064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
151464064216a8433360745f69edddce19a606659163The Android Open Source Project*
151564064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl        - pointer to admCtrl context
151664064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - pmkidList       - memory buffer where the procedure writes the PMKIDs
151764064216a8433360745f69edddce19a606659163The Android Open Source Project*                          Supplied by the caller procedure. .
151864064216a8433360745f69edddce19a606659163The Android Open Source Project*
151964064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
152064064216a8433360745f69edddce19a606659163The Android Open Source Project*
152164064216a8433360745f69edddce19a606659163The Android Open Source Project* OK on success, NOK on failure.
152264064216a8433360745f69edddce19a606659163The Android Open Source Project*
152364064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
152464064216a8433360745f69edddce19a606659163The Android Open Source Project*/
152564064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_getPMKIDList (admCtrl_t * pAdmCtrl,OS_802_11_PMKID *pmkidList)
152664064216a8433360745f69edddce19a606659163The Android Open Source Project{
152764064216a8433360745f69edddce19a606659163The Android Open Source Project
152864064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8   neededLength, i = 0;
152964064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8   NumOfEntries = pAdmCtrl->pmkid_cache.entriesNumber;
153064064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8   *bssid, *pmkid;
153164064216a8433360745f69edddce19a606659163The Android Open Source Project
153264064216a8433360745f69edddce19a606659163The Android Open Source Project    if(!pAdmCtrl->preAuthSupport)
153364064216a8433360745f69edddce19a606659163The Android Open Source Project        return PARAM_NOT_SUPPORTED;
153464064216a8433360745f69edddce19a606659163The Android Open Source Project
153564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Check the buffer length */
153664064216a8433360745f69edddce19a606659163The Android Open Source Project    if(NumOfEntries > 1)
153764064216a8433360745f69edddce19a606659163The Android Open Source Project       neededLength = 30 + ((NumOfEntries - 1) * (MAC_ADDR_LEN + PMKID_VALUE_SIZE));
153864064216a8433360745f69edddce19a606659163The Android Open Source Project    else
153964064216a8433360745f69edddce19a606659163The Android Open Source Project       neededLength = 30;
154064064216a8433360745f69edddce19a606659163The Android Open Source Project
154164064216a8433360745f69edddce19a606659163The Android Open Source Project    if(neededLength > pmkidList->Length)
154264064216a8433360745f69edddce19a606659163The Android Open Source Project    {
154364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* The buffer length is not enough */
154464064216a8433360745f69edddce19a606659163The Android Open Source Project        pmkidList->Length = neededLength;
154564064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
154664064216a8433360745f69edddce19a606659163The Android Open Source Project    }
154764064216a8433360745f69edddce19a606659163The Android Open Source Project
154864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* The buffer is big enough. Fill the info */
154964064216a8433360745f69edddce19a606659163The Android Open Source Project    pmkidList->Length         = neededLength;
155064064216a8433360745f69edddce19a606659163The Android Open Source Project    pmkidList->BSSIDInfoCount = NumOfEntries;
155164064216a8433360745f69edddce19a606659163The Android Open Source Project
155264064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
155364064216a8433360745f69edddce19a606659163The Android Open Source Project      ("RSN:  Get PMKID cache.  Number of entries  = %d \n", NumOfEntries));
155464064216a8433360745f69edddce19a606659163The Android Open Source Project
155564064216a8433360745f69edddce19a606659163The Android Open Source Project    for (i = 0; i < NumOfEntries; i++ )
155664064216a8433360745f69edddce19a606659163The Android Open Source Project    {
155764064216a8433360745f69edddce19a606659163The Android Open Source Project        bssid = (UINT8 *) pAdmCtrl->pmkid_cache.pmkidTbl[i].bssId.addr;
155864064216a8433360745f69edddce19a606659163The Android Open Source Project        pmkid = (UINT8 *)pAdmCtrl->pmkid_cache.pmkidTbl[i].pmkId;
155964064216a8433360745f69edddce19a606659163The Android Open Source Project
156064064216a8433360745f69edddce19a606659163The Android Open Source Project        os_memoryCopy(pAdmCtrl->hOs, (void *)pmkidList->osBSSIDInfo[i].BSSID,
156164064216a8433360745f69edddce19a606659163The Android Open Source Project                      &bssid, MAC_ADDR_LEN);
156264064216a8433360745f69edddce19a606659163The Android Open Source Project
156364064216a8433360745f69edddce19a606659163The Android Open Source Project        os_memoryCopy(pAdmCtrl->hOs,(void *)pmkidList->osBSSIDInfo[i].PMKID,
156464064216a8433360745f69edddce19a606659163The Android Open Source Project                      &pmkid, PMKID_VALUE_SIZE);
156564064216a8433360745f69edddce19a606659163The Android Open Source Project
156664064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
156764064216a8433360745f69edddce19a606659163The Android Open Source Project        ("RSN:  BSSID:  %.2X-%.2X-%.2X-%.2X-%.2X-%.2X   PMKID: %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X  \n",
156864064216a8433360745f69edddce19a606659163The Android Open Source Project           bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5],
156964064216a8433360745f69edddce19a606659163The Android Open Source Project           pmkid[0], pmkid[1], pmkid[2], pmkid[3],
157064064216a8433360745f69edddce19a606659163The Android Open Source Project           pmkid[4], pmkid[5], pmkid[6], pmkid[7],
157164064216a8433360745f69edddce19a606659163The Android Open Source Project           pmkid[8], pmkid[9], pmkid[10],pmkid[11],
157264064216a8433360745f69edddce19a606659163The Android Open Source Project           pmkid[12],pmkid[13],pmkid[14],pmkid[15]));
157364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
157464064216a8433360745f69edddce19a606659163The Android Open Source Project
157564064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
157664064216a8433360745f69edddce19a606659163The Android Open Source Project
157764064216a8433360745f69edddce19a606659163The Android Open Source Project}
157864064216a8433360745f69edddce19a606659163The Android Open Source Project
157964064216a8433360745f69edddce19a606659163The Android Open Source Project/**
158064064216a8433360745f69edddce19a606659163The Android Open Source Project*
158164064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_addPMKID
158264064216a8433360745f69edddce19a606659163The Android Open Source Project*
158364064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
158464064216a8433360745f69edddce19a606659163The Android Open Source Project*
158564064216a8433360745f69edddce19a606659163The Android Open Source Project* Add/Set an AP's PMKID received from the Supplicant
158664064216a8433360745f69edddce19a606659163The Android Open Source Project*
158764064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
158864064216a8433360745f69edddce19a606659163The Android Open Source Project*
158964064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl - pointer to admCtrl context
159064064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pBSSID   - pointer to AP's BSSID address
159164064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pmkID    - AP's PMKID
159264064216a8433360745f69edddce19a606659163The Android Open Source Project*
159364064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
159464064216a8433360745f69edddce19a606659163The Android Open Source Project*
159564064216a8433360745f69edddce19a606659163The Android Open Source Project* OK on success, NOK on failure.
159664064216a8433360745f69edddce19a606659163The Android Open Source Project*
159764064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
159864064216a8433360745f69edddce19a606659163The Android Open Source Project*/
159964064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_addPMKID (admCtrl_t * pAdmCtrl, macAddress_t *pBSSID, pmkidValue_t pmkID)
160064064216a8433360745f69edddce19a606659163The Android Open Source Project{
160164064216a8433360745f69edddce19a606659163The Android Open Source Project   UINT8         cacheIndex;
160264064216a8433360745f69edddce19a606659163The Android Open Source Project   TI_STATUS     status = NOK;
160364064216a8433360745f69edddce19a606659163The Android Open Source Project
160464064216a8433360745f69edddce19a606659163The Android Open Source Project   /* Try to find the pBSSId in the PMKID cache */
160564064216a8433360745f69edddce19a606659163The Android Open Source Project   status = admCtrlWpa2_findPMKID (pAdmCtrl, pBSSID, NULL, &cacheIndex);
160664064216a8433360745f69edddce19a606659163The Android Open Source Project
160764064216a8433360745f69edddce19a606659163The Android Open Source Project   if(status == OK)
160864064216a8433360745f69edddce19a606659163The Android Open Source Project   {
160964064216a8433360745f69edddce19a606659163The Android Open Source Project       /* Entry for the bssid has been found; Update PMKID */
161064064216a8433360745f69edddce19a606659163The Android Open Source Project       os_memoryCopy(pAdmCtrl->hOs,
161164064216a8433360745f69edddce19a606659163The Android Open Source Project                    (PVOID)&pAdmCtrl->pmkid_cache.pmkidTbl[cacheIndex].pmkId,
161264064216a8433360745f69edddce19a606659163The Android Open Source Project                    pmkID, PMKID_VALUE_SIZE);
161364064216a8433360745f69edddce19a606659163The Android Open Source Project       /*pAdmCtrl->pmkid_cache.pmkidTbl[cacheIndex].generationTs = os_timeStampMs(pAdmCtrl->hOs); */
161464064216a8433360745f69edddce19a606659163The Android Open Source Project   }
161564064216a8433360745f69edddce19a606659163The Android Open Source Project   else
161664064216a8433360745f69edddce19a606659163The Android Open Source Project   {
161764064216a8433360745f69edddce19a606659163The Android Open Source Project       /* The new entry is added to the next free entry. */
161864064216a8433360745f69edddce19a606659163The Android Open Source Project       /* Copy the new entry to the next free place.     */
161964064216a8433360745f69edddce19a606659163The Android Open Source Project       cacheIndex = pAdmCtrl->pmkid_cache.nextFreeEntry;
162064064216a8433360745f69edddce19a606659163The Android Open Source Project       os_memoryCopy(pAdmCtrl->hOs,
162164064216a8433360745f69edddce19a606659163The Android Open Source Project                    (PVOID)&pAdmCtrl->pmkid_cache.pmkidTbl[cacheIndex].bssId.addr,
162264064216a8433360745f69edddce19a606659163The Android Open Source Project                    &(pBSSID->addr), MAC_ADDR_LEN);
162364064216a8433360745f69edddce19a606659163The Android Open Source Project       os_memoryCopy(pAdmCtrl->hOs,
162464064216a8433360745f69edddce19a606659163The Android Open Source Project                    (PVOID)&pAdmCtrl->pmkid_cache.pmkidTbl[cacheIndex].pmkId,
162564064216a8433360745f69edddce19a606659163The Android Open Source Project                    (PVOID)pmkID, PMKID_VALUE_SIZE);
162664064216a8433360745f69edddce19a606659163The Android Open Source Project
162764064216a8433360745f69edddce19a606659163The Android Open Source Project       /* Update the next free entry index. (If the table is full, a new entry */
162864064216a8433360745f69edddce19a606659163The Android Open Source Project       /* will override the oldest entries from the beginning of the table)    */
162964064216a8433360745f69edddce19a606659163The Android Open Source Project       /* Update the number of entries. (it cannot be more than max cach size) */
163064064216a8433360745f69edddce19a606659163The Android Open Source Project       pAdmCtrl->pmkid_cache.nextFreeEntry  = (cacheIndex + 1) % ADMCTRL_PMKID_CACHE_SIZE;
163164064216a8433360745f69edddce19a606659163The Android Open Source Project
163264064216a8433360745f69edddce19a606659163The Android Open Source Project       if(pAdmCtrl->pmkid_cache.entriesNumber < ADMCTRL_PMKID_CACHE_SIZE)
163364064216a8433360745f69edddce19a606659163The Android Open Source Project          pAdmCtrl->pmkid_cache.entriesNumber ++;
163464064216a8433360745f69edddce19a606659163The Android Open Source Project   }
163564064216a8433360745f69edddce19a606659163The Android Open Source Project
163664064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
163764064216a8433360745f69edddce19a606659163The Android Open Source Project         ("RSN   Add PMKID   Entry index is %d \n", cacheIndex));
163864064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
163964064216a8433360745f69edddce19a606659163The Android Open Source Project        ("RSN:  BSSID: %.2X-%.2X-%.2X-%.2X-%.2X-%.2X  PMKID: %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X  \n",
164064064216a8433360745f69edddce19a606659163The Android Open Source Project            pBSSID->addr[0], pBSSID->addr[1], pBSSID->addr[2],
164164064216a8433360745f69edddce19a606659163The Android Open Source Project            pBSSID->addr[3], pBSSID->addr[4], pBSSID->addr[5],
164264064216a8433360745f69edddce19a606659163The Android Open Source Project            pmkID[0], pmkID[1], pmkID[2], pmkID[3],
164364064216a8433360745f69edddce19a606659163The Android Open Source Project            pmkID[4], pmkID[5], pmkID[6], pmkID[7],
164464064216a8433360745f69edddce19a606659163The Android Open Source Project            pmkID[8], pmkID[9], pmkID[10],pmkID[11],
164564064216a8433360745f69edddce19a606659163The Android Open Source Project            pmkID[12],pmkID[13],pmkID[14],pmkID[15]));
164664064216a8433360745f69edddce19a606659163The Android Open Source Project
164764064216a8433360745f69edddce19a606659163The Android Open Source Project
164864064216a8433360745f69edddce19a606659163The Android Open Source Project
164964064216a8433360745f69edddce19a606659163The Android Open Source Project   return OK;
165064064216a8433360745f69edddce19a606659163The Android Open Source Project}
165164064216a8433360745f69edddce19a606659163The Android Open Source Project
165264064216a8433360745f69edddce19a606659163The Android Open Source Project/**
165364064216a8433360745f69edddce19a606659163The Android Open Source Project*
165464064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_setPMKIDList
165564064216a8433360745f69edddce19a606659163The Android Open Source Project*
165664064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
165764064216a8433360745f69edddce19a606659163The Android Open Source Project*
165864064216a8433360745f69edddce19a606659163The Android Open Source Project* Set PMKID cache
165964064216a8433360745f69edddce19a606659163The Android Open Source Project*
166064064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
166164064216a8433360745f69edddce19a606659163The Android Open Source Project*
166264064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl        - pointer to admCtrl context
166364064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - pmkidList       - memory buffer where the procedure reads the PMKIDs from
166464064216a8433360745f69edddce19a606659163The Android Open Source Project*                          Supplied by the caller procedure.
166564064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
166664064216a8433360745f69edddce19a606659163The Android Open Source Project*
166764064216a8433360745f69edddce19a606659163The Android Open Source Project* OK on success, NOK on failure.
166864064216a8433360745f69edddce19a606659163The Android Open Source Project*
166964064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
167064064216a8433360745f69edddce19a606659163The Android Open Source Project*/
167164064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_setPMKIDList (admCtrl_t * pAdmCtrl, OS_802_11_PMKID *pmkidList)
167264064216a8433360745f69edddce19a606659163The Android Open Source Project{
167364064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8          neededLength, i = 0;
167464064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8          NumOfEntries;
167564064216a8433360745f69edddce19a606659163The Android Open Source Project    macAddress_t   macAddr;
167664064216a8433360745f69edddce19a606659163The Android Open Source Project
167764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Check the minimal buffer length */
167864064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pmkidList->Length < 2*sizeof(UINT32))
167964064216a8433360745f69edddce19a606659163The Android Open Source Project    {
168064064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
168164064216a8433360745f69edddce19a606659163The Android Open Source Project        ("RSN: Set PMKID list - Buffer size < min length (8 bytes). Supplied length is %d .\n",
168264064216a8433360745f69edddce19a606659163The Android Open Source Project          pmkidList->Length));
168364064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
168464064216a8433360745f69edddce19a606659163The Android Open Source Project    }
168564064216a8433360745f69edddce19a606659163The Android Open Source Project
168664064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Check the num of entries in the buffer: if 0 it means that */
168764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* PMKID cache has to be cleaned                              */
168864064216a8433360745f69edddce19a606659163The Android Open Source Project    if(pmkidList->BSSIDInfoCount == 0)
168964064216a8433360745f69edddce19a606659163The Android Open Source Project    {
169064064216a8433360745f69edddce19a606659163The Android Open Source Project        admCtrlWpa2_resetPMKIDCache(pAdmCtrl);
169164064216a8433360745f69edddce19a606659163The Android Open Source Project        return OK;
169264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
169364064216a8433360745f69edddce19a606659163The Android Open Source Project
169464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Check the buffer length */
169564064216a8433360745f69edddce19a606659163The Android Open Source Project    NumOfEntries = (UINT8)pmkidList->BSSIDInfoCount;
169664064216a8433360745f69edddce19a606659163The Android Open Source Project    neededLength =  2*sizeof(UINT32) + (NumOfEntries  *(MAC_ADDR_LEN + PMKID_VALUE_SIZE));
169764064216a8433360745f69edddce19a606659163The Android Open Source Project
169864064216a8433360745f69edddce19a606659163The Android Open Source Project    if(pmkidList->Length < neededLength)
169964064216a8433360745f69edddce19a606659163The Android Open Source Project    {
170064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Something wrong goes with the buffer */
170164064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
170264064216a8433360745f69edddce19a606659163The Android Open Source Project        ("RSN: Set PMKID list - no enough room for %d entries; Needed length is %d. Supplied length is %d .\n",
170364064216a8433360745f69edddce19a606659163The Android Open Source Project         NumOfEntries, neededLength,pmkidList->Length));
170464064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
170564064216a8433360745f69edddce19a606659163The Android Open Source Project    }
170664064216a8433360745f69edddce19a606659163The Android Open Source Project
170764064216a8433360745f69edddce19a606659163The Android Open Source Project    /*  Write  the PMKID to the PMKID cashe */
170864064216a8433360745f69edddce19a606659163The Android Open Source Project    pmkidList->BSSIDInfoCount = NumOfEntries;
170964064216a8433360745f69edddce19a606659163The Android Open Source Project    for (i = 0; i < NumOfEntries; i++ )
171064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
171164064216a8433360745f69edddce19a606659163The Android Open Source Project        os_memoryCopy(pAdmCtrl->hOs, &macAddr.addr,
171264064216a8433360745f69edddce19a606659163The Android Open Source Project                      &(pmkidList->osBSSIDInfo[i].BSSID), MAC_ADDR_LEN);
171364064216a8433360745f69edddce19a606659163The Android Open Source Project         WLAN_REPORT_INFORMATION (pAdmCtrl->hReport, RSN_MODULE_LOG,("admCtrlWpa2_setPMKIDList: Received new pre-auth AP\n"));
171464064216a8433360745f69edddce19a606659163The Android Open Source Project         if (pAdmCtrl->numberOfPreAuthCandidates)
171564064216a8433360745f69edddce19a606659163The Android Open Source Project         {
171664064216a8433360745f69edddce19a606659163The Android Open Source Project            pAdmCtrl->numberOfPreAuthCandidates--;
171764064216a8433360745f69edddce19a606659163The Android Open Source Project            if (pAdmCtrl->numberOfPreAuthCandidates == 0)
171864064216a8433360745f69edddce19a606659163The Android Open Source Project            {
171964064216a8433360745f69edddce19a606659163The Android Open Source Project               WLAN_REPORT_INFORMATION (pAdmCtrl->hReport, RSN_MODULE_LOG,("Stopping the Pre-Auth timer since Pre-auth is finished\n"));
172064064216a8433360745f69edddce19a606659163The Android Open Source Project               os_timerStop(pAdmCtrl->hOs, pAdmCtrl->preAuthTimerWpa2);
172164064216a8433360745f69edddce19a606659163The Android Open Source Project               /* Send PRE-AUTH end event to External Application */
172264064216a8433360745f69edddce19a606659163The Android Open Source Project               admCtrl_notifyPreAuthStatus (pAdmCtrl, RSN_PRE_AUTH_END);
172364064216a8433360745f69edddce19a606659163The Android Open Source Project            }
172464064216a8433360745f69edddce19a606659163The Android Open Source Project
172564064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_REPORT_INFORMATION (pAdmCtrl->hReport, RSN_MODULE_LOG,("admCtrlWpa2_setPMKIDList: %d APs left in candidate list\n",pAdmCtrl->numberOfPreAuthCandidates));
172664064216a8433360745f69edddce19a606659163The Android Open Source Project
172764064216a8433360745f69edddce19a606659163The Android Open Source Project         }
172864064216a8433360745f69edddce19a606659163The Android Open Source Project        else
172964064216a8433360745f69edddce19a606659163The Android Open Source Project        {
173064064216a8433360745f69edddce19a606659163The Android Open Source Project           WLAN_REPORT_WARNING (pAdmCtrl->hReport, RSN_MODULE_LOG,("admCtrlWpa2_setPMKIDList: number of candidates was already zero...\n"));
173164064216a8433360745f69edddce19a606659163The Android Open Source Project        }
173264064216a8433360745f69edddce19a606659163The Android Open Source Project        admCtrlWpa2_addPMKID(pAdmCtrl,&macAddr, (UINT8 *)pmkidList->osBSSIDInfo[i].PMKID);
173364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
173464064216a8433360745f69edddce19a606659163The Android Open Source Project
173564064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
173664064216a8433360745f69edddce19a606659163The Android Open Source Project
173764064216a8433360745f69edddce19a606659163The Android Open Source Project}
173864064216a8433360745f69edddce19a606659163The Android Open Source Project
173964064216a8433360745f69edddce19a606659163The Android Open Source Project/**
174064064216a8433360745f69edddce19a606659163The Android Open Source Project*
174164064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_resetPMKIDCache
174264064216a8433360745f69edddce19a606659163The Android Open Source Project*
174364064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
174464064216a8433360745f69edddce19a606659163The Android Open Source Project*
174564064216a8433360745f69edddce19a606659163The Android Open Source Project* Reset PMKID Table
174664064216a8433360745f69edddce19a606659163The Android Open Source Project*
174764064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
174864064216a8433360745f69edddce19a606659163The Android Open Source Project*
174964064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl - pointer to admCtrl context
175064064216a8433360745f69edddce19a606659163The Android Open Source Project*
175164064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
175264064216a8433360745f69edddce19a606659163The Android Open Source Project*
175364064216a8433360745f69edddce19a606659163The Android Open Source Project* OK on success, NOK on failure.
175464064216a8433360745f69edddce19a606659163The Android Open Source Project*
175564064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
175664064216a8433360745f69edddce19a606659163The Android Open Source Project*/
175764064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS admCtrlWpa2_resetPMKIDCache (admCtrl_t *pAdmCtrl)
175864064216a8433360745f69edddce19a606659163The Android Open Source Project{
175964064216a8433360745f69edddce19a606659163The Android Open Source Project
176064064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
176164064216a8433360745f69edddce19a606659163The Android Open Source Project         ("RSN:  Reset PMKID cache.  %d entries are deleted. \n",
176264064216a8433360745f69edddce19a606659163The Android Open Source Project          pAdmCtrl->pmkid_cache.entriesNumber));
176364064216a8433360745f69edddce19a606659163The Android Open Source Project
176464064216a8433360745f69edddce19a606659163The Android Open Source Project   os_memoryZero(pAdmCtrl->hOs, (PVOID)&pAdmCtrl->pmkid_cache, sizeof(pmkid_cache_t));
176564064216a8433360745f69edddce19a606659163The Android Open Source Project
176664064216a8433360745f69edddce19a606659163The Android Open Source Project   return OK;
176764064216a8433360745f69edddce19a606659163The Android Open Source Project}
176864064216a8433360745f69edddce19a606659163The Android Open Source Project
176964064216a8433360745f69edddce19a606659163The Android Open Source Project
177064064216a8433360745f69edddce19a606659163The Android Open Source Project/**
177164064216a8433360745f69edddce19a606659163The Android Open Source Project*
177264064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_sendPMKIDCandidateListAfterDelay
177364064216a8433360745f69edddce19a606659163The Android Open Source Project*
177464064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
177564064216a8433360745f69edddce19a606659163The Android Open Source Project*
177664064216a8433360745f69edddce19a606659163The Android Open Source Project* New Candidate List of APs with the same SSID as the STA is connected to
177764064216a8433360745f69edddce19a606659163The Android Open Source Project* is generated and sent after the delay to the supplicant
177864064216a8433360745f69edddce19a606659163The Android Open Source Project* in order to retrieve the new PMKIDs for the APs.
177964064216a8433360745f69edddce19a606659163The Android Open Source Project*
178064064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
178164064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl - pointer to admCtrl context
178264064216a8433360745f69edddce19a606659163The Android Open Source Project*
178364064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
178464064216a8433360745f69edddce19a606659163The Android Open Source Project*
178564064216a8433360745f69edddce19a606659163The Android Open Source Project* OK on success, NOK on failure.
178664064216a8433360745f69edddce19a606659163The Android Open Source Project*
178764064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
178864064216a8433360745f69edddce19a606659163The Android Open Source Project*/
178964064216a8433360745f69edddce19a606659163The Android Open Source Project
179064064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic void admCtrlWpa2_buildAndSendPMKIDCandList (TI_HANDLE hHandle, bssidList4PreAuth_t *apList)
179164064216a8433360745f69edddce19a606659163The Android Open Source Project{
179264064216a8433360745f69edddce19a606659163The Android Open Source Project
179364064216a8433360745f69edddce19a606659163The Android Open Source Project    admCtrl_t         *pAdmCtrl = (admCtrl_t *)hHandle;
179464064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8             candIndex =0, apIndex = 0, size =0;
179564064216a8433360745f69edddce19a606659163The Android Open Source Project    paramInfo_t       param;
179664064216a8433360745f69edddce19a606659163The Android Open Source Project    OS_802_11_PMKID_CANDIDATELIST  *pCandList;
179764064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8             memBuff[PMKID_CAND_LIST_MEMBUFF_SIZE + sizeof(UINT32)];
179864064216a8433360745f69edddce19a606659163The Android Open Source Project    dot11_RSN_t       *rsnIE = 0;
179964064216a8433360745f69edddce19a606659163The Android Open Source Project    wpa2IeData_t      wpa2Data;
180064064216a8433360745f69edddce19a606659163The Android Open Source Project    TI_STATUS         status = NOK;
180164064216a8433360745f69edddce19a606659163The Android Open Source Project
180264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Get SSID that the STA is accociated with    */
180364064216a8433360745f69edddce19a606659163The Android Open Source Project    param.paramType = SITE_MGR_DESIRED_SSID_PARAM;
180464064216a8433360745f69edddce19a606659163The Android Open Source Project    status          = siteMgr_getParam(pAdmCtrl->pRsn->hSiteMgr, &param);
180564064216a8433360745f69edddce19a606659163The Android Open Source Project    if(status != OK)
180664064216a8433360745f69edddce19a606659163The Android Open Source Project        return;
180764064216a8433360745f69edddce19a606659163The Android Open Source Project
180864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* If the existing PMKID cache contains information for not relevant */
180964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* ssid (i.e. ssid was changed), clean up the PMKID cache and update */
181064064216a8433360745f69edddce19a606659163The Android Open Source Project    /* the ssid in the PMKID cache */
181164064216a8433360745f69edddce19a606659163The Android Open Source Project    if ((pAdmCtrl->pmkid_cache.ssid.len != param.content.siteMgrDesiredSSID.len) ||
181264064216a8433360745f69edddce19a606659163The Android Open Source Project         (os_memoryCompare(pAdmCtrl->hOs, (UINT8 *)pAdmCtrl->pmkid_cache.ssid.ssidString,
181364064216a8433360745f69edddce19a606659163The Android Open Source Project          (UINT8 *) param.content.siteMgrCurrentSSID.ssidString,
181464064216a8433360745f69edddce19a606659163The Android Open Source Project                          pAdmCtrl->pmkid_cache.ssid.len) != 0))
181564064216a8433360745f69edddce19a606659163The Android Open Source Project    {
181664064216a8433360745f69edddce19a606659163The Android Open Source Project        admCtrlWpa2_resetPMKIDCache(pAdmCtrl);
181764064216a8433360745f69edddce19a606659163The Android Open Source Project
181864064216a8433360745f69edddce19a606659163The Android Open Source Project        os_memoryCopy(pAdmCtrl->hOs, (void *)pAdmCtrl->pmkid_cache.ssid.ssidString,
181964064216a8433360745f69edddce19a606659163The Android Open Source Project                      (void *)param.content.siteMgrCurrentSSID.ssidString,
182064064216a8433360745f69edddce19a606659163The Android Open Source Project                      param.content.siteMgrCurrentSSID.len);
182164064216a8433360745f69edddce19a606659163The Android Open Source Project        pAdmCtrl->pmkid_cache.ssid.len = param.content.siteMgrCurrentSSID.len;
182264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
182364064216a8433360745f69edddce19a606659163The Android Open Source Project
182464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Get list of APs of the SSID that the STA is associated with*/
182564064216a8433360745f69edddce19a606659163The Android Open Source Project    /*os_memoryZero(pAdmCtrl->hOs, (PVOID)&apList, sizeof(bssidListBySsid_t));
182664064216a8433360745f69edddce19a606659163The Android Open Source Project    status = siteMgr_GetApListBySsid (pAdmCtrl->pRsn->hSiteMgr,
182764064216a8433360745f69edddce19a606659163The Android Open Source Project                                      &param.content.siteMgrCurrentSSID,
182864064216a8433360745f69edddce19a606659163The Android Open Source Project                                      &apList);
182964064216a8433360745f69edddce19a606659163The Android Open Source Project    */
183064064216a8433360745f69edddce19a606659163The Android Open Source Project    if((apList == NULL) || (apList->NumOfItems == 0))
183164064216a8433360745f69edddce19a606659163The Android Open Source Project        return;
183264064216a8433360745f69edddce19a606659163The Android Open Source Project
183364064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
183464064216a8433360745f69edddce19a606659163The Android Open Source Project        ("admCtrlWpa2_buildAndSendPMKIDCandList - Entry \n"));
183564064216a8433360745f69edddce19a606659163The Android Open Source Project
183664064216a8433360745f69edddce19a606659163The Android Open Source Project    /* fill the PMKID candidate list */
183764064216a8433360745f69edddce19a606659163The Android Open Source Project    pCandList = (OS_802_11_PMKID_CANDIDATELIST *)(memBuff + sizeof(UINT32));
183864064216a8433360745f69edddce19a606659163The Android Open Source Project    pCandList->Version = 1;
183964064216a8433360745f69edddce19a606659163The Android Open Source Project    for (apIndex=0; apIndex<pAdmCtrl->pmkid_cache.entriesNumber; apIndex++)
184064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
184164064216a8433360745f69edddce19a606659163The Android Open Source Project        pAdmCtrl->pmkid_cache.pmkidTbl[apIndex].preAuthenticate = FALSE;
184264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
184364064216a8433360745f69edddce19a606659163The Android Open Source Project
184464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Go over AP list and find APs supporting pre-authentication */
184564064216a8433360745f69edddce19a606659163The Android Open Source Project    for(apIndex = 0; apIndex < apList->NumOfItems; apIndex++)
184664064216a8433360745f69edddce19a606659163The Android Open Source Project    {
184764064216a8433360745f69edddce19a606659163The Android Open Source Project        UINT8 *bssidMac, i = 0;
184864064216a8433360745f69edddce19a606659163The Android Open Source Project
184964064216a8433360745f69edddce19a606659163The Android Open Source Project        status = NOK;
185064064216a8433360745f69edddce19a606659163The Android Open Source Project
185164064216a8433360745f69edddce19a606659163The Android Open Source Project        if (apList->bssidList[apIndex].pRsnIEs==NULL)
185264064216a8433360745f69edddce19a606659163The Android Open Source Project        {
185364064216a8433360745f69edddce19a606659163The Android Open Source Project            continue;
185464064216a8433360745f69edddce19a606659163The Android Open Source Project        }
185564064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Check is there RSN IE in this site */
185664064216a8433360745f69edddce19a606659163The Android Open Source Project        rsnIE = 0;
185764064216a8433360745f69edddce19a606659163The Android Open Source Project        while( !rsnIE && (i < MAX_RSN_IE))
185864064216a8433360745f69edddce19a606659163The Android Open Source Project        {
185964064216a8433360745f69edddce19a606659163The Android Open Source Project            if(apList->bssidList[apIndex].pRsnIEs[i].hdr.eleId == RSN_IE_ID)
186064064216a8433360745f69edddce19a606659163The Android Open Source Project            {
186164064216a8433360745f69edddce19a606659163The Android Open Source Project                rsnIE  = &apList->bssidList[apIndex].pRsnIEs[i];
186264064216a8433360745f69edddce19a606659163The Android Open Source Project                status = OK;
186364064216a8433360745f69edddce19a606659163The Android Open Source Project            }
186464064216a8433360745f69edddce19a606659163The Android Open Source Project            i ++;
186564064216a8433360745f69edddce19a606659163The Android Open Source Project        }
186664064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
186764064216a8433360745f69edddce19a606659163The Android Open Source Project            ("admCtrlWpa2_buildAndSendPMKIDCandList - rsnIE-hdr.eleId = %x \n", rsnIE->hdr.eleId));
186864064216a8433360745f69edddce19a606659163The Android Open Source Project
186964064216a8433360745f69edddce19a606659163The Android Open Source Project        if(status == OK)
187064064216a8433360745f69edddce19a606659163The Android Open Source Project           status = admCtrlWpa2_parseIe(pAdmCtrl, (UINT8 *)rsnIE, &wpa2Data);
187164064216a8433360745f69edddce19a606659163The Android Open Source Project
187264064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
187364064216a8433360745f69edddce19a606659163The Android Open Source Project            ("admCtrlWpa2_buildAndSendPMKIDCandList - parseIe status = %d \n", status));
187464064216a8433360745f69edddce19a606659163The Android Open Source Project        if(status == OK)
187564064216a8433360745f69edddce19a606659163The Android Open Source Project        {
187664064216a8433360745f69edddce19a606659163The Android Open Source Project            BOOL        preAuthStatus;
187764064216a8433360745f69edddce19a606659163The Android Open Source Project            UINT8               cacheIndex;
187864064216a8433360745f69edddce19a606659163The Android Open Source Project
187964064216a8433360745f69edddce19a606659163The Android Open Source Project            preAuthStatus = admCtrlWpa2_getPreAuthStatus(pAdmCtrl, &apList->bssidList[apIndex].bssId, &cacheIndex);
188064064216a8433360745f69edddce19a606659163The Android Open Source Project
188164064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
188264064216a8433360745f69edddce19a606659163The Android Open Source Project                ("admCtrlWpa2_buildAndSendPMKIDCandList, preAuthStatus=%d \n",
188364064216a8433360745f69edddce19a606659163The Android Open Source Project                 preAuthStatus));
188464064216a8433360745f69edddce19a606659163The Android Open Source Project
188564064216a8433360745f69edddce19a606659163The Android Open Source Project            if (preAuthStatus)
188664064216a8433360745f69edddce19a606659163The Android Open Source Project            {
188764064216a8433360745f69edddce19a606659163The Android Open Source Project                pAdmCtrl->pmkid_cache.pmkidTbl[cacheIndex].preAuthenticate = TRUE;
188864064216a8433360745f69edddce19a606659163The Android Open Source Project            }
188964064216a8433360745f69edddce19a606659163The Android Open Source Project
189064064216a8433360745f69edddce19a606659163The Android Open Source Project            bssidMac = (UINT8 *)apList->bssidList[apIndex].bssId.addr;
189164064216a8433360745f69edddce19a606659163The Android Open Source Project            os_memoryCopy(pAdmCtrl->hOs, &(pCandList->CandidateList[candIndex].BSSID),
189264064216a8433360745f69edddce19a606659163The Android Open Source Project                bssidMac, MAC_ADDR_LEN);
189364064216a8433360745f69edddce19a606659163The Android Open Source Project
189464064216a8433360745f69edddce19a606659163The Android Open Source Project            if(pAdmCtrl->preAuthSupport && (wpa2Data.preAuthentication))
189564064216a8433360745f69edddce19a606659163The Android Open Source Project            {
189664064216a8433360745f69edddce19a606659163The Android Open Source Project               pCandList->CandidateList[candIndex].Flags =
189764064216a8433360745f69edddce19a606659163The Android Open Source Project                                 OS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLE;
189864064216a8433360745f69edddce19a606659163The Android Open Source Project            }
189964064216a8433360745f69edddce19a606659163The Android Open Source Project            else
190064064216a8433360745f69edddce19a606659163The Android Open Source Project            {
190164064216a8433360745f69edddce19a606659163The Android Open Source Project                pCandList->CandidateList[candIndex].Flags = 0;
190264064216a8433360745f69edddce19a606659163The Android Open Source Project
190364064216a8433360745f69edddce19a606659163The Android Open Source Project            }
190464064216a8433360745f69edddce19a606659163The Android Open Source Project
190564064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
190664064216a8433360745f69edddce19a606659163The Android Open Source Project                ("RSN:  Candidate [%d] is   %.2X-%.2X-%.2X-%.2X-%.2X-%.2X , Flags=0x%x\n", candIndex,
190764064216a8433360745f69edddce19a606659163The Android Open Source Project                  bssidMac[0], bssidMac[1], bssidMac[2],
190864064216a8433360745f69edddce19a606659163The Android Open Source Project                  bssidMac[3], bssidMac[4], bssidMac[5],
190964064216a8433360745f69edddce19a606659163The Android Open Source Project                 pCandList->CandidateList[candIndex].Flags));
191064064216a8433360745f69edddce19a606659163The Android Open Source Project
191164064216a8433360745f69edddce19a606659163The Android Open Source Project            candIndex ++;
191264064216a8433360745f69edddce19a606659163The Android Open Source Project        }
191364064216a8433360745f69edddce19a606659163The Android Open Source Project
191464064216a8433360745f69edddce19a606659163The Android Open Source Project    }
191564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Add candidates that have valid PMKID, but were not in the list */
191664064216a8433360745f69edddce19a606659163The Android Open Source Project    for (apIndex=0; apIndex<pAdmCtrl->pmkid_cache.entriesNumber; apIndex++)
191764064216a8433360745f69edddce19a606659163The Android Open Source Project    {
191864064216a8433360745f69edddce19a606659163The Android Open Source Project        if (!pAdmCtrl->pmkid_cache.pmkidTbl[apIndex].preAuthenticate)
191964064216a8433360745f69edddce19a606659163The Android Open Source Project        {
192064064216a8433360745f69edddce19a606659163The Android Open Source Project            os_memoryCopy(pAdmCtrl->hOs, &(pCandList->CandidateList[candIndex].BSSID),
192164064216a8433360745f69edddce19a606659163The Android Open Source Project                          (void *)pAdmCtrl->pmkid_cache.pmkidTbl[apIndex].bssId.addr, MAC_ADDR_LEN);
192264064216a8433360745f69edddce19a606659163The Android Open Source Project            pCandList->CandidateList[apIndex].Flags =
192364064216a8433360745f69edddce19a606659163The Android Open Source Project                                 OS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLE;
192464064216a8433360745f69edddce19a606659163The Android Open Source Project            candIndex++;
192564064216a8433360745f69edddce19a606659163The Android Open Source Project        }
192664064216a8433360745f69edddce19a606659163The Android Open Source Project    }
192764064216a8433360745f69edddce19a606659163The Android Open Source Project
192864064216a8433360745f69edddce19a606659163The Android Open Source Project
192964064216a8433360745f69edddce19a606659163The Android Open Source Project    pCandList->NumCandidates = candIndex;
193064064216a8433360745f69edddce19a606659163The Android Open Source Project
193164064216a8433360745f69edddce19a606659163The Android Open Source Project
193264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Send Status Media specific indication to OS */
193364064216a8433360745f69edddce19a606659163The Android Open Source Project    size = sizeof(OS_802_11_PMKID_CANDIDATELIST) +
193464064216a8433360745f69edddce19a606659163The Android Open Source Project           (candIndex - 1) * sizeof(OS_802_11_PMKID_CANDIDATE) + sizeof(UINT32);
193564064216a8433360745f69edddce19a606659163The Android Open Source Project
193664064216a8433360745f69edddce19a606659163The Android Open Source Project     /* Fill type of indication */
193764064216a8433360745f69edddce19a606659163The Android Open Source Project    *(UINT32*)memBuff = os802_11StatusType_PMKID_CandidateList;
193864064216a8433360745f69edddce19a606659163The Android Open Source Project
193964064216a8433360745f69edddce19a606659163The Android Open Source Project    pCandList->NumCandidates = candIndex;
194064064216a8433360745f69edddce19a606659163The Android Open Source Project
194164064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Store the number of candidates sent - needed for pre-auth finish event */
194264064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->numberOfPreAuthCandidates = candIndex;
194364064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Start the pre-authentication finish event timer */
194464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* If the pre-authentication process is not over by the time it expires - we send an event */
194564064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION (pAdmCtrl->hReport, RSN_MODULE_LOG,("Starting PREAUTH timer (%d mSec)\n",pAdmCtrl->preAuthTimeout*candIndex));
194664064216a8433360745f69edddce19a606659163The Android Open Source Project
194764064216a8433360745f69edddce19a606659163The Android Open Source Project    os_timerStart(pAdmCtrl->hOs, pAdmCtrl->preAuthTimerWpa2, pAdmCtrl->preAuthTimeout*candIndex, FALSE);
194864064216a8433360745f69edddce19a606659163The Android Open Source Project    EvHandlerSendEvent(pAdmCtrl->hEvHandler, IPC_EVENT_MEDIA_SPECIFIC,
194964064216a8433360745f69edddce19a606659163The Android Open Source Project                        memBuff, size);
195064064216a8433360745f69edddce19a606659163The Android Open Source Project
195164064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Send PRE-AUTH start event to External Application */
195264064216a8433360745f69edddce19a606659163The Android Open Source Project    admCtrl_notifyPreAuthStatus (pAdmCtrl, RSN_PRE_AUTH_START);
195364064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pAdmCtrl->hReport, RSN_MODULE_LOG,
195464064216a8433360745f69edddce19a606659163The Android Open Source Project       ("RSN:  PMKID Candidate List with %d entries has been built and sent for ssid %s \n",
195564064216a8433360745f69edddce19a606659163The Android Open Source Project        candIndex, pAdmCtrl->pmkid_cache.ssid.ssidString));
195664064216a8433360745f69edddce19a606659163The Android Open Source Project
195764064216a8433360745f69edddce19a606659163The Android Open Source Project
195864064216a8433360745f69edddce19a606659163The Android Open Source Project    return;
195964064216a8433360745f69edddce19a606659163The Android Open Source Project
196064064216a8433360745f69edddce19a606659163The Android Open Source Project}
196164064216a8433360745f69edddce19a606659163The Android Open Source Project
196264064216a8433360745f69edddce19a606659163The Android Open Source Project/**
196364064216a8433360745f69edddce19a606659163The Android Open Source Project*
196464064216a8433360745f69edddce19a606659163The Android Open Source Project* admCtrlWpa2_getPreAuthStatus
196564064216a8433360745f69edddce19a606659163The Android Open Source Project*
196664064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
196764064216a8433360745f69edddce19a606659163The Android Open Source Project*
196864064216a8433360745f69edddce19a606659163The Android Open Source Project* Returns the status of the Pre Auth for the BSSID. If the authentictaion mode
196964064216a8433360745f69edddce19a606659163The Android Open Source Project * is not WPA2, then FALSE will be returned.
197064064216a8433360745f69edddce19a606659163The Android Open Source Project * For WPA2 mode, if PMKID exists fro the BSSID and its liftime is valid
197164064216a8433360745f69edddce19a606659163The Android Open Source Project * TRUE will be returned.
197264064216a8433360745f69edddce19a606659163The Android Open Source Project * Otherwise FALSE.
197364064216a8433360745f69edddce19a606659163The Android Open Source Project*
197464064216a8433360745f69edddce19a606659163The Android Open Source Project*
197564064216a8433360745f69edddce19a606659163The Android Open Source Project*
197664064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
197764064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pAdmCtrl - pointer to admCtrl context
197864064216a8433360745f69edddce19a606659163The Android Open Source Project * I   - givenAP  - required BSSID
197964064216a8433360745f69edddce19a606659163The Android Open Source Project*
198064064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
198164064216a8433360745f69edddce19a606659163The Android Open Source Project*
198264064216a8433360745f69edddce19a606659163The Android Open Source Project* OK on success, NOK on failure.
198364064216a8433360745f69edddce19a606659163The Android Open Source Project*
198464064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
198564064216a8433360745f69edddce19a606659163The Android Open Source Project*/
198664064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic BOOL admCtrlWpa2_getPreAuthStatus(admCtrl_t *pAdmCtrl, macAddress_t *givenAP, UINT8  *cacheIndex)
198764064216a8433360745f69edddce19a606659163The Android Open Source Project{
198864064216a8433360745f69edddce19a606659163The Android Open Source Project    pmkidValue_t    PMKID;
198964064216a8433360745f69edddce19a606659163The Android Open Source Project
199064064216a8433360745f69edddce19a606659163The Android Open Source Project    if (admCtrlWpa2_findPMKID (pAdmCtrl, givenAP,
199164064216a8433360745f69edddce19a606659163The Android Open Source Project                                 &PMKID, cacheIndex)!=OK)
199264064216a8433360745f69edddce19a606659163The Android Open Source Project    {
199364064216a8433360745f69edddce19a606659163The Android Open Source Project        return FALSE;
199464064216a8433360745f69edddce19a606659163The Android Open Source Project    }
199564064216a8433360745f69edddce19a606659163The Android Open Source Project    return TRUE;
199664064216a8433360745f69edddce19a606659163The Android Open Source Project
199764064216a8433360745f69edddce19a606659163The Android Open Source Project}
199864064216a8433360745f69edddce19a606659163The Android Open Source Project
199964064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic TI_STATUS admCtrlWpa2_startPreAuth(admCtrl_t *pAdmCtrl, bssidList4PreAuth_t *pBssidList)
200064064216a8433360745f69edddce19a606659163The Android Open Source Project{
200164064216a8433360745f69edddce19a606659163The Android Open Source Project
200264064216a8433360745f69edddce19a606659163The Android Open Source Project    admCtrlWpa2_buildAndSendPMKIDCandList (pAdmCtrl, pBssidList);
200364064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
200464064216a8433360745f69edddce19a606659163The Android Open Source Project}
200564064216a8433360745f69edddce19a606659163The Android Open Source Project
200664064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic TI_STATUS admCtrlWpa2_get802_1x_AkmExists (admCtrl_t *pAdmCtrl, BOOL *wpa_802_1x_AkmExists)
200764064216a8433360745f69edddce19a606659163The Android Open Source Project{
200864064216a8433360745f69edddce19a606659163The Android Open Source Project    *wpa_802_1x_AkmExists = pAdmCtrl->wpaAkmExists;
200964064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
201064064216a8433360745f69edddce19a606659163The Android Open Source Project}
201164064216a8433360745f69edddce19a606659163The Android Open Source Project
201264064216a8433360745f69edddce19a606659163The Android Open Source Project
201364064216a8433360745f69edddce19a606659163The Android Open Source Project
201464064216a8433360745f69edddce19a606659163The Android Open Source Project/*-----------------------------------------------------------------------------
201564064216a8433360745f69edddce19a606659163The Android Open Source ProjectRoutine Name: admCtrlWpa2_preAuthTimerExpire
201664064216a8433360745f69edddce19a606659163The Android Open Source ProjectRoutine Description: updates the preAuthStatus
201764064216a8433360745f69edddce19a606659163The Android Open Source ProjectArguments:
201864064216a8433360745f69edddce19a606659163The Android Open Source ProjectReturn Value:
201964064216a8433360745f69edddce19a606659163The Android Open Source Project-----------------------------------------------------------------------------*/
202064064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid admCtrlWpa2_preAuthTimerExpire(TI_HANDLE hAdmCtrl)
202164064216a8433360745f69edddce19a606659163The Android Open Source Project{
202264064216a8433360745f69edddce19a606659163The Android Open Source Project    admCtrl_t         *pAdmCtrl = (admCtrl_t *)hAdmCtrl;
202364064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_WARNING (pAdmCtrl->hReport, RSN_MODULE_LOG,("admCtrlWpa2_preAuthTimerExpire: PREAUTH EXPIRED !!!!!!!!"));
202464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Send PRE-AUTH end event to External Application */
202564064216a8433360745f69edddce19a606659163The Android Open Source Project    admCtrl_notifyPreAuthStatus (pAdmCtrl, RSN_PRE_AUTH_END);
202664064216a8433360745f69edddce19a606659163The Android Open Source Project    pAdmCtrl->numberOfPreAuthCandidates = 0;
202764064216a8433360745f69edddce19a606659163The Android Open Source Project   return;
202864064216a8433360745f69edddce19a606659163The Android Open Source Project}
202964064216a8433360745f69edddce19a606659163The Android Open Source Project
2030