/* ========================================================================== Description: Issue a site survey command to driver Arguments: pAdapter Pointer to our adapter wrq Pointer to the ioctl argument Return Value: None Note: Usage: 1.) iwpriv ra0 set site_survey ========================================================================== */ INT Set_SiteSurvey_Proc( IN PRTMP_ADAPTER pAd, IN PSTRING arg) { NDIS_802_11_SSID Ssid; POS_COOKIE pObj; pObj = (POS_COOKIE) pAd->OS_Cookie; //check if the interface is down if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) { DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); return -ENETDOWN; } NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID)); #ifdef CONFIG_AP_SUPPORT #ifdef AP_SCAN_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { if ((strlen(arg) != 0) && (strlen(arg) <= MAX_LEN_OF_SSID)) { NdisMoveMemory(Ssid.Ssid, arg, strlen(arg)); Ssid.SsidLength = strlen(arg); } #ifndef APCLI_CONNECTION_TRIAL if (Ssid.SsidLength == 0) ApSiteSurvey(pAd, &Ssid, SCAN_PASSIVE, FALSE); else ApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, FALSE); #else /*for shorter scan time. use active scan and send probe req.*/ DBGPRINT(RT_DEBUG_TRACE, ("!!! Fast Scan for connection trial !!!\n")); ApSiteSurvey(pAd, &Ssid, FAST_SCAN_ACTIVE, FALSE); #endif /* APCLI_CONNECTION_TRIAL */ return TRUE; } #endif /* AP_SCAN_SUPPORT */ #endif // CONFIG_AP_SUPPORT // DBGPRINT(RT_DEBUG_TRACE, ("Set_SiteSurvey_Proc\n")); return TRUE; }
/* ========================================================================== Description: trigger Auto Channel Selection every period of ACSCheckTime. NOTE: This function is called in a 1-sec mlme periodic check. ========================================================================== */ VOID AutoChannelSelCheck(IN PRTMP_ADAPTER pAd) { /* Do nothing if ACSCheckTime is not configured or AP is doing site survey */ if (pAd->ApCfg.ACSCheckTime == 0 || ApScanRunning(pAd)) return; else pAd->ApCfg.ACSCheckCount++; if (pAd->ApCfg.ACSCheckCount >= pAd->ApCfg.ACSCheckTime) { /* Reset Counter */ pAd->ApCfg.ACSCheckCount = 0; /* Do Auto Channel Selection only when no client is associated */ if (pAd->MacTab.Size != 0) { DBGPRINT(RT_DEBUG_TRACE, ("%s(): Channel Selection not checked because there are %u associated clients.\n", __FUNCTION__, pAd->MacTab.Size)); return; } else { /* Do Auto Channel Selection */ DBGPRINT(RT_DEBUG_TRACE, ("%s(): Scanning channels for channel selection.\n", __FUNCTION__)); ApSiteSurvey(pAd, NULL, SCAN_PASSIVE, TRUE); } } }
VOID RTMPRepeaterReconnectionCheck( IN PRTMP_ADAPTER pAd) { #ifdef APCLI_AUTO_CONNECT_SUPPORT INT i; PCHAR pApCliSsid, pApCliCfgSsid; UCHAR CfgSsidLen; NDIS_802_11_SSID Ssid; if (pAd->ApCfg.bMACRepeaterEn && pAd->ApCfg.MACRepeaterOuiMode == 2 && pAd->ApCfg.ApCliAutoConnectRunning == FALSE) { for (i = 0; i < MAX_APCLI_NUM; i++) { pApCliSsid = pAd->ApCfg.ApCliTab[i].Ssid; pApCliCfgSsid = pAd->ApCfg.ApCliTab[i].CfgSsid; CfgSsidLen = pAd->ApCfg.ApCliTab[i].CfgSsidLen; if ((pAd->ApCfg.ApCliTab[i].CtrlCurrState < APCLI_CTRL_AUTH || !NdisEqualMemory(pApCliSsid, pApCliCfgSsid, CfgSsidLen)) && pAd->ApCfg.ApCliTab[i].CfgSsidLen > 0 && pAd->Mlme.OneSecPeriodicRound % 23 == 0) { DBGPRINT(RT_DEBUG_TRACE, (" %s(): Scan channels for AP (%s)\n", __FUNCTION__, pApCliCfgSsid)); pAd->ApCfg.ApCliAutoConnectRunning = TRUE; Ssid.SsidLength = CfgSsidLen; NdisCopyMemory(Ssid.Ssid, pApCliCfgSsid, CfgSsidLen); ApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, FALSE); } } } #endif /* APCLI_AUTO_CONNECT_SUPPORT */ }
/* ========================================================================== Description: trigger Auto Channel Selection every period of ACSCheckTime. NOTE: This function is called in a 1-sec mlme periodic check. ========================================================================== */ VOID AutoChannelSelCheck(RTMP_ADAPTER *pAd) { /* Do nothing if ACSCheckTime is not configured or AP is doing site survey */ if (pAd->ApCfg.ACSCheckTime == 0 || ApScanRunning(pAd)) return; else pAd->ApCfg.ACSCheckCount++; if (pAd->ApCfg.ACSCheckCount >= pAd->ApCfg.ACSCheckTime) { /* Reset Counter */ pAd->ApCfg.ACSCheckCount = 0; /* Do Auto Channel Selection only when no client is associated */ if (pAd->MacTab.Size != 0) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s(): ignore Channel Selection checking because has %u associated clients\n", __FUNCTION__, pAd->MacTab.Size)); return; } else { /* Do Auto Channel Selection */ MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s(): Scanning channels for channel selection.\n", __FUNCTION__)); ApSiteSurvey(pAd, NULL, SCAN_PASSIVE, TRUE); } } }
/* ========================================================================== Description: Issue a site survey command to driver Arguments: pAdapter Pointer to our adapter wrq Pointer to the ioctl argument Return Value: None Note: Usage: 1.) iwpriv ra0 set site_survey ========================================================================== */ int Set_SiteSurvey_Proc( IN PRTMP_ADAPTER pAd, IN PSTRING arg) { NDIS_802_11_SSID Ssid; POS_COOKIE pObj; pObj = (POS_COOKIE) pAd->OS_Cookie; //check if the interface is down if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) { DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); return -ENETDOWN; } NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID)); #ifdef CONFIG_AP_SUPPORT #ifdef AP_SCAN_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { if ((strlen(arg) != 0) && (strlen(arg) <= MAX_LEN_OF_SSID)) { NdisMoveMemory(Ssid.Ssid, arg, strlen(arg)); Ssid.SsidLength = strlen(arg); } if (Ssid.SsidLength == 0) ApSiteSurvey(pAd, &Ssid, SCAN_PASSIVE, FALSE); else ApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, FALSE); return TRUE; } #endif /* AP_SCAN_SUPPORT */ #endif // CONFIG_AP_SUPPORT // DBGPRINT(RT_DEBUG_TRACE, ("Set_SiteSurvey_Proc\n")); return TRUE; }
VOID RTMPRepeaterReconnectionCheck( IN PRTMP_ADAPTER pAd) { #ifdef APCLI_AUTO_CONNECT_SUPPORT INT i; PCHAR pApCliSsid, pApCliCfgSsid; UCHAR CfgSsidLen; NDIS_802_11_SSID Ssid; USHORT SiteSurveyPeriod; if ((pAd->ApCfg.ApCliAutoConnectRunning == FALSE) #ifdef AP_PARTIAL_SCAN_SUPPORT && (pAd->ApCfg.bPartialScanning == FALSE) #endif /* AP_PARTIAL_SCAN_SUPPORT */ ) { for (i = 0; i < MAX_APCLI_NUM; i++) { if (!APCLI_IF_UP_CHECK(pAd, i) || (pAd->ApCfg.ApCliTab[i].Enable == FALSE)) continue; pApCliSsid = pAd->ApCfg.ApCliTab[i].Ssid; pApCliCfgSsid = pAd->ApCfg.ApCliTab[i].CfgSsid; CfgSsidLen = pAd->ApCfg.ApCliTab[i].CfgSsidLen; SiteSurveyPeriod = pAd->ApCfg.ApCliTab[i].ApCliSiteSurveyPeriod; if ((pAd->ApCfg.ApCliTab[i].CtrlCurrState < APCLI_CTRL_AUTH || !NdisEqualMemory(pApCliSsid, pApCliCfgSsid, CfgSsidLen)) && (pAd->ApCfg.ApCliTab[i].CfgSsidLen > 0) && (pAd->Mlme.OneSecPeriodicRound % SiteSurveyPeriod == 0)) { DBGPRINT(RT_DEBUG_TRACE, (" %s(): Scan channels for AP (%s)\n", __FUNCTION__, pApCliCfgSsid)); pAd->ApCfg.ApCliAutoConnectRunning = TRUE; #ifdef AP_PARTIAL_SCAN_SUPPORT pAd->ApCfg.bPartialScanning = TRUE; #endif /* AP_PARTIAL_SCAN_SUPPORT */ Ssid.SsidLength = CfgSsidLen; NdisCopyMemory(Ssid.Ssid, pApCliCfgSsid, CfgSsidLen); ApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, FALSE); } } } #endif /* APCLI_AUTO_CONNECT_SUPPORT */ }
/* ========================================================================== 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); { bss_idx = BssSsidTableSearch(&pAd->ScanTab, pAd->P2pCfg.Bssid, (PCHAR)JoinReq.Ssid, JoinReq.SsidLen, pAd->CommonCfg.Channel); if (bss_idx == BSS_NOT_FOUND) { *pCurrState = APCLI_CTRL_PROBE; ApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE); return; } else { BOOLEAN Cancelled; INT old_conf_mode = pWpsCtrl->WscConfMode, old_wsc_mode = pWpsCtrl->WscMode; 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 (INFRA_ON(pAd) && (pAd->StaActive.SupportedHtPhy.ExtChanOffset != RootApHtInfo.ExtChanOffset) && (pAd->StaActive.SupportedHtPhy.ChannelWidth == BW_40)) { DBGPRINT(RT_DEBUG_OFF, ("%s :: Channel offset = %d not match INFRA Channel offset %d .\n", __FUNCTION__, pAd->MlmeAux.CentralChannel, RootApCentralChannel)); P2pLinkDown(pAd, P2P_CONNECT_FAIL); return; } 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"); } sprintf(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 = old_wsc_mode; pWpsCtrl->WscConfMode = old_conf_mode; pWpsCtrl->bWscTrigger = TRUE; return; } else { pAd->CommonCfg.Channel = pAd->ScanTab.BssEntry[bss_idx].Channel; AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.Channel); } } } } else #endif /* WSC_AP_SUPPORT */ if (pApCliEntry->CfgSsidLen != 0) { ULONG bss_idx = 0; bss_idx = BssSsidTableSearch(&pAd->ScanTab, JoinReq.Bssid, (PCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen, pAd->CommonCfg.Channel); 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); } if (pApCliEntry->CfgSsidLen == 0) { DBGPRINT(RT_DEBUG_TRACE, ("%s:: ApCliEntry SSID Len is 0 !!!.\n", __FUNCTION__)); *pCurrState = APCLI_CTRL_PROBE; ApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE); return; } 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: 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; }