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

📄 wmgr.c

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