diff options
Diffstat (limited to 'wilink_6_1/stad/src/Application/roamingMngr_manualSM.c')
-rw-r--r-- | wilink_6_1/stad/src/Application/roamingMngr_manualSM.c | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/wilink_6_1/stad/src/Application/roamingMngr_manualSM.c b/wilink_6_1/stad/src/Application/roamingMngr_manualSM.c new file mode 100644 index 0000000..ca2c516 --- /dev/null +++ b/wilink_6_1/stad/src/Application/roamingMngr_manualSM.c @@ -0,0 +1,266 @@ +/* + * roamingMngr_manualSM.c + * + * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name Texas Instruments nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** \file roamingMngr_manualSM.c + * \brief Roaming Manager + * + * \see roamingMngr_manualSM.h + */ + +/**************************************************************************** + * * + * MODULE: Roaming Manager * + * PURPOSE: * + * Roaming manager is responsible to receive Roaming triggers and try + * to select a better AP. + * The Roaming triggers are: Low RSSI, PER, consecutive No ACK on TX, + * beacon Missed or External request. + * In each Internal Roaming request, scan is performed and selection for + * better AP. Better AP is defined as a different AP with better RSSI, + * and similar SSID and security settings. + * If better AP is found, there is a check for fast-roaming via the + * Supplicant. Then connection to the new AP is invoked. + * * + ****************************************************************************/ + +#define __FILE_ID__ FILE_ID_136 +#include "osApi.h" +#include "paramOut.h" +#include "report.h" +#include "scanMngrApi.h" +#include "roamingMngrApi.h" +#include "roamingMngrTypes.h" +#include "bssTypes.h" +#include "DrvMainModules.h" +#include "TWDriver.h" +#include "siteMgrApi.h" +#include "GenSM.h" +#include "apConnApi.h" +#include "roamingMngr_manualSM.h" +#include "EvHandler.h" +#include "public_types.h" + + +typedef enum +{ + REASSOC_RESP_SUCCESS =0, + REASSOC_RESP_FAILURE, + REASSOC_RESP_REJECT +} reassociationResp_e; + + +static void roamingMngr_SendReassocEvent(TI_HANDLE hRoamingMngr, reassociationResp_e ReassResp); +static void roamingMngr_smIdleToStart (TI_HANDLE hRoamingMngr); +static void roamingMngr_smSTOP (TI_HANDLE hRoamingMngr); +static void roamingMngr_smConnectedToScan (TI_HANDLE hRoamingMngr); +static void roamingMngr_smConnectedToHandover(TI_HANDLE hRoamingMngr); +static void roamingMngr_smScanToConnected(TI_HANDLE hRoamingMngr); +static void roamingMngr_smHandoverToHandoverConnectEvent (TI_HANDLE hRoamingMngr); +static void roamingMngr_smHandoverToHandoverFailEvent (TI_HANDLE hRoamingMngr); +static void roamingMngr_smHandoverToConnectedSuccessEvent(TI_HANDLE hRoamingMngr); +static void roamingMngr_smHandoverToConnectedRejectEvent(TI_HANDLE hRoamingMngr); + + +/*-----------*/ +/* Constants */ +/*-----------*/ + +TGenSM_actionCell roamingMngrManual_matrix[ROAMING_MANUAL_NUM_STATES][ROAMING_MANUAL_NUM_EVENTS] = +{ + /* next state and actions for IDLE state */ + { + {ROAMING_MANUAL_STATE_CONNECTED, roamingMngr_smIdleToStart}, /* START */ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* SCAN */ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /*CONNECT*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* STOP*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* REJECT*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* SUCCESS*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* FAIL*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* COMPLETE*/ + }, + /* next state and actions for CONNECTED state */ + { + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* START */ + {ROAMING_MANUAL_STATE_SCAN, roamingMngr_smConnectedToScan}, /* SCAN */ + {ROAMING_MANUAL_STATE_HANDOVER, roamingMngr_smConnectedToHandover}, /*CONNECT*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smSTOP}, /* STOP*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* REJECT*/ + {ROAMING_MANUAL_STATE_CONNECTED, roamingMngr_smNop}, /* SUCCESS* retain CurrAp called */ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* FAIL*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* COMPLETE*/ + }, + /* next state and actions for SCAN state */ + { + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* START */ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* SCAN */ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /*CONNECT*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smSTOP}, /* STOP*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* REJECT*/ + {ROAMING_MANUAL_STATE_SCAN, roamingMngr_smNop}, /* SUCCESS* retain CurrAp called */ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* FAIL*/ + {ROAMING_MANUAL_STATE_CONNECTED, roamingMngr_smScanToConnected}, /* COMPLETE*/ + }, + /* next state and actions for HANDOVER state */ + { + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* START */ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected}, /* SCAN */ + {ROAMING_MANUAL_STATE_HANDOVER,roamingMngr_smHandoverToHandoverConnectEvent}, /*CONNECT*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smSTOP}, /* STOP*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smHandoverToConnectedRejectEvent}, /* REJECT*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smHandoverToConnectedSuccessEvent}, /* SUCCESS*/ + {ROAMING_MANUAL_STATE_HANDOVER, roamingMngr_smHandoverToHandoverFailEvent}, /* FAIL*/ + {ROAMING_MANUAL_STATE_IDLE, roamingMngr_smUnexpected }, /* COMPLETE*/ + } +}; + +TI_INT8* ManualRoamStateDescription[] = +{ + "IDLE", + "CONNECTED", + "SCAN", + "HANDOVER" +}; + +TI_INT8* ManualRoamEventDescription[] = +{ + "START", + "SCAN", + "CONNECT", + "STOP", + "REJECT", + "SUCCESS", + "FAIL", + "COMPLETE" +}; + +static void roamingMngr_smIdleToStart (TI_HANDLE hRoamingMngr) +{ + roamingMngr_t* pRoamingMngr; + + pRoamingMngr = (roamingMngr_t*)hRoamingMngr; + scanMngr_startManual((TI_HANDLE)pRoamingMngr->hScanMngr); +} + +static void roamingMngr_smSTOP (TI_HANDLE hRoamingMngr) +{ + roamingMngr_t* pRoamingMngr = (roamingMngr_t*)hRoamingMngr; + + //if (SCAN_ISS_IDLE != pScanMngr->immedScanState || SCAN_CSS_IDLE!= != pScanMngr->contScanState) + { + roamingMngr_smStopWhileScanning(hRoamingMngr); + } + + scanMngr_stopManual(pRoamingMngr->hScanMngr); +} + + +static void roamingMngr_smConnectedToScan (TI_HANDLE hRoamingMngr) +{ + roamingMngr_t *pRoamingMngr = (roamingMngr_t*) hRoamingMngr; + TI_STATUS status = TI_OK; + + status= apConn_prepareToRoaming(pRoamingMngr->hAPConnection, ROAMING_TRIGGER_NONE); + + if (status == TI_OK) + { + status = scanMngr_startImmediateScan (pRoamingMngr->hScanMngr,TI_FALSE); + } + else + { + roamingMngr_smEvent(ROAMING_MANUAL_EVENT_COMPLETE, hRoamingMngr); + } +} + +static void roamingMngr_smConnectedToHandover(TI_HANDLE hRoamingMngr) +{ + roamingMngr_t *pRoamingMngr = (roamingMngr_t*)hRoamingMngr; + TI_STATUS status = TI_OK; + + pRoamingMngr->handoverWasPerformed = TI_TRUE; + status= apConn_prepareToRoaming(pRoamingMngr->hAPConnection, pRoamingMngr->roamingTrigger); + + if (status == TI_OK) + { + apConn_connectToAP(pRoamingMngr->hAPConnection, &(pRoamingMngr->targetAP.newAP), &(pRoamingMngr->targetAP.connRequest), TI_TRUE); + } + else + { + roamingMngr_smEvent(ROAMING_MANUAL_EVENT_REJECT, hRoamingMngr); + } +} + +static void roamingMngr_smScanToConnected(TI_HANDLE hRoamingMngr) +{ + roamingMngr_t *pRoamingMngr = (roamingMngr_t*) hRoamingMngr; + apConn_connRequest_t request; + + request.dataBufLength = 0; + request.requestType = AP_CONNECT_RETAIN_CURR_AP; + apConn_connectToAP(pRoamingMngr->hAPConnection, NULL , &request , TI_FALSE); +} + +static void roamingMngr_smHandoverToHandoverConnectEvent (TI_HANDLE hRoamingMngr) +{ + roamingMngr_t *pRoamingMngr = (roamingMngr_t*) hRoamingMngr; + + apConn_connectToAP(pRoamingMngr->hAPConnection, &(pRoamingMngr->targetAP.newAP), &(pRoamingMngr->targetAP.connRequest), TI_TRUE); +} + +static void roamingMngr_smHandoverToHandoverFailEvent (TI_HANDLE hRoamingMngr) +{ + roamingMngr_SendReassocEvent(hRoamingMngr, REASSOC_RESP_FAILURE); +} + +static void roamingMngr_smHandoverToConnectedSuccessEvent(TI_HANDLE hRoamingMngr) +{ + roamingMngr_SendReassocEvent(hRoamingMngr, REASSOC_RESP_SUCCESS); +} + +static void roamingMngr_smHandoverToConnectedRejectEvent(TI_HANDLE hRoamingMngr) +{ + roamingMngr_SendReassocEvent(hRoamingMngr, REASSOC_RESP_REJECT); +} + +static void roamingMngr_SendReassocEvent(TI_HANDLE hRoamingMngr, reassociationResp_e ReassResp) +{ + roamingMngr_t *pRoamingMngr = (roamingMngr_t*) hRoamingMngr; + + TRACE1(pRoamingMngr->hReport, REPORT_SEVERITY_INFORMATION, "roamingMngr_SendReassocEvent(): %d \n", ReassResp); + EvHandlerSendEvent(pRoamingMngr->hEvHandler, + IPC_EVENT_REASSOCIATION_RESP, + (TI_UINT8*)(&ReassResp), + sizeof(reassociationResp_e)); +} + + + |