1 /*
2 * connInfra.c
3 *
4 * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * * Neither the name Texas Instruments nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 /** \file connInfra.c
35 * \brief Infra connection implementation
36 *
37 * \see connInfra.h
38 */
39
40 /***************************************************************************/
41 /* */
42 /* MODULE: connInfra.c */
43 /* PURPOSE: Infra connection implementation */
44 /* */
45 /***************************************************************************/
46
47 #define __FILE_ID__ FILE_ID_27
48 #include "tidef.h"
49 #include "report.h"
50 #include "osApi.h"
51 #include "conn.h"
52 #include "connInfra.h"
53 #include "timer.h"
54 #include "fsm.h"
55 #include "siteMgrApi.h"
56 #include "sme.h"
57 #include "rsnApi.h"
58 #include "DataCtrl_Api.h"
59 #include "paramOut.h"
60 #include "siteHash.h"
61 #include "smeSm.h"
62 #include "PowerMgr_API.h"
63 #include "measurementMgrApi.h"
64 #include "TrafficMonitorAPI.h"
65 #include "qosMngr_API.h"
66 #include "EvHandler.h"
67 #include "SwitchChannelApi.h"
68 #include "ScanCncn.h"
69 #include "currBss.h"
70 #include "healthMonitor.h"
71 #include "regulatoryDomainApi.h"
72 #include "txCtrl.h"
73 #include "TWDriver.h"
74 #include "SoftGeminiApi.h"
75 #include "RxQueue_api.h"
76
77 #ifdef XCC_MODULE_INCLUDED
78 #include "XCCMngr.h"
79 #include "XCCTSMngr.h"
80 #endif
81
82 #define DISCONNECT_TIMEOUT_MSEC 800
83
84 /* Local functions prototypes */
85
86 static TI_STATUS actionUnexpected(void *pData);
87
88 static TI_STATUS actionNop(void *pData);
89
90 static TI_STATUS connInfra_ScrWait(void *pData);
91
92 static TI_STATUS Idle_to_Idle(void *pData);
93
94 static TI_STATUS ScrWait_to_idle(void *pData);
95
96 static TI_STATUS ScrWait_to_JoinWait(void *pData);
97
98 static TI_STATUS JoinWait_to_mlmeWait(void *pData);
99
100 static TI_STATUS JoinWait_to_WaitDisconnect(void *pData);
101
102 static TI_STATUS mlmeWait_to_WaitDisconnect(void *pData);
103
104 static TI_STATUS mlmeWait_to_rsnWait(void *pData);
105
106 static TI_STATUS rsnWait_to_disconnect(void *pData);
107
108 static TI_STATUS rsnWait_to_configHW(void *pData);
109
110 static TI_STATUS configHW_to_connected(void *pData);
111
112 static TI_STATUS configHW_to_disconnect(void *pData);
113
114 static TI_STATUS connInfra_ScrWaitDisconn_to_disconnect(void *pData);
115
116 static TI_STATUS connect_to_ScrWait(void *pData);
117
118 static TI_STATUS prepare_send_disconnect(void *pData);
119
120 static TI_STATUS connInfra_WaitDisconnectToIdle (void *pData);
121
122
123 static TI_STATUS stopModules( conn_t *pConn, TI_BOOL bDisconnect );
124
125 void InfraConnSM_ScrCB( TI_HANDLE hConn, EScrClientRequestStatus requestStatus,
126 EScrResourceId eResource, EScePendReason pendReason );
127
128 int conn_ConfigHwFinishCb(TI_HANDLE pData);
129
130 /********************************************/
131 /* Functions Implementations */
132 /********************************************/
133
134
135 /***********************************************************************
136 * conn_infraConfig
137 ***********************************************************************
138 DESCRIPTION: Infra Connection configuration function, called by the conection set param function
139 in the selection phase. Configures the connection state machine to Infra connection mode
140
141 INPUT: hConn - Connection handle.
142
143 OUTPUT:
144
145 RETURN: TI_OK on success, TI_NOK otherwise
146
147 ************************************************************************/
conn_infraConfig(conn_t * pConn)148 TI_STATUS conn_infraConfig(conn_t *pConn)
149 {
150 static fsm_actionCell_t smMatrix[CONN_INFRA_NUM_STATES][CONN_INFRA_NUM_EVENTS] =
151 {
152 /* next state and actions for IDLE state */
153 { {STATE_CONN_INFRA_SCR_WAIT_CONN, connInfra_ScrWait}, /* "EVENT_CONNECT" */
154 {STATE_CONN_INFRA_IDLE, actionNop }, /* "EVENT_SCR_SUCC"*/
155 {STATE_CONN_INFRA_IDLE, actionNop }, /* "EVENT_JOIN_CMD_CMPLT */
156 {STATE_CONN_INFRA_IDLE, Idle_to_Idle }, /* "EVENT_DISCONNECT" */
157 {STATE_CONN_INFRA_IDLE, actionUnexpected}, /* "EVENT_MLME_SUCC"*/
158 {STATE_CONN_INFRA_IDLE, actionUnexpected}, /* "EVENT_RSN_SUCC" */
159 {STATE_CONN_INFRA_IDLE, actionNop}, /* "EVENT_CONFIG_HW" */
160 {STATE_CONN_INFRA_IDLE, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */
161 },
162
163 /* next state and actions for SCR_WAIT_CONN state */
164 { {STATE_CONN_INFRA_SCR_WAIT_CONN , actionUnexpected}, /* "EVENT_CONNECT" */
165 {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, ScrWait_to_JoinWait}, /* "EVENT_SCR_SUCC"*/
166 {STATE_CONN_INFRA_SCR_WAIT_CONN , actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT */
167 {STATE_CONN_INFRA_IDLE, ScrWait_to_idle}, /* "EVENT_DISCONNECT" */
168 {STATE_CONN_INFRA_SCR_WAIT_CONN , actionUnexpected}, /* "EVENT_MLME_SUCC"*/
169 {STATE_CONN_INFRA_SCR_WAIT_CONN , actionUnexpected}, /* "EVENT_RSN_SUCC" */
170 {STATE_CONN_INFRA_SCR_WAIT_CONN , actionNop}, /* "EVENT_CONFIG_HW "*/
171 {STATE_CONN_INFRA_SCR_WAIT_CONN , actionNop} /* "EVENT_DISCONN_COMPLETE" */
172 },
173
174 /* next state and actions for WAIT_JOIN_CMPLT */
175 { {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected}, /* "EVENT_CONNECT" */
176 {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected}, /* "EVENT_SCR_SUCC"*/
177 {STATE_CONN_INFRA_MLME_WAIT, JoinWait_to_mlmeWait}, /* "EVENT_JOIN_CMD_CMPLT" */
178 {STATE_CONN_INFRA_WAIT_DISCONNECT, JoinWait_to_WaitDisconnect},/* "EVENT_DISCONNECT" */
179 {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected}, /* "EVENT_MLME_SUCC"*/
180 {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected}, /* "EVENT_RSN_SUCC" */
181 {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionNop}, /* "EVENT_CONFIG_HW" */
182 {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */
183
184 },
185
186 /* next state and actions for MLME_WAIT state */
187 { {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}, /* "EVENT_CONNECT" */
188 {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}, /* "EVENT_SCR_SUCC" */
189 {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT"*/
190 {STATE_CONN_INFRA_WAIT_DISCONNECT, mlmeWait_to_WaitDisconnect}, /* "EVENT_DISCONNECT" */
191 {STATE_CONN_INFRA_RSN_WAIT, mlmeWait_to_rsnWait}, /* "EVENT_MLME_SUCC"*/
192 {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}, /* "EVENT_RSN_SUCC" */
193 {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}, /* "EVENT_CONFIG_HW" */
194 {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */
195 },
196
197 /* next state and actions for RSN_WAIT state */
198 { {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected}, /* "EVENT_CONNECT" */
199 {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected}, /* "EVENT_SCR_SUCC" */
200 {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT"*/
201 {STATE_CONN_INFRA_WAIT_DISCONNECT, rsnWait_to_disconnect}, /* "EVENT_DISCONNECT" */
202 {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected}, /* "EVENT_MLME_SUCC"*/
203 {STATE_CONN_INFRA_CONFIG_HW, rsnWait_to_configHW}, /* "EVENT_RSN_SUCC" */
204 {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected}, /* "EVENT_CONFIG_HW" */
205 {STATE_CONN_INFRA_RSN_WAIT, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */
206 },
207
208 /* next state and actions for CONFIG_HW state */
209 { {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}, /* "EVENT_CONNECT" */
210 {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}, /* "EVENT_SCR_SUCC" */
211 {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT"*/
212 {STATE_CONN_INFRA_WAIT_DISCONNECT, configHW_to_disconnect}, /* "EVENT_DISCONNECT" */
213 {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}, /* "EVENT_MLME_SUCC"*/
214 {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}, /* "EVENT_RSN_SUCC" */
215 {STATE_CONN_INFRA_CONNECTED, configHW_to_connected}, /* "EVENT_CONFIG_HW" */
216 {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */
217 },
218
219 /* next state and actions for CONNECTED state */
220 { {STATE_CONN_INFRA_SCR_WAIT_CONN, connect_to_ScrWait}, /* "EVENT_CONNECT" */
221 {STATE_CONN_INFRA_CONNECTED, actionUnexpected}, /* "EVENT_SCR_SUCC"*/
222 {STATE_CONN_INFRA_CONNECTED, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT" */
223 {STATE_CONN_INFRA_SCR_WAIT_DISCONN, connInfra_ScrWait}, /* "EVENT_DISCONNECT" */
224 {STATE_CONN_INFRA_CONNECTED, actionUnexpected}, /* "EVENT_MLME_SUCC"*/
225 {STATE_CONN_INFRA_CONNECTED, actionUnexpected}, /* "EVENT_RSN_SUCC" */
226 {STATE_CONN_INFRA_CONNECTED, actionUnexpected}, /* "STATE_CONN_INFRA_CONFIG_HW" */
227 {STATE_CONN_INFRA_CONNECTED, actionUnexpected} /* "EVENT_DISCONN_COMPLETE" */
228 },
229
230 /* next state and actions for SCR_WAIT_DISCONN state */
231 { {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected}, /* "EVENT_CONNECT" */
232 {STATE_CONN_INFRA_WAIT_DISCONNECT , connInfra_ScrWaitDisconn_to_disconnect}, /* "EVENT_SCR_SUCC"*/
233 {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT */
234 {STATE_CONN_INFRA_SCR_WAIT_DISCONN, ScrWait_to_idle}, /* "EVENT_DISCONNECT" */
235 {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected}, /* "EVENT_MLME_SUCC"*/
236 {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected}, /* "EVENT_RSN_SUCC" */
237 {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionNop}, /* "EVENT_CONFIG_HW "*/
238 {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionNop} /* "EVENT_DISCONN_COMPLETE" */
239 },
240
241 /* next state and actions for STATE_CONN_INFRA_WAIT_DISCONNECT state */
242 { {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "EVENT_CONNECT" */
243 {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "STATE_CONN_INFRA_SCR_WAIT_CONN"*/
244 {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "EVENT_JOIN_CMD_CMPLT" */
245 {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "EVENT_DISCONNECT" */
246 {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "EVENT_MLME_SUCC"*/
247 {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "EVENT_RSN_SUCC" */
248 {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected}, /* "STATE_CONN_INFRA_CONFIG_HW" */
249 {STATE_CONN_INFRA_IDLE , connInfra_WaitDisconnectToIdle} /* "EVENT_DISCONN_COMPLETE" */
250 }
251
252 };
253
254 scr_registerClientCB( pConn->hScr, SCR_CID_CONNECT, InfraConnSM_ScrCB, pConn );
255
256 return fsm_Config(pConn->infra_pFsm, (fsm_Matrix_t)smMatrix, CONN_INFRA_NUM_STATES, CONN_INFRA_NUM_EVENTS, conn_infraSMEvent, pConn->hOs);
257 }
258
259 /***********************************************************************
260 * conn_infraSMEvent
261 ***********************************************************************
262 DESCRIPTION: Infra Connection SM event processing function, called by the connection API
263 Perform the following:
264 - Print the state movement as a result from the event
265 - Calls the generic state machine event processing function which preform the following:
266 - Calls the correspoding callback function
267 - Move to next state
268
269 INPUT: currentState - Pointer to the connection current state.
270 event - Received event
271 pConn - Connection handle
272
273 OUTPUT:
274
275 RETURN: TI_OK on success, TI_NOK otherwise
276
277 ************************************************************************/
conn_infraSMEvent(TI_UINT8 * currentState,TI_UINT8 event,TI_HANDLE hConn)278 TI_STATUS conn_infraSMEvent(TI_UINT8 *currentState, TI_UINT8 event, TI_HANDLE hConn)
279 {
280 conn_t *pConn = (conn_t *)hConn;
281 TI_STATUS status;
282 TI_UINT8 nextState;
283
284 status = fsm_GetNextState(pConn->infra_pFsm, *currentState, event, &nextState);
285 if (status != TI_OK)
286 {
287 TRACE0(pConn->hReport, REPORT_SEVERITY_SM, "State machine error, failed getting next state\n");
288 return(TI_NOK);
289 }
290
291 TRACE3( pConn->hReport, REPORT_SEVERITY_INFORMATION, "conn_infraSMEvent: <currentState = %d, event = %d> --> nextState = %d\n", *currentState, event, nextState);
292
293 status = fsm_Event(pConn->infra_pFsm, currentState, event, (void *)pConn);
294
295 return status;
296 }
297
298 /************************************************************************************************************/
299 /* In the following section are listed the callback function used by the Infra connection state machine */
300 /************************************************************************************************************/
301
302 /* JOIN, SET_DATA_PORT_NOTIFY, START_MLME */
ScrWait_to_JoinWait(void * pData)303 static TI_STATUS ScrWait_to_JoinWait(void *pData)
304 {
305 TI_STATUS status;
306 conn_t *pConn = (conn_t *)pData;
307
308 status = siteMgr_join(((conn_t *)pData)->hSiteMgr );
309 /* If the Join command was failed we report the SME that connection failure so it could exit connecting state */
310 if (status != TI_OK)
311 {
312 TRACE0(pConn->hReport, REPORT_SEVERITY_ERROR, "Join command has failed!\n");
313 }
314 return status;
315 }
316
317
JoinWait_to_mlmeWait(void * pData)318 static TI_STATUS JoinWait_to_mlmeWait(void *pData)
319 {
320 TI_STATUS status;
321 paramInfo_t *pParam;
322 conn_t *pConn = (conn_t *)pData;
323
324 pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
325 if (!pParam)
326 {
327 return TI_NOK;
328 }
329
330 /* Set the BA session policies to the FW */
331 qosMngr_SetBaPolicies(pConn->hQosMngr);
332
333 pParam->paramType = SITE_MGR_CURRENT_CHANNEL_PARAM;
334 siteMgr_getParam(pConn->hSiteMgr, pParam);
335
336 pParam->paramType = REGULATORY_DOMAIN_TX_POWER_AFTER_SELECTION_PARAM;
337 pParam->content.channel = pParam->content.siteMgrCurrentChannel;
338 regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam);
339
340 pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
341 pParam->content.rxDataPortStatus = OPEN_NOTIFY;
342 status = rxData_setParam(pConn->hRxData, pParam);
343 if (status != TI_OK)
344 {
345 TRACE1( pConn->hReport, REPORT_SEVERITY_FATAL_ERROR, "JoinWait_to_mlmeWait: rxData_setParam return 0x%x.\n", status);
346 os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
347 return status;
348 }
349
350 /* Update TxMgmtQueue SM to open Tx path only for Mgmt packets. */
351 txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_MGMT);
352
353 /*
354 * Set the reassociation flag in the association logic.
355 */
356 pParam->paramType = MLME_RE_ASSOC_PARAM;
357
358 if( pConn->connType == CONN_TYPE_ROAM )
359 pParam->content.mlmeReAssoc = TI_TRUE;
360 else
361 pParam->content.mlmeReAssoc = TI_FALSE;
362
363 status = mlme_setParam(pConn->hMlmeSm, pParam);
364
365 if (status != TI_OK)
366 {
367 TRACE1( pConn->hReport, REPORT_SEVERITY_FATAL_ERROR, "JoinWait_to_mlmeWait: mlme_setParam return 0x%x.\n", status);
368 }
369 os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
370 return mlme_start(pConn->hMlmeSm);
371 }
372
373
374 /* STOP_MLME, SET_DATA_PORT_CLOSE, DIS_JOIN */
mlmeWait_to_WaitDisconnect(void * pData)375 static TI_STATUS mlmeWait_to_WaitDisconnect(void *pData)
376 {
377 TI_STATUS status;
378 paramInfo_t *pParam;
379 conn_t *pConn = (conn_t *)pData;
380
381 status = mlme_stop( pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP );
382 if (status != TI_OK)
383 return status;
384
385 pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
386 if (!pParam)
387 {
388 return TI_NOK;
389 }
390
391 pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
392 pParam->content.rxDataPortStatus = CLOSE;
393 rxData_setParam(pConn->hRxData, pParam);
394
395 /* Update TxMgmtQueue SM to close Tx path. */
396 txMgmtQ_SetConnState (pConn->hTxMgmtQ, TX_CONN_STATE_CLOSE);
397
398 /* Start the disconnect complete time out timer.
399 Disconect Complete event, which stops the timer. */
400 tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC, TI_FALSE);
401
402 /* FW will send the disconn frame according to disConnType */
403 TWD_CmdFwDisconnect (pConn->hTWD, pConn->disConnType, pConn->disConnReasonToAP);
404
405 #ifdef XCC_MODULE_INCLUDED
406 XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_DISASSOC);
407 #endif
408 os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
409 return TI_OK;
410 }
411
412 /* This function is called from the WAIT_FOR_JOIN_CB_CMPLT state (before mlme_start)
413 - all we need to do is call siteMgr_disJoin */
JoinWait_to_WaitDisconnect(void * pData)414 static TI_STATUS JoinWait_to_WaitDisconnect(void *pData)
415 {
416 conn_t *pConn = (conn_t *)pData;
417
418 /* Start the disconnect complete time out timer.
419 Disconect Complete event, which stops the timer. */
420 tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC, TI_FALSE);
421
422 /* FW will send the disconn frame according to disConnType */
423 TWD_CmdFwDisconnect (pConn->hTWD, pConn->disConnType, pConn->disConnReasonToAP);
424
425 return TI_OK;
426 }
427
428 /* SET_DATA_PORT_EAPOL, START_RSN */
mlmeWait_to_rsnWait(void * pData)429 static TI_STATUS mlmeWait_to_rsnWait(void *pData)
430 {
431 TI_STATUS status;
432 paramInfo_t *pParam;
433 conn_t *pConn = (conn_t *)pData;
434
435 pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
436 if (!pParam)
437 {
438 return TI_NOK;
439 }
440
441 pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
442 pParam->content.rxDataPortStatus = OPEN_EAPOL;
443 status = rxData_setParam(pConn->hRxData, pParam);
444 os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
445 if (status != TI_OK)
446 return status;
447 /* Update TxMgmtQueue SM to enable EAPOL packets. */
448 txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_EAPOL);
449
450 /*
451 * Notify that the driver is associated to the supplicant\IP stack.
452 */
453 EvHandlerSendEvent(pConn->hEvHandler, IPC_EVENT_ASSOCIATED, NULL,0);
454 status = rsn_start(pConn->hRsn);
455 return status;
456 }
457
458
459
460 /* STOP_RSN, SET_DATA_PORT_CLOSE, STOP_MLME, DIS_JOIN */
rsnWait_to_disconnect(void * pData)461 static TI_STATUS rsnWait_to_disconnect(void *pData)
462 {
463 TI_STATUS status;
464 paramInfo_t *pParam;
465 conn_t *pConn = (conn_t *)pData;
466
467 status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys);
468 if (status != TI_OK)
469 return status;
470
471 pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
472 if (!pParam)
473 {
474 return TI_NOK;
475 }
476
477 pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
478 pParam->content.rxDataPortStatus = CLOSE;
479 status = rxData_setParam(pConn->hRxData, pParam);
480 os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
481 if (status != TI_OK)
482 return status;
483
484 /* Update TxMgmtQueue SM to close Tx path for all except Mgmt packets. */
485 txMgmtQ_SetConnState (pConn->hTxMgmtQ, TX_CONN_STATE_MGMT);
486
487 status = mlme_stop( pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP );
488
489 if (status != TI_OK)
490 return status;
491
492 /* send disconnect command to firmware */
493 prepare_send_disconnect(pData);
494
495 return TI_OK;
496 }
497
498
499 /* STOP_RSN, SET_DATA_PORT_CLOSE, STOP_MLME, DIS_JOIN */
configHW_to_disconnect(void * pData)500 static TI_STATUS configHW_to_disconnect(void *pData)
501 {
502 TI_STATUS status;
503 paramInfo_t *pParam;
504 conn_t *pConn = (conn_t *)pData;
505
506 status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys );
507 if (status != TI_OK)
508 return status;
509
510 pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
511 if (!pParam)
512 {
513 return TI_NOK;
514 }
515
516 pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
517 pParam->content.rxDataPortStatus = CLOSE;
518 status = rxData_setParam(pConn->hRxData, pParam);
519 if (status == TI_OK)
520 {
521 /* Update TxMgmtQueue SM to close Tx path for all except Mgmt packets. */
522 txMgmtQ_SetConnState (pConn->hTxMgmtQ, TX_CONN_STATE_MGMT);
523
524 status = mlme_stop( pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP );
525 if (status == TI_OK)
526 {
527 pParam->paramType = REGULATORY_DOMAIN_DISCONNECT_PARAM;
528 regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam);
529
530 /* Must be called AFTER mlme_stop. since De-Auth packet should be sent with the
531 supported rates, and stopModules clears all rates. */
532 stopModules(pConn, TI_TRUE);
533
534 /* send disconnect command to firmware */
535 prepare_send_disconnect(pData);
536 }
537 }
538 os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
539 return status;
540 }
541
connInfra_ScrWaitDisconn_to_disconnect(void * pData)542 static TI_STATUS connInfra_ScrWaitDisconn_to_disconnect(void *pData)
543 {
544 TI_STATUS status;
545 paramInfo_t *pParam;
546 conn_t *pConn = (conn_t *)pData;
547
548 status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys);
549 if (status != TI_OK)
550 return status;
551
552 pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
553 if (!pParam)
554 {
555 return TI_NOK;
556 }
557
558 pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
559 pParam->content.rxDataPortStatus = CLOSE;
560 status = rxData_setParam(pConn->hRxData, pParam);
561 if (status == TI_OK)
562 {
563 /* Update TxMgmtQueue SM to close Tx path for all except Mgmt packets. */
564 txMgmtQ_SetConnState(pConn->hTxMgmtQ, TX_CONN_STATE_MGMT);
565
566 pParam->paramType = REGULATORY_DOMAIN_DISCONNECT_PARAM;
567 regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam);
568
569 status = mlme_stop(pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP);
570 if (status == TI_OK)
571 {
572 /* Must be called AFTER mlme_stop. since De-Auth packet should be sent with the
573 supported rates, and stopModules clears all rates. */
574 stopModules(pConn, TI_TRUE);
575
576 /* send disconnect command to firmware */
577 prepare_send_disconnect(pData);
578 }
579 }
580 os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
581 return status;
582
583 }
584
585
rsnWait_to_configHW(void * pData)586 static TI_STATUS rsnWait_to_configHW(void *pData)
587 {
588 conn_t *pConn=(conn_t *)pData;
589 TI_STATUS status;
590 paramInfo_t *pParam;
591
592 pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
593 if (!pParam)
594 {
595 return TI_NOK;
596 }
597
598 /* Open the RX to DATA */
599 pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
600 pParam->content.rxDataPortStatus = OPEN;
601 status = rxData_setParam(pConn->hRxData, pParam);
602 os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
603 if (status != TI_OK)
604 return status;
605
606 status = qosMngr_connect(pConn->hQosMngr);
607 if (status != TI_OK)
608 {
609 TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR, "Infra Conn status=%d, have to return (%d)\n",status,__LINE__);
610 return status;
611 }
612
613 status = measurementMgr_connected(pConn->hMeasurementMgr);
614 if (status != TI_OK)
615 {
616 TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR, "Infra Conn status=%d, have to return (%d)\n",status,__LINE__);
617 return status;
618 }
619
620 status = TrafficMonitor_Start(pConn->hTrafficMonitor);
621 if (status != TI_OK)
622 {
623 TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR, "Infra Conn status=%d, have to return (%d)\n",status,__LINE__);
624 return status;
625 }
626
627 healthMonitor_setState(pConn->hHealthMonitor, HEALTH_MONITOR_STATE_CONNECTED);
628
629 switchChannel_start(pConn->hSwitchChannel);
630
631 scanCncn_SwitchToConnected (pConn->hScanCncn);
632
633 PowerMgr_startPS(pConn->hPwrMngr);
634
635 TRACE1(pConn->hReport, REPORT_SEVERITY_INFORMATION, "rsnWait_to_configHW: setStaStatus %d\n",STA_STATE_CONNECTED);
636 TWD_CmdSetStaState(pConn->hTWD, STA_STATE_CONNECTED, (void *)conn_ConfigHwFinishCb, pData);
637
638 return TI_OK;
639 }
640
641 /* last command of rsnWait_to_configHW callback */
conn_ConfigHwFinishCb(TI_HANDLE pData)642 int conn_ConfigHwFinishCb(TI_HANDLE pData)
643 {
644 conn_t *pConn = (conn_t *)pData;
645
646 TRACE0(pConn->hReport, REPORT_SEVERITY_INFORMATION, "conn_MboxFlushFinishCb: called \n");
647 return conn_infraSMEvent(&pConn->state, CONN_INFRA_HW_CONFIGURED, pConn);
648 }
649
configHW_to_connected(void * pData)650 static TI_STATUS configHW_to_connected(void *pData)
651 {
652 conn_t *pConn=(conn_t *)pData;
653 EScrResourceId uResourceIndex;
654
655 /* Update TxMgmtQueue SM to open Tx path to all packets. */
656 txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_OPEN);
657
658 #ifdef XCC_MODULE_INCLUDED
659 XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_ASSOC_OK);
660 #endif
661
662 /* Start keep alive process */
663 siteMgr_start(pConn->hSiteMgr);
664
665 /* free both SCR resources */
666 for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL;
667 uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES;
668 uResourceIndex++)
669 {
670 scr_clientComplete(pConn->hScr, SCR_CID_CONNECT, uResourceIndex );
671 pConn->scrRequested[ uResourceIndex ] = TI_FALSE;
672 }
673
674 /* Update current BSS connection type and mode */
675 currBSS_updateConnectedState(pConn->hCurrBss, TI_TRUE, BSS_INFRASTRUCTURE);
676
677 pConn->pConnStatusCB( pConn->connStatCbObj, STATUS_SUCCESSFUL, 0);
678
679 SoftGemini_SetPSmode(pConn->hSoftGemini);
680 #ifdef REPORT_LOG
681 TRACE0(pConn->hReport, REPORT_SEVERITY_CONSOLE, "************ NEW CONNECTION ************\n");
682 WLAN_OS_REPORT(("************ NEW CONNECTION ************\n"));
683 siteMgr_printPrimarySiteDesc(pConn->hSiteMgr);
684 TRACE0(pConn->hReport, REPORT_SEVERITY_CONSOLE, "****************************************\n");
685 WLAN_OS_REPORT(("****************************************\n"));
686 #else
687 os_printf("%s: *** NEW CONNECTION ***\n", __func__);
688 #endif
689
690 return TI_OK;
691 }
692
693
actionUnexpected(void * pData)694 static TI_STATUS actionUnexpected(void *pData)
695 {
696 #ifdef TI_DBG
697 conn_t *pConn = (conn_t *)pData;
698
699 TRACE0(pConn->hReport, REPORT_SEVERITY_SM, "State machine error, unexpected Event\n\n");
700 #endif /*TI_DBG*/
701
702 return TI_OK;
703 }
704
actionNop(void * pData)705 static TI_STATUS actionNop(void *pData)
706 {
707 return TI_OK;
708 }
709
710
connInfra_ScrWait(void * pData)711 static TI_STATUS connInfra_ScrWait(void *pData)
712 {
713 conn_t *pConn = (conn_t *)pData;
714 EScrClientRequestStatus scrReplyStatus[ SCR_RESOURCE_NUM_OF_RESOURCES ];
715 EScePendReason scrPendReason[ SCR_RESOURCE_NUM_OF_RESOURCES ];
716 EScrResourceId uResourceIndex;
717
718 TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Connnect SM: Requesting SCR.\n");
719
720 /* request the SCR for both resources, and act according to return status */
721 for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL;
722 uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES;
723 uResourceIndex++)
724 {
725 scrReplyStatus[ uResourceIndex ] = scr_clientRequest( pConn->hScr, SCR_CID_CONNECT,
726 uResourceIndex,
727 &(scrPendReason[ uResourceIndex ]));
728 pConn->scrRequested[ uResourceIndex ] = TI_TRUE;
729
730 /* sanity check */
731 if ((scrReplyStatus[ uResourceIndex ] > SCR_CRS_PEND) ||
732 (scrReplyStatus[ uResourceIndex ] < SCR_CRS_RUN))
733 {
734 TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR , "Idle_to_ScrWait: SCR for resource %d returned status %d\n", uResourceIndex, scrReplyStatus[ uResourceIndex ]);
735 return TI_NOK;
736 }
737 }
738
739 /* analyze SCR results: */
740 /* both returned run - continue to next stage */
741 if ((SCR_CRS_RUN == scrReplyStatus[ SCR_RESOURCE_SERVING_CHANNEL ]) &&
742 (SCR_CRS_RUN == scrReplyStatus[ SCR_RESOURCE_PERIODIC_SCAN ]))
743 {
744 /* send an SCR SUCCESS event to the SM */
745 TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: SCR acquired.\n");
746 conn_infraSMEvent(&pConn->state, CONN_INFRA_SCR_SUCC, (TI_HANDLE) pConn);
747 }
748 else
749 {
750 /* mark which resource is pending (or both) */
751 for (uResourceIndex = SCR_RESOURCE_PERIODIC_SCAN;
752 uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES;
753 uResourceIndex++)
754 {
755 if (SCR_CRS_PEND == scrReplyStatus[ uResourceIndex ])
756 {
757 TRACE2( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: SCR pending for resource %d with pend reason: %d, stay in wait SCR state.\n", uResourceIndex, scrPendReason);
758 pConn->bScrAcquired[ uResourceIndex ] = TI_FALSE;
759 }
760 else
761 {
762 pConn->bScrAcquired[ uResourceIndex ] = TI_TRUE;
763 }
764 }
765 }
766 return TI_OK;
767 }
768
769
770
InfraConnSM_ScrCB(TI_HANDLE hConn,EScrClientRequestStatus requestStatus,EScrResourceId eResource,EScePendReason pendReason)771 void InfraConnSM_ScrCB( TI_HANDLE hConn, EScrClientRequestStatus requestStatus,
772 EScrResourceId eResource, EScePendReason pendReason )
773 {
774 conn_t *pConn = (conn_t *)hConn;
775
776 TRACE2( pConn->hReport, REPORT_SEVERITY_INFORMATION, "InfraConnSM_ScrCB called by SCR for resource %d. Status is: %d.\n", eResource, requestStatus);
777
778 /* act according to the request staus */
779 switch ( requestStatus )
780 {
781 case SCR_CRS_RUN:
782 TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: SCR acquired.\n");
783 /* mark that the SCR was acquired for this resource */
784 pConn->bScrAcquired[ eResource ] = TI_TRUE;
785
786 /* if both resources had now been acquired */
787 if ((TI_TRUE == pConn->bScrAcquired[ SCR_RESOURCE_SERVING_CHANNEL ]) &&
788 (TI_TRUE == pConn->bScrAcquired[ SCR_RESOURCE_PERIODIC_SCAN ]))
789 {
790 /* send an SCR SUCCESS event to the SM */
791 conn_infraSMEvent(&pConn->state, CONN_INFRA_SCR_SUCC, (TI_HANDLE) pConn);
792 }
793 break;
794
795 case SCR_CRS_FW_RESET:
796 /* Ignore FW reset, the MLME SM will handle re-try of the conn */
797 TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: Recovery occured.\n");
798 break;
799
800 default:
801 TRACE3( pConn->hReport, REPORT_SEVERITY_ERROR, "Illegal SCR request status:%d, pend reason:%d, resource: %d.\n", requestStatus, pendReason, eResource);
802 break;
803 }
804 }
805
806
807
ScrWait_to_idle(void * pData)808 static TI_STATUS ScrWait_to_idle(void *pData)
809 {
810 conn_t *pConn = (conn_t *)pData;
811 EScrResourceId uResourceIndex;
812
813 TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Connnect SM: Stop event while in SCR wait, moving to IDLE.\n");
814
815 /* free both SCR resources */
816 for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL;
817 uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES;
818 uResourceIndex++)
819 {
820 scr_clientComplete(pConn->hScr, SCR_CID_CONNECT, uResourceIndex );
821 pConn->scrRequested[ uResourceIndex ] = TI_FALSE;
822 }
823
824 /*
825 * Call the connection lost callback set by the SME or AP_CONN.
826 */
827 pConn->pConnStatusCB( pConn->connStatCbObj, pConn->smContext.disAssocEventReason, pConn->smContext.disAssocEventStatusCode);
828
829 return TI_OK;
830 }
831
832
stopModules(conn_t * pConn,TI_BOOL bDisconnect)833 static TI_STATUS stopModules( conn_t *pConn, TI_BOOL bDisconnect )
834 {
835
836 measurementMgr_disconnected(pConn->hMeasurementMgr);
837
838 rxData_stop(pConn->hRxData);
839
840 ctrlData_stop(pConn->hCtrlData);
841
842 TrafficMonitor_Stop(pConn->hTrafficMonitor);
843
844 switchChannel_stop(pConn->hSwitchChannel);
845
846 healthMonitor_setState(pConn->hHealthMonitor, HEALTH_MONITOR_STATE_DISCONNECTED);
847
848 siteMgr_stop(pConn->hSiteMgr);
849
850 /* stopping power save */
851 PowerMgr_stopPS(pConn->hPwrMngr, bDisconnect);
852
853 scanCncn_SwitchToNotConnected (pConn->hScanCncn);
854
855 /* Set Current BSS Module to stop triggerring roaming events */
856 currBSS_updateConnectedState(pConn->hCurrBss, TI_FALSE, BSS_INFRASTRUCTURE);
857
858 SoftGemini_unSetPSmode(pConn->hSoftGemini);
859
860 return TI_OK;
861 }
862
863
prepare_send_disconnect(void * pData)864 static TI_STATUS prepare_send_disconnect(void *pData)
865 {
866 conn_t *pConn = (conn_t *)pData;
867
868 txCtrlParams_setEapolEncryptionStatus(pConn->hTxCtrl, DEF_EAPOL_ENCRYPTION_STATUS);
869 qosMngr_disconnect (pConn->hQosMngr, TI_TRUE);
870
871 #ifdef XCC_MODULE_INCLUDED
872 measurementMgr_disableTsMetrics(pConn->hMeasurementMgr, MAX_NUM_OF_AC);
873 #endif
874
875 /* Start the disconnect complete time out timer.
876 Disconect Complete event, which stops the timer. */
877 tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC, TI_FALSE);
878
879 /* FW will send the disconn frame according to disConnType */
880 TWD_CmdFwDisconnect (pConn->hTWD, pConn->disConnType, pConn->disConnReasonToAP);
881
882 #ifdef XCC_MODULE_INCLUDED
883 XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_DISASSOC);
884 #endif
885
886 return TI_OK;
887 }
888
connInfra_WaitDisconnectToIdle(void * pData)889 static TI_STATUS connInfra_WaitDisconnectToIdle(void *pData)
890 {
891 conn_t *pConn = (conn_t *)pData;
892 EScrResourceId uResourceIndex;
893
894 /* close all BA sessions */
895 TWD_CloseAllBaSessions(pConn->hTWD);
896
897 /* Stop the disconnect timeout timer. */
898 tmr_StopTimer (pConn->hConnTimer);
899
900 /*
901 * In case of connection failuer we might get here without freeing the SCR.
902 */
903 for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL;
904 uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES;
905 uResourceIndex++)
906 {
907 if (pConn->scrRequested[ uResourceIndex ] == TI_TRUE)
908 {
909 scr_clientComplete(pConn->hScr, SCR_CID_CONNECT, uResourceIndex );
910 pConn->scrRequested[ uResourceIndex ] = TI_FALSE;
911 }
912 }
913
914 /*
915 * Call the connection lost callback set by the SME or AP_CONN.
916 */
917 pConn->pConnStatusCB( pConn->connStatCbObj, pConn->smContext.disAssocEventReason, pConn->smContext.disAssocEventStatusCode);
918
919 return TI_OK;
920 }
921
connect_to_ScrWait(void * pData)922 static TI_STATUS connect_to_ScrWait(void *pData)
923 {
924 TI_STATUS status;
925 paramInfo_t *pParam;
926 conn_t *pConn = (conn_t *)pData;
927
928 /*
929 * This function performs roaming by two steps:
930 * First - close the current connection without notify the SME.
931 * Second - start new connection in reassociation mode.
932 */
933
934 /* close all BA sessions */
935 TWD_CloseAllBaSessions(pConn->hTWD);
936
937 status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys);
938 if (status != TI_OK)
939 return status;
940
941 pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
942 if (!pParam)
943 {
944 return TI_NOK;
945 }
946
947 pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
948 pParam->content.rxDataPortStatus = CLOSE;
949 status = rxData_setParam(pConn->hRxData, pParam);
950 if (status == TI_OK)
951 {
952 /* Update TxMgmtQueue SM to close Tx path. */
953 txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_CLOSE);
954
955 status = mlme_stop(pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP);
956 if (status == TI_OK)
957 {
958 pParam->paramType = REGULATORY_DOMAIN_DISCONNECT_PARAM;
959 regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam);
960
961 #ifdef XCC_MODULE_INCLUDED
962 XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_DISASSOC);
963 #endif
964 /* Must be called AFTER mlme_stop. since De-Auth packet should be sent with the
965 supported rates, and stopModules clears all rates. */
966 stopModules(pConn, TI_FALSE);
967
968 txCtrlParams_setEapolEncryptionStatus(pConn->hTxCtrl, DEF_EAPOL_ENCRYPTION_STATUS);
969 qosMngr_disconnect (pConn->hQosMngr, TI_FALSE);
970
971 /*
972 * Start new connection.
973 */
974 connInfra_ScrWait(pConn);
975 }
976 }
977
978 os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
979 return status;
980 }
981
Idle_to_Idle(void * pData)982 static TI_STATUS Idle_to_Idle(void *pData)
983 {
984 conn_t *pConn = (conn_t *)pData;
985
986 /*
987 * In case we are in IDLE and getting DISCONNECT event, we need to inform
988 * the SME\AP_connection that we are disconnected.
989 * Call the connection lost callback set by the SME or AP_CONN.
990 */
991 pConn->pConnStatusCB( pConn->connStatCbObj, pConn->smContext.disAssocEventReason, pConn->smContext.disAssocEventStatusCode);
992
993 return TI_OK;
994 }
995
996 /***********************************************************************
997 connInfra_JoinCmpltNotification
998 ***********************************************************************
999 DESCRIPTION: Call back upon receving Join Event Complete.
1000
1001 INPUT: hSiteMgr - site mgr handle.
1002
1003 OUTPUT:
1004
1005 RETURN:
1006 ************************************************************************/
connInfra_JoinCmpltNotification(TI_HANDLE hconn)1007 TI_STATUS connInfra_JoinCmpltNotification(TI_HANDLE hconn)
1008 {
1009 conn_t *pConn = (conn_t *)hconn;
1010
1011 TRACE0(pConn->hReport, REPORT_SEVERITY_INFORMATION, "connInfra_JoinCmpltNotification: has been called\n");
1012
1013 if (pConn->currentConnType == CONNECTION_INFRA ) {
1014 conn_infraSMEvent(&pConn->state, CONN_INFRA_JOIN_CMD_CMPLT, pConn);
1015 }
1016
1017 return TI_OK;
1018 }
1019
connInfra_DisconnectComplete(conn_t * pConn,TI_UINT8 * data,TI_UINT8 dataLength)1020 void connInfra_DisconnectComplete (conn_t *pConn, TI_UINT8 *data, TI_UINT8 dataLength)
1021 {
1022 /* send an DISCONNECT COMPLETE event to the SM */
1023 conn_infraSMEvent(&pConn->state, CONN_INFRA_DISCONN_COMPLETE, (TI_HANDLE) pConn);
1024 }
1025