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

📄 ioctl.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. * All rights reserved. * * This software is copyrighted by and is the sole property of * VIA Networking Technologies, Inc. This software may only be used * in accordance with the corresponding license agreement. Any unauthorized * use, duplication, transmission, distribution, or disclosure of this * software is expressly forbidden. * * This software is provided by VIA Networking Technologies, Inc. "as is" * and any express or implied warranties, including, but not limited to, the * implied warranties of merchantability and fitness for a particular purpose * are disclaimed. In no event shall VIA Networking Technologies, Inc. * be liable for any direct, indirect, incidental, special, exemplary, or * consequential damages. *  * File: ioctl.c * * Purpose:  private ioctl functions * * Author: Lyndon Chen * * Date: Auguest 20, 2003 * * Functions:  * * Revision History: * */ #if !defined(__IOCTL_H__)#include "ioctl.h"#endif#if !defined(__IOCMD_H__)#include "iocmd.h"#endif#if !defined(__MAC_H__)#include "mac.h"#endif#if !defined(__CARD_H__)#include "card.h"#endif#if !defined(__HOSTAP_H__)#include "hostap.h"#endif#if !defined(__UMEM_H__)#include "umem.h"#endif#if !defined(__WPACTL_H__)#include "wpactl.h"#endif#if !defined(__CONTROL_H__)#include "control.h"#endif#if !defined(__RNDIS_H__)#include "rndis.h"#endif#if !defined(__RF_H__)#include "rf.h"#endif/*---------------------  Static Definitions -------------------------*//*---------------------  Static Classes  ----------------------------*//*---------------------  Static Variables  --------------------------*///static int          msglevel                =MSG_LEVEL_DEBUG;static int          msglevel                =MSG_LEVEL_INFO;#ifdef SndEvt_ToAPIstatic int Evt_init_Evtdev(PSDevice pDevice);static int evt_release_evtdev(PSDevice pDevice);#endif#ifdef WPA_SM_Transtatus    SWPAResult wpa_Result;#endif/*---------------------  Static Functions  --------------------------*//*---------------------  Export Variables  --------------------------*/int private_ioctl(PSDevice pDevice, struct ifreq *rq) {    	PSCmdRequest        pReq = (PSCmdRequest)rq;     PSMgmtObject        pMgmt = &(pDevice->sMgmtObj);			int 		        result = 0;    PWLAN_IE_SSID       pItemSSID;	    SCmdBSSJoin         sJoinCmd;    SCmdScan            sScanCmd;        SCmdStartAP         sStartAPCmd;        SCmdSetWEP          sWEPCmd;    SCmdValue           sValue;    SBSSIDList          sList;    SNodeList           sNodeList;        PSBSSIDList         pList;    PSNodeList          pNodeList;        UINT                cbListCount;    PKnownBSS           pBSS;    PKnownNodeDB        pNode;        UINT                ii, jj;    SCmdLinkStatus      sLinkStatus;    BYTE                abySuppRates[] = {WLAN_EID_SUPP_RATES, 4, 0x02, 0x04, 0x0B, 0x16};    BYTE                abyNullAddr[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};    DWORD               dwKeyIndex= 0;    BYTE                abyScanSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];    LONG                ldBm;        pReq->wResult = 0;        switch(pReq->wCmdCode) {            case WLAN_CMD_BSS_SCAN:            if (copy_from_user(&sScanCmd, pReq->data, sizeof(SCmdScan))) {			result = -EFAULT;			break;		};    		        pItemSSID = (PWLAN_IE_SSID)sScanCmd.ssid;        if (pItemSSID->len != 0) {            memset(abyScanSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);             memcpy(abyScanSSID, pItemSSID, pItemSSID->len + WLAN_IEHDR_LEN);        }           spin_lock_irq(&pDevice->lock);        if (memcmp(pMgmt->abyCurrBSSID, &abyNullAddr[0], 6) == 0)            BSSvClearBSSList((HANDLE)pDevice, FALSE);        else                BSSvClearBSSList((HANDLE)pDevice, pDevice->bLinkPass);        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_BSS_SCAN..begin \n");                if (pItemSSID->len != 0)                     bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, abyScanSSID);        else             bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, NULL);                spin_unlock_irq(&pDevice->lock);                break;            case WLAN_CMD_BSS_JOIN:        if (copy_from_user(&sJoinCmd, pReq->data, sizeof(SCmdBSSJoin))) {			result = -EFAULT;			break;		};		        pItemSSID = (PWLAN_IE_SSID)sJoinCmd.ssid;        memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); 		memcpy(pMgmt->abyDesireSSID, pItemSSID, pItemSSID->len + WLAN_IEHDR_LEN);	    if (sJoinCmd.wBSSType == ADHOC) {	        pMgmt->eConfigMode = WMAC_CONFIG_IBSS_STA;	        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "ioct set to adhoc mode\n");	    }    	    else {	        pMgmt->eConfigMode = WMAC_CONFIG_ESS_STA;	        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "ioct set to STA mode\n");	        	    }	    if (sJoinCmd.bPSEnable == TRUE) {	                pDevice->ePSMode = WMAC_POWER_FAST;//            pDevice->ePSMode = WMAC_POWER_MAX;            pMgmt->wListenInterval = 2;            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Power Saving On\n");        }        else {                pDevice->ePSMode = WMAC_POWER_CAM;            pMgmt->wListenInterval = 1;            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Power Saving Off \n");        }                if (sJoinCmd.bShareKeyAuth == TRUE){            pMgmt->bShareKeyAlgorithm = TRUE;            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Share Key \n");        }        else {            pMgmt->bShareKeyAlgorithm = FALSE;            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Open System \n");        }    	    pDevice->uChannel = sJoinCmd.uChannel;        netif_stop_queue(pDevice->dev);	            spin_lock_irq(&pDevice->lock);        pMgmt->eCurrState = WMAC_STATE_IDLE;        bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);        bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);        spin_unlock_irq(&pDevice->lock);                break;                    case WLAN_CMD_SET_WEP:        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_SET_WEP Key. \n");        memset(&sWEPCmd, 0 ,sizeof(SCmdSetWEP));        if (copy_from_user(&sWEPCmd, pReq->data, sizeof(SCmdSetWEP))) {			result = -EFAULT;			break;		};	    if (sWEPCmd.bEnableWep != TRUE) {	        int uu;	                    pDevice->bEncryptionEnable = FALSE;            pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;            spin_lock_irq(&pDevice->lock);            for(uu=0;uu<MAX_KEY_TABLE;uu++)                 MACvDisableKeyEntry(pDevice,uu);                    spin_unlock_irq(&pDevice->lock);                   DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WEP function disable. \n");            break;        }            	    	        for (ii = 0; ii < WLAN_WEP_NKEYS; ii ++) {            if (sWEPCmd.bWepKeyAvailable[ii]) {                if (ii == sWEPCmd.byKeyIndex)//2006-1207-01<Modify>by Einsn Liu//		    dwKeyIndex|= (1 << 31);                    dwKeyIndex=ii|(1 << 31);                else                    dwKeyIndex = ii;                spin_lock_irq(&pDevice->lock);                KeybSetDefaultKey(  pDevice,                                    &(pDevice->sKey),                                    dwKeyIndex,                                    sWEPCmd.auWepKeyLength[ii],                                    NULL,                                    (PBYTE)&sWEPCmd.abyWepKey[ii][0],                                    KEY_CTL_WEP                                  );               spin_unlock_irq(&pDevice->lock);                                                    }            }            pDevice->byKeyIndex = sWEPCmd.byKeyIndex;        pDevice->bTransmitKey = TRUE;                pDevice->bEncryptionEnable = TRUE;        pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;                        break;    case WLAN_CMD_GET_LINK:        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_GET_LINK status. \n");                memset(sLinkStatus.abySSID, 0 , WLAN_SSID_MAXLEN + 1);                if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)             sLinkStatus.wBSSType = ADHOC;        else             sLinkStatus.wBSSType = INFRA;        if (pMgmt->eCurrState == WMAC_STATE_JOINTED)            sLinkStatus.byState = ADHOC_JOINTED;        else             sLinkStatus.byState = ADHOC_STARTED;                    sLinkStatus.uChannel = pMgmt->uCurrChannel;        if (pDevice->bLinkPass == TRUE) {            sLinkStatus.bLink = TRUE; 		    pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;		    memcpy(sLinkStatus.abySSID, pItemSSID->abySSID, pItemSSID->len);		    memcpy(sLinkStatus.abyBSSID, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); 		    sLinkStatus.uLinkRate = pMgmt->sNodeDBTable[0].wTxDataRate;            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Link Success ! \n");        }        else {            sLinkStatus.bLink = FALSE;        }            if (copy_to_user(pReq->data, &sLinkStatus, sizeof(SCmdLinkStatus))) {			result = -EFAULT;			break;		};        break;            case WLAN_CMD_GET_LISTLEN:		cbListCount = 0;				pBSS = &(pMgmt->sBSSList[0]);        for (ii = 0; ii < MAX_BSS_NUM; ii++) {            pBSS = &(pMgmt->sBSSList[ii]);            if (!pBSS->bActive)                continue;            cbListCount++;        };        sList.uItem = cbListCount;        if (copy_to_user(pReq->data, &sList, sizeof(SBSSIDList))) {			result = -EFAULT;			break;		};        pReq->wResult = 0;        break;                case WLAN_CMD_GET_LIST:        if (copy_from_user(&sList, pReq->data, sizeof(SBSSIDList))) {			result = -EFAULT;			break;		};            pList = (PSBSSIDList)kmalloc(sizeof(SBSSIDList) + (sList.uItem * sizeof(SBSSIDItem)), (int)GFP_ATOMIC);        if (pList == NULL) {                result = -ENOMEM;            break;        }		pList->uItem = sList.uItem;		pBSS = &(pMgmt->sBSSList[0]);        for (ii = 0, jj = 0; jj < MAX_BSS_NUM ; jj++) {            pBSS = &(pMgmt->sBSSList[jj]);            if (pBSS->bActive) {    		    pList->sBSSIDList[ii].uChannel = pBSS->uChannel;    		    pList->sBSSIDList[ii].wBeaconInterval = pBSS->wBeaconInterval;    		    pList->sBSSIDList[ii].wCapInfo = pBSS->wCapInfo;    		    RFvRSSITodBm(pDevice, (BYTE)(pBSS->uRSSI), &ldBm);    		    pList->sBSSIDList[ii].uRSSI = (UINT)ldBm;//    		    pList->sBSSIDList[ii].uRSSI = pBSS->uRSSI;    		        		    memcpy(pList->sBSSIDList[ii].abyBSSID, pBSS->abyBSSID, WLAN_BSSID_LEN);    		    pItemSSID = (PWLAN_IE_SSID)pBSS->abySSID;    		    memset(pList->sBSSIDList[ii].abySSID, 0, WLAN_SSID_MAXLEN + 1);    		    memcpy(pList->sBSSIDList[ii].abySSID, pItemSSID->abySSID, pItemSSID->len);                if (WLAN_GET_CAP_INFO_ESS(pBSS->wCapInfo)) {    		        pList->sBSSIDList[ii].byNetType = INFRA;                }                else {    		        pList->sBSSIDList[ii].byNetType = ADHOC;    		    }    		    if (WLAN_GET_CAP_INFO_PRIVACY(pBSS->wCapInfo)) {    		        pList->sBSSIDList[ii].bWEPOn = TRUE;                }                else {    		        pList->sBSSIDList[ii].bWEPOn = FALSE;    		    }    		    ii ++;    		    if (ii >= pList->uItem)    		        break;            }        }                if (copy_to_user(pReq->data, pList, sizeof(SBSSIDList) + (sList.uItem * sizeof(SBSSIDItem)))) {			result = -EFAULT;			break;		};        kfree(pList);        pReq->wResult = 0;        break;            case WLAN_CMD_GET_MIB:        if (copy_to_user(pReq->data, &(pDevice->s802_11Counter), sizeof(SDot11MIBCount))) {			result = -EFAULT;			break;		};            break;            case WLAN_CMD_GET_STAT:        if (copy_to_user(pReq->data, &(pDevice->scStatistic), sizeof(SStatCounter))) {			result = -EFAULT;			break;		};            break;     case WLAN_CMD_STOP_MAC:            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_STOP_MAC\n");        // Todo xxxxxx        netif_stop_queue(pDevice->dev);        spin_lock_irq(&pDevice->lock);        if (pDevice->bRadioOff == FALSE) {             CARDbRadioPowerOff(pDevice);         }        pDevice->bLinkPass = FALSE;        ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);        memset(pMgmt->abyCurrBSSID, 0, 6);         pMgmt->eCurrState = WMAC_STATE_IDLE;//        del_timer(&pDevice->sTimerCommand);//        del_timer(&pMgmt->sTimerSecondCallback);        pDevice->bCmdRunning = FALSE;        spin_unlock_irq(&pDevice->lock);                break;            case WLAN_CMD_START_MAC:            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_START_MAC\n");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -