/* ========================================================================== 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; DBGPRINT(RT_DEBUG_TRACE, ("ApCli SYNC - ApCliMlmeProbeReqAction(Ssid %s)\n", Info->Ssid)); /* reset all the timers */ RTMPCancelTimer(&pAd->ApCliMlmeAux.ProbeTimer, &Cancelled); pAd->ApCliMlmeAux.Rssi = -9999; pAd->ApCliMlmeAux.Channel = pAd->CommonCfg.Channel; pAd->ApCliMlmeAux.SupRateLen = pAd->CommonCfg.SupRateLen; NdisMoveMemory(pAd->ApCliMlmeAux.SupRate, pAd->CommonCfg.SupRate, pAd->CommonCfg.SupRateLen); /* Prepare the default value for extended rate */ pAd->ApCliMlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen; NdisMoveMemory(pAd->ApCliMlmeAux.ExtRate, pAd->CommonCfg.ExtRate, pAd->CommonCfg.ExtRateLen); RTMPSetTimer(&pAd->ApCliMlmeAux.ProbeTimer, PROBE_TIMEOUT); ApCliEnqueueProbeRequest(pAd, Info->SsidLen, (PCHAR) Info->Ssid, ifIndex); DBGPRINT(RT_DEBUG_TRACE, ("ApCli SYNC - Start Probe the SSID %s on channel =%d\n", pAd->ApCliMlmeAux.Ssid, pAd->ApCliMlmeAux.Channel)); *pCurrState = APCLI_JOIN_WAIT_PROBE_RSP; return; }
VOID RT28xxUsbStaAsicForceWakeup( IN PRTMP_ADAPTER pAd, IN BOOLEAN bFromTx) { BOOLEAN Canceled; if (pAd->Mlme.AutoWakeupTimerRunning) { if ( !OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) ) { return; } RTMPCancelTimer(&pAd->Mlme.AutoWakeupTimer, &Canceled); pAd->Mlme.AutoWakeupTimerRunning = FALSE; } #ifdef MT7601 if ( IS_MT7601(pAd) ) { ASIC_RADIO_ON(pAd, DOT11_RADIO_ON); } else #endif /* MT7601 */ { AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02, FALSE); } OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); }
VOID P2pPeerGoNegoReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { if (pAd->P2pCfg.GoFormCurrentState != P2P_GO_FORM_IDLE && pAd->P2pCfg.GoFormCurrentState != P2P_WAIT_GO_FORM_CONF ) return; P2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState); PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; if ( pP2PCtrl->bProvAutoRsp == FALSE ) { BOOLEAN Cancelled; if (pP2PCtrl->bP2pReSendTimerRunning) { pP2PCtrl->bP2pReSendTimerRunning = FALSE; pAd->P2pTable.Client[pP2PCtrl->P2pProvIndex].ReTransmitCnt = 0; RTMPCancelTimer(&pP2PCtrl->P2pReSendTimer, &Cancelled); } pP2PCtrl->P2pProvIndex = P2P_NOT_FOUND; pP2PCtrl->P2pProvUserNotify = FALSE; pAd->P2pCfg.P2pCounter.UserAccept = 0; } /* Skip auto scan conn in STAMlmePeriodicExec */ pAd->StaCfg.bSkipAutoScanConn = TRUE; P2pReceGoNegoReqAction(pAd, Elem); *pCurrState = P2P_WAIT_GO_FORM_CONF; }
/* ========================================================================== Description: ========================================================================== */ 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]; 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); if(Status != MLME_SUCCESS) { pAd->PortCfg.AuthFailReason = Status; COPY_MAC_ADDR(pAd->PortCfg.AuthFailSta, Addr2); } pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); } } else { DBGPRINT(RT_DEBUG_TRACE, "AUTH - PeerAuthRspAtSeq4Action() sanity check fail\n"); } }
/* Device Discovery Action */ static VOID P2PDiscScanAction( 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; BOOLEAN Cancelled; DBGPRINT(RT_DEBUG_TRACE, ("%s::\n", __FUNCTION__)); /* If I just finish group formation as GO. don't do scan . If I am auto GO, I should support P2P scan too. So check GoIntentIdx != 16. */ if ((pP2PCtrl->P2PConnectState == P2P_ANY_IN_FORMATION_AS_GO) && (pP2PCtrl->GoIntentIdx <= 15)) { pP2PCtrl->P2pCounter.Counter100ms = 0; } /* Stop Scan and resume */ if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) { /*pAd->StaCfg.bSkipAutoScanConn = TRUE;*/ RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled); pAd->MlmeAux.Channel = 0; ScanNextChannel(pAd, OPMODE_STA); } /* Scan Type is SCAN_P2P for SYNC State Machine */ ScanParmFill(pAd, &ScanReq, "", 0, BSS_ANY, SCAN_P2P); 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_SCAN; /* pAd->StaCfg.bSkipAutoScanConn = FALSE;*/ }
static VOID MeshPeerUcgWhenActivated( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MESH_CTRL_STATE *pCurrState = &(pAd->MeshTab.CtrlCurrentState); BOOLEAN Cancelled; PMESH_CH_SW_ANN_MSG_STRUCT pInfo = (PMESH_CH_SW_ANN_MSG_STRUCT)(Elem->Msg); UINT32 NewCPI = pInfo->NewCPI; PUCHAR pMeshSA = pInfo->MeshSA; DBGPRINT(RT_DEBUG_TRACE, ("%s: Get UCG evt when Activated.\n", __FUNCTION__)); if ((NewCPI < pAd->MeshTab.CPI) || ((NewCPI == pAd->MeshTab.CPI) && (memcmp(pAd->MeshTab.CurrentAddress, pMeshSA, MAC_ADDR_LEN) >= 0)) ) { return; } RTMPCancelTimer(&pAd->MeshTab.PldTimer, &Cancelled); MeshPeerUcgWhenUcg(pAd, Elem); *pCurrState = MESH_CTRL_UCG; return; }
void PeerAuthRspAtSeq4Action(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem) { u8 Addr2[MAC_ADDR_LEN]; u16 Alg, Seq, Status; char ChlgText[CIPHER_TEXT_LEN]; BOOLEAN TimerCancelled; 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); } pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); } } else { DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthRspAtSeq4Action() sanity check fail\n")); } }
/* ========================================================================== Description: peer sends reassoc rsp Parametrs: Elem - MLME message cntaining the received frame ========================================================================== */ VOID PeerReassocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT CapabilityInfo; USHORT Status; USHORT Aid; UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; UCHAR Addr2[MAC_ADDR_LEN]; EDCA_PARM EdcaParm; BOOLEAN TimerCancelled; #ifdef RALINK_WPA_SUPPLICANT_SUPPORT union iwreq_data wrqu; #endif if(PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, &EdcaParm)) { if(MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) // The frame is for me ? { DBGPRINT(RT_DEBUG_TRACE, "ASSOC - receive REASSOC_RSP to me (status=%d)\n", Status); RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer,&TimerCancelled); if(Status == MLME_SUCCESS) { // go to procedure listed on page 376 AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen, &EdcaParm); #ifdef RALINK_WPA_SUPPLICANT_SUPPORT if (pAd->PortCfg.WPA_Supplicant == TRUE) { //collect associate info link_status_handler(pAd); //send associnfo event to wpa_supplicant memset(&wrqu, 0, sizeof(wrqu)); wrqu.data.flags = RT_ASSOC_EVENT_FLAG; wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL); } DBGPRINT(RT_DEBUG_OFF, "ASSOC - receive REASSOC_RSP to me (status=%d)\n", Status); #endif #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT if (pAd->PortCfg.bNativeWpa == TRUE) // add by johnli wext_notify_event_assoc(pAd, SIOCGIWAP, TRUE); #endif // NATIVE_WPA_SUPPLICANT_SUPPORT } pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status); } } else { DBGPRINT(RT_DEBUG_TRACE, "ASSOC - PeerReassocRspAction() sanity check fail\n"); } }
VOID PMF_PeerSAQueryRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Action = Elem->Msg[LENGTH_802_11+1]; if (Action == ACTION_SAQ_RESPONSE) { PMAC_TABLE_ENTRY pEntry; PFRAME_802_11 pHeader; USHORT TransactionID; BOOLEAN Cancelled; DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s : Receive SA Query Response\n", __FUNCTION__)); pHeader = (PFRAME_802_11) Elem->Msg; #ifdef CONFIG_AP_SUPPORT pEntry = MacTableLookup(pAd, pHeader->Hdr.Addr2); #endif /* CONFIG_AP_SUPPORT */ if (!pEntry) { DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s : Entry is not found, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", __FUNCTION__, PRINT_MAC(pHeader->Hdr.Addr2))); return; } if (!(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_PMF_CAPABLE))) { DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s : Entry is not PMF capable, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", __FUNCTION__, PRINT_MAC(pHeader->Hdr.Addr2))); return; } NdisMoveMemory(&TransactionID, &Elem->Msg[LENGTH_802_11+2], sizeof(USHORT)); if (pEntry->TransactionID == TransactionID) { pEntry->SAQueryStatus = SAQ_IDLE; RTMPCancelTimer(&pEntry->SAQueryTimer, &Cancelled); RTMPCancelTimer(&pEntry->SAQueryConfirmTimer, &Cancelled); DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s - Compare TransactionID correctly, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", __FUNCTION__, PRINT_MAC(pHeader->Hdr.Addr2))); } else { DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s - Compare TransactionID wrong, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", __FUNCTION__, PRINT_MAC(pHeader->Hdr.Addr2))); } } }
/* ========================================================================== Description: peer sends assoc rsp back Parameters: Elme - MLME message containing the received frame ========================================================================== */ static VOID ApCliPeerAssocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; USHORT CapabilityInfo, Status, Aid; UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; UCHAR Addr2[MAC_ADDR_LEN]; EDCA_PARM EdcaParm; UCHAR CkipFlag; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; HT_CAPABILITY_IE HtCapability; ADD_HT_INFO_IE AddHtInfo; /* AP might use this additional ht info IE */ UCHAR HtCapabilityLen; UCHAR AddHtInfoLen; UCHAR NewExtChannelOffset = 0xff; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; if (ApCliPeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, &HtCapability, &AddHtInfo, &HtCapabilityLen,&AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, &CkipFlag)) { /* The frame is for me ? */ if(MAC_ADDR_EQUAL(Addr2, pAd->ApCliMlmeAux.Bssid)) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status)); RTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, &Cancelled); if(Status == MLME_SUCCESS) { /* go to procedure listed on page 376 */ ApCliAssocPostProc(pAd, Addr2, CapabilityInfo, ifIndex, SupRate, SupRateLen, ExtRate, ExtRateLen, &EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo); ApCliCtrlMsg.Status = MLME_SUCCESS; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } else { ApCliCtrlMsg.Status = Status; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } *pCurrState = APCLI_ASSOC_IDLE; } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliPeerAssocRspAction() sanity check fail\n")); } return; }
static INT mac_entry_reset(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, BOOLEAN clean) { BOOLEAN Cancelled; RTMPCancelTimer(&pEntry->RetryTimer, &Cancelled); RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled); NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY)); if (clean == TRUE) { pEntry->MaxSupportedRate = RATE_11; pEntry->CurrTxRate = RATE_11; NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY)); pEntry->PairwiseKey.KeyLen = 0; pEntry->PairwiseKey.CipherAlg = CIPHER_NONE; } return 0; }
void RT28xxUsbStaAsicForceWakeup(struct rt_rtmp_adapter *pAd, IN BOOLEAN bFromTx) { BOOLEAN Canceled; if (pAd->Mlme.AutoWakeupTimerRunning) RTMPCancelTimer(&pAd->Mlme.AutoWakeupTimer, &Canceled); AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02); OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); }
VOID RTMPIdsStop( IN PRTMP_ADAPTER pAd) { BOOLEAN Cancelled; if (pAd->ApCfg.IDSTimerRunning == TRUE) { RTMPCancelTimer(&pAd->ApCfg.IDSTimer, &Cancelled); pAd->ApCfg.IDSTimerRunning = FALSE; } }
/* ========================================================================== 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; PAPCLI_STRUCT pApCliEntry = NULL; DBGPRINT(RT_DEBUG_TRACE, ("ApCli SYNC - ApCliMlmeProbeReqAction(Ssid %s), ifIndex = %d\n", Info->Ssid, ifIndex)); if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; /* reset all the timers */ RTMPCancelTimer(&(pApCliEntry->ApCliMlmeAux.ProbeTimer), &Cancelled); pApCliEntry->ApCliMlmeAux.Rssi = -9999; #ifdef APCLI_CONNECTION_TRIAL if (pApCliEntry->TrialCh ==0) #endif pApCliEntry->ApCliMlmeAux.Channel = pAd->CommonCfg.Channel; #ifdef APCLI_CONNECTION_TRIAL else pApCliEntry->ApCliMlmeAux.Channel = pApCliEntry->TrialCh; #endif pApCliEntry->ApCliMlmeAux.SupRateLen = pAd->CommonCfg.SupRateLen; NdisMoveMemory(pApCliEntry->ApCliMlmeAux.SupRate, pAd->CommonCfg.SupRate, pAd->CommonCfg.SupRateLen); /* Prepare the default value for extended rate */ pApCliEntry->ApCliMlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen; NdisMoveMemory(pApCliEntry->ApCliMlmeAux.ExtRate, pAd->CommonCfg.ExtRate, pAd->CommonCfg.ExtRateLen); RTMPSetTimer(&(pApCliEntry->ApCliMlmeAux.ProbeTimer), PROBE_TIMEOUT); #ifdef APCLI_CONNECTION_TRIAL NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Ssid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen); #endif ApCliEnqueueProbeRequest(pAd, Info->SsidLen, (PCHAR) Info->Ssid, ifIndex); DBGPRINT(RT_DEBUG_TRACE, ("ApCli SYNC - Start Probe the SSID %s on channel =%d\n", pApCliEntry->ApCliMlmeAux.Ssid, pApCliEntry->ApCliMlmeAux.Channel)); *pCurrState = APCLI_JOIN_WAIT_PROBE_RSP; return; }
VOID RT28xxUsbStaAsicForceWakeup( IN PRTMP_ADAPTER pAd, IN BOOLEAN bFromTx) { BOOLEAN Canceled; if (pAd->Mlme.AutoWakeupTimerRunning) RTMPCancelTimer(&pAd->Mlme.AutoWakeupTimer, &Canceled); AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02); OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); }
VOID RTUSBHalt( IN PRTMP_ADAPTER pAd, IN BOOLEAN IsFree) { BOOLEAN TimerCancelled; DBGPRINT(RT_DEBUG_TRACE, "====> RTUSBHalt\n"); // // before set flag fRTMP_ADAPTER_HALT_IN_PROGRESS, // we should send a disassoc frame to our AP. // RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); RTUSBCleanUpMLMEWaitQueue(pAd); RTUSBCleanUpMLMEBulkOutQueue(pAd); RTMPCancelTimer(&pAd->PortCfg.QuickResponeForRateUpTimer,&TimerCancelled); RTMPCancelTimer(&pAd->RxAnt.RxAntDiversityTimer,&TimerCancelled); // Free MLME stuff MlmeHalt(pAd); // Sleep 50 milliseconds so pending io might finish normally RTMPusecDelay(50000); // We want to wait until all pending receives and sends to the // device object. We cancel any // irps. Wait until sends and receives have stopped. // RTUSBCancelPendingIRPs(pAd); // Free the entire adapter object ReleaseAdapter(pAd, IsFree, FALSE); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); }
/* ========================================================================== Description: IRQL = PASSIVE_LEVEL ========================================================================== */ VOID TDLS_ChannelSwitchTimeOutAction( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { PRT_802_11_TDLS pTDLS = (PRT_802_11_TDLS)FunctionContext; PRTMP_ADAPTER pAd = pTDLS->pAd; BOOLEAN TimerCancelled; DBGPRINT(RT_DEBUG_WARN, ("TDLS - Failed to wait for channel switch, terminate the channel switch procedure (%02x:%02x:%02x:%02x:%02x:%02x)\n", pTDLS->MacAddr[0], pTDLS->MacAddr[1], pTDLS->MacAddr[2], pTDLS->MacAddr[3], pTDLS->MacAddr[4], pTDLS->MacAddr[5])); { ULONG Now, temp1; NdisGetSystemUpTime(&Now); temp1 = (((Now - pTDLS->ChannelSwitchTimerStartTime) * 1000) / OS_HZ); if (temp1 < (pTDLS->ChSwitchTimeout / 1000)) { RTMPSetTimer(&pTDLS->ChannelSwitchTimeoutTimer, ((pTDLS->ChSwitchTimeout / 1000) - temp1)); return; } if (temp1 < (pTDLS->ChSwitchTimeout / 1000)) { DBGPRINT(RT_DEBUG_OFF, ("Timer = %ld < 11 !!!\n", temp1)); } } RTMPCancelTimer(&pAd->StaCfg.TdlsResponderGoBackBaseChTimer, &TimerCancelled); pAd->StaCfg.bTdlsCurrentDoingChannelSwitchWaitSuccess = FALSE; pAd->StaCfg.bDoingPeriodChannelSwitch = FALSE; RTMPusecDelay(300); NdisGetSystemUpTime(&pAd->StaCfg.TdlsGoBackStartTime); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH); if (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) TDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_ABOVE); else if (pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) TDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_BELOW); else TDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_NONE); TDLS_EnablePktChannel(pAd, TDLS_FIFO_ALL); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH); }
static VOID ApCliMlmeScanReqAction( IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType; /* Suspend MSDU transmission here */ RTMPSuspendMsduTransmission(pAd); /* first check the parameter sanity */ if (MlmeScanReqSanity(pAd, Elem->Msg, Elem->MsgLen, &BssType, (PCHAR)Ssid, &SsidLen, &ScanType)) { DBGPRINT(RT_DEBUG_TRACE, ("%s(): mlme scan req action!\n", __FUNCTION__)); NdisGetSystemUpTime(&pAd->ApCfg.LastScanTime); RTMPCancelTimer(&pAd->MlmeAux.APScanTimer, &Cancelled); /* record desired BSS parameters */ pAd->MlmeAux.BssType = BssType; pAd->MlmeAux.ScanType = ScanType; pAd->MlmeAux.SsidLen = SsidLen; NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen); /* start from the first channel */ #ifdef AP_PARTIAL_SCAN_SUPPORT pAd->MlmeAux.Channel = RTMPFindScanChannel(pAd, 0); #else pAd->MlmeAux.Channel = FirstChannel(pAd); #endif /* AP_PARTIAL_SCAN_SUPPORT */ /* Let BBP register at 20MHz to do scan */ bbp_set_bw(pAd, BW_20); DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BBP R4 to 20MHz.l\n")); #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { if (pAd->ApCfg.bAutoChannelAtBootup == TRUE)/* iwpriv set auto channel selection */ { APAutoChannelInit(pAd); pAd->ApCfg.AutoChannel_Channel = pAd->ChannelList[0].Channel; } #ifdef SMART_MESH Set_Scan_False_CCA(pAd, 0, CCA_RESET); #endif /* SMART_MESH */ } #endif /* CONFIG_AP_SUPPORT */ ScanNextChannel(pAd, OPMODE_AP, INT_APCLI); }
/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ========================================================================== */ VOID PeerDeauthAction( IN PRTMP_ADAPTER pAd, IN PMLME_QUEUE_ELEM Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Reason; if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) { if (INFRA_ON(pAd) && MAC_ADDR_EQUAL(Addr2, pAd->CommonCfg.Bssid)) { DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - receive DE-AUTH from our AP (Reason=%d)\n", Reason)); #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT { union iwreq_data wrqu; memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN); wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL); } #endif // NATIVE_WPA_SUPPLICANT_SUPPORT // // send wireless event - for deauthentication if (pAd->CommonCfg.bWirelessEvent) RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); LinkDown(pAd, TRUE); // Authentication Mode Cisco_LEAP has start a timer // We should cancel it if using LEAP #ifdef LEAP_SUPPORT if (pAd->StaCfg.LeapAuthMode == CISCO_AuthModeLEAP) { RTMPCancelTimer(&pAd->StaCfg.LeapAuthTimer, &TimerCancelled); //Check is it mach the LEAP Authentication failed as possible a Rogue AP //on it's PortSecured not equal to WPA_802_1X_PORT_SECURED while process the Authenticaton. if ((pAd->StaCfg.PortSecured != WPA_802_1X_PORT_SECURED) && (pAd->Mlme.LeapMachine.CurrState != LEAP_IDLE)) { RogueApTableSetEntry(pAd, &pAd->StaCfg.RogueApTab, Addr2, LEAP_REASON_AUTH_TIMEOUT); } } #endif // LEAP_SUPPORT // } } else { DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - PeerDeauthAction() sanity check fail\n")); } }
/* ========================================================================== 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); }
VOID CFG80211DRV_OpsScanInLinkDownAction(struct rtmp_adapter *pAd) { bool Cancelled; DBGPRINT(RT_DEBUG_TRACE, ("---> CFG80211_MLME Disconnect in Scaning, ORI ==> %d\n", (int) pAd->Mlme.CntlMachine.CurrState)); RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled); pAd->MlmeAux.Channel = 0; pAd->cfg80211_ctrl.FlgCfg80211Scanning = false; CFG80211OS_ScanEnd(pAd->pCfg80211_CB, true); ScanNextChannel(pAd, OPMODE_STA); DBGPRINT(RT_DEBUG_TRACE, ("<--- CFG80211_MLME Disconnect in Scan END, ORI ==> %d\n", (int) pAd->Mlme.CntlMachine.CurrState)); }
INT Set_NfcConfigurationToken_Proc( IN RTMP_ADAPTER *pAd, IN PSTRING arg) { POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; PWSC_CTRL pWscCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl; PUCHAR pBuf = NULL; USHORT BufLen = 0; /* Action: b¡¦<7:6>: 0x00 ¡V Request, 0x01 ¡V Notify b¡¦<5:0>: 0x00 ¡V Get, 0x01 - Set */ UCHAR action = 1, type = TYPE_CONFIGURATION; os_alloc_mem(pAd, (UCHAR **)&pBuf, (NFC_WSC_TLV_SIZE*sizeof(UCHAR))); if (pBuf == NULL) { return FALSE; } NfcBuildWscProfileTLV(pAd, pWscCtrl, pBuf, &BufLen); if (pBuf && (BufLen != 0)) { NfcCommand(pAd, action, type, BufLen, pBuf); os_free_mem(NULL, pBuf); } if ((pAd->OpMode == OPMODE_AP) && (pWscCtrl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED)) { pWscCtrl->WscConfStatus = WSC_SCSTATE_CONFIGURED; WscBuildBeaconIE(pAd, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, 0, NULL, 0,AP_MODE); WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, 0, NULL, 0,AP_MODE); APUpdateAllBeaconFrame(pAd); } if (pWscCtrl->WscUpdatePortCfgTimerRunning) { BOOLEAN bCancel; RTMPCancelTimer(&pWscCtrl->WscUpdatePortCfgTimer, &bCancel); } else pWscCtrl->WscUpdatePortCfgTimerRunning = TRUE; RTMPSetTimer(&pWscCtrl->WscUpdatePortCfgTimer, 1000); return TRUE; }
/* ========================================================================== Description: ========================================================================== */ static VOID ApCliPeerAuthRspAtSeq4Action( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; UCHAR Addr2[MAC_ADDR_LEN]; USHORT Alg, Seq, Status; CHAR ChlgText[CIPHER_TEXT_LEN]; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; USHORT ifIndex = (USHORT)(Elem->Priv); PAPCLI_STRUCT pApCliEntry = NULL; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState; if (ifIndex >= MAX_APCLI_NUM) return; if(PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, ChlgText)) { if(MAC_ADDR_EQUAL(pApCliEntry->ApCliMlmeAux.Bssid, Addr2) && Seq == 4) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI AUTH - Receive AUTH_RSP seq#4 to me\n")); RTMPCancelTimer(&pApCliEntry->ApCliMlmeAux.ApCliAuthTimer, &Cancelled); ApCliCtrlMsg.Status = MLME_SUCCESS; if(Status != MLME_SUCCESS) { ApCliCtrlMsg.Status = Status; } *pCurrState = APCLI_AUTH_REQ_IDLE; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI - PeerAuthRspAtSeq4Action() sanity check fail\n")); } return; }
VOID CFG80211DRV_OpsScanInLinkDownAction( VOID *pAdOrg) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; BOOLEAN Cancelled; DBGPRINT(RT_DEBUG_TRACE, ("---> CFG80211_MLME Disconnect in Scaning, ORI ==> %d\n", pAd->Mlme.CntlMachine.CurrState)); RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled); pAd->MlmeAux.Channel = 0; pAd->cfg80211_ctrl.FlgCfg80211Scanning = FALSE; CFG80211OS_ScanEnd(pAd->pCfg80211_CB, TRUE); ScanNextChannel(pAd, OPMODE_STA); DBGPRINT(RT_DEBUG_TRACE, ("<--- CFG80211_MLME Disconnect in Scan END, ORI ==> %d\n", pAd->Mlme.CntlMachine.CurrState)); }
static VOID MeshCtrlDisconnectAtUCGAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MESH_CTRL_STATE *pCurrState = &(pAd->MeshTab.CtrlCurrentState); INT i; BOOLEAN Cancelled; DBGPRINT(RT_DEBUG_TRACE, ("%s: Get Disconnect evt when UCG.\n", __FUNCTION__)); for (i = 0; i < MAX_MESH_LINKS; i++) { MlmeEnqueue(pAd, MESH_LINK_MNG_STATE_MACHINE, MESH_LINK_MNG_CNCL, 0, NULL, i); } RTMPCancelTimer(&pAd->MeshTab.McsTimer, &Cancelled); *pCurrState = MESH_CTRL_IDLE; }
VOID rt2880_module_exit(VOID) { struct net_device *net_dev = rt2880_dev; RTMP_ADAPTER *pAd; if (net_dev == NULL) return; pAd = RTMP_OS_NETDEV_GET_PRIV(net_dev); if (pAd != NULL) { #ifdef WLAN_LED //extern RALINK_TIMER_STRUCT LedCheckTimer; //extern unsigned char CheckTimerEbl; { BOOLEAN Cancelled; RTMPCancelTimer(&LedCheckTimer, &Cancelled); CheckTimerEbl=0; } #endif // WLAN_LED // RtmpPhyNetDevExit(pAd, net_dev); RtmpRaDevCtrlExit(pAd); } else { RtmpOSNetDevDetach(net_dev); } // Free the root net_device. RtmpOSNetDevFree(net_dev); #if defined(CONFIG_RA_CLASSIFIER)&&(!defined(CONFIG_RA_CLASSIFIER_MODULE)) proc_ptr = proc_ralink_wl_video; if(ra_classifier_release_func!=NULL) ra_classifier_release_func(); #endif wl_proc_exit(); }
VOID CFG80211DRV_OpsScanInLinkDownAction( VOID *pAdOrg) { #ifdef CONFIG_STA_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; BOOLEAN Cancelled; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("---> CFG80211_MLME Disconnect in Scaning, ORI ==> %d\n", pAd->Mlme.CntlMachine.CurrState)); RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled); pAd->MlmeAux.Channel = 0; pAd->cfg80211_ctrl.FlgCfg80211Scanning = FALSE; CFG80211OS_ScanEnd(pAd->pCfg80211_CB, TRUE); ScanNextChannel(pAd, OPMODE_STA); MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("<--- CFG80211_MLME Disconnect in Scan END, ORI ==> %d\n", pAd->Mlme.CntlMachine.CurrState)); #endif /* CONFIG_STA_SUPPORT */ }
/* ========================================================================== Description: IRQL = DISPATCH_LEVEL ========================================================================== */ VOID FT_OTA_PeerAuthAckAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Alg, Seq, Status; BOOLEAN TimerCancelled; if (PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, NULL)) { if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && (Alg == AUTH_MODE_FT) && (Seq == 4)) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("FT_OTA_AUTH - Receive FT_OTA_AUTH_ACK to me\n")); RTMPCancelTimer(&pAd->MlmeAux.FtOtaAuthTimer, &TimerCancelled); pAd->StaCfg.Dot11RCommInfo.FtRspSuccess = FT_OTA_RESPONSE; if (Status == MLME_SUCCESS) { /* Retrieve Reassociation Deadline */ /* Check RIC-Response */ } else { pAd->StaCfg.AuthFailReason = Status; COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2); } pAd->Mlme.FtOtaAuthMachine.CurrState = FT_OTA_AUTH_REQ_IDLE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); } } else { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("FT_OTA_AUTH - FT_OTA_PeerAuthAckAction() sanity check fail\n")); } }
static VOID MeshCtrlUcgWhenActivated( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { MESH_CTRL_STATE *pCurrState = &(pAd->MeshTab.CtrlCurrentState); INT i; BOOLEAN Cancelled; UINT8 ChSwCnt = RandomChSwWaitTime(pAd); UINT32 NewCPI = pAd->MeshTab.CPI += RandomByte(pAd); UINT32 ChSwMode = 1; RTMPCancelTimer(&pAd->MeshTab.PldTimer, &Cancelled); RTMPSetTimer(&pAd->MeshTab.McsTimer, ChSwCnt * MESH_TU); /* propagate channel switch announcement to each peer link. */ INC_MESH_SEQ(pAd->MeshTab.MeshSeq); for (i = 0; i < MAX_MESH_LINKS; i++) { if (PeerLinkValidCheck(pAd, i) == TRUE) EnqueChSwAnnouncement( pAd, pAd->MeshTab.MeshLink[i].Entry.PeerMacAddr, pAd->MeshTab.TTL, pAd->MeshTab.MeshSeq, ChSwMode, pAd->MeshTab.MeshChannel, NewCPI, ChSwCnt, pAd->MeshTab.CurrentAddress); } pAd->MeshTab.NewCPI = NewCPI; *pCurrState = MESH_CTRL_UCG; DBGPRINT(RT_DEBUG_TRACE, ("%s: Get UCG evt when Activated.\n", __FUNCTION__)); }
UINT flush_tcp_ack_queue(PRTMP_ADAPTER pAd, PMAC_TABLE_ENTRY pEntry, BOOLEAN bCancelTimer) { PNDIS_PACKET pPacket; BOOLEAN Cancelled; UINT cnt = 0; if (bCancelTimer && pEntry->QueueAckTimerRunning == TRUE) RTMPCancelTimer(&pEntry->QueueAckTimer, &Cancelled); pEntry->QueueAckTimerRunning = FALSE; while (1) { pPacket = skb_dequeue(&pEntry->ack_queue); if (pPacket == NULL) break; cnt++; APSendPacket(pAd, pPacket); } return cnt; }