assocSM.c revision 12d754a18612383f03b960dfad4dbcaba72df370
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"
71981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "sme.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{
19812d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	TI_STATUS       status;
19912d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	assoc_t     *pHandle;
200981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
20112d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	pHandle = (assoc_t *)hAssoc;
20212d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	if (!pHandle)
20312d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt		return TI_NOK;
204981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
20512d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	status = fsm_Unload(pHandle->hOs, pHandle->pAssocSm);
20612d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	if (status != TI_OK)
20712d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	{
20812d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt		/* report failure but don't stop... */
20912d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt		TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "ASSOC_SM: Error releasing FSM memory \n");
21012d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	}
21112d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt
21212d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	tmr_DestroyTimer (pHandle->hAssocSmTimer);
21312d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt
21412d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	os_memoryFree(pHandle->hOs, hAssoc, sizeof(assoc_t));
215981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
21612d754a18612383f03b960dfad4dbcaba72df370Dmitry Shmidt	return TI_OK;
217981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
218981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
219981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
220981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
221981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_config - configure a new association SM
222981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
223981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
224981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
225981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Configure a new association SM.
226981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
227981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
228981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
229981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  void
230981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
231981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Create, assoc_Unload
232981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
233981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid assoc_init (TStadHandlesList *pStadHandles)
234981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
235981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t *pHandle = (assoc_t*)(pStadHandles->hAssoc);
236981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
237981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /** Main 802.1X State Machine matrix */
238981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    fsm_actionCell_t    assoc_smMatrix[ASSOC_SM_NUM_STATES][ASSOC_SM_NUM_EVENTS] =
239981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
240981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* next state and actions for IDLE state */
241981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {{ASSOC_SM_STATE_WAIT, (fsm_Action_t)assoc_smStartIdle},
242981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smActionUnexpected},
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        },
248981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* next state and actions for WAIT state */
249981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {{ASSOC_SM_STATE_WAIT, (fsm_Action_t)assoc_smActionUnexpected},
250981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smStopWait},
251981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_ASSOC, (fsm_Action_t)assoc_smSuccessWait},
252981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smFailureWait},
253981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_WAIT, (fsm_Action_t)assoc_smTimeoutWait},
254981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smMaxRetryWait}
255981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        },
256981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* next state and actions for ASSOC state */
257981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {{ASSOC_SM_STATE_ASSOC, (fsm_Action_t)assoc_smActionUnexpected},
258981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_IDLE, (fsm_Action_t)assoc_smStopAssoc},
259981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt         {ASSOC_SM_STATE_ASSOC, (fsm_Action_t)assoc_smActionUnexpected},
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        }};
264981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
265981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* configure state machine */
266981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    fsm_Config (pHandle->pAssocSm, &assoc_smMatrix[0][0], ASSOC_SM_NUM_STATES, ASSOC_SM_NUM_EVENTS, NULL, pStadHandles->hOs);
267981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
268981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->assocRejectCount = 0;
269981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->assocTimeoutCount = 0;
270981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->currentState = ASSOC_SM_STATE_IDLE;
271981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
272981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hMlme             = pStadHandles->hMlmeSm;
273981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hRegulatoryDomain = pStadHandles->hRegulatoryDomain;
274981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hSiteMgr          = pStadHandles->hSiteMgr;
275981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hCtrlData         = pStadHandles->hCtrlData;
276981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hTWD              = pStadHandles->hTWD;
277981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hRsn              = pStadHandles->hRsn;
278981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hReport           = pStadHandles->hReport;
279981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hOs               = pStadHandles->hOs;
280981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hXCCMngr          = pStadHandles->hXCCMngr;
281981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hQosMngr          = pStadHandles->hQosMngr;
282981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hMeasurementMgr   = pStadHandles->hMeasurementMgr;
283981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hApConn           = pStadHandles->hAPConnection;
284981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hTimer            = pStadHandles->hTimer;
285981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hStaCap = pStadHandles->hStaCap;
286981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hSme              = pStadHandles->hSme;
287981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
288981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
289981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
290981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
291981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_SetDefaults (TI_HANDLE hAssoc, assocInitParams_t *pAssocInitParams)
292981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
293981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t *pHandle = (assoc_t*)hAssoc;
294981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
295981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->timeout = pAssocInitParams->assocResponseTimeout;
296981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->maxCount = pAssocInitParams->assocMaxRetryCount;
297981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
298981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* allocate OS timer memory */
299981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->hAssocSmTimer = tmr_CreateTimer (pHandle->hTimer);
300981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle->hAssocSmTimer == NULL)
301981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
302981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "assoc_SetDefaults(): Failed to create hAssocSmTimer!\n");
303981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
304981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
305981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
306981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
307981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
308981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
309981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
310981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
311981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
312981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_start - Start event for the association SM
313981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
314981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
315981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
316981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Start event for the association SM
317981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
318981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
319981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
320981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
321981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
322981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
323981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
324981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
325981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
326981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Stop, assoc_Recv
327981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
328981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_start(TI_HANDLE hAssoc)
329981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
330981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
331981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
332981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
333981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
334981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
335981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle == NULL)
336981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
337981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
338981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
339981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
340981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->reAssoc = TI_FALSE;
341981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
342981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->disAssoc = TI_FALSE;
343981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
344981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smEvent(pHandle, ASSOC_SM_EVENT_START, hAssoc);
345981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
346981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
347981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
348981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
349981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
350981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
351981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
352981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_start - Start event for the association SM
353981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
354981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
355981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
356981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Start event for the association SM - for Re-assoc request
357981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
358981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
359981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
360981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
361981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
362981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
363981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
364981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
365981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
366981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Stop, assoc_Recv
367981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
368981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS reassoc_start(TI_HANDLE hAssoc)
369981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
370981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
371981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
372981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
373981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
374981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
375981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle == NULL)
376981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
377981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
378981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
379981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->reAssoc = TI_TRUE;
380981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
381981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smEvent(pHandle, ASSOC_SM_EVENT_START, hAssoc);
382981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
383981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
384981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
385981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
386981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
387981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
388981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_stop - Stop event for the association SM
389981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
390981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
391981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
392981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Stop event for the association SM
393981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
394981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
395981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
396981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
397981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
398981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
399981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
400981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
401981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
402981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Start, assoc_Recv
403981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
404981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_stop(TI_HANDLE hAssoc)
405981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
406981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
407981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
408981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
409981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
410981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
411981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle == NULL)
412981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
413981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
414981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
415981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
416981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smEvent(pHandle, ASSOC_SM_EVENT_STOP, hAssoc);
417981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
418981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
419981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
420981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
421981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
422981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_setDisAssocFlag(TI_HANDLE hAssoc, TI_BOOL disAsoccFlag)
423981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
424981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
425981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
426981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
427981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->disAssoc = disAsoccFlag;
428981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
429981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
430981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
431981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
432981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
433981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
434981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
435981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
436981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_recv - Recive a message from the AP
437981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
438981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
439981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
440981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Parse a message form the AP and perform the appropriate event.
441981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
442981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
443981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
444981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
445981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - pFrame - Frame recieved  \n
446981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
447981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
448981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
449981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
450981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
451981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Start, assoc_Stop
452981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
453981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_recv(TI_HANDLE hAssoc, mlmeFrameInfo_t *pFrame)
454981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
455981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
456981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t         *pHandle;
457981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TTwdParamInfo   tTwdParam;
458981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT16           rspStatus;
459981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
460981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
461981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
462981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* ensure that the SM is waiting for assoc response */
463981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(pHandle->currentState != ASSOC_SM_STATE_WAIT)
464981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_OK;
465981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
466981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle == NULL)
467981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
468981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
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{
609981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
610981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
611981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
612981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
613981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((pHandle == NULL) || (pParam == NULL))
614981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
615981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
616981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
617981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
618981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* serch parameter type */
619981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    switch (pParam->paramType)
620981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
621981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    case ASSOC_RESPONSE_TIMEOUT_PARAM:
622981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pParam->content.assocResponseTimeout = pHandle->timeout;
623981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        break;
624981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
625981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    case ASSOC_COUNTERS_PARAM:
626981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pParam->content.siteMgrTiWlanCounters.AssocRejects = pHandle->assocRejectCount;
627981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pParam->content.siteMgrTiWlanCounters.AssocTimeouts = pHandle->assocTimeoutCount;
628981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        break;
629981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
630981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    case ASSOC_ASSOCIATION_RESP_PARAM:
631981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pParam->content.assocReqBuffer.buffer = pHandle->assocReqBuffer;
632981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pParam->content.assocReqBuffer.bufferSize = pHandle->assocRespLen;
633981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        break;
634981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
635981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    case ASSOC_ASSOCIATION_INFORMATION_PARAM:
636981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt       {
637981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           TI_UINT8  reqBuffIEOffset, respBuffIEOffset;
638981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           TI_UINT32 RequestIELength = 0;
639981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           TI_UINT32 ResponseIELength = 0;
640981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           paramInfo_t  param;
641981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
642981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "ASSOC_SM: DEBUG - Association Information Get:  \n");
643981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
644981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           /* Assoc exists only in Infrastructure */
645981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           param.paramType = CTRL_DATA_CURRENT_BSS_TYPE_PARAM;
646981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           ctrlData_getParam(pHandle->hCtrlData, &param);
647981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           if (param.content.ctrlDataCurrentBssType != BSS_INFRASTRUCTURE)
648981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           {
649981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt               TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "Not in Infrastructure BSS, No ASSOC Info for GET ASSOC_ASSOCIATION_INFORMATION_PARAM\n");
650981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt               return TI_NOK;
651981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           }
652981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
653981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           /* Init the result buffer to 0 */
654981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           os_memoryZero(pHandle->hOs ,&pParam->content, sizeof(OS_802_11_ASSOCIATION_INFORMATION));
655981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
656981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           reqBuffIEOffset  = 4;  /* In Assoc request frame IEs are located from byte 4 */
657981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           respBuffIEOffset = 6;  /* In Assoc response frame the IEs are located from byte 6 */
658981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
659981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* If the last associate was re-associciation, the current AP MAC address */
660981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* is placed before the IEs. Copy it to the result parameters.            */
661981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if (pHandle->reAssoc)
662981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            {
663981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                MAC_COPY (pParam->content.assocAssociationInformation.RequestFixedIEs.CurrentAPAddress,
664981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                          &pHandle->assocReqBuffer[reqBuffIEOffset]);
665981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                reqBuffIEOffset += MAC_ADDR_LEN;
666981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            }
667981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
668981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* Calculate length of Info elements in assoc request and response frames */
669981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if(pHandle->assocReqLen > reqBuffIEOffset)
670981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                RequestIELength = pHandle->assocReqLen - reqBuffIEOffset;
671981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
672981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if(pHandle->assocRespLen > respBuffIEOffset)
673981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                ResponseIELength = pHandle->assocRespLen - respBuffIEOffset;
674981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
675981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* Copy the association request information */
676981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.Length = sizeof(OS_802_11_ASSOCIATION_INFORMATION);
677981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.AvailableRequestFixedIEs = OS_802_11_AI_REQFI_CAPABILITIES | OS_802_11_AI_REQFI_LISTENINTERVAL;
678981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.RequestFixedIEs.Capabilities = *(TI_UINT16*)&(pHandle->assocReqBuffer[0]);
679981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.RequestFixedIEs.ListenInterval = *(TI_UINT16*)(&pHandle->assocReqBuffer[2]);
680981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
681981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.RequestIELength = RequestIELength;
682981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.OffsetRequestIEs = 0;
683981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if (RequestIELength > 0)
684981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            {
685981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                pParam->content.assocAssociationInformation.OffsetRequestIEs = (TI_UINT32)&pHandle->assocReqBuffer[reqBuffIEOffset];
686981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            }
687981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* Copy the association response information */
688981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.AvailableResponseFixedIEs =
689981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                OS_802_11_AI_RESFI_CAPABILITIES | OS_802_11_AI_RESFI_STATUSCODE | OS_802_11_AI_RESFI_ASSOCIATIONID;
690981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.ResponseFixedIEs.Capabilities = *(TI_UINT16*)&(pHandle->assocRespBuffer[0]);
691981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.ResponseFixedIEs.StatusCode = *(TI_UINT16*)&(pHandle->assocRespBuffer[2]);
692981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.ResponseFixedIEs.AssociationId = *(TI_UINT16*)&(pHandle->assocRespBuffer[4]);
693981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.ResponseIELength = ResponseIELength;
694981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pParam->content.assocAssociationInformation.OffsetResponseIEs = 0;
695981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if (ResponseIELength > 0)
696981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            {
697981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                pParam->content.assocAssociationInformation.OffsetResponseIEs = (TI_UINT32)&pHandle->assocRespBuffer[respBuffIEOffset];
698981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            }
699981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
700981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt       }
701981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        break;
702981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    default:
703981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
704981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
705981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
706981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
707981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
708981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
709981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
710981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
711981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_setParam - Set a specific parameter to the association SM
712981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
713981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
714981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
715981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Set a specific parameter to the association SM.
716981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
717981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
718981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
719981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
720981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I/O - pParam - Parameter \n
721981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
722981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
723981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
724981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
725981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
726981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Start, assoc_Stop
727981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
728981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_setParam(TI_HANDLE hAssoc, paramInfo_t *pParam)
729981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
730981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
731981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
732981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
733981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
734981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((pHandle == NULL) || (pParam == NULL))
735981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
736981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
737981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
738981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
739981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    switch (pParam->paramType)
740981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
741981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    case ASSOC_RESPONSE_TIMEOUT_PARAM:
742981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* check bounds */
743981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if ((pParam->content.assocResponseTimeout >= ASSOC_RESPONSE_TIMEOUT_MIN) &&
744981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            (pParam->content.assocResponseTimeout <= ASSOC_RESPONSE_TIMEOUT_MAX))
745981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
746981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pHandle->timeout = pParam->content.assocResponseTimeout;
747981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        } else {
748981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            return TI_NOK;
749981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
750981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        break;
751981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    default:
752981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
753981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
754981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
755981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
756981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
757981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
758981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
759981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
760981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_smTimeout - Time out event activation function
761981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
762981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
763981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
764981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Time out event activation function.
765981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
766981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
767981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
768981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - hAssoc - Association SM context  \n
769981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
770981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
771981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
772981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
773981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
774981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa assoc_Start, assoc_Stop
775981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
776981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid assoc_smTimeout(TI_HANDLE hAssoc, TI_BOOL bTwdInitOccured)
777981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
778981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_t     *pHandle;
779981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
780981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle = (assoc_t*)hAssoc;
781981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
782981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
783981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pHandle == NULL)
784981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
785981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return;
786981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
787981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
788981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pHandle->assocTimeoutCount++;
789981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
790981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_smEvent(pHandle, ASSOC_SM_EVENT_TIMEOUT, hAssoc);
791981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
792981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
793981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
794981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
795981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* assoc_smEvent - Perform an event on the association SM
796981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
797981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
798981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
799981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Perform an event on the association SM.
800981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
801981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
802981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
803981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - pAssoc - Association SM context  \n
804981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - event - Current event \n
805981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - pData - event related data
806981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
807981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
808981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
809981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK if successful, TI_NOK otherwise.
810981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
811981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa
812981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
813981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smEvent(assoc_t *pAssoc, TI_UINT8 event, void *pData)
814981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
815981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
816981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT8        nextState;
817981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
818981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = fsm_GetNextState(pAssoc->pAssocSm, pAssoc->currentState, event, &nextState);
819981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
820981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
821981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TRACE0(pAssoc->hReport, REPORT_SEVERITY_ERROR, "ASSOC_SM: ERROR - failed getting next state \n");
822981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
823981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return(TI_NOK);
824981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
825981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
826981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	TRACE3( pAssoc->hReport, REPORT_SEVERITY_INFORMATION, "assoc_smEvent: <currentState = %d, event = %d> --> nextState = %d\n", pAssoc->currentState, event, nextState);
827981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
828981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = fsm_Event(pAssoc->pAssocSm, &pAssoc->currentState, event, pData);
829981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
830981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return(status);
831981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
832981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
833981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* state machine functions */
834981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
835981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStartIdle(assoc_t *pAssoc)
836981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
837981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
838981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
839981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smResetRetry(pAssoc);
840981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smSendAssocReq(pAssoc);
841981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStartTimer(pAssoc);
842981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smIncRetry(pAssoc);
843981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
844981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
845981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
846981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
847981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStopWait(assoc_t *pAssoc)
848981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
849981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
850981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
851981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStopTimer(pAssoc);
852981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
853981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
854981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
855981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
856981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smSuccessWait(assoc_t *pAssoc)
857981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
858981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
859981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
860981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStopTimer(pAssoc);
861981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smReportSuccess(pAssoc);
862981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
863981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
864981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
865981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
866981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smFailureWait(assoc_t *pAssoc)
867981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
868981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
869981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT16           uRspStatus = *(TI_UINT16*)&(pAssoc->assocRespBuffer[2]);
870981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
871981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStopTimer(pAssoc);
872981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
873981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Sanity check. If the Response status is indeed not 0 */
874981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (uRspStatus)
875981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
876981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = assoc_smReportFailure(pAssoc, uRspStatus);
877981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
878981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else    /* (uRspStatus == 0) how did we get here ? */
879981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
880981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TRACE0(pAssoc->hReport, REPORT_SEVERITY_ERROR, "while Response status is OK (0) !!! \n");
881981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
882981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = assoc_smReportFailure(pAssoc, (TI_UINT16)TI_NOK);
883981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
884981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
885981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
886981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
887981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smTimeoutWait(assoc_t *pAssoc)
888981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
889981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
890981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
891981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smSendAssocReq(pAssoc);
892981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStartTimer(pAssoc);
893981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smIncRetry(pAssoc);
894981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
895981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
896981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
897981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
898981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smMaxRetryWait(assoc_t *pAssoc)
899981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
900981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
901981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
902981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smStopTimer(pAssoc);
903981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smReportFailure(pAssoc, STATUS_PACKET_REJ_TIMEOUT);
904981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
905981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
906981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
907981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
908981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smSendAssocReq(assoc_t *pAssoc)
909981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
910981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT8                assocMsg[MAX_ASSOC_MSG_LENGTH];
911981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32               msgLen;
912981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS           status;
913981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    dot11MgmtSubType_e  assocType=ASSOC_REQUEST;
914981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
915981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc->reAssoc)
916981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
917981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        assocType = RE_ASSOC_REQUEST;
918981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
919981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smRequestBuild(pAssoc, assocMsg, &msgLen);
920981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
921981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return status;
922981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
923981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Save the association request message */
924981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    assoc_saveAssocReqMessage(pAssoc, assocMsg, msgLen);
925981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = mlmeBuilder_sendFrame(pAssoc->hMlme, assocType, assocMsg, msgLen, 0);
926981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
927981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
928981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
929981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
930981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStopAssoc(assoc_t *pAssoc)
931981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
932981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc->disAssoc) {
933981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        assoc_sendDisAssoc(pAssoc, STATUS_UNSPECIFIED);
934981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
935981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
936981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
937981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
938981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smActionUnexpected(assoc_t *pAssoc)
939981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
940981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
941981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
942981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
943981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* local functions */
944981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
945981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
946981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smResetRetry(assoc_t *pAssoc)
947981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
948981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
949981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
950981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
951981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
952981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
953981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pAssoc->retryCount = 0;
954981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
955981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
956981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
957981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
958981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smIncRetry(assoc_t *pAssoc)
959981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
960981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
961981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
962981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
963981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
964981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
965981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
966981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
967981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pAssoc->retryCount++;
968981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
969981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc->retryCount > pAssoc->maxCount)
970981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
971981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = assoc_smEvent(pAssoc, ASSOC_SM_EVENT_MAX_RETRY, pAssoc);
972981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
973981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return status;
974981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
975981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
976981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
977981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
978981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
979981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smReportSuccess(assoc_t *pAssoc)
980981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
981981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
982981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
983981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
984981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
985981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
986981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
987981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = mlme_reportAssocStatus(pAssoc->hMlme, (TI_UINT16)TI_OK);
988981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
989981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
990981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
991981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
992981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smReportFailure(assoc_t *pAssoc, TI_UINT16 uStatusCode)
993981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
994981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
995981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
996981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
997981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
998981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
999981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1000981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1001981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = mlme_reportAssocStatus(pAssoc->hMlme, uStatusCode);
1002981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1003981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
1004981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1005981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1006981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStartTimer(assoc_t *pAssoc)
1007981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1008981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
1009981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1010981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1011981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1012981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1013981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    tmr_StartTimer (pAssoc->hAssocSmTimer,
1014981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                    assoc_smTimeout,
1015981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                    (TI_HANDLE)pAssoc,
1016981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                    pAssoc->timeout,
1017981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                    TI_FALSE);
1018981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1019981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1020981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1021981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1022981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smStopTimer(assoc_t *pAssoc)
1023981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1024981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pAssoc == NULL)
1025981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1026981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1027981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1028981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1029981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    tmr_StopTimer (pAssoc->hAssocSmTimer);
1030981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1031981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1032981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1033981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1034981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*****************************************************************************
1035981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt**
1036981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt** Association messages builder/Parser
1037981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt**
1038981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*****************************************************************************/
1039981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1040981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smCapBuild(assoc_t *pCtx, TI_UINT16 *cap)
1041981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1042981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    paramInfo_t         param;
1043981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS           status;
1044981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    EDot11Mode          mode;
1045981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32           rateSuppMask, rateBasicMask;
1046981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT8            ratesBuf[DOT11_MAX_SUPPORTED_RATES];
1047981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32           len = 0, ofdmIndex = 0;
1048981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_BOOL             b11nEnable, bWmeEnable;
1049981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1050981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *cap = 0;
1051981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1052981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Bss type */
1053981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = CTRL_DATA_CURRENT_BSS_TYPE_PARAM;
1054981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  ctrlData_getParam(pCtx->hCtrlData, &param);
1055981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1056981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1057981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (param.content.ctrlDataCurrentBssType == BSS_INFRASTRUCTURE)
1058981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1059981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_ESS;
1060981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        } else {
1061981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_IBSS;
1062981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1063981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1064981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1065981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1066981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1067981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Privacy */
1068981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = RSN_ENCRYPTION_STATUS_PARAM;
1069981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  rsn_getParam(pCtx->hRsn, &param);
1070981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1071981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1072981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (param.content.rsnEncryptionStatus != TWD_CIPHER_NONE)
1073981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1074981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_PRIVACY;
1075981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1076981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1077981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1078981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1079981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1080981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Preamble */
1081981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_DESIRED_PREAMBLE_TYPE_PARAM;
1082981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  siteMgr_getParam(pCtx->hSiteMgr, &param);
1083981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1084981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1085981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (param.content.siteMgrCurrentPreambleType == PREAMBLE_SHORT)
1086981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_SHORT_PREAMBLE;
1087981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1088981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1089981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1090981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1091981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Pbcc */
1092981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_CURRENT_RATE_PAIR_PARAM;
1093981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  siteMgr_getParam(pCtx->hSiteMgr, &param);
1094981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1095981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1096981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if(param.content.siteMgrCurrentRateMask.supportedRateMask & DRV_RATE_MASK_22_PBCC)
1097981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_PBCC;
1098981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1099981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1100981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1101981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1102981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1103981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Checking if the station supports Spectrum Management (802.11h) */
1104981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = REGULATORY_DOMAIN_MANAGEMENT_CAPABILITY_ENABLED_PARAM;
1105981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  regulatoryDomain_getParam(pCtx->hRegulatoryDomain, &param);
1106981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK )
1107981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1108981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if( param.content.spectrumManagementEnabled)
1109981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_SPECTRUM_MANAGEMENT;
1110981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1111981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1112981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1113981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1114981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1115981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1116981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* slot time */
1117981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_OPERATIONAL_MODE_PARAM;
1118981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = siteMgr_getParam(pCtx->hSiteMgr, &param);
1119981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(status == TI_OK)
1120981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1121981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        mode = param.content.siteMgrDot11OperationalMode;
1122981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1123981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1124981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1125981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1126981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(mode == DOT11_G_MODE)
1127981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1128981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* new requirement: the short slot time should be set only
1129981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt           if the AP's modulation is OFDM (highest rate) */
1130981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1131981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* get Rates */
1132981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        param.paramType = SITE_MGR_CURRENT_RATE_PAIR_PARAM;
1133981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status =  siteMgr_getParam(pCtx->hSiteMgr, &param);
1134981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (status == TI_OK)
1135981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1136981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            rateBasicMask = param.content.siteMgrCurrentRateMask.basicRateMask;
1137981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            rateSuppMask  = param.content.siteMgrCurrentRateMask.supportedRateMask;
1138981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        } else {
1139981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            return TI_NOK;
1140981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1141981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1142981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* convert the bit map to the rates array */
1143981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        rate_DrvBitmapToNetStr (rateSuppMask, rateBasicMask, ratesBuf, &len, &ofdmIndex);
1144981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1145981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if(ofdmIndex < len)
1146981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_SHORT_SLOT_TIME;
1147981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1148981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*
1149981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        param.paramType = SITE_MGR_CURRENT_MODULATION_TYPE_PARAM;
1150981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = siteMgr_getParam(pCtx->hSiteMgr, &param);
1151981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if(param.content.siteMgrCurrentModulationType == DRV_MODULATION_OFDM)
1152981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *cap |= DOT11_CAPS_SHORT_SLOT_TIME;
1153981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
1154981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1155981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1156981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Immediate Block Ack subfield - (is WME on?) AND (is HT Enable?) */
1157981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* verify 11n_Enable and Chip type */
1158981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    StaCap_IsHtEnable (pCtx->hStaCap, &b11nEnable);
1159981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* verify that WME flag enable */
1160981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    qosMngr_GetWmeEnableFlag (pCtx->hQosMngr, &bWmeEnable);
1161981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1162981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((b11nEnable != TI_FALSE) && (bWmeEnable != TI_FALSE))
1163981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1164981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *cap |= DOT11_CAPS_IMMEDIATE_BA;
1165981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt      }
1166981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1167981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1168981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1169981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1170981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1171981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smSSIDBuild(assoc_t *pCtx, TI_UINT8 *pSSID, TI_UINT32 *ssidLen)
1172981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1173981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    paramInfo_t         param;
1174981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS               status;
1175981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    dot11_SSID_t        *pDot11Ssid;
1176981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1177981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11Ssid = (dot11_SSID_t*)pSSID;
1178981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* set SSID element id */
1179981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11Ssid->hdr[0] = SSID_IE_ID;
1180981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1181981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* get SSID */
1182981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SME_DESIRED_SSID_ACT_PARAM;
1183981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  sme_GetParam(pCtx->hSme, &param);
1184981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1185981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1186981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return status;
1187981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1188981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1189981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* check for ANY ssid */
1190981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (param.content.smeDesiredSSID.len != 0)
1191981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1192981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Ssid->hdr[1] = param.content.smeDesiredSSID.len;
1193981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryCopy(pCtx->hOs,
1194981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      (void *)pDot11Ssid->serviceSetId,
1195981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      (void *)param.content.smeDesiredSSID.str,
1196981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      param.content.smeDesiredSSID.len);
1197981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1198981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1199981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* if ANY ssid is configured, use the current SSID */
1200981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        param.paramType = SITE_MGR_CURRENT_SSID_PARAM;
1201981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status =  siteMgr_getParam(pCtx->hSiteMgr, &param);
1202981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (status != TI_OK)
1203981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1204981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            return status;
1205981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1206981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Ssid->hdr[1] = param.content.siteMgrCurrentSSID.len;
1207981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryCopy(pCtx->hOs,
1208981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      (void *)pDot11Ssid->serviceSetId,
1209981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      (void *)param.content.siteMgrCurrentSSID.str,
1210981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      param.content.siteMgrCurrentSSID.len);
1211981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1212981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1213981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1214981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *ssidLen = pDot11Ssid->hdr[1] + sizeof(dot11_eleHdr_t);
1215981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1216981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1217981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1218981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1219981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smRatesBuild(assoc_t *pCtx, TI_UINT8 *pRates, TI_UINT32 *ratesLen)
1220981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1221981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    paramInfo_t         param;
1222981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS           status;
1223981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32           rateSuppMask, rateBasicMask;
1224981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    dot11_RATES_t       *pDot11Rates;
1225981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32           len = 0, ofdmIndex = 0;
1226981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT8            ratesBuf[DOT11_MAX_SUPPORTED_RATES];
1227981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    EDot11Mode          mode;
1228981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32           suppRatesLen, extSuppRatesLen, i;
1229981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11Rates = (dot11_RATES_t*)pRates;
1230981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1231981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1232981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* get Rates */
1233981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_CURRENT_RATE_PAIR_PARAM;
1234981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  siteMgr_getParam(pCtx->hSiteMgr, &param);
1235981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1236981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1237981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        rateBasicMask = param.content.siteMgrCurrentRateMask.basicRateMask;
1238981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        rateSuppMask  = param.content.siteMgrCurrentRateMask.supportedRateMask;
1239981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1240981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1241981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1242981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1243981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1244981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1245981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* get operational mode */
1246981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_OPERATIONAL_MODE_PARAM;
1247981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = siteMgr_getParam(pCtx->hSiteMgr, &param);
1248981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(status == TI_OK)
1249981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        mode = param.content.siteMgrDot11OperationalMode;
1250981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1251981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1252981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1253981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* convert the bit map to the rates array */
1254981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* remove MCS rates from Extended Supported Rates IE */
1255981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    rateSuppMask &= ~(DRV_RATE_MASK_MCS_0_OFDM |
1256981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_1_OFDM |
1257981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_2_OFDM |
1258981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_3_OFDM |
1259981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_4_OFDM |
1260981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_5_OFDM |
1261981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_6_OFDM |
1262981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                      DRV_RATE_MASK_MCS_7_OFDM );
1263981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1264981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    rate_DrvBitmapToNetStr (rateSuppMask, rateBasicMask, ratesBuf, &len, &ofdmIndex);
1265981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1266981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(mode != DOT11_G_MODE || ofdmIndex == len )
1267981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1268981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[0] = SUPPORTED_RATES_IE_ID;
1269981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[1] = len;
1270981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryCopy(NULL, (void *)pDot11Rates->rates, ratesBuf, len);
1271981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *ratesLen = pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
1272981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1273981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1274981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1275981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* fill in the supported rates */
1276981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[0] = SUPPORTED_RATES_IE_ID;
1277981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[1] = ofdmIndex;
1278981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryCopy(NULL, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr[1]);
1279981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        suppRatesLen = pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
1280981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* fill in the extended supported rates */
1281981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates = (dot11_RATES_t*)(pRates + suppRatesLen);
1282981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[0] = EXT_SUPPORTED_RATES_IE_ID;
1283981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11Rates->hdr[1] = len - ofdmIndex;
1284981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        os_memoryCopy(NULL, (void *)pDot11Rates->rates, &ratesBuf[ofdmIndex], pDot11Rates->hdr[1]);
1285981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        extSuppRatesLen = pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
1286981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *ratesLen = suppRatesLen + extSuppRatesLen;
1287981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1288981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1289981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TRACE3(pCtx->hReport, REPORT_SEVERITY_INFORMATION, "ASSOC_SM: ASSOC_REQ - bitmapSupp= 0x%X,bitMapBasic = 0x%X, len = %d\n", rateSuppMask,rateBasicMask,len);
1290981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    for(i=0; i<len; i++)
1291981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1292981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        TRACE2(pCtx->hReport, REPORT_SEVERITY_INFORMATION, "ASSOC_SM: ASSOC_REQ - ratesBuf[%d] = 0x%X\n", i, ratesBuf[i]);
1293981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1294981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1295981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1296981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1297981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1298981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_powerCapabilityBuild(assoc_t *pCtx, TI_UINT8 *pPowerCapability, TI_UINT32 *powerCapabilityLen)
1299981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1300981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    paramInfo_t         param;
1301981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS               status;
1302981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    dot11_CAPABILITY_t      *pDot11PowerCapability;
1303981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1304981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11PowerCapability = (dot11_CAPABILITY_t*)pPowerCapability;
1305981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1306981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* set Power Capability element id */
1307981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11PowerCapability->hdr[0] = DOT11_CAPABILITY_ELE_ID;
1308981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pDot11PowerCapability->hdr[1] = DOT11_CAPABILITY_ELE_LEN;
1309981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1310981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* get power capability */
1311981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = REGULATORY_DOMAIN_POWER_CAPABILITY_PARAM;
1312981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  regulatoryDomain_getParam(pCtx->hRegulatoryDomain, &param);
1313981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1314981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1315981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1316981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11PowerCapability->minTxPower = param.content.powerCapability.minTxPower;
1317981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pDot11PowerCapability->maxTxPower = param.content.powerCapability.maxTxPower;
1318981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *powerCapabilityLen = pDot11PowerCapability->hdr[1] + sizeof(dot11_eleHdr_t);
1319981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1320981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1321981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *powerCapabilityLen = 0;
1322981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1323981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1324981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1325981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1326981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_smRequestBuild(assoc_t *pCtx, TI_UINT8* reqBuf, TI_UINT32* reqLen)
1327981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1328981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
1329981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT8        *pRequest;
1330981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT32       len;
1331981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    paramInfo_t     param;
1332981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TTwdParamInfo   tTwdParam;
1333981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_UINT16       capabilities;
1334981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1335981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest = reqBuf;
1336981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen = 0;
1337981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1338981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* insert capabilities */
1339981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smCapBuild(pCtx, &capabilities);
1340981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1341981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1342981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *(TI_UINT16*)pRequest = capabilities;
1343981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1344981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    else
1345981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1346981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1347981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += 2;
1348981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += 2;
1349981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1350981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* insert listen interval */
1351981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    tTwdParam.paramType = TWD_LISTEN_INTERVAL_PARAM_ID;
1352981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status =  TWD_GetParam (pCtx->hTWD, &tTwdParam);
1353981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status == TI_OK)
1354981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1355981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *(TI_UINT16*)pRequest = ENDIAN_HANDLE_WORD((TI_UINT16)tTwdParam.content.halCtrlListenInterval);
1356981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1357981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1358981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1359981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1360981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += 2;
1361981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += 2;
1362981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pCtx->reAssoc)
1363981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {   /* Insert currentAPAddress element only in reassoc request*/
1364981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        param.paramType = SITE_MGR_PREV_SITE_BSSID_PARAM;
1365981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = siteMgr_getParam(pCtx->hSiteMgr, &param);
1366981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (status == TI_OK)
1367981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1368981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            MAC_COPY (pRequest, param.content.siteMgrDesiredBSSID);
1369981801b95b81e6d1c7a2085967406e86af0f08fcDmitry 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]);
1370981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1371981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1372981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pRequest += MAC_ADDR_LEN;
1373981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *reqLen += MAC_ADDR_LEN;
1374981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1375981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        else
1376981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1377981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            TRACE0(pCtx->hReport, REPORT_SEVERITY_ERROR, "ASSOC_SM: ASSOC_REQ - No prev AP \n");
1378981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            return status;
1379981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1380981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1381981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1382981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1383981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* insert SSID element */
1384981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smSSIDBuild(pCtx, pRequest, &len);
1385981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1386981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1387981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1388981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1389981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1390981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1391981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1392981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1393981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* insert Rates element */
1394981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = assoc_smRatesBuild(pCtx, pRequest, &len);
1395981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1396981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1397981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1398981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1399981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1400981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1401981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1402981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Checking if the station supports Spectrum Management (802.11h) */
1403981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = REGULATORY_DOMAIN_MANAGEMENT_CAPABILITY_ENABLED_PARAM;
1404981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = regulatoryDomain_getParam(pCtx->hRegulatoryDomain,&param);
1405981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if( (status == TI_OK) && param.content.spectrumManagementEnabled)
1406981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1407981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        /* Checking the selected AP capablities */
1408981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        param.paramType = SITE_MGR_SITE_CAPABILITY_PARAM;
1409981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status =  siteMgr_getParam(pCtx->hSiteMgr,&param);
1410981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if(status == TI_OK && ((param.content.siteMgrSiteCapability & DOT11_SPECTRUM_MANAGEMENT) != 0))
1411981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1412981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* insert Power capability element */
1413981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            status = assoc_powerCapabilityBuild(pCtx, pRequest, &len);
1414981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if (status != TI_OK)
1415981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            {
1416981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                return TI_NOK;
1417981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            }
1418981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pRequest += len;
1419981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *reqLen += len;
1420981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#if 0
1421981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            /* insert Supported Channels element */
1422981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            status = assoc_supportedChannelBuild(pCtx, pRequest, &len);
1423981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            if (status != TI_OK)
1424981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            {
1425981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt                return TI_NOK;
1426981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            }
1427981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            pRequest += len;
1428981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            *reqLen += len;
1429981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#endif
1430981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1431981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1432981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1433981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1434981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1435981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = qosMngr_getQosCapabiltyInfeElement(pCtx->hQosMngr,pRequest,&len);
1436981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1437981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1438981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1439981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1440981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1441981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1442981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1443981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1444981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#ifdef XCC_MODULE_INCLUDED
1445981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = rsn_getXCCExtendedInfoElement(pCtx->hRsn, pRequest, (TI_UINT8*)&len);
1446981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1447981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1448981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1449981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1450981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1451981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1452981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1453981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (pCtx->reAssoc)
1454981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {   /* insert CCKM information element only in reassoc */
1455981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = XCCMngr_getCckmInfoElement(pCtx->hXCCMngr, pRequest, (TI_UINT8*)&len);
1456981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1457981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        if (status != TI_OK)
1458981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        {
1459981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt            return TI_NOK;
1460981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        }
1461981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        pRequest += len;
1462981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        *reqLen += len;
1463981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1464981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = XCCMngr_getXCCVersionInfoElement(pCtx->hXCCMngr, pRequest, (TI_UINT8*)&len);
1465981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1466981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1467981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1468981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1469981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1470981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1471981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1472981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Insert Radio Mngt Capability IE */
1473981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = measurementMgr_radioMngtCapabilityBuild(pCtx->hMeasurementMgr, pRequest, (TI_UINT8*)&len);
1474981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (status != TI_OK)
1475981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1476981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1477981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1478981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pRequest += len;
1479981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    *reqLen += len;
1480981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#endif
1481981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1482981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* insert RSN information elements */
1483981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = rsn_getInfoElement(pCtx->hRsn, pRequest, &len);
1484981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1485981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (status != TI_OK)
1486981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
1487981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
1488981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
1489981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	pRequest += len;
1490981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	*reqLen += len;
1491981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1492981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1493981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    /* Primary Site support HT ? */
1494981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    param.paramType = SITE_MGR_PRIMARY_SITE_HT_SUPPORT;
1495981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    siteMgr_getParam(pCtx->hSiteMgr, &param);
1496981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1497981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if(TI_TRUE == param.content.bPrimarySiteHtSupport)
1498981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1499981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        status = StaCap_GetHtCapabilitiesIe (pCtx->hStaCap, pRequest, &len);
1500981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    	if (status != TI_OK)
1501981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    	{
1502981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    		return TI_NOK;
1503981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    	}
1504981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    	pRequest += len;
1505981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    	*reqLen += len;
1506981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1507981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1508981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	status = qosMngr_assocReqBuild(pCtx->hQosMngr,pRequest,&len);
1509981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (status != TI_OK)
1510981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
1511981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
1512981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
1513981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	pRequest += len;
1514981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	*reqLen += len;
1515981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1516981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	status = apConn_getVendorSpecificIE(pCtx->hApConn, pRequest, &len);
1517981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (status != TI_OK)
1518981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
1519981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
1520981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
1521981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	pRequest += len;
1522981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	*reqLen += len;
1523981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1524981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (*reqLen>=MAX_ASSOC_MSG_LENGTH)
1525981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1526981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1527981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1528981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1529981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1530981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1531981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1532981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1533981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1534981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_saveAssocRespMessage(assoc_t *pAssocSm, TI_UINT8 *pAssocBuffer, TI_UINT32 length)
1535981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1536981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((pAssocSm==NULL) || (pAssocBuffer==NULL) || (length>=MAX_ASSOC_MSG_LENGTH))
1537981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1538981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1539981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1540981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    os_memoryCopy(pAssocSm->hOs, pAssocSm->assocRespBuffer, pAssocBuffer, length);
1541981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pAssocSm->assocRespLen = length;
1542981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1543981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TRACE1(pAssocSm->hReport, REPORT_SEVERITY_INFORMATION, "assoc_saveAssocRespMessage: length=%ld \n",length);
1544981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1545981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1546981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1547981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_saveAssocReqMessage(assoc_t *pAssocSm, TI_UINT8 *pAssocBuffer, TI_UINT32 length)
1548981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1549981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1550981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if ((pAssocSm==NULL) || (pAssocBuffer==NULL) || (length>=MAX_ASSOC_MSG_LENGTH))
1551981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1552981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        return TI_NOK;
1553981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1554981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1555981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    os_memoryCopy(pAssocSm->hOs, pAssocSm->assocReqBuffer, pAssocBuffer, length);
1556981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    pAssocSm->assocReqLen = length;
1557981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1558981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TRACE1(pAssocSm->hReport, REPORT_SEVERITY_INFORMATION, "assoc_saveAssocReqMessage: length=%ld \n",length);
1559981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return TI_OK;
1560981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1561981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1562981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1563981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS assoc_sendDisAssoc(assoc_t *pAssocSm, mgmtStatus_e reason)
1564981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
1565981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    TI_STATUS       status;
1566981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    disAssoc_t      disAssoc;
1567981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1568981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    if (reason == STATUS_SUCCESSFUL)
1569981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    {
1570981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        disAssoc.reason = ENDIAN_HANDLE_WORD(STATUS_UNSPECIFIED);
1571981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    } else {
1572981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt        disAssoc.reason = ENDIAN_HANDLE_WORD(reason);
1573981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    }
1574981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1575981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    status = mlmeBuilder_sendFrame(pAssocSm->hMlme, DIS_ASSOC, (TI_UINT8*)&disAssoc, sizeof(disAssoc_t), 0);
1576981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1577981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt    return status;
1578981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
1579981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1580981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
1581