⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmgr.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -