📄 assoc.c
字号:
else { DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerDisassocAction() sanity check fail\n")); }}/* ========================================================================== Description: what the state machine will do after assoc timeout Parameters: Elme - IRQL = DISPATCH_LEVEL ========================================================================== */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: what the state machine will do after reassoc timeout IRQL = DISPATCH_LEVEL ========================================================================== */VOID ReassocTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT Status; DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - ReassocTimeoutAction\n")); pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; Status = MLME_REJ_TIMEOUT; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status);}/* ========================================================================== Description: what the state machine will do after disassoc timeout IRQL = DISPATCH_LEVEL ========================================================================== */VOID DisassocTimeoutAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT Status; DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - DisassocTimeoutAction\n")); pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; Status = MLME_SUCCESS; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status);}VOID InvalidStateWhenAssoc( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT Status; DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - InvalidStateWhenAssoc(state=%ld), reset ASSOC state machine\n", pAd->Mlme.AssocMachine.CurrState)); pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; Status = MLME_STATE_MACHINE_REJECT; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status);}VOID InvalidStateWhenReassoc( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT Status; DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - InvalidStateWhenReassoc(state=%ld), reset ASSOC state machine\n", pAd->Mlme.AssocMachine.CurrState)); pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; Status = MLME_STATE_MACHINE_REJECT; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status);}VOID InvalidStateWhenDisassociate( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT Status; DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - InvalidStateWhenDisassoc(state=%ld), reset ASSOC state machine\n", pAd->Mlme.AssocMachine.CurrState)); pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; Status = MLME_STATE_MACHINE_REJECT; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status);}/* ========================================================================== Description: right part of IEEE 802.11/1999 page 374 Note: This event should never cause ASSOC state machine perform state transition, and has no relationship with CNTL machine. So we separate this routine as a service outside of ASSOC state transition table. IRQL = DISPATCH_LEVEL ========================================================================== */VOID Cls3errAction( IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr) { HEADER_802_11 DisassocHdr; PHEADER_802_11 pDisassocHdr; PUCHAR pOutBuffer = NULL; ULONG FrameLen = 0; NDIS_STATUS NStatus; USHORT Reason = REASON_CLS3ERR; NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory if (NStatus != NDIS_STATUS_SUCCESS) return; DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Class 3 Error, Send DISASSOC frame\n")); MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pAddr, pAd->CommonCfg.Bssid); // patch peap ttls switching issue MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11),&DisassocHdr, 2, &Reason, END_OF_ARGS); MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); // To patch Instance and Buffalo(N) AP // Driver has to send deauth to Instance AP, but Buffalo(N) needs to send disassoc to reset Authenticator's state machine // Therefore, we send both of them. pDisassocHdr = (PHEADER_802_11)pOutBuffer; pDisassocHdr->FC.SubType = SUBTYPE_DEAUTH; MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); pAd->StaCfg.DisassocReason = REASON_CLS3ERR; COPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pAddr);} /* ========================================================================== Description: Switch between WEP and CKIP upon new association up. Parameters: IRQL = DISPATCH_LEVEL ========================================================================== */VOID SwitchBetweenWepAndCkip( IN PRTMP_ADAPTER pAd){ int i; SHAREDKEY_MODE_STRUC csr1; // if KP is required. change the CipherAlg in hardware shard key table from WEP // to CKIP. else remain as WEP if (pAd->StaCfg.bCkipOn && (pAd->StaCfg.CkipFlag & 0x10)) { // modify hardware key table so that MAC use correct algorithm to decrypt RX RTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE, &csr1.word); if (csr1.field.Bss0Key0CipherAlg == CIPHER_WEP64) csr1.field.Bss0Key0CipherAlg = CIPHER_CKIP64; else if (csr1.field.Bss0Key0CipherAlg == CIPHER_WEP128) csr1.field.Bss0Key0CipherAlg = CIPHER_CKIP128; if (csr1.field.Bss0Key1CipherAlg == CIPHER_WEP64) csr1.field.Bss0Key1CipherAlg = CIPHER_CKIP64; else if (csr1.field.Bss0Key1CipherAlg == CIPHER_WEP128) csr1.field.Bss0Key1CipherAlg = CIPHER_CKIP128; if (csr1.field.Bss0Key2CipherAlg == CIPHER_WEP64) csr1.field.Bss0Key2CipherAlg = CIPHER_CKIP64; else if (csr1.field.Bss0Key2CipherAlg == CIPHER_WEP128) csr1.field.Bss0Key2CipherAlg = CIPHER_CKIP128; if (csr1.field.Bss0Key3CipherAlg == CIPHER_WEP64) csr1.field.Bss0Key3CipherAlg = CIPHER_CKIP64; else if (csr1.field.Bss0Key3CipherAlg == CIPHER_WEP128) csr1.field.Bss0Key3CipherAlg = CIPHER_CKIP128; RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE, csr1.word); DBGPRINT(RT_DEBUG_TRACE, ("SwitchBetweenWepAndCkip: modify BSS0 cipher to %s\n", CipherName[csr1.field.Bss0Key0CipherAlg])); // modify software key table so that driver can specify correct algorithm in TXD upon TX for (i=0; i<SHARE_KEY_NUM; i++) { if (pAd->SharedKey[BSS0][i].CipherAlg == CIPHER_WEP64) pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_CKIP64; else if (pAd->SharedKey[BSS0][i].CipherAlg == CIPHER_WEP128) pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_CKIP128; } } // else if KP NOT inused. change the CipherAlg in hardware shard key table from CKIP // to WEP. else { // modify hardware key table so that MAC use correct algorithm to decrypt RX RTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE, &csr1.word); if (csr1.field.Bss0Key0CipherAlg == CIPHER_CKIP64) csr1.field.Bss0Key0CipherAlg = CIPHER_WEP64; else if (csr1.field.Bss0Key0CipherAlg == CIPHER_CKIP128) csr1.field.Bss0Key0CipherAlg = CIPHER_WEP128; if (csr1.field.Bss0Key1CipherAlg == CIPHER_CKIP64) csr1.field.Bss0Key1CipherAlg = CIPHER_WEP64; else if (csr1.field.Bss0Key1CipherAlg == CIPHER_CKIP128) csr1.field.Bss0Key1CipherAlg = CIPHER_WEP128; if (csr1.field.Bss0Key2CipherAlg == CIPHER_CKIP64) csr1.field.Bss0Key2CipherAlg = CIPHER_WEP64; else if (csr1.field.Bss0Key2CipherAlg == CIPHER_CKIP128) csr1.field.Bss0Key2CipherAlg = CIPHER_WEP128; if (csr1.field.Bss0Key3CipherAlg == CIPHER_CKIP64) csr1.field.Bss0Key3CipherAlg = CIPHER_WEP64; else if (csr1.field.Bss0Key3CipherAlg == CIPHER_CKIP128) csr1.field.Bss0Key3CipherAlg = CIPHER_WEP128; // modify software key table so that driver can specify correct algorithm in TXD upon TX for (i=0; i<SHARE_KEY_NUM; i++) { if (pAd->SharedKey[BSS0][i].CipherAlg == CIPHER_CKIP64) pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_WEP64; else if (pAd->SharedKey[BSS0][i].CipherAlg == CIPHER_CKIP128) pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_WEP128; } // // On WPA-NONE, must update CipherAlg. // Because the OID_802_11_WEP_STATUS was been set after OID_802_11_ADD_KEY // and CipherAlg will be CIPHER_NONE by Windows ZeroConfig. // So we need to update CipherAlg after connect. // if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) { for (i = 0; i < SHARE_KEY_NUM; i++) { if (pAd->SharedKey[BSS0][i].KeyLen != 0) { if (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) { pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_TKIP; } else if (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) { pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_AES; } } else { pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_NONE; } } csr1.field.Bss0Key0CipherAlg = pAd->SharedKey[BSS0][0].CipherAlg; csr1.field.Bss0Key1CipherAlg = pAd->SharedKey[BSS0][1].CipherAlg; csr1.field.Bss0Key2CipherAlg = pAd->SharedKey[BSS0][2].CipherAlg; csr1.field.Bss0Key3CipherAlg = pAd->SharedKey[BSS0][3].CipherAlg; } RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE, csr1.word); DBGPRINT(RT_DEBUG_TRACE, ("SwitchBetweenWepAndCkip: modify BSS0 cipher to %s\n", CipherName[csr1.field.Bss0Key0CipherAlg])); }}#ifdef WPA_SUPPLICANT_SUPPORT#ifndef NATIVE_WPA_SUPPLICANT_SUPPORTVOID SendAssocIEsToWpaSupplicant( IN PRTMP_ADAPTER pAd){ union iwreq_data wrqu; unsigned char custom[IW_CUSTOM_MAX] = {0}; if ((pAd->StaCfg.ReqVarIELen + 17) <= IW_CUSTOM_MAX) { sprintf(custom, "ASSOCINFO_ReqIEs="); NdisMoveMemory(custom+17, pAd->StaCfg.ReqVarIEs, pAd->StaCfg.ReqVarIELen); memset(&wrqu, 0, sizeof(wrqu)); wrqu.data.length = pAd->StaCfg.ReqVarIELen + 17; wrqu.data.flags = RT_REQIE_EVENT_FLAG; wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, custom); memset(&wrqu, 0, sizeof(wrqu)); wrqu.data.flags = RT_ASSOCINFO_EVENT_FLAG; wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL); } else DBGPRINT(RT_DEBUG_TRACE, ("pAd->StaCfg.ReqVarIELen + 17 > MAX_CUSTOM_LEN\n")); return;}#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //#endif // WPA_SUPPLICANT_SUPPORT //#ifdef NATIVE_WPA_SUPPLICANT_SUPPORTint wext_notify_event_assoc( IN RTMP_ADAPTER *pAd){ union iwreq_data wrqu; char custom[IW_CUSTOM_MAX] = {0};#if WIRELESS_EXT > 17 if (pAd->StaCfg.ReqVarIELen <= IW_CUSTOM_MAX) { wrqu.data.length = pAd->StaCfg.ReqVarIELen; memcpy(custom, pAd->StaCfg.ReqVarIEs, pAd->StaCfg.ReqVarIELen); wireless_send_event(pAd->net_dev, IWEVASSOCREQIE, &wrqu, custom); } else DBGPRINT(RT_DEBUG_TRACE, ("pAd->StaCfg.ReqVarIELen > MAX_CUSTOM_LEN\n"));#else if (((pAd->StaCfg.ReqVarIELen*2) + 17) <= IW_CUSTOM_MAX) { UCHAR idx; wrqu.data.length = (pAd->StaCfg.ReqVarIELen*2) + 17; sprintf(custom, "ASSOCINFO(ReqIEs="); for (idx=0; idx<pAd->StaCfg.ReqVarIELen; idx++) sprintf(custom, "%s%02x", custom, pAd->StaCfg.ReqVarIEs[idx]); wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, custom); } else DBGPRINT(RT_DEBUG_TRACE, ("(pAd->StaCfg.ReqVarIELen*2) + 17 > MAX_CUSTOM_LEN\n"));#endif return 0; }#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //BOOLEAN StaAddMacTableEntry( IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, IN UCHAR MaxSupportedRateIn500Kbps, IN HT_CAPABILITY_IE *pHtCapability, IN UCHAR HtCapabilityLen, IN USHORT CapabilityInfo){ UCHAR MaxSupportedRate = RATE_11; if (ADHOC_ON(pAd)) CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); switch (MaxSupportedRateIn500Kbps) { case 108: MaxSupportedRate = RATE_54; break; case 96: MaxSupportedRate = RATE_48; break; case 72: MaxSupportedRate = RATE_36; break; case 48: MaxSupportedRate = RATE_24; break; case 36: MaxSupportedRate = RATE_18; break; case 24: MaxSupportedRate = RATE_12; break; case 18: MaxSupportedRate = RATE_9; break; case 12: MaxSup
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -