1981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*
2981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * assocSM.c
3981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *
4981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
5981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * All rights reserved.
6981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *
7981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * Redistribution and use in source and binary forms, with or without
8981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * modification, are permitted provided that the following conditions
9981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * are met:
10981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *
11981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *  * Redistributions of source code must retain the above copyright
12981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    notice, this list of conditions and the following disclaimer.
13981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *  * Redistributions in binary form must reproduce the above copyright
14981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    notice, this list of conditions and the following disclaimer in
15981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    the documentation and/or other materials provided with the
16981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    distribution.
17981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *  * Neither the name Texas Instruments nor the names of its
18981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    contributors may be used to endorse or promote products derived
19981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    from this software without specific prior written permission.
20981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *
21981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt */
33981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
34981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/** \file assocSM.c
35981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *  \brief 802.11 association SM source
36981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *
37981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *  \see assocSM.h
38981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt */
39981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
40981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
41981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/***************************************************************************/
42981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*                                                                         */
43981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*      MODULE: assocSM.c                                                  */
44981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*    PURPOSE:  802.11 association SM source                               */
45981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*                                                                         */
46981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/***************************************************************************/
47981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
48981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#define __FILE_ID__  FILE_ID_63
49981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "osApi.h"
50981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "paramOut.h"
51981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "rate.h"
52981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "timer.h"
53981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "fsm.h"
54981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "report.h"
55981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "DataCtrl_Api.h"
56981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "siteMgrApi.h"
57981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "rsnApi.h"
58981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "regulatoryDomainApi.h"
59981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "mlmeBuilder.h"
60981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "mlmeApi.h"
61981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "AssocSM.h"
62981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "qosMngr_API.h"
63981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#ifdef XCC_MODULE_INCLUDED
64981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "XCCRMMngr.h"
65981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "XCCMngr.h"
66981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#endif
67981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "apConn.h"
68981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "TWDriver.h"
69981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "DrvMainModules.h"
70981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "StaCap.h"
71653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt#include "smeApi.h"
72981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
73981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Constants */
74981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
75981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/** number of states in the state machine */
76981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#define ASSOC_SM_NUM_STATES     3
77981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
78981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/** number of events in the state machine */
79981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#define ASSOC_SM_NUM_EVENTS     6
80981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
81981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Enumerations */
82981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
83981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Typedefs */
84981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
85981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Structures */
86981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
87981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* External data definitions */
88981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
89981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* External functions definitions */
90981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
91981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Global variables */
92981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
93981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Local function prototypes */
94981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
95981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* functions */
96981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
97981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
98981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* state machine functions */
99981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
100981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
101981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smEvent(assoc_t *pAssoc, TI_UINT8 event, void *pData);
102981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
103981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid assoc_smTimeout(TI_HANDLE hAssoc, TI_BOOL bTwdInitOccured);
104981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
105981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStartIdle(assoc_t *pAssoc);
106981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStopWait(assoc_t *pAssoc);
107981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smSuccessWait(assoc_t *pAssoc);
108981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smFailureWait(assoc_t *pAssoc);
109981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smTimeoutWait(assoc_t *pAssoc);
110981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smMaxRetryWait(assoc_t *pAssoc);
111981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStopAssoc(assoc_t *pAssoc);
112981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smActionUnexpected(assoc_t *pAssoc);
113981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
114981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smResetRetry(assoc_t *pAssoc);
115981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smIncRetry(assoc_t *pAssoc);
116981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smReportSuccess(assoc_t *pAssoc);
117981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smReportFailure(assoc_t *pAssoc, TI_UINT16 uStatusCode);
118981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smSendAssocReq(assoc_t *pAssoc);
119981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStartTimer(assoc_t *pAssoc);
120981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStopTimer(assoc_t *pAssoc);
121981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
122981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smCapBuild(assoc_t *pCtx, TI_UINT16 *cap);
123981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smSSIDBuild(assoc_t *pCtx, TI_UINT8 *pSSID, TI_UINT32 *ssidLen);
124981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smRatesBuild(assoc_t *pCtx, TI_UINT8 *pRates, TI_UINT32 *ratesLen);
125981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smRequestBuild(assoc_t *pCtx, TI_UINT8* reqBuf, TI_UINT32* reqLen);
126981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
127981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_saveAssocReqMessage(assoc_t *pAssocSm, TI_UINT8 *pAssocBuffer, TI_UINT32 length);
128981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_sendDisAssoc(assoc_t *pAssocSm, mgmtStatus_e reason);
129981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
130981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
131981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
132981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_create - allocate memory for association SM
133981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
134981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
135981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
136981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Allocate memory for association SM. \n
137981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*       Allocates memory for Association context. \n
138981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*       Allocates memory for association SM matrix. \n
139981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
140981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
141981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
142981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hOs - OS context  \n
143981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
144981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
145981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
146981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
147981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
148981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa rsn_mainSecSmKeysOnlyStop()
149981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
150981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_HANDLE assoc_create(TI_HANDLE hOs)
151981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
152981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
153981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
154981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
155981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* allocate association context memory */
156981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)os_memoryAlloc(hOs, sizeof(assoc_t));
157981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle == NULL)
158981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
159981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return NULL;
160981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
161981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
162981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    os_memoryZero(hOs, pHandle, sizeof(assoc_t));
163981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
164981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hOs = hOs;
165981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
166981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* allocate memory for association state machine */
167981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = fsm_Create(hOs, &pHandle->pAssocSm, ASSOC_SM_NUM_STATES, ASSOC_SM_NUM_EVENTS);
168981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
169981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
170981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryFree(hOs, pHandle, sizeof(assoc_t));
171981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return NULL;
172981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
173981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
174981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return pHandle;
175981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
176981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
177981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
178981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
179981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
180981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assocunload - unload association SM from memory
181981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
182981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
183981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
184981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Unload association SM from memory
185981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
186981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
187981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
188981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - association SM context  \n
189981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
190981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
191981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
192981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
193981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
194981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa rsn_mainSecSmKeysOnlyStop()
195981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
196981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_unload(TI_HANDLE hAssoc)
197981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
198653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    TI_STATUS       status;
199653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    assoc_t     *pHandle;
200981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
201653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    pHandle = (assoc_t*)hAssoc;
202981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
203653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    status = fsm_Unload(pHandle->hOs, pHandle->pAssocSm);
204653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    if (status != TI_OK)
205653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    {
206653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt        /* report failure but don't stop... */
207653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt        TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "ASSOC_SM: Error releasing FSM memory \n");
208653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    }
209653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt
210653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt	if (pHandle->hAssocSmTimer)
21112d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	{
212653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt		tmr_DestroyTimer (pHandle->hAssocSmTimer);
21312d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	}
214653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt
215653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    os_memoryFree(pHandle->hOs, hAssoc, sizeof(assoc_t));
21612d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt
217653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    return TI_OK;
218981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
219981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
220981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
221981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
222981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_config - configure a new association SM
223981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
224981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
225981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
226981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Configure a new association SM.
227981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
228981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
229981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
230981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  void
231981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
232981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Create, assoc_Unload
233981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
234981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid assoc_init (TStadHandlesList *pStadHandles)
235981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
236981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t *pHandle = (assoc_t*)(pStadHandles->hAssoc);
237981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
238981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /** Main 802.1X State Machine matrix */
239981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    fsm_actionCell_t    assoc_smMatrix[ASSOC_SM_NUM_STATES][ASSOC_SM_NUM_EVENTS] =
240981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
241981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* next state and actions for IDLE state */
242981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {{ASSOC_SM_STATE_WAIT, (fsm_Action_t)assoc_smStartIdle},
243981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smActionUnexpected},
244981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smActionUnexpected},
245981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smActionUnexpected},
246981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smActionUnexpected},
247981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smActionUnexpected}
248981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        },
249981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* next state and actions for WAIT state */
250981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {{ASSOC_SM_STATE_WAIT, (fsm_Action_t)assoc_smActionUnexpected},
251981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smStopWait},
252981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_ASSOC, (fsm_Action_t)assoc_smSuccessWait},
253981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smFailureWait},
254981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_WAIT, (fsm_Action_t)assoc_smTimeoutWait},
255981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smMaxRetryWait}
256981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        },
257981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* next state and actions for ASSOC state */
258981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {{ASSOC_SM_STATE_ASSOC, (fsm_Action_t)assoc_smActionUnexpected},
259981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smStopAssoc},
260981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_ASSOC, (fsm_Action_t)assoc_smActionUnexpected},
261981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_ASSOC, (fsm_Action_t)assoc_smActionUnexpected},
262981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_ASSOC, (fsm_Action_t)assoc_smActionUnexpected},
263981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_ASSOC, (fsm_Action_t)assoc_smActionUnexpected}
264981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }};
265981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
266981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* configure state machine */
267981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    fsm_Config (pHandle->pAssocSm, &assoc_smMatrix[0][0], ASSOC_SM_NUM_STATES, ASSOC_SM_NUM_EVENTS, NULL, pStadHandles->hOs);
268981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
269981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->assocRejectCount = 0;
270981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->assocTimeoutCount = 0;
271981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->currentState = ASSOC_SM_STATE_IDLE;
272981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
273981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hMlme             = pStadHandles->hMlmeSm;
274981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hRegulatoryDomain = pStadHandles->hRegulatoryDomain;
275981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hSiteMgr          = pStadHandles->hSiteMgr;
276981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hCtrlData         = pStadHandles->hCtrlData;
277981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hTWD              = pStadHandles->hTWD;
278981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hRsn              = pStadHandles->hRsn;
279981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hReport           = pStadHandles->hReport;
280981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hOs               = pStadHandles->hOs;
281981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hXCCMngr          = pStadHandles->hXCCMngr;
282981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hQosMngr          = pStadHandles->hQosMngr;
283981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hMeasurementMgr   = pStadHandles->hMeasurementMgr;
284981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hApConn           = pStadHandles->hAPConnection;
285981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hTimer            = pStadHandles->hTimer;
286981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hStaCap = pStadHandles->hStaCap;
287981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hSme              = pStadHandles->hSme;
288981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
289981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
290981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
291981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
292981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_SetDefaults (TI_HANDLE hAssoc, assocInitParams_t *pAssocInitParams)
293981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
294981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t *pHandle = (assoc_t*)hAssoc;
295981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
296981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->timeout = pAssocInitParams->assocResponseTimeout;
297981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->maxCount = pAssocInitParams->assocMaxRetryCount;
298981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
299981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* allocate OS timer memory */
300981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hAssocSmTimer = tmr_CreateTimer (pHandle->hTimer);
301981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle->hAssocSmTimer == NULL)
302981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
303981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "assoc_SetDefaults(): Failed to create hAssocSmTimer!\n");
304981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
305981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
306981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
307981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
308981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
309981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
310981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
311981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
312981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
313981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_start - Start event for the association SM
314981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
315981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
316981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
317981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Start event for the association SM
318981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
319981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
320981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
321981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
322981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
323981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
324981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
325981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
326981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
327981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Stop, assoc_Recv
328981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
329981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_start(TI_HANDLE hAssoc)
330981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
331981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
332981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
333981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
334981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
335981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
336981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle == NULL)
337981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
338981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
339981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
340981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
341981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->reAssoc = TI_FALSE;
342981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
343981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->disAssoc = TI_FALSE;
344981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
345981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smEvent(pHandle, ASSOC_SM_EVENT_START, hAssoc);
346981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
347981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
348981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
349981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
350981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
351981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
352981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
353981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_start - Start event for the association SM
354981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
355981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
356981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
357981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Start event for the association SM - for Re-assoc request
358981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
359981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
360981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
361981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
362981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
363981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
364981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
365981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
366981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
367981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Stop, assoc_Recv
368981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
369981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS reassoc_start(TI_HANDLE hAssoc)
370981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
371981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
372981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
373981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
374981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
375981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
376981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle == NULL)
377981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
378981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
379981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
380981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->reAssoc = TI_TRUE;
381981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
382981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smEvent(pHandle, ASSOC_SM_EVENT_START, hAssoc);
383981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
384981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
385981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
386981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
387981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
388981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
389981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_stop - Stop event for the association SM
390981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
391981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
392981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
393981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Stop event for the association SM
394981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
395981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
396981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
397981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
398981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
399981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
400981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
401981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
402981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
403981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Start, assoc_Recv
404981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
405981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_stop(TI_HANDLE hAssoc)
406981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
407981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
408981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
409981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
410981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
411981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
412981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle == NULL)
413981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
414981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
415981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
416981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
417981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smEvent(pHandle, ASSOC_SM_EVENT_STOP, hAssoc);
418981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
419981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
420981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
421981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
422981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
423981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_setDisAssocFlag(TI_HANDLE hAssoc, TI_BOOL disAsoccFlag)
424981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
425981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
426981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
427981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
428981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->disAssoc = disAsoccFlag;
429981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
430981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
431981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
432981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
433981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
434981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
435981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
436981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
437981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_recv - Recive a message from the AP
438981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
439981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
440981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
441981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Parse a message form the AP and perform the appropriate event.
442981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
443981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
444981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
445981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
446981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - pFrame - Frame recieved  \n
447981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
448981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
449981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
450981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
451981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
452981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Start, assoc_Stop
453981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
454981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_recv(TI_HANDLE hAssoc, mlmeFrameInfo_t *pFrame)
455981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
456981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
457653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    assoc_t         *pHandle = (assoc_t*)hAssoc;
458981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TTwdParamInfo   tTwdParam;
459981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT16           rspStatus;
460981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
461653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    if (pHandle == NULL)
462653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    {
463653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt        return TI_NOK;
464653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    }
465981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
466981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* ensure that the SM is waiting for assoc response */
467981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(pHandle->currentState != ASSOC_SM_STATE_WAIT)
468981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_OK;
469981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
470981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
471981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((pFrame->subType != ASSOC_RESPONSE) && (pFrame->subType != RE_ASSOC_RESPONSE))
472981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
473981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
474981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
475981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
476981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* check response status */
477981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    rspStatus  = pFrame->content.assocRsp.status;
478981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
479981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (rspStatus == 0)
480981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
481981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TRsnData        rsnData;
482981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        dot11_RSN_t *pRsnIe;
483981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TI_UINT8       curRsnData[255];
484981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TI_UINT8       rsnAssocIeLen;
485981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TI_UINT8        length = 0;
486981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
487981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
488981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "ASSOC_SM: DEBUG Success associating to AP \n");
489981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
490981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* set AID to HAL */
491981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        tTwdParam.paramType = TWD_AID_PARAM_ID;
492981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        tTwdParam.content.halCtrlAid  = pFrame->content.assocRsp.aid;
493981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TWD_SetParam (pHandle->hTWD, &tTwdParam);
494981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
495981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
496981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* Get the RSN IE data */
497981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pRsnIe = pFrame->content.assocRsp.pRsnIe;
498981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        while (length < pFrame->content.assocRsp.rsnIeLen && (pFrame->content.assocRsp.rsnIeLen < 255))
499981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
500981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            curRsnData[0+length] = pRsnIe->hdr[0];
501981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            curRsnData[1+length] = pRsnIe->hdr[1];
502981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            os_memoryCopy(pHandle->hOs, &curRsnData[2+length], (void *)pRsnIe->rsnIeData, pRsnIe->hdr[1]);
503981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            length += pRsnIe->hdr[1] + 2;
504981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pRsnIe += 1;
505981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
506981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
507981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (pFrame->content.assocRsp.rsnIeLen != 0)
508981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
509981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            rsnData.pIe = curRsnData;
510981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            rsnData.ieLen = pFrame->content.assocRsp.rsnIeLen;
511981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            rsnData.privacy =  ((pFrame->content.assocRsp.capabilities >> CAP_PRIVACY_SHIFT) & CAP_PRIVACY_MASK) ? TI_TRUE : TI_FALSE;
512981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            rsn_setSite(pHandle->hRsn, &rsnData, NULL, &rsnAssocIeLen);
513981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
514981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
515981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* update siteMgr with capabilities and whether we are connected to Cisco AP */
516981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        siteMgr_assocReport(pHandle->hSiteMgr,
517981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                            pFrame->content.assocRsp.capabilities, pFrame->content.assocRsp.ciscoIEPresent);
518981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
519981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* update QoS Manager - it the QOS active protocol is NONE, or no WME IE present, it will return TI_OK */
520981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* if configured by AP, update MSDU lifetime */
521981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = qosMngr_setSite(pHandle->hQosMngr, &pFrame->content.assocRsp);
522981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
523981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if(status != TI_OK)
524981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
525981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "ASSOC_SM: DEBUG - Association failed : qosMngr_setSite error \n");
526981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* in case we wanted to work with qosAP and failed to connect to qos AP we want to reassociated again
527981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt               to another one */
528981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            status = assoc_smEvent(pHandle, ASSOC_SM_EVENT_FAIL, hAssoc);
529981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
530981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        else
531981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
532981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            status = assoc_smEvent(pHandle, ASSOC_SM_EVENT_SUCCESS, hAssoc);
533981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
534981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
535981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
536981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
537981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pHandle->assocRejectCount++;
538981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
539981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* If there was attempt to renegotiate voice settings, update QoS Manager */
540981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        qosMngr_checkTspecRenegResults(pHandle->hQosMngr, &pFrame->content.assocRsp);
541981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
542981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* check failure reason */
543981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        switch (rspStatus)
544981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
545981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        case 0:
546981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            break;
547981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        case 1:
548981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* print debug message */
549981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "ASSOC_SM: DEBUG - Association denied: Unspecified error \n");
550981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            break;
551981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        case 10:
552981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* print debug message */
553981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "ASSOC_SM: DEBUG - Association denied: Cannot support all requested capabilities in the Capability Information field \n");
554981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            break;
555981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        case 11:
556981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* print debug message */
557981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "ASSOC_SM: DEBUG - Association denied: Reassociation denied due to inability to confirm that association exists \n");
558981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            break;
559981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        case 12:
560981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* print debug message */
561981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "ASSOC_SM: DEBUG - Association denied: Association denied due to reason outside the scope of this standard \n");
562981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            rsn_reportAuthFailure(pHandle->hRsn, RSN_AUTH_STATUS_INVALID_TYPE);
563981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            break;
564981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        case 13:
565981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "ASSOC_SM: DEBUG - Association denied: Association denied due to wrong authentication algorithm \n");
566981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            rsn_reportAuthFailure(pHandle->hRsn, RSN_AUTH_STATUS_INVALID_TYPE);
567981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            break;
568981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        case 17:
569981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* print debug message */
570981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "ASSOC_SM: DEBUG - Association denied: Association denied because AP is unable to handle additional associated stations \n");
571981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            break;
572981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        case 18:
573981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* print debug message */
574981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "ASSOC_SM: DEBUG - Association denied: Association denied due to requesting station not supporting all of the data rates in the BSSBasicRateSet parameter \n");
575981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            break;
576981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        default:
577981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* print error message on wrong error code for association response */
578981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE1(pHandle->hReport, REPORT_SEVERITY_ERROR, "ASSOC_SM: ERROR - Association denied: error code (%d) irrelevant \n", rspStatus);
579981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            break;
580981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
581981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
582981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = assoc_smEvent(pHandle, ASSOC_SM_EVENT_FAIL, hAssoc);
583981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
584981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
585981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
586981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
587981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
588981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
589981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
590981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_getParam - Get a specific parameter from the association SM
591981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
592981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
593981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
594981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Get a specific parameter from the association SM.
595981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
596981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
597981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
598981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
599981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I/O - pParam - Parameter \n
600981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
601981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
602981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
603981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
604981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
605981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Start, assoc_Stop
606981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
607981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_getParam(TI_HANDLE hAssoc, paramInfo_t *pParam)
608981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
609023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt    assoc_t *pHandle = (assoc_t *)hAssoc;
610981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
611981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((pHandle == NULL) || (pParam == NULL))
612981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
613981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
614981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
615981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
616981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* serch parameter type */
617981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    switch (pParam->paramType)
618981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
619981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    case ASSOC_RESPONSE_TIMEOUT_PARAM:
620981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pParam->content.assocResponseTimeout = pHandle->timeout;
621981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        break;
622981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
623981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    case ASSOC_COUNTERS_PARAM:
624981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pParam->content.siteMgrTiWlanCounters.AssocRejects = pHandle->assocRejectCount;
625981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pParam->content.siteMgrTiWlanCounters.AssocTimeouts = pHandle->assocTimeoutCount;
626981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        break;
627981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
628653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    case ASSOC_ASSOCIATION_REQ_PARAM:
629981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pParam->content.assocReqBuffer.buffer = pHandle->assocReqBuffer;
630653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt        pParam->content.assocReqBuffer.bufferSize = pHandle->assocReqLen;
631653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt		pParam->content.assocReqBuffer.reAssoc = pHandle->reAssoc;
632653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt        break;
633653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt
634653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    case ASSOC_ASSOCIATION_RESP_PARAM:
635653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt        pParam->content.assocReqBuffer.buffer = pHandle->assocRespBuffer;
636981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pParam->content.assocReqBuffer.bufferSize = pHandle->assocRespLen;
637653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt		pParam->content.assocReqBuffer.reAssoc = pHandle->reAssocResp;
638981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        break;
639981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
640981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    case ASSOC_ASSOCIATION_INFORMATION_PARAM:
641981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt       {
642981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           TI_UINT8  reqBuffIEOffset, respBuffIEOffset;
643981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           TI_UINT32 RequestIELength = 0;
644981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           TI_UINT32 ResponseIELength = 0;
645023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt           paramInfo_t  *lParam;
646023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt           ScanBssType_enum bssType;
647981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
648981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "ASSOC_SM: DEBUG - Association Information Get:  \n");
649023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt           lParam = (paramInfo_t *)os_memoryAlloc(pHandle->hOs, sizeof(paramInfo_t));
650023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt           if (!lParam)
651023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt               return TI_NOK;
652981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
653981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           /* Assoc exists only in Infrastructure */
654023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt           lParam->paramType = CTRL_DATA_CURRENT_BSS_TYPE_PARAM;
655023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt           ctrlData_getParam(pHandle->hCtrlData, lParam);
656023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt           bssType = lParam->content.ctrlDataCurrentBssType;
657023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt           os_memoryFree(pHandle->hOs, lParam, sizeof(paramInfo_t));
658023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt           if (bssType != BSS_INFRASTRUCTURE)
659981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           {
660981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt               TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "Not in Infrastructure BSS, No ASSOC Info for GET ASSOC_ASSOCIATION_INFORMATION_PARAM\n");
661981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt               return TI_NOK;
662981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           }
663981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
664981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           /* Init the result buffer to 0 */
665981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           os_memoryZero(pHandle->hOs ,&pParam->content, sizeof(OS_802_11_ASSOCIATION_INFORMATION));
666981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
667981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           reqBuffIEOffset  = 4;  /* In Assoc request frame IEs are located from byte 4 */
668981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           respBuffIEOffset = 6;  /* In Assoc response frame the IEs are located from byte 6 */
669981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
670981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* If the last associate was re-associciation, the current AP MAC address */
671981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* is placed before the IEs. Copy it to the result parameters.            */
672981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if (pHandle->reAssoc)
673981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            {
674981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                MAC_COPY (pParam->content.assocAssociationInformation.RequestFixedIEs.CurrentAPAddress,
675981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                          &pHandle->assocReqBuffer[reqBuffIEOffset]);
676981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                reqBuffIEOffset += MAC_ADDR_LEN;
677981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            }
678981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
679981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* Calculate length of Info elements in assoc request and response frames */
680981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if(pHandle->assocReqLen > reqBuffIEOffset)
681981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                RequestIELength = pHandle->assocReqLen - reqBuffIEOffset;
682981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
683981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if(pHandle->assocRespLen > respBuffIEOffset)
684981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                ResponseIELength = pHandle->assocRespLen - respBuffIEOffset;
685981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
686981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* Copy the association request information */
687981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.Length = sizeof(OS_802_11_ASSOCIATION_INFORMATION);
688981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.AvailableRequestFixedIEs = OS_802_11_AI_REQFI_CAPABILITIES | OS_802_11_AI_REQFI_LISTENINTERVAL;
689981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.RequestFixedIEs.Capabilities = *(TI_UINT16*)&(pHandle->assocReqBuffer[0]);
690981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.RequestFixedIEs.ListenInterval = *(TI_UINT16*)(&pHandle->assocReqBuffer[2]);
691981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
692981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.RequestIELength = RequestIELength;
693981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.OffsetRequestIEs = 0;
694981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if (RequestIELength > 0)
695981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            {
696981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                pParam->content.assocAssociationInformation.OffsetRequestIEs = (TI_UINT32)&pHandle->assocReqBuffer[reqBuffIEOffset];
697981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            }
698981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* Copy the association response information */
699981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.AvailableResponseFixedIEs =
700981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                OS_802_11_AI_RESFI_CAPABILITIES | OS_802_11_AI_RESFI_STATUSCODE | OS_802_11_AI_RESFI_ASSOCIATIONID;
701981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.ResponseFixedIEs.Capabilities = *(TI_UINT16*)&(pHandle->assocRespBuffer[0]);
702981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.ResponseFixedIEs.StatusCode = *(TI_UINT16*)&(pHandle->assocRespBuffer[2]);
703981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.ResponseFixedIEs.AssociationId = *(TI_UINT16*)&(pHandle->assocRespBuffer[4]);
704981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.ResponseIELength = ResponseIELength;
705981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.OffsetResponseIEs = 0;
706981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if (ResponseIELength > 0)
707981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            {
708981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                pParam->content.assocAssociationInformation.OffsetResponseIEs = (TI_UINT32)&pHandle->assocRespBuffer[respBuffIEOffset];
709981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            }
710981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
711981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt       }
712981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        break;
713981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    default:
714981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
715981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
716981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
717981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
718981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
719981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
720981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
721981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
722981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_setParam - Set a specific parameter to the association SM
723981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
724981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
725981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
726981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Set a specific parameter to the association SM.
727981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
728981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
729981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
730981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
731981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I/O - pParam - Parameter \n
732981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
733981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
734981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
735981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
736981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
737981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Start, assoc_Stop
738981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
739981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_setParam(TI_HANDLE hAssoc, paramInfo_t *pParam)
740981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
741981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
742981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
743981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
744981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
745981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((pHandle == NULL) || (pParam == NULL))
746981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
747981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
748981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
749981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
750981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    switch (pParam->paramType)
751981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
752981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    case ASSOC_RESPONSE_TIMEOUT_PARAM:
753981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* check bounds */
754981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if ((pParam->content.assocResponseTimeout >= ASSOC_RESPONSE_TIMEOUT_MIN) &&
755981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            (pParam->content.assocResponseTimeout <= ASSOC_RESPONSE_TIMEOUT_MAX))
756981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
757981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pHandle->timeout = pParam->content.assocResponseTimeout;
758981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        } else {
759981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            return TI_NOK;
760981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
761981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        break;
762981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    default:
763981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
764981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
765981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
766981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
767981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
768981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
769981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
770981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
771981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_smTimeout - Time out event activation function
772981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
773981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
774981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
775981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Time out event activation function.
776981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
777981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
778981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
779981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
780981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
781981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
782981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
783981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
784981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
785981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Start, assoc_Stop
786981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
787981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid assoc_smTimeout(TI_HANDLE hAssoc, TI_BOOL bTwdInitOccured)
788981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
789981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
790981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
791981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
792981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
793981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
794981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle == NULL)
795981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
796981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return;
797981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
798981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
799981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->assocTimeoutCount++;
800981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
801981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_smEvent(pHandle, ASSOC_SM_EVENT_TIMEOUT, hAssoc);
802981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
803981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
804981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
805981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
806981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_smEvent - Perform an event on the association SM
807981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
808981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
809981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
810981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Perform an event on the association SM.
811981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
812981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
813981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
814981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - pAssoc - Association SM context  \n
815981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - event - Current event \n
816981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - pData - event related data
817981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
818981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
819981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
820981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
821981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
822981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa
823981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
824981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smEvent(assoc_t *pAssoc, TI_UINT8 event, void *pData)
825981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
826981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
827981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT8        nextState;
828981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
829981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = fsm_GetNextState(pAssoc->pAssocSm, pAssoc->currentState, event, &nextState);
830981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
831981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
832981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TRACE0(pAssoc->hReport, REPORT_SEVERITY_ERROR, "ASSOC_SM: ERROR - failed getting next state \n");
833981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
834981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return(TI_NOK);
835981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
836981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
837981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	TRACE3( pAssoc->hReport, REPORT_SEVERITY_INFORMATION, "assoc_smEvent: <currentState = %d, event = %d> --> nextState = %d\n", pAssoc->currentState, event, nextState);
838981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
839981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = fsm_Event(pAssoc->pAssocSm, &pAssoc->currentState, event, pData);
840981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
841981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return(status);
842981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
843981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
844981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* state machine functions */
845981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
846981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStartIdle(assoc_t *pAssoc)
847981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
848981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
849981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
850981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smResetRetry(pAssoc);
851981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smSendAssocReq(pAssoc);
852981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStartTimer(pAssoc);
853981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smIncRetry(pAssoc);
854981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
855981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
856981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
857981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
858981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStopWait(assoc_t *pAssoc)
859981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
860981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
861981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
862981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStopTimer(pAssoc);
863981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
864981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
865981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
866981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
867981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smSuccessWait(assoc_t *pAssoc)
868981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
869981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
870981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
871981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStopTimer(pAssoc);
872981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smReportSuccess(pAssoc);
873981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
874981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
875981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
876981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
877981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smFailureWait(assoc_t *pAssoc)
878981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
879981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
880981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT16           uRspStatus = *(TI_UINT16*)&(pAssoc->assocRespBuffer[2]);
881981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
882981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStopTimer(pAssoc);
883981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
884981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Sanity check. If the Response status is indeed not 0 */
885981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (uRspStatus)
886981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
887981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = assoc_smReportFailure(pAssoc, uRspStatus);
888981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
889981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else    /* (uRspStatus == 0) how did we get here ? */
890981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
891981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TRACE0(pAssoc->hReport, REPORT_SEVERITY_ERROR, "while Response status is OK (0) !!! \n");
892981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
893981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = assoc_smReportFailure(pAssoc, (TI_UINT16)TI_NOK);
894981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
895981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
896981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
897981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
898981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smTimeoutWait(assoc_t *pAssoc)
899981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
900981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
901981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
902981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smSendAssocReq(pAssoc);
903981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStartTimer(pAssoc);
904981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smIncRetry(pAssoc);
905981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
906981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
907981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
908981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
909981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smMaxRetryWait(assoc_t *pAssoc)
910981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
911981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
912981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
913981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStopTimer(pAssoc);
914981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smReportFailure(pAssoc, STATUS_PACKET_REJ_TIMEOUT);
915981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
916981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
917981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
918981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
919981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smSendAssocReq(assoc_t *pAssoc)
920981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
921023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt    TI_UINT8           *assocMsg;
922023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt    TI_UINT32           msgLen;
923981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS           status;
924981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    dot11MgmtSubType_e  assocType=ASSOC_REQUEST;
925981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
926023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt    assocMsg = os_memoryAlloc(pAssoc->hOs, MAX_ASSOC_MSG_LENGTH);
927023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt    if (!assocMsg)
928023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt        return TI_NOK;
929023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt
930981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc->reAssoc)
931981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
932981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        assocType = RE_ASSOC_REQUEST;
933981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
934981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smRequestBuild(pAssoc, assocMsg, &msgLen);
935023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt    if (status == TI_OK) {
936023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt        /* Save the association request message */
937023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt        assoc_saveAssocReqMessage(pAssoc, assocMsg, msgLen);
938023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt        status = mlmeBuilder_sendFrame(pAssoc->hMlme, assocType, assocMsg, msgLen, 0);
939023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt    }
940023547f11f3d7c84ab64acaab9b9e821f8c528e7Dmitry Shmidt    os_memoryFree(pAssoc->hOs, assocMsg, MAX_ASSOC_MSG_LENGTH);
941981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
942981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
943981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
944981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStopAssoc(assoc_t *pAssoc)
945981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
946981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc->disAssoc) {
947981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        assoc_sendDisAssoc(pAssoc, STATUS_UNSPECIFIED);
948981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
949981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
950981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
951981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
952981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smActionUnexpected(assoc_t *pAssoc)
953981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
954981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
955981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
956981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
957981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* local functions */
958981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
959981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
960981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smResetRetry(assoc_t *pAssoc)
961981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
962981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
963981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
964981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
965981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
966981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
967981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pAssoc->retryCount = 0;
968981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
969981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
970981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
971981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
972981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smIncRetry(assoc_t *pAssoc)
973981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
974981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
975981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
976981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
977981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
978981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
979981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
980981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
981981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pAssoc->retryCount++;
982981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
983981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc->retryCount > pAssoc->maxCount)
984981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
985981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = assoc_smEvent(pAssoc, ASSOC_SM_EVENT_MAX_RETRY, pAssoc);
986981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
987981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return status;
988981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
989981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
990981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
991981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
992981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
993981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smReportSuccess(assoc_t *pAssoc)
994981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
995981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
996981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
997981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
998981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
999981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1000981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1001981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = mlme_reportAssocStatus(pAssoc->hMlme, (TI_UINT16)TI_OK);
1002981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1003981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
1004981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1005981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1006981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smReportFailure(assoc_t *pAssoc, TI_UINT16 uStatusCode)
1007981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1008981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
1009981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1010981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
1011981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1012981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1013981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1014981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1015981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = mlme_reportAssocStatus(pAssoc->hMlme, uStatusCode);
1016981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1017981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
1018981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1019981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1020981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStartTimer(assoc_t *pAssoc)
1021981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1022981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
1023981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1024981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1025981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1026981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1027981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    tmr_StartTimer (pAssoc->hAssocSmTimer,
1028981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                    assoc_smTimeout,
1029981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                    (TI_HANDLE)pAssoc,
1030981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                    pAssoc->timeout,
1031981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                    TI_FALSE);
1032981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1033981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1034981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1035981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1036981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStopTimer(assoc_t *pAssoc)
1037981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1038981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
1039981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1040981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1041981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1042981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1043981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    tmr_StopTimer (pAssoc->hAssocSmTimer);
1044981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1045981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1046981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1047981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1048981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*****************************************************************************
1049981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt**
1050981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt** Association messages builder/Parser
1051981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt**
1052981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*****************************************************************************/
1053981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1054981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smCapBuild(assoc_t *pCtx, TI_UINT16 *cap)
1055981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1056981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    paramInfo_t         param;
1057981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS           status;
1058981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    EDot11Mode          mode;
1059981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32           rateSuppMask, rateBasicMask;
1060981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT8            ratesBuf[DOT11_MAX_SUPPORTED_RATES];
1061981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32           len = 0, ofdmIndex = 0;
1062981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_BOOL             b11nEnable, bWmeEnable;
1063981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1064981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *cap = 0;
1065981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1066981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Bss type */
1067981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = CTRL_DATA_CURRENT_BSS_TYPE_PARAM;
1068981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  ctrlData_getParam(pCtx->hCtrlData, &param);
1069981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1070981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1071981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (param.content.ctrlDataCurrentBssType == BSS_INFRASTRUCTURE)
1072981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1073981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_ESS;
1074981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        } else {
1075981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_IBSS;
1076981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1077981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1078981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1079981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1080981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1081981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Privacy */
1082981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = RSN_ENCRYPTION_STATUS_PARAM;
1083981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  rsn_getParam(pCtx->hRsn, &param);
1084981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1085981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1086981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (param.content.rsnEncryptionStatus != TWD_CIPHER_NONE)
1087981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1088981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_PRIVACY;
1089981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1090981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1091981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1092981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1093981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1094981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Preamble */
1095981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_DESIRED_PREAMBLE_TYPE_PARAM;
1096981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  siteMgr_getParam(pCtx->hSiteMgr, &param);
1097981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1098981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1099981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (param.content.siteMgrCurrentPreambleType == PREAMBLE_SHORT)
1100981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_SHORT_PREAMBLE;
1101981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1102981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1103981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1104981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1105981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Pbcc */
1106981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_CURRENT_RATE_PAIR_PARAM;
1107981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  siteMgr_getParam(pCtx->hSiteMgr, &param);
1108981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1109981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1110981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if(param.content.siteMgrCurrentRateMask.supportedRateMask & DRV_RATE_MASK_22_PBCC)
1111981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_PBCC;
1112981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1113981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1114981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1115981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1116981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1117981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Checking if the station supports Spectrum Management (802.11h) */
1118981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = REGULATORY_DOMAIN_MANAGEMENT_CAPABILITY_ENABLED_PARAM;
1119981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  regulatoryDomain_getParam(pCtx->hRegulatoryDomain, &param);
1120981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK )
1121981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1122981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if( param.content.spectrumManagementEnabled)
1123981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_SPECTRUM_MANAGEMENT;
1124981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1125981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1126981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1127981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1128981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1129981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1130981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* slot time */
1131981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_OPERATIONAL_MODE_PARAM;
1132981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = siteMgr_getParam(pCtx->hSiteMgr, &param);
1133981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(status == TI_OK)
1134981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1135981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        mode = param.content.siteMgrDot11OperationalMode;
1136981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1137981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1138981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1139981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1140981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(mode == DOT11_G_MODE)
1141981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1142981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* new requirement: the short slot time should be set only
1143981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           if the AP's modulation is OFDM (highest rate) */
1144981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1145981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* get Rates */
1146981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        param.paramType = SITE_MGR_CURRENT_RATE_PAIR_PARAM;
1147981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status =  siteMgr_getParam(pCtx->hSiteMgr, &param);
1148981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (status == TI_OK)
1149981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1150981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            rateBasicMask = param.content.siteMgrCurrentRateMask.basicRateMask;
1151981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            rateSuppMask  = param.content.siteMgrCurrentRateMask.supportedRateMask;
1152981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        } else {
1153981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            return TI_NOK;
1154981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1155981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1156981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* convert the bit map to the rates array */
1157981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        rate_DrvBitmapToNetStr (rateSuppMask, rateBasicMask, ratesBuf, &len, &ofdmIndex);
1158981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1159981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if(ofdmIndex < len)
1160981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_SHORT_SLOT_TIME;
1161981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1162981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*
1163981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        param.paramType = SITE_MGR_CURRENT_MODULATION_TYPE_PARAM;
1164981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = siteMgr_getParam(pCtx->hSiteMgr, &param);
1165981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if(param.content.siteMgrCurrentModulationType == DRV_MODULATION_OFDM)
1166981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_SHORT_SLOT_TIME;
1167981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
1168981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1169981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1170981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Immediate Block Ack subfield - (is WME on?) AND (is HT Enable?) */
1171981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* verify 11n_Enable and Chip type */
1172981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    StaCap_IsHtEnable (pCtx->hStaCap, &b11nEnable);
1173981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* verify that WME flag enable */
1174981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    qosMngr_GetWmeEnableFlag (pCtx->hQosMngr, &bWmeEnable);
1175981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1176981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((b11nEnable != TI_FALSE) && (bWmeEnable != TI_FALSE))
1177981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1178981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *cap |= DOT11_CAPS_IMMEDIATE_BA;
1179981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt      }
1180981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1181981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1182981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1183981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1184981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1185981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smSSIDBuild(assoc_t *pCtx, TI_UINT8 *pSSID, TI_UINT32 *ssidLen)
1186981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1187981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    paramInfo_t         param;
1188981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS               status;
1189981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    dot11_SSID_t        *pDot11Ssid;
1190981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1191981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11Ssid = (dot11_SSID_t*)pSSID;
1192981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* set SSID element id */
1193981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11Ssid->hdr[0] = SSID_IE_ID;
1194981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1195981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* get SSID */
1196981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SME_DESIRED_SSID_ACT_PARAM;
1197981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  sme_GetParam(pCtx->hSme, &param);
1198981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1199981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1200981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return status;
1201981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1202981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1203981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* check for ANY ssid */
1204981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (param.content.smeDesiredSSID.len != 0)
1205981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1206981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Ssid->hdr[1] = param.content.smeDesiredSSID.len;
1207981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryCopy(pCtx->hOs,
1208981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      (void *)pDot11Ssid->serviceSetId,
1209981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      (void *)param.content.smeDesiredSSID.str,
1210981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      param.content.smeDesiredSSID.len);
1211981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1212981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1213981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* if ANY ssid is configured, use the current SSID */
1214981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        param.paramType = SITE_MGR_CURRENT_SSID_PARAM;
1215981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status =  siteMgr_getParam(pCtx->hSiteMgr, &param);
1216981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (status != TI_OK)
1217981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1218981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            return status;
1219981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1220981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Ssid->hdr[1] = param.content.siteMgrCurrentSSID.len;
1221981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryCopy(pCtx->hOs,
1222981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      (void *)pDot11Ssid->serviceSetId,
1223981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      (void *)param.content.siteMgrCurrentSSID.str,
1224981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      param.content.siteMgrCurrentSSID.len);
1225981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1226981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1227981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1228981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *ssidLen = pDot11Ssid->hdr[1] + sizeof(dot11_eleHdr_t);
1229981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1230981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1231981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1232981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1233981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smRatesBuild(assoc_t *pCtx, TI_UINT8 *pRates, TI_UINT32 *ratesLen)
1234981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1235981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    paramInfo_t         param;
1236981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS           status;
1237981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32           rateSuppMask, rateBasicMask;
1238981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    dot11_RATES_t       *pDot11Rates;
1239981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32           len = 0, ofdmIndex = 0;
1240981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT8            ratesBuf[DOT11_MAX_SUPPORTED_RATES];
1241981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    EDot11Mode          mode;
1242981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32           suppRatesLen, extSuppRatesLen, i;
1243981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11Rates = (dot11_RATES_t*)pRates;
1244981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1245981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1246981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* get Rates */
1247981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_CURRENT_RATE_PAIR_PARAM;
1248981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  siteMgr_getParam(pCtx->hSiteMgr, &param);
1249981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1250981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1251981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        rateBasicMask = param.content.siteMgrCurrentRateMask.basicRateMask;
1252981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        rateSuppMask  = param.content.siteMgrCurrentRateMask.supportedRateMask;
1253981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1254981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1255981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1256981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1257981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1258981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1259981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* get operational mode */
1260981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_OPERATIONAL_MODE_PARAM;
1261981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = siteMgr_getParam(pCtx->hSiteMgr, &param);
1262981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(status == TI_OK)
1263981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        mode = param.content.siteMgrDot11OperationalMode;
1264981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1265981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1266981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1267981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* convert the bit map to the rates array */
1268981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* remove MCS rates from Extended Supported Rates IE */
1269981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    rateSuppMask &= ~(DRV_RATE_MASK_MCS_0_OFDM |
1270981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_1_OFDM |
1271981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_2_OFDM |
1272981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_3_OFDM |
1273981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_4_OFDM |
1274981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_5_OFDM |
1275981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_6_OFDM |
1276981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_7_OFDM );
1277981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1278981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    rate_DrvBitmapToNetStr (rateSuppMask, rateBasicMask, ratesBuf, &len, &ofdmIndex);
1279981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1280981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(mode != DOT11_G_MODE || ofdmIndex == len )
1281981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1282981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[0] = SUPPORTED_RATES_IE_ID;
1283981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[1] = len;
1284981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryCopy(NULL, (void *)pDot11Rates->rates, ratesBuf, len);
1285981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *ratesLen = pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
1286981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1287981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1288981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1289981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* fill in the supported rates */
1290981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[0] = SUPPORTED_RATES_IE_ID;
1291981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[1] = ofdmIndex;
1292981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryCopy(NULL, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr[1]);
1293981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        suppRatesLen = pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
1294981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* fill in the extended supported rates */
1295981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates = (dot11_RATES_t*)(pRates + suppRatesLen);
1296981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[0] = EXT_SUPPORTED_RATES_IE_ID;
1297981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[1] = len - ofdmIndex;
1298981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryCopy(NULL, (void *)pDot11Rates->rates, &ratesBuf[ofdmIndex], pDot11Rates->hdr[1]);
1299981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        extSuppRatesLen = pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
1300981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *ratesLen = suppRatesLen + extSuppRatesLen;
1301981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1302981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1303981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TRACE3(pCtx->hReport, REPORT_SEVERITY_INFORMATION, "ASSOC_SM: ASSOC_REQ - bitmapSupp= 0x%X,bitMapBasic = 0x%X, len = %d\n", rateSuppMask,rateBasicMask,len);
1304981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    for(i=0; i<len; i++)
1305981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1306981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TRACE2(pCtx->hReport, REPORT_SEVERITY_INFORMATION, "ASSOC_SM: ASSOC_REQ - ratesBuf[%d] = 0x%X\n", i, ratesBuf[i]);
1307981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1308981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1309981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1310981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1311981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1312981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_powerCapabilityBuild(assoc_t *pCtx, TI_UINT8 *pPowerCapability, TI_UINT32 *powerCapabilityLen)
1313981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1314981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    paramInfo_t         param;
1315981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS               status;
1316981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    dot11_CAPABILITY_t      *pDot11PowerCapability;
1317981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1318981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11PowerCapability = (dot11_CAPABILITY_t*)pPowerCapability;
1319981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1320981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* set Power Capability element id */
1321981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11PowerCapability->hdr[0] = DOT11_CAPABILITY_ELE_ID;
1322981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11PowerCapability->hdr[1] = DOT11_CAPABILITY_ELE_LEN;
1323981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1324981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* get power capability */
1325981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = REGULATORY_DOMAIN_POWER_CAPABILITY_PARAM;
1326981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  regulatoryDomain_getParam(pCtx->hRegulatoryDomain, &param);
1327981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1328981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1329981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1330981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11PowerCapability->minTxPower = param.content.powerCapability.minTxPower;
1331981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11PowerCapability->maxTxPower = param.content.powerCapability.maxTxPower;
1332981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *powerCapabilityLen = pDot11PowerCapability->hdr[1] + sizeof(dot11_eleHdr_t);
1333981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1334981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1335981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *powerCapabilityLen = 0;
1336981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1337981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1338981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1339981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1340981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smRequestBuild(assoc_t *pCtx, TI_UINT8* reqBuf, TI_UINT32* reqLen)
1341981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1342981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
1343981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT8        *pRequest;
1344981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32       len;
1345981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    paramInfo_t     param;
1346981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TTwdParamInfo   tTwdParam;
1347981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT16       capabilities;
1348981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1349981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest = reqBuf;
1350981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen = 0;
1351981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1352981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* insert capabilities */
1353981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smCapBuild(pCtx, &capabilities);
1354981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1355981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1356981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *(TI_UINT16*)pRequest = capabilities;
1357981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1358981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1359981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1360981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1361981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += 2;
1362981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += 2;
1363981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1364981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* insert listen interval */
1365981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    tTwdParam.paramType = TWD_LISTEN_INTERVAL_PARAM_ID;
1366981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  TWD_GetParam (pCtx->hTWD, &tTwdParam);
1367981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1368981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1369981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *(TI_UINT16*)pRequest = ENDIAN_HANDLE_WORD((TI_UINT16)tTwdParam.content.halCtrlListenInterval);
1370981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1371981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1372981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1373981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1374981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += 2;
1375981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += 2;
1376981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pCtx->reAssoc)
1377981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {   /* Insert currentAPAddress element only in reassoc request*/
1378981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        param.paramType = SITE_MGR_PREV_SITE_BSSID_PARAM;
1379981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = siteMgr_getParam(pCtx->hSiteMgr, &param);
1380981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (status == TI_OK)
1381981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1382981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            MAC_COPY (pRequest, param.content.siteMgrDesiredBSSID);
1383981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE6(pCtx->hReport, REPORT_SEVERITY_INFORMATION, "ASSOC_SM: ASSOC_REQ - prev AP = %x-%x-%x-%x-%x-%x\n", param.content.siteMgrDesiredBSSID[0], param.content.siteMgrDesiredBSSID[1], param.content.siteMgrDesiredBSSID[2], param.content.siteMgrDesiredBSSID[3], param.content.siteMgrDesiredBSSID[4], param.content.siteMgrDesiredBSSID[5]);
1384981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1385981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1386981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pRequest += MAC_ADDR_LEN;
1387981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *reqLen += MAC_ADDR_LEN;
1388981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1389981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        else
1390981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1391981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE0(pCtx->hReport, REPORT_SEVERITY_ERROR, "ASSOC_SM: ASSOC_REQ - No prev AP \n");
1392981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            return status;
1393981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1394981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1395981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1396981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1397981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* insert SSID element */
1398981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smSSIDBuild(pCtx, pRequest, &len);
1399981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1400981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1401981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1402981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1403981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1404981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1405981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1406981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1407981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* insert Rates element */
1408981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smRatesBuild(pCtx, pRequest, &len);
1409981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1410981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1411981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1412981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1413981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1414981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1415981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1416981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Checking if the station supports Spectrum Management (802.11h) */
1417981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = REGULATORY_DOMAIN_MANAGEMENT_CAPABILITY_ENABLED_PARAM;
1418981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = regulatoryDomain_getParam(pCtx->hRegulatoryDomain,&param);
1419981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if( (status == TI_OK) && param.content.spectrumManagementEnabled)
1420981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1421981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* Checking the selected AP capablities */
1422981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        param.paramType = SITE_MGR_SITE_CAPABILITY_PARAM;
1423981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status =  siteMgr_getParam(pCtx->hSiteMgr,&param);
1424981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if(status == TI_OK && ((param.content.siteMgrSiteCapability & DOT11_SPECTRUM_MANAGEMENT) != 0))
1425981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1426981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* insert Power capability element */
1427981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            status = assoc_powerCapabilityBuild(pCtx, pRequest, &len);
1428981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if (status != TI_OK)
1429981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            {
1430981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                return TI_NOK;
1431981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            }
1432981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pRequest += len;
1433981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *reqLen += len;
1434981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#if 0
1435981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* insert Supported Channels element */
1436981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            status = assoc_supportedChannelBuild(pCtx, pRequest, &len);
1437981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if (status != TI_OK)
1438981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            {
1439981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                return TI_NOK;
1440981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            }
1441981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pRequest += len;
1442981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *reqLen += len;
1443981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#endif
1444981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1445981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1446981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1447981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1448981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1449981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = qosMngr_getQosCapabiltyInfeElement(pCtx->hQosMngr,pRequest,&len);
1450981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1451981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1452981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1453981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1454981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1455981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1456981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1457981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1458981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#ifdef XCC_MODULE_INCLUDED
1459981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = rsn_getXCCExtendedInfoElement(pCtx->hRsn, pRequest, (TI_UINT8*)&len);
1460981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1461981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1462981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1463981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1464981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1465981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1466981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1467981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pCtx->reAssoc)
1468981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {   /* insert CCKM information element only in reassoc */
1469981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = XCCMngr_getCckmInfoElement(pCtx->hXCCMngr, pRequest, (TI_UINT8*)&len);
1470981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1471981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (status != TI_OK)
1472981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1473981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            return TI_NOK;
1474981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1475981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pRequest += len;
1476981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *reqLen += len;
1477981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1478981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = XCCMngr_getXCCVersionInfoElement(pCtx->hXCCMngr, pRequest, (TI_UINT8*)&len);
1479981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1480981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1481981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1482981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1483981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1484981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1485981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1486981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Insert Radio Mngt Capability IE */
1487981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = measurementMgr_radioMngtCapabilityBuild(pCtx->hMeasurementMgr, pRequest, (TI_UINT8*)&len);
1488981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1489981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1490981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1491981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1492981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1493981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1494981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#endif
1495981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1496653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt     /* Get Simple-Config state */
1497653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    param.paramType = SITE_MGR_SIMPLE_CONFIG_MODE;
1498653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt    status = siteMgr_getParam(pCtx->hSiteMgr, &param);
1499653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt
1500653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt   if (param.content.siteMgrWSCMode.WSCMode == TIWLN_SIMPLE_CONFIG_OFF)
1501653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt   {
1502981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* insert RSN information elements */
1503981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = rsn_getInfoElement(pCtx->hRsn, pRequest, &len);
1504981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1505981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (status != TI_OK)
1506981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
1507981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
1508981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
1509981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	pRequest += len;
1510981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	*reqLen += len;
1511653850f71f9caaa41af19cadbab24bb5e655daf4Dmitry Shmidt  }
1512981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1513981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Primary Site support HT ? */
1514981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_PRIMARY_SITE_HT_SUPPORT;
1515981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    siteMgr_getParam(pCtx->hSiteMgr, &param);
1516981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1517981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(TI_TRUE == param.content.bPrimarySiteHtSupport)
1518981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1519981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = StaCap_GetHtCapabilitiesIe (pCtx->hStaCap, pRequest, &len);
1520981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    	if (status != TI_OK)
1521981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    	{
1522981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    		return TI_NOK;
1523981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    	}
1524981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    	pRequest += len;
1525981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    	*reqLen += len;
1526981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1527981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1528981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	status = qosMngr_assocReqBuild(pCtx->hQosMngr,pRequest,&len);
1529981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (status != TI_OK)
1530981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
1531981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
1532981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
1533981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	pRequest += len;
1534981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	*reqLen += len;
1535981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1536981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	status = apConn_getVendorSpecificIE(pCtx->hApConn, pRequest, &len);
1537981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (status != TI_OK)
1538981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
1539981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
1540981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
1541981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	pRequest += len;
1542981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	*reqLen += len;
1543981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1544981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (*reqLen>=MAX_ASSOC_MSG_LENGTH)
1545981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1546981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1547981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1548981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1549981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1550981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1551981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1552981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1553981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1554981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_saveAssocRespMessage(assoc_t *pAssocSm, TI_UINT8 *pAssocBuffer, TI_UINT32 length)
1555981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1556981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((pAssocSm==NULL) || (pAssocBuffer==NULL) || (length>=MAX_ASSOC_MSG_LENGTH))
1557981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1558981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1559981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1560981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    os_memoryCopy(pAssocSm->hOs, pAssocSm->assocRespBuffer, pAssocBuffer, length);
1561981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pAssocSm->assocRespLen = length;
1562981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1563981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TRACE1(pAssocSm->hReport, REPORT_SEVERITY_INFORMATION, "assoc_saveAssocRespMessage: length=%ld \n",length);
1564981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1565981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1566981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1567981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_saveAssocReqMessage(assoc_t *pAssocSm, TI_UINT8 *pAssocBuffer, TI_UINT32 length)
1568981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1569981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1570981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((pAssocSm==NULL) || (pAssocBuffer==NULL) || (length>=MAX_ASSOC_MSG_LENGTH))
1571981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1572981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1573981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1574981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1575981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    os_memoryCopy(pAssocSm->hOs, pAssocSm->assocReqBuffer, pAssocBuffer, length);
1576981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pAssocSm->assocReqLen = length;
1577981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1578981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TRACE1(pAssocSm->hReport, REPORT_SEVERITY_INFORMATION, "assoc_saveAssocReqMessage: length=%ld \n",length);
1579981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1580981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1581981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1582981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1583981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_sendDisAssoc(assoc_t *pAssocSm, mgmtStatus_e reason)
1584981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1585981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
1586981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    disAssoc_t      disAssoc;
1587981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1588981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (reason == STATUS_SUCCESSFUL)
1589981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1590981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        disAssoc.reason = ENDIAN_HANDLE_WORD(STATUS_UNSPECIFIED);
1591981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1592981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        disAssoc.reason = ENDIAN_HANDLE_WORD(reason);
1593981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1594981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1595981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = mlmeBuilder_sendFrame(pAssocSm->hMlme, DIS_ASSOC, (TI_UINT8*)&disAssoc, sizeof(disAssoc_t), 0);
1596981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1597981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
1598981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1599981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1600981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1601