/* ========================================================================== Description: APCLI MLME JOIN req timeout state machine procedure ========================================================================== */ static VOID ApCliCtrlJoinReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_MLME_JOIN_REQ_STRUCT JoinReq; PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Probe Req Timeout.\n", __FUNCTION__)); if (ifIndex >= MAX_APCLI_NUM) return; if (ApScanRunning(pAd) == TRUE) { *pCurrState = APCLI_CTRL_DISCONNECTED; return; } /* stay in same state. */ *pCurrState = APCLI_CTRL_PROBE; /* retry Probe Req. */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Retry Probe Req.\n", __FUNCTION__)); pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; NdisZeroMemory(&JoinReq, sizeof(APCLI_MLME_JOIN_REQ_STRUCT)); if (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) { COPY_MAC_ADDR(JoinReq.Bssid, pApCliEntry->CfgApCliBssid); } #ifdef WSC_AP_SUPPORT if ((pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode != WSC_DISABLE) && (pAd->ApCfg.ApCliTab[ifIndex].WscControl.bWscTrigger == TRUE)) { ULONG bss_idx = 0; bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PCHAR)JoinReq.Ssid, JoinReq.SsidLen); if (bss_idx == BSS_NOT_FOUND) { DBGPRINT(RT_DEBUG_TRACE, ("%s:: WSC exec. start SiteSurvey!\n", __FUNCTION__)); *pCurrState = APCLI_CTRL_PROBE; ApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE); return; } NdisZeroMemory(JoinReq.Ssid, MAX_LEN_OF_SSID); JoinReq.SsidLen = pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.SsidLength; NdisMoveMemory(JoinReq.Ssid, pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.Ssid, JoinReq.SsidLen); } else #endif /* WSC_AP_SUPPORT */ if (pApCliEntry->CfgSsidLen != 0) { ULONG bss_idx = 0; bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen); if (bss_idx == BSS_NOT_FOUND) { DBGPRINT(RT_DEBUG_TRACE, ("%s:: can't find SSID[%s] in ScanTab.\n", __FUNCTION__, pApCliEntry->CfgSsid)); *pCurrState = APCLI_CTRL_PROBE; ApSiteSurvey(pAd, NULL, SCAN_ACTIVE, FALSE); return; } DBGPRINT(RT_DEBUG_TRACE, ("%s:: find SSID[%ld][%s] channel[%d-%d] in ScanTab.\n", __FUNCTION__, bss_idx, pApCliEntry->CfgSsid, pAd->ScanTab.BssEntry[bss_idx].Channel, pAd->ScanTab.BssEntry[bss_idx].CentralChannel)); /* BssSearch Table has found the pEntry, send Prob Req. directly */ pAd->CommonCfg.Channel = pAd->ScanTab.BssEntry[bss_idx].Channel; AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.Channel); JoinReq.SsidLen = pApCliEntry->CfgSsidLen; NdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->CfgSsid, JoinReq.SsidLen); } DBGPRINT(RT_DEBUG_TRACE, ("(%s) Probe Ssid=%s, Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, JoinReq.Ssid, JoinReq.Bssid[0], JoinReq.Bssid[1], JoinReq.Bssid[2], JoinReq.Bssid[3], JoinReq.Bssid[4], JoinReq.Bssid[5])); MlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_MLME_PROBE_REQ, sizeof(APCLI_MLME_JOIN_REQ_STRUCT), &JoinReq, ifIndex); return; }
/* ========================================================================== Description: APCLI MLME JOIN req state machine procedure ========================================================================== */ static VOID ApCliCtrlJoinReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_MLME_JOIN_REQ_STRUCT JoinReq; PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; #ifdef WSC_AP_SUPPORT PWSC_CTRL pWpsCtrl = &pAd->ApCfg.ApCliTab[ifIndex].WscControl; #endif /* WSC_AP_SUPPORT */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Start Probe Req.\n", __FUNCTION__)); if (ifIndex >= MAX_APCLI_NUM) return; if (ApScanRunning(pAd) == TRUE) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; NdisZeroMemory(&JoinReq, sizeof(APCLI_MLME_JOIN_REQ_STRUCT)); if (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) { COPY_MAC_ADDR(JoinReq.Bssid, pApCliEntry->CfgApCliBssid); } #ifdef WSC_AP_SUPPORT if ((pWpsCtrl->WscConfMode != WSC_DISABLE) && (pWpsCtrl->bWscTrigger == TRUE)) { ULONG bss_idx = 0; NdisZeroMemory(JoinReq.Ssid, MAX_LEN_OF_SSID); JoinReq.SsidLen = pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.SsidLength; NdisMoveMemory(JoinReq.Ssid, pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.Ssid, JoinReq.SsidLen); if (pWpsCtrl->WscMode == 1) /* PIN */ { bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PUCHAR)(JoinReq.Ssid), JoinReq.SsidLen); if (bss_idx == BSS_NOT_FOUND) { ApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE); return; } else { INT old_conf_mode = pWpsCtrl->WscConfMode; ADD_HTINFO RootApHtInfo, ApHtInfo; UCHAR channel = pAd->CommonCfg.Channel, RootApChannel = pAd->ScanTab.BssEntry[bss_idx].Channel; UCHAR RootApCentralChannel = pAd->ScanTab.BssEntry[bss_idx].CentralChannel; ApHtInfo = pAd->CommonCfg.AddHTInfo.AddHtInfo; RootApHtInfo = pAd->ScanTab.BssEntry[bss_idx].AddHtInfo.AddHtInfo; if ((RootApChannel != channel) || ((RootApCentralChannel != RootApChannel) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && (ApHtInfo.ExtChanOffset != RootApHtInfo.ExtChanOffset))) { STRING ChStr[5] = {0}; if (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) { if (RootApHtInfo.ExtChanOffset == EXTCHA_ABOVE) Set_HtExtcha_Proc(pAd, "1"); else Set_HtExtcha_Proc(pAd, "0"); } snprintf(ChStr, sizeof(ChStr), "%d", pAd->ScanTab.BssEntry[bss_idx].Channel); Set_Channel_Proc(pAd, ChStr); /* ApStop will call WscStop, we need to reset WscConfMode, WscMode & bWscTrigger here. */ pWpsCtrl->WscState = WSC_STATE_START; pWpsCtrl->WscStatus = STATUS_WSC_START_ASSOC; pWpsCtrl->WscMode = 1; pWpsCtrl->WscConfMode = old_conf_mode; pWpsCtrl->bWscTrigger = TRUE; return; } } } } else #endif /* WSC_AP_SUPPORT */ if (pApCliEntry->CfgSsidLen != 0) { JoinReq.SsidLen = pApCliEntry->CfgSsidLen; NdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->CfgSsid, JoinReq.SsidLen); } DBGPRINT(RT_DEBUG_TRACE, ("(%s) Probe Ssid=%s, Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, JoinReq.Ssid, JoinReq.Bssid[0], JoinReq.Bssid[1], JoinReq.Bssid[2], JoinReq.Bssid[3], JoinReq.Bssid[4], JoinReq.Bssid[5])); *pCurrState = APCLI_CTRL_PROBE; MlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_MLME_PROBE_REQ, sizeof(APCLI_MLME_JOIN_REQ_STRUCT), &JoinReq, ifIndex); return; }
/* ========================================================================== Description: MLME PROBE req state machine procedure ========================================================================== */ static VOID ApCliMlmeProbeReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; APCLI_MLME_JOIN_REQ_STRUCT *Info = (APCLI_MLME_JOIN_REQ_STRUCT *)(Elem->Msg); USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState; APCLI_STRUCT *pApCliEntry = NULL; DBGPRINT(RT_DEBUG_TRACE, ("ApCli SYNC - ApCliMlmeProbeReqAction(Ssid %s)\n", Info->Ssid)); if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; /* reset all the timers */ RTMPCancelTimer(&(pApCliEntry->MlmeAux.ProbeTimer), &Cancelled); pApCliEntry->MlmeAux.Rssi = -9999; ULONG bss_idx = BSS_NOT_FOUND; bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PCHAR)Info->Ssid, Info->SsidLen); if (bss_idx == BSS_NOT_FOUND) { #ifdef APCLI_CONNECTION_TRIAL if (pApCliEntry->TrialCh ==0) pApCliEntry->MlmeAux.Channel = pAd->CommonCfg.Channel; else pApCliEntry->MlmeAux.Channel = pApCliEntry->TrialCh; #else pApCliEntry->MlmeAux.Channel = pAd->CommonCfg.Channel; #endif /* APCLI_CONNECTION_TRIAL */ } else { #ifdef APCLI_CONNECTION_TRIAL if (pApCliEntry->TrialCh ==0) pApCliEntry->MlmeAux.Channel = pAd->CommonCfg.Channel; else pApCliEntry->MlmeAux.Channel = pApCliEntry->TrialCh; #else DBGPRINT(RT_DEBUG_TRACE, ("%s, Found %s in scanTable , goto channel %d\n", __FUNCTION__, pAd->ScanTab.BssEntry[bss_idx].Ssid, pAd->ScanTab.BssEntry[bss_idx].Channel)); pApCliEntry->MlmeAux.Channel = pAd->ScanTab.BssEntry[bss_idx].Channel; #endif /* APCLI_CONNECTION_TRIAL */ } #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE pApCliEntry->MlmeAux.SupRateLen = pAd->cfg80211_ctrl.P2pSupRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.SupRate, pAd->cfg80211_ctrl.P2pSupRate, pAd->cfg80211_ctrl.P2pSupRateLen); pApCliEntry->MlmeAux.ExtRateLen = pAd->cfg80211_ctrl.P2pExtRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.ExtRate, pAd->cfg80211_ctrl.P2pExtRate, pAd->cfg80211_ctrl.P2pExtRateLen); #else pApCliEntry->MlmeAux.SupRateLen = pAd->CommonCfg.SupRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.SupRate, pAd->CommonCfg.SupRate, pAd->CommonCfg.SupRateLen); /* Prepare the default value for extended rate */ pApCliEntry->MlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.ExtRate, pAd->CommonCfg.ExtRate, pAd->CommonCfg.ExtRateLen); #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ RTMPSetTimer(&(pApCliEntry->MlmeAux.ProbeTimer), PROBE_TIMEOUT); #ifdef APCLI_CONNECTION_TRIAL NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen); #endif /* APCLI_CONNECTION_TRIAL */ ApCliEnqueueProbeRequest(pAd, Info->SsidLen, (PCHAR) Info->Ssid, ifIndex); DBGPRINT(RT_DEBUG_TRACE, ("ApCli SYNC - Start Probe the SSID %s on channel =%d\n", pApCliEntry->MlmeAux.Ssid, pApCliEntry->MlmeAux.Channel)); *pCurrState = APCLI_JOIN_WAIT_PROBE_RSP; return; }
/* ========================================================================== Description: APCLI MLME JOIN req state machine procedure ========================================================================== */ static VOID ApCliCtrlJoinReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_MLME_JOIN_REQ_STRUCT JoinReq; PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Start Probe Req.\n", __FUNCTION__)); if (ifIndex >= MAX_APCLI_NUM) return; if (ApScanRunning(pAd) == TRUE) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; NdisZeroMemory(&JoinReq, sizeof(APCLI_MLME_JOIN_REQ_STRUCT)); if (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) { COPY_MAC_ADDR(JoinReq.Bssid, pApCliEntry->CfgApCliBssid); } if (pApCliEntry->CfgSsidLen != 0) { #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE ULONG bss_idx = BSS_NOT_FOUND; bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen); if (bss_idx == BSS_NOT_FOUND) { DBGPRINT(RT_DEBUG_TRACE, ("%s:: can't find SSID[%s] in ScanTab.\n", __FUNCTION__, pApCliEntry->CfgSsid)); *pCurrState = APCLI_CTRL_PROBE; CFG80211_checkScanTable(pAd); RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(pAd, JoinReq.Bssid, NULL, 0, NULL, 0, 0); return; } DBGPRINT(RT_DEBUG_TRACE, ("%s:: find SSID[%ld][%s] channel[%d-%d] in ScanTab.\n", __FUNCTION__, bss_idx, pApCliEntry->CfgSsid, pAd->ScanTab.BssEntry[bss_idx].Channel, pAd->ScanTab.BssEntry[bss_idx].CentralChannel)); //TODO /* BssSearch Table has found the pEntry, send Prob Req. directly */ if (pAd->CommonCfg.Channel != pAd->ScanTab.BssEntry[bss_idx].Channel) { pAd->CommonCfg.Channel = pAd->ScanTab.BssEntry[bss_idx].Channel; AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.Channel); } #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ JoinReq.SsidLen = pApCliEntry->CfgSsidLen; NdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->CfgSsid, JoinReq.SsidLen); } DBGPRINT(RT_DEBUG_TRACE, ("(%s) Probe Ssid=%s, Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, JoinReq.Ssid, PRINT_MAC(JoinReq.Bssid))); *pCurrState = APCLI_CTRL_PROBE; MlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_MLME_PROBE_REQ, sizeof(APCLI_MLME_JOIN_REQ_STRUCT), &JoinReq, ifIndex); return; }