📄 ioctl.c
字号:
/* * 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 + -