/* ========================================================================== Description: APCLI MLME Peer DeAssoc Req state machine procedure ========================================================================== */ static VOID ApCliCtrlPeerDeAssocReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Peer DeAssoc Req.\n", __FUNCTION__)); if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; if (pApCliEntry->Valid) ApCliLinkDown(pAd, ifIndex); /* set the apcli interface be invalid. */ pApCliEntry->Valid = FALSE; /* clear MlmeAux.Ssid and Bssid. */ NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, MAC_ADDR_LEN); pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.SsidLen = 0; NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Rssi = 0; *pCurrState = APCLI_CTRL_DISCONNECTED; return; }
/* ========================================================================== Description: APCLI MLME DeASSOC RSP state machine procedure ========================================================================== */ static VOID ApCliCtrlDeAssocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; APCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg); USHORT Status = Info->Status; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; if (Status == MLME_SUCCESS) { DBGPRINT(RT_DEBUG_TRACE, ("(%s) Receive DeAssoc Rsp Success.\n", __FUNCTION__)); } else { DBGPRINT(RT_DEBUG_TRACE, ("(%s) Receive DeAssoc Rsp Failure.\n", __FUNCTION__)); } if (pApCliEntry->Valid) ApCliLinkDown(pAd, ifIndex); *pCurrState = APCLI_CTRL_DISCONNECTED; return; }
/* ========================================================================== Description: APCLI MLME Disconnect Req state machine procedure ========================================================================== */ static VOID ApCliCtrlDeAuthAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; MLME_DEAUTH_REQ_STRUCT DeAuthFrame; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; BOOLEAN bValid = FALSE; DBGPRINT(RT_DEBUG_TRACE, ("(%s) MLME Request Disconnect.\n", __FUNCTION__)); if ((ifIndex >= MAX_APCLI_NUM) ) return; pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; /* Fill in the related information */ DeAuthFrame.Reason = (USHORT)REASON_DEAUTH_STA_LEAVING; COPY_MAC_ADDR(DeAuthFrame.Addr, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid); bValid = pApCliEntry->Valid; MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_DEAUTH_REQ, sizeof(MLME_DEAUTH_REQ_STRUCT), &DeAuthFrame, ifIndex); if (bValid) ApCliLinkDown(pAd, ifIndex); /* set the apcli interface be invalid. */ { pApCliEntry->Valid = FALSE; /* clear MlmeAux.Ssid and Bssid. */ NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.SsidLen = 0; NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Rssi = 0; } *pCurrState = APCLI_CTRL_DISCONNECTED; return; }
/* ========================================================================== Description: APCLI MLME Peer DeAssoc Req state machine procedure ========================================================================== */ static VOID ApCliCtrlPeerDeAssocReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; BOOLEAN bValid = FALSE; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Peer DeAssoc Req.\n", __FUNCTION__)); if ((ifIndex >= MAX_APCLI_NUM) ) return; pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; bValid = pApCliEntry->Valid; if (bValid) ApCliLinkDown(pAd, ifIndex); #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) ) { PMAC_TABLE_ENTRY pMacEntry; pMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; if (pMacEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED) ApCliSwitchCandidateAP(pAd); } #endif /* APCLI_AUTO_CONNECT_SUPPORT */ /* set the apcli interface be invalid. */ { pApCliEntry->Valid = FALSE; /* clear MlmeAux.Ssid and Bssid. */ NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.SsidLen = 0; NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Rssi = 0; } *pCurrState = APCLI_CTRL_DISCONNECTED; return; }
/* ========================================================================== Description: APCLI MLME Disconnect Rsp state machine procedure ========================================================================== */ static VOID ApCliCtrlDisconnectReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; BOOLEAN bValid = FALSE; DBGPRINT(RT_DEBUG_TRACE, ("(%s) MLME Request disconnect.\n", __FUNCTION__)); if ((ifIndex >= MAX_APCLI_NUM) ) return; pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; bValid = pApCliEntry->Valid; DBGPRINT(RT_DEBUG_ERROR, ("(%s) 2. Before do ApCliLinkDown.\n", __FUNCTION__)); if (bValid) ApCliLinkDown(pAd, ifIndex); /* set the apcli interface be invalid. */ { pApCliEntry->Valid = FALSE; /* clear MlmeAux.Ssid and Bssid. */ NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.SsidLen = 0; NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Rssi = 0; } *pCurrState = APCLI_CTRL_DISCONNECTED; return; }
static VOID ApCliTrialConnectPhase2Timeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { PAPCLI_STRUCT pApCliEntry = (APCLI_STRUCT *)FunctionContext; RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pApCliEntry->pAd; MLME_ASSOC_REQ_STRUCT AssocReq; UCHAR ifIndex = pApCliEntry->ifIndex; UCHAR BBPValue; struct wifi_dev *wdev; wdev = &pApCliEntry->wdev; DBGPRINT(RT_DEBUG_TRACE, ("ApCli_SYNC - %s,\n \ Jump back to trial channel:%d\n \ to issue Assoc Req to new root AP\n", __func__, pApCliEntry->TrialCh)); if (pApCliEntry->TrialCh != pAd->CommonCfg.CentralChannel) { /* Let BBP register at 20MHz */ AsicDisableSync(pAd);//disable beacon AsicSwitchChannel(pAd, pApCliEntry->TrialCh, TRUE); //andes_switch_channel(pAd, pApCliEntry->TrialCh, 0, 0, 0x202, 0);//woody } ApCliLinkDown(pAd, ifIndex); if (wdev->AuthMode >= Ndis802_11AuthModeWPA) RTMPSetTimer(&(pApCliEntry->TrialConnectRetryTimer), 800); else RTMPSetTimer(&(pApCliEntry->TrialConnectRetryTimer), TRIAL_TIMEOUT); AssocParmFill(pAd, &AssocReq, pAd->ApCfg.ApCliTab[pApCliEntry->ifIndex].MlmeAux.Bssid, pAd->ApCfg.ApCliTab[pApCliEntry->ifIndex].MlmeAux.CapabilityInfo, ASSOC_TIMEOUT, 5); MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_ASSOC_REQ, sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, pApCliEntry->ifIndex); RTMP_MLME_HANDLER(pAd); return; }
/* ========================================================================== Description: APCLI MLME Disconnect Req state machine procedure ========================================================================== */ static VOID ApCliCtrlDeAssocAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PAPCLI_STRUCT pApCliEntry; MLME_DISASSOC_REQ_STRUCT DisassocReq; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; DBGPRINT(RT_DEBUG_TRACE, ("(%s) MLME Request Disconnect.\n", __FUNCTION__)); if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; DisassocParmFill(pAd, &DisassocReq, pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, REASON_DISASSOC_STA_LEAVING); MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, ifIndex); if (pApCliEntry->Valid) ApCliLinkDown(pAd, ifIndex); /* set the apcli interface be invalid. */ pApCliEntry->Valid = FALSE; /* clear MlmeAux.Ssid and Bssid. */ NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, MAC_ADDR_LEN); pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.SsidLen = 0; NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Rssi = 0; *pCurrState = APCLI_CTRL_DEASSOC; return; }
VOID RTMPRemoveRepeaterDisconnectEntry( IN PRTMP_ADAPTER pAd, IN UCHAR apIdx, IN UCHAR CliIdx) { PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = apIdx; PULONG pCurrState = NULL; BOOLEAN bValid = FALSE; MLME_DISASSOC_REQ_STRUCT DisassocReq; MLME_DEAUTH_REQ_STRUCT DeAuthFrame; BOOLEAN Cancelled; DBGPRINT(RT_DEBUG_OFF, ("(%s) disconnect apIdx=%d CliIdx=%d.\n", __FUNCTION__,apIdx, CliIdx)); if (ifIndex >= MAX_APCLI_NUM) return; pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; bValid = pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CliValid; RTMPCancelTimer(&pApCliEntry->RepeaterCli[CliIdx].ApCliAssocTimer, &Cancelled); RTMPCancelTimer(&pApCliEntry->RepeaterCli[CliIdx].ApCliAuthTimer, &Cancelled); if (*pCurrState == APCLI_CTRL_ASSOC) { *pCurrState = APCLI_CTRL_DEASSOC; DisassocParmFill(pAd, &DisassocReq, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, REASON_DISASSOC_STA_LEAVING); MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, (64 + (MAX_EXT_MAC_ADDR_SIZE*ifIndex) + CliIdx)); RTMP_MLME_HANDLER(pAd); } else if (*pCurrState == APCLI_CTRL_CONNECTED) { DeAuthFrame.Reason = (USHORT)REASON_DEAUTH_STA_LEAVING; COPY_MAC_ADDR(DeAuthFrame.Addr, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid); MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_DEAUTH_REQ, sizeof(MLME_DEAUTH_REQ_STRUCT), &DeAuthFrame, (64 + (MAX_EXT_MAC_ADDR_SIZE*ifIndex) + CliIdx)); RTMP_MLME_HANDLER(pAd); if (bValid) ApCliLinkDown(pAd, (64 + (MAX_EXT_MAC_ADDR_SIZE*ifIndex) + CliIdx)); *pCurrState = APCLI_CTRL_DISCONNECTED; } else { if (bValid) ApCliLinkDown(pAd, (64 + (MAX_EXT_MAC_ADDR_SIZE*ifIndex) + CliIdx)); *pCurrState = APCLI_CTRL_DISCONNECTED; } return; }
static VOID ApCliTrialConnectRetryTimeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { PAPCLI_STRUCT pApCliEntry = (APCLI_STRUCT *)FunctionContext; RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pApCliEntry->pAd; PULONG pCurrState = &pAd->ApCfg.ApCliTab[pApCliEntry->ifIndex].CtrlCurrState; int i; UCHAR ifIndex = pApCliEntry->ifIndex; UCHAR tempBuf[10] = {}; UCHAR BBPValue; PMAC_TABLE_ENTRY pMacEntry; //PMAC_TABLE_ENTRY pOldRootAp = &pApCliEntry->oldRootAP; pMacEntry = MacTableLookup(pAd, pApCliEntry->MlmeAux.Bssid); //find rootAp that is under connecting if exists in mactable. if (pMacEntry == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("ApCli_SYNC - %s, no CfgApCliBssid in mactable!\n", __func__)); *pCurrState = APCLI_CTRL_DISCONNECTED; pApCliEntry->NewRootApRetryCnt++; if (pApCliEntry->NewRootApRetryCnt >= 10) { DBGPRINT(RT_DEBUG_TRACE, ("%s, RetryCnt:%d, pCurrState = %d, \n", __func__, pApCliEntry->NewRootApRetryCnt, *pCurrState)); pApCliEntry->TrialCh=0; ApCliLinkDown(pAd, ifIndex); MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, ifIndex); NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);//cleanup CfgSsid. pApCliEntry->CfgSsidLen = 0; pApCliEntry->NewRootApRetryCnt = 0;//cleanup retry count pApCliEntry->Enable = FALSE; } AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, TRUE); AsicEnableBssSync(pAd);//jump back to origin channel, regenerate beacon. return; } if ((pMacEntry->PortSecured == WPA_802_1X_PORT_SECURED) && (*pCurrState == APCLI_CTRL_CONNECTED)) { DBGPRINT(RT_DEBUG_TRACE, ("ApCli_SYNC - %s, new rootAP connected!!\n", __func__)); /* connected to new ap ok, change common channel to new channel */ //AsicSetApCliBssid(pAd, pApCliEntry->ApCliMlmeAux.Bssid, 1); //MacTableDeleteEntry(pAd, pApCliEntry->MacTabWCID, APCLI_ROOT_BSSID_GET(pAd, pApCliEntry->MacTabWCID)); DBGPRINT(RT_DEBUG_TRACE, ("ApCli_SYNC - %s, jump back to origin channel to wait for User's operation!\n", __func__)); AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, TRUE); AsicEnableBssSync(pAd);//jump back to origin channel, regenerate beacon. NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);//cleanup CfgSsid. pApCliEntry->CfgSsidLen = 0; pApCliEntry->NewRootApRetryCnt = 0;//cleanup retry count pApCliEntry->Enable = FALSE; // sprintf(tempBuf, "%d", pApCliEntry->TrialCh); // DBGPRINT(RT_DEBUG_TRACE, ("Follow new rootAP Switch to channel :%s\n", tempBuf)); // Set_Channel_Proc(pAd, tempBuf);//APStartUp will regenerate beacon. pApCliEntry->TrialCh=0; } else { /* Apcli does not connect to new root ap successfully yet, jump back to origin channel to serve old rootap traffic. re-issue assoc_req to go later. */ //pApCliEntry->MacTabWCID = pOldRootAp->Aid; pApCliEntry->NewRootApRetryCnt++; if (pApCliEntry->NewRootApRetryCnt < 10) RTMPSetTimer(&(pApCliEntry->TrialConnectPhase2Timer), TRIAL_TIMEOUT); else { DBGPRINT(RT_DEBUG_TRACE, ("%s, RetryCnt:%d, pCurrState = %d, \n", __func__, pApCliEntry->NewRootApRetryCnt, *pCurrState)); pApCliEntry->TrialCh=0; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, ifIndex); NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);//cleanup CfgSsid. pApCliEntry->CfgSsidLen = 0; pApCliEntry->NewRootApRetryCnt = 0;//cleanup retry count pApCliEntry->Enable = FALSE; ApCliLinkDown(pAd, ifIndex); } AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, TRUE); AsicEnableBssSync(pAd);//jump back to origin channel, regenerate beacon. } return; }