📄 wmgr.c
字号:
return;}/*+ * * Description:(AP function) * Handle incoming station re-association request frames. * * Parameters: * In: * pMgmt - Management Object structure * pRxPacket - Received Packet * Out: * none * * Return Value: None. *-*/staticVOIDs_vMgrRxReAssocRequest( IN PSDevice pDevice, IN PSMgmtObject pMgmt, IN PSRxMgmtPacket pRxPacket, IN UINT uNodeIndex ){ WLAN_FR_REASSOCREQ sFrame; CMD_STATUS Status; PSTxMgmtPacket pTxPacket; WORD wAssocStatus = 0; WORD wAssocAID = 0; UINT uRateLen = WLAN_RATES_MAXLEN; BYTE abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; BYTE abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP) return; // node index not found if (!uNodeIndex) return; //check if node is authenticated //decode the frame memset(&sFrame, 0, sizeof(WLAN_FR_REASSOCREQ)); sFrame.len = pRxPacket->cbMPDULen; sFrame.pBuf = (PBYTE)pRxPacket->p80211Header; vMgrDecodeReassocRequest(&sFrame); if (pMgmt->sNodeDBTable[uNodeIndex].eNodeState >= NODE_AUTH) { pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_ASSOC; pMgmt->sNodeDBTable[uNodeIndex].wCapInfo = cpu_to_le16(*sFrame.pwCapInfo); pMgmt->sNodeDBTable[uNodeIndex].wListenInterval = cpu_to_le16(*sFrame.pwListenInterval); pMgmt->sNodeDBTable[uNodeIndex].bPSEnable = WLAN_GET_FC_PWRMGT(sFrame.pHdr->sA3.wFrameCtl) ? TRUE : FALSE; // Todo: check sta basic rate, if ap can't support, set status code if (pDevice->byBBType == BB_TYPE_11B) { uRateLen = WLAN_RATES_MAXLEN_11B; } abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES; abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates, (PWLAN_IE_SUPP_RATES)abyCurrSuppRates, uRateLen); abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES; if (pDevice->byBBType == BB_TYPE_11G) { abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pExtSuppRates, (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates, uRateLen); } else { abyCurrExtSuppRates[1] = 0; } RATEvParseMaxRate((PVOID)pDevice, (PWLAN_IE_SUPP_RATES)abyCurrSuppRates, (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates, FALSE, // do not change our basic rate &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate), &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate), &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate), &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate), &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate) ); // set max tx rate pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate = pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate; // Todo: check sta preamble, if ap can't support, set status code pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo); pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo); pMgmt->sNodeDBTable[uNodeIndex].wAID = (WORD)uNodeIndex; wAssocStatus = WLAN_MGMT_STATUS_SUCCESS; wAssocAID = (WORD)uNodeIndex; // if suppurt ERP if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M) pMgmt->sNodeDBTable[uNodeIndex].bERPExist = TRUE; if (pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate <= RATE_11M) { // B only STA join pDevice->bProtectMode = TRUE; pDevice->bNonERPPresent = TRUE; } if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble == FALSE) { pDevice->bBarkerPreambleMd = TRUE; } DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Rx ReAssociate AID= %d \n", wAssocAID); DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X \n", sFrame.pHdr->sA3.abyAddr2[0], sFrame.pHdr->sA3.abyAddr2[1], sFrame.pHdr->sA3.abyAddr2[2], sFrame.pHdr->sA3.abyAddr2[3], sFrame.pHdr->sA3.abyAddr2[4], sFrame.pHdr->sA3.abyAddr2[5] ) ; DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Max Support rate = %d \n", pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate); } // assoc response reply.. pTxPacket = s_MgrMakeReAssocResponse ( pDevice, pMgmt, pMgmt->wCurrCapInfo, wAssocStatus, wAssocAID, sFrame.pHdr->sA3.abyAddr2, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates ); if (pTxPacket != NULL ){ /* send the frame */ if (pDevice->bEnableHostapd) { return; } Status = csMgmt_xmit(pDevice, pTxPacket); if (Status != CMD_STATUS_PENDING) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:ReAssoc response tx failed\n"); } else { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:ReAssoc response tx sending..\n"); } } return;} /*+ * * Routine Description: * Handle incoming association response frames. * * Return Value: * None. *-*/staticVOIDs_vMgrRxAssocResponse( IN PSDevice pDevice, IN PSMgmtObject pMgmt, IN PSRxMgmtPacket pRxPacket, IN BOOL bReAssocType ){ WLAN_FR_ASSOCRESP sFrame; PWLAN_IE_SSID pItemSSID; PBYTE pbyIEs; viawget_wpa_header *wpahdr; if (pMgmt->eCurrState == WMAC_STATE_ASSOCPENDING || pMgmt->eCurrState == WMAC_STATE_ASSOC) { sFrame.len = pRxPacket->cbMPDULen; sFrame.pBuf = (PBYTE)pRxPacket->p80211Header; // decode the frame vMgrDecodeAssocResponse(&sFrame); if ((sFrame.pwCapInfo == 0) || (sFrame.pwStatus == 0) || (sFrame.pwAid == 0) || (sFrame.pSuppRates == 0)){ DBG_PORT80(0xCC); return; }; pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.Capabilities = *(sFrame.pwCapInfo); pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.StatusCode = *(sFrame.pwStatus); pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.AssociationId = *(sFrame.pwAid); pMgmt->sAssocInfo.AssocInfo.AvailableResponseFixedIEs |= 0x07; pMgmt->sAssocInfo.AssocInfo.ResponseIELength = sFrame.len - 24 - 6; pMgmt->sAssocInfo.AssocInfo.OffsetResponseIEs = pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs + pMgmt->sAssocInfo.AssocInfo.RequestIELength; pbyIEs = pMgmt->sAssocInfo.abyIEs; pbyIEs += pMgmt->sAssocInfo.AssocInfo.RequestIELength; memcpy(pbyIEs, (sFrame.pBuf + 24 +6), pMgmt->sAssocInfo.AssocInfo.ResponseIELength); // save values and set current BSS state if (cpu_to_le16((*(sFrame.pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){ // set AID pMgmt->wCurrAID = cpu_to_le16((*(sFrame.pwAid))); if ( (pMgmt->wCurrAID >> 14) != (BIT0 | BIT1) ) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "AID from AP, has two msb clear.\n"); }; DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Association Successful, AID=%d.\n", pMgmt->wCurrAID & ~(BIT14|BIT15)); pMgmt->eCurrState = WMAC_STATE_ASSOC; BSSvUpdateAPNode((HANDLE)pDevice, sFrame.pwCapInfo, sFrame.pSuppRates, sFrame.pExtSuppRates); pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID; DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Link with AP(SSID): %s\n", pItemSSID->abySSID); pDevice->bLinkPass = TRUE; ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_INTER); if ((pDevice->bWPADevEnable) && (pDevice->skb != NULL)) { wpahdr = (viawget_wpa_header *)pDevice->skb->data; wpahdr->type = VIAWGET_ASSOC_MSG; wpahdr->resp_ie_len = pMgmt->sAssocInfo.AssocInfo.ResponseIELength; wpahdr->req_ie_len = pMgmt->sAssocInfo.AssocInfo.RequestIELength; memcpy(pDevice->skb->data + sizeof(viawget_wpa_header), pMgmt->sAssocInfo.abyIEs, wpahdr->req_ie_len); memcpy(pDevice->skb->data + sizeof(viawget_wpa_header) + wpahdr->req_ie_len, pbyIEs, wpahdr->resp_ie_len ); skb_put(pDevice->skb, sizeof(viawget_wpa_header) + wpahdr->resp_ie_len + wpahdr->req_ie_len); 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 SndEvt_ToAPI evt_notify(pDevice,0,WMAC_STATE_ASSOC); #endif//2008-0409-07, <Add> by Einsn Liu#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT //if(pDevice->bWPASuppWextEnabled == TRUE) { BYTE buf[512]; size_t len; union iwreq_data wrqu; int we_event; memset(buf, 0, 512); len = pMgmt->sAssocInfo.AssocInfo.RequestIELength; if(len) { memcpy(buf, pMgmt->sAssocInfo.abyIEs, len); memset(&wrqu, 0, sizeof (wrqu)); wrqu.data.length = len; we_event = IWEVASSOCREQIE; printk("wireless_send_event--->IWEVASSOCREQIE\n"); wireless_send_event(pDevice->dev, we_event, &wrqu, buf); } memset(buf, 0, 512); len = pMgmt->sAssocInfo.AssocInfo.ResponseIELength; if(len) { memcpy(buf, pbyIEs, len); memset(&wrqu, 0, sizeof (wrqu)); wrqu.data.length = len; we_event = IWEVASSOCRESPIE; printk("wireless_send_event--->IWEVASSOCRESPIE\n"); wireless_send_event(pDevice->dev, we_event, &wrqu, buf); } memset(&wrqu, 0, sizeof (wrqu)); memcpy(wrqu.ap_addr.sa_data, &pMgmt->abyCurrBSSID[0], ETH_ALEN); wrqu.ap_addr.sa_family = ARPHRD_ETHER; printk("wireless_send_event--->SIOCGIWAP(associated)\n"); wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL); }#endif //#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT//End Add -- //2008-0409-07, <Add> by Einsn Liu } else { if (bReAssocType) { pMgmt->eCurrState = WMAC_STATE_IDLE; } else { // jump back to the auth state and indicate the error pMgmt->eCurrState = WMAC_STATE_AUTH; } s_vMgrLogStatus(pMgmt,cpu_to_le16((*(sFrame.pwStatus)))); } }#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT//need clear flags related to Networkmanager pDevice->bwextstep0 = FALSE; pDevice->bwextstep1 = FALSE; pDevice->bwextstep2 = FALSE; pDevice->bwextstep3 = FALSE; pDevice->bWPASuppWextEnabled = FALSE; #endif return;}/*+ * * Routine Description: * Start the station authentication procedure. Namely, send an * authentication frame to the AP. * * Return Value: * None. *-*/VOIDvMgrAuthenBeginSta( IN HANDLE hDeviceContext, IN PSMgmtObject pMgmt, OUT PCMD_STATUS pStatus ){ PSDevice pDevice = (PSDevice)hDeviceContext; WLAN_FR_AUTHEN sFrame; PSTxMgmtPacket pTxPacket = NULL; pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool; memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN); pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket)); sFrame.pBuf = (PBYTE)pTxPacket->p80211Header; sFrame.len = WLAN_AUTHEN_FR_MAXLEN; vMgrEncodeAuthen(&sFrame); /* insert values */ sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( ( WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN) )); memcpy( sFrame.pHdr->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN); memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); if (pMgmt->bShareKeyAlgorithm) *(sFrame.pwAuthAlgorithm) = cpu_to_le16(WLAN_AUTH_ALG_SHAREDKEY); else *(sFrame.pwAuthAlgorithm) = cpu_to_le16(WLAN_AUTH_ALG_OPENSYSTEM); *(sFrame.pwAuthSequence) = cpu_to_le16(1); /* Adjust the length fields */ pTxPacket->cbMPDULen = sFrame.len; pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; *pStatus = csMgmt_xmit(pDevice, pTxPacket); if (*pStatus == CMD_STATUS_PENDING){ pMgmt->eCurrState = WMAC_STATE_AUTHPENDING; *pStatus = CMD_STATUS_SUCCESS; } return ;}/*+ * * Routine Description: * Start the station(AP) deauthentication procedure. Namely, send an * deauthentication frame to the AP or Sta. * * Return Value: * None. *-*/VOIDvMgrDeAuthenBeginSta( IN HANDLE hDeviceContext, IN PSMgmtObject pMgmt, IN PBYTE abyDestAddress, IN WORD wReason, OUT PCMD_STATUS pStatus ){ PSDevice pDevice = (PSDevice)hDeviceContext; WLAN_FR_DEAUTHEN sFrame; PSTxMgmtPacket pTxPacket = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -