/* ========================================================================== Description: what the state machine will do after assoc timeout ========================================================================== */ VOID AssocTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT Status; DBGPRINT(RT_DEBUG_TRACE, "ASSOC - AssocTimeoutAction\n"); pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; Status = MLME_REJ_TIMEOUT; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status); }
/* ========================================================================== Description: ========================================================================== */ VOID MlmeDeauthReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MLME_DEAUTH_REQ_STRUCT *pInfo; HEADER_802_11 DeauthHdr; PUCHAR pOutBuffer = NULL; ULONG FrameLen = 0; USHORT Status; USHORT NStatus; pInfo = (MLME_DEAUTH_REQ_STRUCT *)Elem->Msg; // allocate and send out DeauthReq frame NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); //Get an unused nonpaged memory if (NStatus != NDIS_STATUS_SUCCESS) { DBGPRINT(RT_DEBUG_TRACE, "AUTH - MlmeDeauthReqAction() allocate memory fail\n"); pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; Status = MLME_FAIL_NO_RESOURCE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DEAUTH_CONF, 2, &Status); return; } DBGPRINT(RT_DEBUG_TRACE, "AUTH - Send DE-AUTH request (Reason=%d)...\n", pInfo->Reason); MgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, pInfo->Addr, pAd->MlmeAux.Bssid); MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &DeauthHdr, 2, &pInfo->Reason, END_OF_ARGS); MiniportMMRequest(pAd, pOutBuffer, FrameLen); pAd->PortCfg.DeauthReason = pInfo->Reason; COPY_MAC_ADDR(pAd->PortCfg.DeauthSta, pInfo->Addr); pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; Status = MLME_SUCCESS; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DEAUTH_CONF, 2, &Status); }
static VOID ApCliProbeTimeoutAtJoinAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState; APCLI_STRUCT *pApCliEntry = NULL; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("APCLI_SYNC - ProbeTimeoutAtJoinAction\n")); if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; *pCurrState = SYNC_IDLE; #ifdef APCLI_CONNECTION_TRIAL if (ifIndex == 1) *pCurrState = APCLI_CTRL_DISCONNECTED; #endif /* APCLI_CONNECTION_TRIAL */ MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("APCLI_SYNC - MlmeAux.Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pApCliEntry->MlmeAux.Bssid))); if(!MAC_ADDR_EQUAL(pApCliEntry->MlmeAux.Bssid, ZERO_MAC_ADDR)) { ApCliCtrlMsg.Status = MLME_SUCCESS; #ifdef MAC_REPEATER_SUPPORT ApCliCtrlMsg.BssIdx = ifIndex; ApCliCtrlMsg.CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PROBE_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } else { MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex); } return; }
static VOID MeshCtrlDisconnectAtDicoveryAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MESH_CTRL_STATE *pCurrState = &(pAd->MeshTab.CtrlCurrentState); INT i; DBGPRINT(RT_DEBUG_TRACE, ("%s: Get Disconnect evt when Discovery.\n", __FUNCTION__)); for (i = 0; i < MAX_MESH_LINKS; i++) { MlmeEnqueue(pAd, MESH_LINK_MNG_STATE_MACHINE, MESH_LINK_MNG_CNCL, 0, NULL, i); } #ifdef AP_SCAN_SUPPORT MlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE, APMT2_MLME_SCAN_CNCL, 0, NULL, 0); #endif *pCurrState = MESH_CTRL_IDLE; }
/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ========================================================================== */ VOID MlmeAuthReqAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) { if (AUTH_ReqSend(pAd, Elem, &pAd->MlmeAux.AuthTimer, "AUTH", 1, NULL, 0)) pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ2; else { USHORT Status; pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; Status = MLME_INVALID_FORMAT; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); } }
/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ========================================================================== */ VOID InvalidStateWhenAuth( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT Status; DBGPRINT(RT_DEBUG_TRACE, ("AUTH - InvalidStateWhenAuth (state=%ld), reset AUTH state machine\n", pAd->Mlme.AuthMachine.CurrState)); pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; Status = MLME_STATE_MACHINE_REJECT; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); }
/* ========================================================================== 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 Assoc Req timeout state machine procedure ========================================================================== */ static VOID ApCliCtrlAssocReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MLME_ASSOC_REQ_STRUCT AssocReq; PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Assoc Req Timeout.\n", __FUNCTION__)); if ((ifIndex >= MAX_APCLI_NUM) ) return; pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; /* give up to retry authentication req after retry it 5 times. */ { pApCliEntry->AssocReqCnt++; if (pApCliEntry->AssocReqCnt > 5) { *pCurrState = APCLI_CTRL_DISCONNECTED; NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); pApCliEntry->AssocReqCnt = 0; #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) ) ApCliSwitchCandidateAP(pAd); #endif /* APCLI_AUTO_CONNECT_SUPPORT */ return; } } /* stay in same state. */ *pCurrState = APCLI_CTRL_ASSOC; /* retry Association Req. */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Retry Association Req.\n", __FUNCTION__)); AssocParmFill(pAd, &AssocReq, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.CapabilityInfo, ASSOC_TIMEOUT, 5); MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_ASSOC_REQ, sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex); return; }
/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ========================================================================== */ VOID FT_OTD_InvalidStateWhenFt( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT Status; DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - InvalidStateWhenFt (state=%lu), reset FT state machine\n", pAd->Mlme.FtOtdActMachine.CurrState)); pAd->Mlme.FtOtdActMachine.CurrState = FT_OTD_IDLE; Status = MLME_STATE_MACHINE_REJECT; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_FT_OTD_CONF, 2, &Status, 0); }
void MlmeAuthReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem) { if (AUTH_ReqSend (pAd, Elem, &pAd->MlmeAux.AuthTimer, "AUTH", 1, NULL, 0)) pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ2; else { u16 Status; pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; Status = MLME_INVALID_FORMAT; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); } }
/* ========================================================================== Description: Becaon timeout handler, executed in timer thread ========================================================================== */ static VOID ApCliProbeTimeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { #ifdef APCLI_CONNECTION_TRIAL PAPCLI_STRUCT pApCliEntry = (APCLI_STRUCT *)FunctionContext; RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pApCliEntry->pAd; #else RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; #endif /*APCLI_CONNECTION_TRIAL*/ DBGPRINT(RT_DEBUG_TRACE, ("ApCli_SYNC - ProbeReqTimeout\n")); #ifndef APCLI_CONNECTION_TRIAL MlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_PROBE_TIMEOUT, 0, NULL, 0); #else MlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_PROBE_TIMEOUT, 0, NULL, pApCliEntry->ifIndex); #endif /* APCLI_CONNECTION_TRIAL */ RTMP_MLME_HANDLER(pAd); return; }
/* ========================================================================== Description: what the state machine will do after assoc timeout ========================================================================== */ static VOID ApCliAssocTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliAssocTimeoutAction\n")); *pCurrState = APCLI_ASSOC_IDLE; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_REQ_TIMEOUT, 0, NULL, ifIndex); return; }
/* ========================================================================== Description: APCLI MLME Auth Req timeout state machine procedure ========================================================================== */ static VOID ApCliCtrlAuthReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MLME_AUTH_REQ_STRUCT AuthReq; PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; if ((ifIndex >= MAX_APCLI_NUM) ) return; pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Auth Req Timeout.\n", __FUNCTION__)); { pApCliEntry->AuthReqCnt++; if (pApCliEntry->AuthReqCnt > 5) { *pCurrState = APCLI_CTRL_DISCONNECTED; NdisZeroMemory(pApCliEntry->MlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pApCliEntry->MlmeAux.Ssid, MAX_LEN_OF_SSID); pApCliEntry->AuthReqCnt = 0; #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) ) ApCliSwitchCandidateAP(pAd); #endif /* APCLI_AUTO_CONNECT_SUPPORT */ return; } } /* stay in same state. */ *pCurrState = APCLI_CTRL_AUTH; /* retry Authentication. */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Retry Auth Req.\n", __FUNCTION__)); COPY_MAC_ADDR(AuthReq.Addr, pApCliEntry->MlmeAux.Bssid); AuthReq.Alg = pApCliEntry->MlmeAux.Alg; /*Ndis802_11AuthModeOpen; */ AuthReq.Timeout = AUTH_TIMEOUT; MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_AUTH_REQ, sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex); return; }
static VOID ApCliTrialConnectTimeout( 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; UCHAR ifIndex = pApCliEntry->ifIndex; UCHAR BBPValue; PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; DBGPRINT(RT_DEBUG_TRACE, ("ApCli_SYNC - TrialConnectTimeout, Jump back to original Channel\n")); AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, TRUE); AsicEnableBssSync(pAd);//jump back to origin channel, regenerate beacon. if (pAd->CommonCfg.BBPCurrentBW == BW_40) { } if (*pCurrState == APCLI_CTRL_ASSOC) { //trialConnectTimeout, and currect status is ASSOC, //it means we got Auth Resp from new root AP already, //we shall serve the origin channel traffic first, //and jump back to trial channel to issue Assoc Req later, //and finish four way-handshake if need. DBGPRINT(RT_DEBUG_TRACE, ("%s, ApCliTrialConnectTimeout APCLI_CTRL_ASSOC set TrialConnectPhase2Timer\n", __func__)); RTMPSetTimer(&(pApCliEntry->TrialConnectPhase2Timer), TRIAL_TIMEOUT); } else { //RTMPCancelTimer(&(pApCliEntry->ApCliMlmeAux.ProbeTimer), &Cancelled); pApCliEntry->NewRootApRetryCnt++; if (pApCliEntry->NewRootApRetryCnt >= 10) { 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; } else *pCurrState = APCLI_CTRL_DISCONNECTED;//Disconnected State will bring the next probe req, auth req. } return; }
/* ========================================================================== Description: function to be executed at timer thread when auth timer expires ========================================================================== */ static VOID ApCliAuthTimeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; DBGPRINT(RT_DEBUG_TRACE, ("%s():AuthTimeout\n", __FUNCTION__)); MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_AUTH_TIMEOUT, 0, NULL, 0); RTMP_MLME_HANDLER(pAd); return; }
/* ========================================================================== Description: Becaon timeout handler, executed in timer thread ========================================================================== */ static VOID ApCliProbeTimeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { #if defined(APCLI_CONNECTION_TRIAL) || defined(MULTI_APCLI_SUPPORT) PAPCLI_STRUCT pApCliEntry = (APCLI_STRUCT *)FunctionContext; RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pApCliEntry->pAd; #else RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; #endif /*APCLI_CONNECTION_TRIAL*/ MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("ApCli_SYNC - ProbeReqTimeout\n")); #if defined(APCLI_CONNECTION_TRIAL)|| defined(MULTI_APCLI_SUPPORT) MlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_PROBE_TIMEOUT, 0, NULL, pApCliEntry->ifIndex); #else MlmeEnqueue(pAd,APCLI_SYNC_STATE_MACHINE,APCLI_MT2_PROBE_TIMEOUT,0,NULL,0); #endif /* APCLI_CONNECTION_TRIAL */ RTMP_MLME_HANDLER(pAd); return; }
/* ========================================================================== Description: Becaon timeout handler, executed in timer thread ========================================================================== */ static VOID ApCliProbeTimeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; DBGPRINT(RT_DEBUG_TRACE, ("ApCli_SYNC - ProbeReqTimeout\n")); MlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_PROBE_TIMEOUT, 0, NULL, 0); RTMP_MLME_HANDLER(pAd); return; }
/* ========================================================================== Description: Association timeout procedure. After association timeout, this function will be called and it will put a message into the MLME queue Parameters: Standard timer parameters ========================================================================== */ static VOID ApCliAssocTimeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - enqueue APCLI_MT2_ASSOC_TIMEOUT \n")); MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_ASSOC_TIMEOUT, 0, NULL, 0); RTMP_MLME_HANDLER(pAd); return; }
/* ========================================================================== Description: Mesh-Channel-Switch timeout procedure. Parameters: Standard timer parameters ========================================================================== */ static VOID MeshMcsTimeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; DBGPRINT(RT_DEBUG_TRACE, ("%s - enqueue MESH_CTRL_MCS_TIMEOUT to MESH_CTRL State-Machine.\n", __FUNCTION__)); MlmeEnqueue(pAd, MESH_CTRL_STATE_MACHINE, MESH_CTRL_MCS_TIMEOUT, 0, NULL, 0); MeshMlmeHandler(pAd); return; }
/* ========================================================================== Description: ========================================================================== */ static VOID ApCliPeerDeauthAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr1[MAC_ADDR_LEN]; UCHAR Addr2[MAC_ADDR_LEN]; UCHAR Addr3[MAC_ADDR_LEN]; USHORT Reason; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState; #ifdef APCLI_WPA_SUPPLICANT_SUPPORT PMAC_TABLE_ENTRY pMacEntry = NULL; #endif /*APCLI_WPA_SUPPLICANT_SUPPORT*/ if (ifIndex >= MAX_APCLI_NUM) return; #ifdef APCLI_WPA_SUPPLICANT_SUPPORT pMacEntry = &pAd->MacTab.Content[pAd->ApCfg.ApCliTab[ifIndex].MacTabWCID]; if (!pMacEntry || !IS_ENTRY_APCLI(pMacEntry)) { return; } #endif /*APCLI_WPA_SUPPLICANT_SUPPORT*/ if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr1, Addr2, Addr3, &Reason)) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI AUTH_RSP - receive DE-AUTH from our AP\n")); *pCurrState = APCLI_AUTH_REQ_IDLE; #ifdef APCLI_WPA_SUPPLICANT_SUPPORT if ((pAd->ApCfg.ApCliTab[ifIndex].WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) && (pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPA2) &&(pMacEntry->PortSecured == WPA_802_1X_PORT_SECURED)) { pAd->ApCfg.ApCliTab[ifIndex].bLostAp = TRUE; } #endif /*APCLI_WPA_SUPPLICANT_SUPPORT*/ MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PEER_DISCONNECT_REQ, 0, NULL, ifIndex); } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI AUTH_RSP - ApCliPeerDeauthAction() sanity check fail\n")); } return; }
/* ========================================================================== Description: Retry sending ADDBA Reqest. IRQL = DISPATCH_LEVEL Parametrs: p8023Header: if this is already 802.3 format, p8023Header is NULL Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere. FALSE , then continue indicaterx at this moment. ========================================================================== */ void BAOriSessionSetupTimeout(void *SystemSpecific1, void *FunctionContext, void *SystemSpecific2, void *SystemSpecific3) { struct rt_ba_ori_entry *pBAEntry = (struct rt_ba_ori_entry *)FunctionContext; struct rt_mac_table_entry *pEntry; struct rt_rtmp_adapter *pAd; if (pBAEntry == NULL) return; pAd = pBAEntry->pAdapter; { /* Do nothing if monitor mode is on */ if (MONITOR_ON(pAd)) return; } pEntry = &pAd->MacTab.Content[pBAEntry->Wcid]; if ((pBAEntry->ORI_BA_Status == Originator_WaitRes) && (pBAEntry->Token < ORI_SESSION_MAX_RETRY)) { struct rt_mlme_addba_req AddbaReq; NdisZeroMemory(&AddbaReq, sizeof(AddbaReq)); COPY_MAC_ADDR(AddbaReq.pAddr, pEntry->Addr); AddbaReq.Wcid = (u8)(pEntry->Aid); AddbaReq.TID = pBAEntry->TID; AddbaReq.BaBufSize = pAd->CommonCfg.BACapability.field.RxBAWinLimit; AddbaReq.TimeOutValue = 0; AddbaReq.Token = pBAEntry->Token; MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ADD_BA_CATE, sizeof(struct rt_mlme_addba_req), (void *)& AddbaReq); RTMP_MLME_HANDLER(pAd); DBGPRINT(RT_DEBUG_TRACE, ("BA Ori Session Timeout(%d) : Send ADD BA again\n", pBAEntry->Token)); pBAEntry->Token++; RTMPSetTimer(&pBAEntry->ORIBATimer, ORI_BA_SESSION_TIMEOUT); } else { BATableFreeOriEntry(pAd, pEntry->BAOriWcidArray[pBAEntry->TID]); } }
/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ========================================================================== */ VOID PeerAuthRspAtSeq4Action( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Alg, Seq, Status; /* CHAR ChlgText[CIPHER_TEXT_LEN]; */ CHAR *ChlgText = NULL; BOOLEAN TimerCancelled; /* allocate memory */ os_alloc_mem(NULL, (UCHAR **) & ChlgText, CIPHER_TEXT_LEN); if (ChlgText == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("%s: ChlgText Allocate memory fail!!!\n", __FUNCTION__)); return; } if (PeerAuthSanity (pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, ChlgText)) { if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 4) { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Receive AUTH_RSP seq#4 to me\n")); RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &TimerCancelled); if (Status != MLME_SUCCESS) { pAd->StaCfg.AuthFailReason = Status; COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2); RTMPSendWirelessEvent(pAd, IW_SHARED_WEP_FAIL, NULL, BSS0, 0); } pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); } } else { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthRspAtSeq4Action() sanity check fail\n")); } if (ChlgText != NULL) os_free_mem(NULL, ChlgText); }
/* ========================================================================== Description: left part of IEEE 802.11/1999 p.374 Parameters: Elem - MLME message containing the received frame ========================================================================== */ static VOID ApCliPeerDisassocAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Reason; USHORT ifIndex = (USHORT)(Elem->Priv); if ((ifIndex >= MAX_APCLI_NUM) ) return; PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; if(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) { if (MAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, Addr2)) { #ifdef DPA_S #ifdef P2P_SUPPORT UCHAR p2pIndex = P2P_NOT_FOUND; #endif /* P2P_SUPPORT */ #endif /* DPA_S */ *pCurrState = APCLI_ASSOC_IDLE; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PEER_DISCONNECT_REQ, 0, NULL, ifIndex); #ifdef DPA_S #ifdef P2P_SUPPORT p2pIndex = P2pGroupTabSearch(pAd, Addr2); if (p2pIndex != P2P_NOT_FOUND) { PRT_P2P_CLIENT_ENTRY pP2pEntry = &pAd->P2pTable.Client[p2pIndex]; P2pSendSamsungEvent(pAd, P2P_NOTIF_SOFTAP_STA_DISASSOC, Addr2, pP2pEntry->DeviceName, pP2pEntry->DeviceNameLen); } else P2pSendSamsungEvent(pAd, P2P_NOTIF_SOFTAP_STA_DISASSOC, Addr2, NULL, 0); #endif /* P2P_SUPPORT */ #endif /* DPA_S */ } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliPeerDisassocAction() sanity check fail\n")); } return; }
VOID WpaDisassocApAndBlockAssoc( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { RTMP_ADAPTER *pAd = (PRTMP_ADAPTER)FunctionContext; MLME_DISASSOC_REQ_STRUCT DisassocReq; // disassoc from current AP first DBGPRINT(RT_DEBUG_TRACE, ("RTMPReportMicError - disassociate with current AP after sending second continuous EAPOL frame\n")); DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_MIC_FAILURE); MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq); pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; pAd->StaCfg.bBlockAssoc = TRUE; }
static VOID ApCliInvalidStateWhenDisassociate( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - InvalidStateWhenApCliDisassoc(state=%ld), reset APCLI_ASSOC state machine\n", *pCurrState)); *pCurrState = APCLI_ASSOC_IDLE; ApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DEASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); return; }
/* ========================================================================== Description: ========================================================================== */ static VOID ApCliInvalidStateWhenJoin( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState; *pCurrState = APCLI_SYNC_IDLE; ApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PROBE_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); DBGPRINT(RT_DEBUG_TRACE, ("APCLI_AYNC - ApCliInvalidStateWhenJoin(state=%ld). Reset SYNC machine\n", *pCurrState)); return; }
/* ========================================================================== Description: APCLI MLME AUTH2 Rsp state machine procedure ========================================================================== */ static VOID ApCliCtrlAuth2RspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg); USHORT Status = Info->Status; MLME_ASSOC_REQ_STRUCT AssocReq; PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; if ((ifIndex >= MAX_APCLI_NUM) ) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; pCurrState = &pApCliEntry->CtrlCurrState; if(Status == MLME_SUCCESS) { DBGPRINT(RT_DEBUG_TRACE, ("(%s) Auth2 Rsp Success.\n", __FUNCTION__)); *pCurrState = APCLI_CTRL_ASSOC; pApCliEntry->AssocReqCnt = 0; AssocParmFill(pAd, &AssocReq, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.CapabilityInfo, ASSOC_TIMEOUT, 5); MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_ASSOC_REQ, sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex); } else { DBGPRINT(RT_DEBUG_TRACE, ("(%s) Apcli Auth Rsp Failure.\n", __FUNCTION__)); *pCurrState = APCLI_CTRL_DISCONNECTED; #ifdef APCLI_AUTO_CONNECT_SUPPORT if ((pAd->ApCfg.ApCliAutoConnectRunning == TRUE) ) ApCliSwitchCandidateAP(pAd); #endif /* APCLI_AUTO_CONNECT_SUPPORT */ } return; }
static VOID ApCliInvalidStateWhenDisassociate( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; #ifdef MAC_REPEATER_SUPPORT UCHAR CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ if ((ifIndex >= MAX_APCLI_NUM) #ifdef MAC_REPEATER_SUPPORT && (ifIndex < 64) #endif /* MAC_REPEATER_SUPPORT */ ) return; #ifdef MAC_REPEATER_SUPPORT if (ifIndex >= 64) { CliIdx = ((ifIndex - 64) % 16); ifIndex = ((ifIndex - 64) / 16); pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].AssocCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - InvalidStateWhenApCliDisassoc(state=%ld), reset APCLI_ASSOC state machine\n", *pCurrState)); *pCurrState = APCLI_ASSOC_IDLE; ApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT; #ifdef MAC_REPEATER_SUPPORT ApCliCtrlMsg.BssIdx = ifIndex; ApCliCtrlMsg.CliIdx = CliIdx; ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DEASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); return; }
/* ========================================================================== Description: APCLI MLME Auth Req timeout state machine procedure ========================================================================== */ static VOID ApCliCtrlAuthReqTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MLME_AUTH_REQ_STRUCT AuthReq; PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; UINT *failureConntCnter = &pAd->ApCfg.ApCliTab[ifIndex].FailConntCounter; DBGPRINT(RT_DEBUG_TRACE, ("(%s) Auth Req Timeout.\n", __FUNCTION__)); if (ifIndex >= MAX_APCLI_NUM) return; (*failureConntCnter)++; ApCliCtrlCntFailPrint(*failureConntCnter,"Connect to access-point with wrong password."); pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; pApCliEntry->AuthReqCnt++; if (pApCliEntry->AuthReqCnt > 5) { *pCurrState = APCLI_CTRL_DISCONNECTED; NdisZeroMemory(pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pAd->ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID); pApCliEntry->AuthReqCnt = 0; return; } /* stay in same state. */ *pCurrState = APCLI_CTRL_AUTH; /* retry Authentication. */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Retry Auth Req.\n", __FUNCTION__)); COPY_MAC_ADDR(AuthReq.Addr, pAd->ApCliMlmeAux.Bssid); AuthReq.Alg = pAd->ApCliMlmeAux.Alg; /*Ndis802_11AuthModeOpen; */ AuthReq.Timeout = AUTH_TIMEOUT; MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_AUTH_REQ, sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex); return; }
static VOID P2PDiscSearchAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { P2P_DISC_STATE *pCurrState = &(pAd->P2pCfg.DiscCurrentState); PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; MLME_SCAN_REQ_STRUCT ScanReq; if (pP2PCtrl->P2pCounter.bStartScan) { DBGPRINT(RT_DEBUG_INFO, ("%s::\n", __FUNCTION__)); ScanParmFill(pAd, &ScanReq, "", 0, BSS_ANY, SCAN_P2P_SEARCH); MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0); pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; *pCurrState = P2P_DISC_SEARCH; } }