📄 wmgr.c
字号:
IN PWLAN_FR_AUTHEN pFrame ){ if ( cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){ DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (SHAREDKEY) Successful.\n"); pMgmt->eCurrState = WMAC_STATE_AUTH; } else{ DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (SHAREDKEY) Failed.\n"); s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))) ); pMgmt->eCurrState = WMAC_STATE_IDLE; } if ( pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) {// spin_unlock_irq(&pDevice->lock);// vCommandTimerWait((HANDLE)pDevice, 0);// spin_lock_irq(&pDevice->lock); } }/*+ * * Routine Description: * Handles incoming disassociation frames * * * Return Value: * None. *-*/staticVOIDs_vMgrRxDisassociation( IN PSDevice pDevice, IN PSMgmtObject pMgmt, IN PSRxMgmtPacket pRxPacket ){ WLAN_FR_DISASSOC sFrame; UINT uNodeIndex = 0; CMD_STATUS CmdStatus; viawget_wpa_header *wpahdr; if ( pMgmt->eCurrMode == WMAC_MODE_ESS_AP ){ // if is acting an AP.. // a STA is leaving this BSS.. sFrame.len = pRxPacket->cbMPDULen; sFrame.pBuf = (PBYTE)pRxPacket->p80211Header; if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) { BSSvRemoveOneNode(pDevice, uNodeIndex); } else { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx disassoc, sta not found\n"); } } else if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA ){ sFrame.len = pRxPacket->cbMPDULen; sFrame.pBuf = (PBYTE)pRxPacket->p80211Header; vMgrDecodeDisassociation(&sFrame); DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP disassociated me, reason=%d.\n", cpu_to_le16(*(sFrame.pwReason))); //TODO: do something let upper layer know or //try to send associate packet again because of inactivity timeout if (pMgmt->eCurrState == WMAC_STATE_ASSOC) { vMgrReAssocBeginSta((PSDevice)pDevice, pMgmt, &CmdStatus); }; if ((pDevice->bWPADevEnable) && (pDevice->skb != NULL)) { wpahdr = (viawget_wpa_header *)pDevice->skb->data; wpahdr->type = VIAWGET_DISASSOC_MSG; wpahdr->resp_ie_len = 0; wpahdr->req_ie_len = 0; skb_put(pDevice->skb, sizeof(viawget_wpa_header)); pDevice->skb->dev = pDevice->wpadev;//2008-4-3 modify by Chester for wpa #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) pDevice->skb->mac_header = pDevice->skb->data;#else pDevice->skb->mac.raw = pDevice->skb->data;#endif pDevice->skb->pkt_type = PACKET_HOST; pDevice->skb->protocol = htons(ETH_P_802_2); memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb)); netif_rx(pDevice->skb); pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz); }; #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT // if(pDevice->bWPASuppWextEnabled == TRUE) { union iwreq_data wrqu; memset(&wrqu, 0, sizeof (wrqu)); wrqu.ap_addr.sa_family = ARPHRD_ETHER; printk("wireless_send_event--->SIOCGIWAP(disassociated)\n"); wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL); } #endif } /* else, ignore it */ return;}/*+ * * Routine Description: * Handles incoming deauthentication frames * * * Return Value: * None. *-*/staticVOID s_vMgrRxDeauthentication( IN PSDevice pDevice, IN PSMgmtObject pMgmt, IN PSRxMgmtPacket pRxPacket ){ WLAN_FR_DEAUTHEN sFrame; UINT uNodeIndex = 0; viawget_wpa_header *wpahdr; if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP ){ //Todo: // if is acting an AP.. // a STA is leaving this BSS.. sFrame.len = pRxPacket->cbMPDULen; sFrame.pBuf = (PBYTE)pRxPacket->p80211Header; if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) { BSSvRemoveOneNode(pDevice, uNodeIndex); } else { DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Rx deauth, sta not found\n"); } } else { if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA ) { sFrame.len = pRxPacket->cbMPDULen; sFrame.pBuf = (PBYTE)pRxPacket->p80211Header; vMgrDecodeDeauthen(&sFrame); DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP deauthed me, reason=%d.\n", cpu_to_le16((*(sFrame.pwReason)))); // TODO: update BSS list for specific BSSID if pre-authentication case if (IS_ETH_ADDRESS_EQUAL(sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID)) { if (pMgmt->eCurrState >= WMAC_STATE_AUTHPENDING) { pMgmt->sNodeDBTable[0].bActive = FALSE; pMgmt->eCurrMode = WMAC_MODE_STANDBY; pMgmt->eCurrState = WMAC_STATE_IDLE; netif_stop_queue(pDevice->dev); pDevice->bLinkPass = FALSE; ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW); } }; if ((pDevice->bWPADevEnable) && (pDevice->skb != NULL)) { wpahdr = (viawget_wpa_header *)pDevice->skb->data; wpahdr->type = VIAWGET_DISASSOC_MSG; wpahdr->resp_ie_len = 0; wpahdr->req_ie_len = 0; skb_put(pDevice->skb, sizeof(viawget_wpa_header)); pDevice->skb->dev = pDevice->wpadev;//2008-4-3 modify by Chester for wpa #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) pDevice->skb->mac_header = pDevice->skb->data;#else pDevice->skb->mac.raw = pDevice->skb->data;#endif pDevice->skb->pkt_type = PACKET_HOST; pDevice->skb->protocol = htons(ETH_P_802_2); memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb)); netif_rx(pDevice->skb); pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz); }; #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT // if(pDevice->bWPASuppWextEnabled == TRUE) { union iwreq_data wrqu; memset(&wrqu, 0, sizeof (wrqu)); wrqu.ap_addr.sa_family = ARPHRD_ETHER; printk("wireless_send_event--->SIOCGIWAP(disauthen)\n"); wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL); } #endif } /* else, ignore it. TODO: IBSS authentication service would be implemented here */ }; return;}/*+ * * Routine Description: * Handles and analysis incoming beacon frames. * * * Return Value: * None. *-*/staticVOIDs_vMgrRxBeacon( IN PSDevice pDevice, IN PSMgmtObject pMgmt, IN PSRxMgmtPacket pRxPacket, IN BOOL bInScan ){ PKnownBSS pBSSList; WLAN_FR_BEACON sFrame; QWORD qwTSFOffset; BOOL bIsBSSIDEqual = FALSE; BOOL bIsSSIDEqual = FALSE; BOOL bTSFLargeDiff = FALSE; BOOL bTSFOffsetPostive = FALSE; BOOL bUpdateTSF = FALSE; BOOL bIsAPBeacon = FALSE; BOOL bIsChannelEqual = FALSE; UINT uLocateByteIndex; BYTE byTIMBitOn = 0; WORD wAIDNumber = 0; UINT uNodeIndex; QWORD qwTimestamp, qwLocalTSF; QWORD qwCurrTSF; WORD wStartIndex = 0; WORD wAIDIndex = 0; BYTE byCurrChannel = pRxPacket->byRxChannel; ERPObject sERP; UINT uRateLen = WLAN_RATES_MAXLEN; BOOL bChannelHit = FALSE; BYTE byOldPreambleType; if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) return; memset(&sFrame, 0, sizeof(WLAN_FR_BEACON)); sFrame.len = pRxPacket->cbMPDULen; sFrame.pBuf = (PBYTE)pRxPacket->p80211Header; // decode the beacon frame vMgrDecodeBeacon(&sFrame); if ((sFrame.pwBeaconInterval == 0) || (sFrame.pwCapInfo == 0) || (sFrame.pSSID == 0) || (sFrame.pSuppRates == 0) ) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx beacon frame error\n"); return; }; if( byCurrChannel > CB_MAX_CHANNEL_24G ) { if (sFrame.pDSParms != NULL) { if (byCurrChannel == RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1]) bChannelHit = TRUE; byCurrChannel = RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1]; } else { bChannelHit = TRUE; } } else { if (sFrame.pDSParms != NULL) { if (byCurrChannel == sFrame.pDSParms->byCurrChannel) bChannelHit = TRUE; byCurrChannel = sFrame.pDSParms->byCurrChannel; } else { bChannelHit = TRUE; } } if (sFrame.pERP != NULL) { sERP.byERP = sFrame.pERP->byContext; sERP.bERPExist = TRUE; } else { sERP.bERPExist = FALSE; sERP.byERP = 0; } pBSSList = BSSpAddrIsInBSSList((HANDLE)pDevice, sFrame.pHdr->sA3.abyAddr3, sFrame.pSSID); if (pBSSList == NULL) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Beacon/insert: RxChannel = : %d\n", byCurrChannel); BSSbInsertToBSSList((HANDLE)pDevice, sFrame.pHdr->sA3.abyAddr3, *sFrame.pqwTimestamp, *sFrame.pwBeaconInterval, *sFrame.pwCapInfo, byCurrChannel, sFrame.pSSID, sFrame.pSuppRates, sFrame.pExtSuppRates, &sERP, sFrame.pRSN, sFrame.pRSNWPA, sFrame.pIE_Country, sFrame.pIE_Quiet, sFrame.len - WLAN_HDR_ADDR3_LEN, sFrame.pHdr->sA4.abyAddr4, // payload of beacon (HANDLE)pRxPacket ); } else {// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"update bcn: RxChannel = : %d\n", byCurrChannel); BSSbUpdateToBSSList((HANDLE)pDevice, *sFrame.pqwTimestamp, *sFrame.pwBeaconInterval, *sFrame.pwCapInfo, byCurrChannel, bChannelHit, sFrame.pSSID, sFrame.pSuppRates, sFrame.pExtSuppRates, &sERP, sFrame.pRSN, sFrame.pRSNWPA, sFrame.pIE_Country, sFrame.pIE_Quiet, pBSSList, sFrame.len - WLAN_HDR_ADDR3_LEN, sFrame.pHdr->sA4.abyAddr4, // payload of probresponse (HANDLE)pRxPacket ); } if (bInScan) { return; } if(byCurrChannel == (BYTE)pMgmt->uCurrChannel) bIsChannelEqual = TRUE; if (bIsChannelEqual && (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) { // if rx beacon without ERP field if (sERP.bERPExist) { if (WLAN_GET_ERP_USE_PROTECTION(sERP.byERP)){ pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1); pDevice->wUseProtectCntDown = USE_PROTECT_PERIOD; } } else { pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1); pDevice->wUseProtectCntDown = USE_PROTECT_PERIOD; } if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { if(!WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo)) pDevice->byERPFlag |= WLAN_SET_ERP_BARKER_MODE(1); if(!sERP.bERPExist) pDevice->byERPFlag |= WLAN_SET_ERP_NONERP_PRESENT(1); } } // check if BSSID the same if (memcmp(sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN) == 0) { bIsBSSIDEqual = TRUE; pDevice->uCurrRSSI = pRxPacket->uRSSI; pDevice->byCurrSQ = pRxPacket->bySQ; if (pMgmt->sNodeDBTable[0].uInActiveCount != 0) { pMgmt->sNodeDBTable[0].uInActiveCount = 0; //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BCN:Wake Count= [%d]\n", pMgmt->wCountToWakeUp); } } // check if SSID the same if (sFrame.pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) { if (memcmp(sFrame.pSSID->abySSID, ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->abySSID, sFrame.pSSID->len ) == 0) { bIsSSIDEqual = TRUE; }; } if ((WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)== TRUE) && (bIsB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -