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_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); } }
/** * * roamingMngr_smHandover * * \b Description: * * This procedure is called when handover should be invoked. * Go over the candidate APs and start handover to each of them. * If there's no candidate APs, disconnect. * Handover to the current AP is allowed only if the trigger is * low quality. * * \b ARGS: * * I - hRoamingMngr - roamingMngr SM context \n * * \b RETURNS: * * TI_OK if successful, TI_NOK otherwise. * * */ static void roamingMngr_smHandover(TI_HANDLE hRoamingMngr) { roamingMngr_t *pRoamingMngr; bssEntry_t *pApToConnect; apConn_connRequest_t requestToApConn; pRoamingMngr = (roamingMngr_t*)hRoamingMngr; if ((pRoamingMngr->handoverWasPerformed) && (pRoamingMngr->candidateApIndex == CURRENT_AP_INDEX)) { /* Handover with the current AP already failed, Disconnect */ roamingMngr_smEvent(ROAMING_EVENT_FAILURE, pRoamingMngr); return; } if (pRoamingMngr->listOfCandidateAps.numOfNeighborBSS > 0) { /* Neighbor APs are the highest priority to Roam */ pRoamingMngr->candidateApIndex = pRoamingMngr->listOfCandidateAps.neighborBSSList[pRoamingMngr->listOfCandidateAps.numOfNeighborBSS-1]; pRoamingMngr->listOfCandidateAps.numOfNeighborBSS--; } else if (pRoamingMngr->listOfCandidateAps.numOfPreAuthBSS > 0) { /* Pre-Auth APs are the second priority to Roam */ pRoamingMngr->candidateApIndex = pRoamingMngr->listOfCandidateAps.preAuthBSSList[pRoamingMngr->listOfCandidateAps.numOfPreAuthBSS-1]; pRoamingMngr->listOfCandidateAps.numOfPreAuthBSS--; } else if (pRoamingMngr->listOfCandidateAps.numOfRegularBSS > 0) { /* Regular APs are APs that are not pre-authenticated and not Neighbor */ pRoamingMngr->candidateApIndex = pRoamingMngr->listOfCandidateAps.regularBSSList[pRoamingMngr->listOfCandidateAps.numOfRegularBSS-1]; pRoamingMngr->listOfCandidateAps.numOfRegularBSS--; } else { /* No Candidate APs */ pRoamingMngr->candidateApIndex = INVALID_CANDIDATE_INDEX; } TRACE1(pRoamingMngr->hReport, REPORT_SEVERITY_INFORMATION, "roamingMngr_smHandover, candidateApIndex=%d \n", pRoamingMngr->candidateApIndex); if (pRoamingMngr->candidateApIndex == INVALID_CANDIDATE_INDEX) { /* No cnadidate to Roam to, only the current AP is candidate */ if (pRoamingMngr->roamingTrigger <= ROAMING_TRIGGER_LOW_QUALITY_GROUP) { /* If the trigger to Roam is low quality, and there are no candidate APs to roam to, retain connected to the current AP */ requestToApConn.requestType = (pRoamingMngr->handoverWasPerformed) ? AP_CONNECT_RECONNECT_CURR_AP : AP_CONNECT_RETAIN_CURR_AP; pRoamingMngr->candidateApIndex = CURRENT_AP_INDEX; } else { /* Disconnect the BSS, there are no more APs to roam to */ roamingMngr_smEvent(ROAMING_EVENT_FAILURE, pRoamingMngr); return; } } else { /* There is a valid candidate AP */ if (pRoamingMngr->roamingTrigger > ROAMING_TRIGGER_FAST_CONNECT_GROUP) { /* Full re-connection should be perfromed */ requestToApConn.requestType = AP_CONNECT_FULL_TO_AP; } else { /* Fast re-connection should be perfromed */ requestToApConn.requestType = AP_CONNECT_FAST_TO_AP; } } #ifdef TI_DBG /* For debug */ if (!pRoamingMngr->handoverWasPerformed) { /* Take the time before the first handover started */ pRoamingMngr->roamingHandoverStartedTimestamp = os_timeStampMs(pRoamingMngr->hOs); } #endif if (pRoamingMngr->candidateApIndex == CURRENT_AP_INDEX) { /* get the current AP */ pApToConnect = apConn_getBSSParams(pRoamingMngr->hAPConnection); if (pApToConnect == NULL) return; } else { /* get the candidate AP */ pRoamingMngr->handoverWasPerformed = TI_TRUE; pApToConnect = &pRoamingMngr->pListOfAPs->BSSList[pRoamingMngr->candidateApIndex]; } TRACE3(pRoamingMngr->hReport, REPORT_SEVERITY_INFORMATION, "roamingMngr_smHandover, candidateApIndex=%d, requestType = %d, channel=%d \n", pRoamingMngr->candidateApIndex, requestToApConn.requestType, pApToConnect->channel); requestToApConn.dataBufLength = 0; apConn_connectToAP(pRoamingMngr->hAPConnection, pApToConnect, &requestToApConn, TI_TRUE); }
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); }