📄 rtmp_info.c
字号:
/*************************************************************************** * RT2x00 SourceForge Project - http://rt2x00.serialmonkey.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * Licensed under the GNU GPL * * Original code supplied under license from RaLink Inc, 2004. * ***************************************************************************//*************************************************************************** * Module Name: rtmp_info.c * * Abstract: IOCTL related subroutines * * Revision History: * Who When What * -------- ---------- ----------------------------- * Rory Chen 01-03-2003 created * Rory Chen 02-14-2005 modify to support RT61 * idamlaj 05-10-2006 Import rfmon implementation * idamlaj 14-10-2006 Mac Address Changing * idamlaj 14-10-2006 RFMONTx (based on MarkW's code) * RomainB 31-12-2006 RFMONTx getter * ***************************************************************************/#include "rt_config.h"#include <net/iw_handler.h>#ifdef DBGextern ULONG RTDebugLevel;#endif#ifndef IW_ESSID_MAX_SIZE/* Maximum size of the ESSID and NICKN strings */#define IW_ESSID_MAX_SIZE 32#endifextern UCHAR CipherWpa2Template[];extern UCHAR CipherWpa2TemplateLen;extern UCHAR CipherWpaPskTkip[];extern UCHAR CipherWpaPskTkipLen;#define NR_WEP_KEYS 4//#define WEP_SMALL_KEY_LEN (40/8) //move to rtmp_def.h//#define WEP_LARGE_KEY_LEN (104/8)struct iw_priv_args privtab[] = {{ RTPRIV_IOCTL_SET, IW_PRIV_TYPE_CHAR | 1024, 0, "set"},#ifdef DBG{ RTPRIV_IOCTL_BBP, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, "bbp"},{ RTPRIV_IOCTL_MAC, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, "mac"},#endif{ RTPRIV_IOCTL_ADHOCOFDM, IW_PRIV_TYPE_INT | 1, 0, "adhocOfdm"},{ RTPRIV_IOCTL_STATISTICS, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, "stat"},{ RTPRIV_IOCTL_GSITESURVEY, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 , "get_site_survey"},{ RTPRIV_IOCTL_GETRAAPCFG, IW_PRIV_TYPE_CHAR | 1024, 0, "get_RaAP_Cfg"},{ RTPRIV_IOCTL_FORCEPRISMHEADER, IW_PRIV_TYPE_CHAR | 1024, 0, "forceprism"},{ RTPRIV_IOCTL_SETRFMONTX, IW_PRIV_TYPE_CHAR | 1024, 0, "rfmontx"},{ RTPRIV_IOCTL_GETRFMONTX, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_rfmontx"},{ RTPRIV_IOCTL_AUTH, IW_PRIV_TYPE_INT |1, 0, "auth"},{ RTPRIV_IOCTL_WEPSTATUS, IW_PRIV_TYPE_INT |1, 0, "enc"},{ RTPRIV_IOCTL_WPAPSK, IW_PRIV_TYPE_CHAR |64, 0, "wpapsk"},{ RTPRIV_IOCTL_PSM, IW_PRIV_TYPE_INT |1, 0, "psm"},};struct rt_priv_support { CHAR *name; INT (*set_proc)(PRTMP_ADAPTER pAdapter, PUCHAR arg);};static struct rt_priv_support RTMP_PRIVATE_SUPPORT_PROC[] = { {"DriverVersion", Set_DriverVersion_Proc}, {"CountryRegion", Set_CountryRegion_Proc}, {"CountryRegionABand", Set_CountryRegionABand_Proc}, {"SSID", Set_SSID_Proc}, {"WirelessMode", Set_WirelessMode_Proc}, {"TxRate", Set_TxRate_Proc}, {"Channel", Set_Channel_Proc}, {"BGProtection", Set_BGProtection_Proc}, {"TxPreamble", Set_TxPreamble_Proc}, {"RTSThreshold", Set_RTSThreshold_Proc}, {"FragThreshold", Set_FragThreshold_Proc}, {"TxBurst", Set_TxBurst_Proc}, {"AdhocOfdm", Set_AdhocModeRate_Proc},#ifdef AGGREGATION_SUPPORT {"PktAggregate", Set_PktAggregate_Proc},#endif {"TurboRate", Set_TurboRate_Proc},#if 0 {"WmmCapable", Set_WmmCapable_Proc},#endif {"IEEE80211H", Set_IEEE80211H_Proc}, {"NetworkType", Set_NetworkType_Proc}, {"AuthMode", Set_AuthMode_Proc}, {"EncrypType", Set_EncrypType_Proc}, {"DefaultKeyID", Set_DefaultKeyID_Proc}, {"Key1", Set_Key1_Proc}, {"Key2", Set_Key2_Proc}, {"Key3", Set_Key3_Proc}, {"Key4", Set_Key4_Proc}, {"WPAPSK", Set_WPAPSK_Proc}, {"ResetCounter", Set_ResetStatCounter_Proc}, {"PSMode", Set_PSMode_Proc},#ifdef DBG {"Debug", Set_Debug_Proc},#endif {NULL,}};char * rtstrchr(const char * s, int c){ for(; *s != (char) c; ++s) if (*s == '\0') return NULL; return (char *) s;}/*This is required for LinEX2004/kernel2.6.7 to provide iwlist scanning function*/intrt_ioctl_giwname(struct net_device *dev, struct iw_request_info *info, char *name, char *extra){ strncpy(name, "RT73 WLAN", IFNAMSIZ); return 0;}int rt_ioctl_siwfreq(struct net_device *dev, struct iw_request_info *info, struct iw_freq *freq, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; int chan = -1; //check if the interface is down if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; if (freq->e > 1) { DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__); return -EINVAL; } if((freq->e == 0) && (freq->m <= 1000)) chan = freq->m; // Setting by channel number else MAP_KHZ_TO_CHANNEL_ID( (freq->m /100) , chan); // Setting by frequency - search the table , like 2.412G, 2.422G, pAdapter->PortCfg.Channel = chan; DBGPRINT(RT_DEBUG_ERROR, "==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x%x] (Channel=%d)\n", SIOCSIWFREQ, pAdapter->PortCfg.Channel); if (pAdapter->PortCfg.BssType == BSS_MONITOR) { pAdapter->PortCfg.Channel = chan; AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel); AsicLockChannel(pAdapter, pAdapter->PortCfg.Channel); } return 0;}int rt_ioctl_giwfreq(struct net_device *dev, struct iw_request_info *info, struct iw_freq *freq, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; ULONG m; //check if the interface is down if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; DBGPRINT(RT_DEBUG_TRACE,"==>rt_ioctl_giwfreq %d\n",pAdapter->PortCfg.Channel); MAP_CHANNEL_ID_TO_KHZ(pAdapter->PortCfg.Channel, m); freq->m = m * 100; freq->e = 1; freq->i = 0; return 0;}int rt_ioctl_siwmode(struct net_device *dev, struct iw_request_info *info, __u32 *mode, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; //check if the interface is down if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; switch (*mode) { case IW_MODE_ADHOC: if (pAdapter->PortCfg.BssType != BSS_ADHOC) { // Config has changed if (pAdapter->PortCfg.BssType == BSS_MONITOR) { RTUSBEnqueueInternalCmd(pAdapter, RT_OID_LINK_DOWN); // First cancel linkdown timer DBGPRINT(RT_DEBUG_TRACE, "NDIS_STATUS_MEDIA_DISCONNECT Event BB!\n"); } } pAdapter->PortCfg.BssType = BSS_ADHOC; pAdapter->net_dev->type = 1; RT73WriteTXRXCSR0(pAdapter, FALSE, TRUE); DBGPRINT(RT_DEBUG_TRACE, "===>rt_ioctl_siwmode::SIOCSIWMODE (AD-HOC)\n"); break; case IW_MODE_INFRA: if (pAdapter->PortCfg.BssType != BSS_INFRA) { // Config has changed if (ADHOC_ON(pAdapter)) RTUSBEnqueueInternalCmd(pAdapter, RT_OID_LINK_DOWN); } pAdapter->PortCfg.BssType = BSS_INFRA; pAdapter->net_dev->type = 1; RT73WriteTXRXCSR0(pAdapter, FALSE, TRUE); DBGPRINT(RT_DEBUG_TRACE, "===>rt_ioctl_siwmode::SIOCSIWMODE (INFRA)\n"); break; case IW_MODE_MONITOR: if (pAdapter->PortCfg.BssType != BSS_MONITOR) { RTUSBEnqueueInternalCmd(pAdapter, RT_OID_LINK_DOWN); } pAdapter->PortCfg.BssType = BSS_MONITOR; if (pAdapter->bAcceptRFMONTx == TRUE) { if (pAdapter->ForcePrismHeader == 1) pAdapter->net_dev->type = 802; // ARPHRD_IEEE80211_PRISM else pAdapter->net_dev->type = 801; // ARPHRD_IEEE80211 } else { if (pAdapter->ForcePrismHeader == 2) pAdapter->net_dev->type = 801; // ARPHRD_IEEE80211 else pAdapter->net_dev->type = 802; // ARPHRD_IEEE80211_PRISM } RT73WriteTXRXCSR0(pAdapter, FALSE, TRUE); DBGPRINT(RT_DEBUG_TRACE, "===>rt_ioctl_siwmode::SIOCSIWMODE (MONITOR)\n"); break; default: DBGPRINT(RT_DEBUG_TRACE, "===>rt_ioctl_siwmode::SIOCSIWMODE (unknown)\n"); return -EINVAL; } // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key pAdapter->PortCfg.WpaState = SS_NOTUSE; return 0;}int rt_ioctl_giwmode(struct net_device *dev, struct iw_request_info *info, __u32 *mode, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; //check if the interface is down if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; switch( pAdapter->PortCfg.BssType) { case BSS_ADHOC: *mode = IW_MODE_ADHOC; break; case BSS_INFRA: *mode = IW_MODE_INFRA; break; case BSS_MONITOR: *mode = IW_MODE_MONITOR; break; default: *mode = IW_MODE_AUTO; } DBGPRINT(RT_DEBUG_TRACE,"==>rt_ioctl_giwmode\n"); return 0;}int rt_ioctl_siwsens(struct net_device *dev, struct iw_request_info *info, char *name, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; //check if the interface is down if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; return 0;}int rt_ioctl_giwsens(struct net_device *dev, struct iw_request_info *info, char *name, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; //check if the interface is down if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; return 0;}int rt_ioctl_giwrange(struct net_device *dev, struct iw_request_info *info, struct iw_point *data, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; struct iw_range *range = (struct iw_range *) extra; u16 val; int i, chan; //check if the interface is down if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; DBGPRINT(RT_DEBUG_TRACE,"===>rt_ioctl_giwrange\n"); data->length = sizeof(struct iw_range); memset(range, 0, sizeof(struct iw_range)); range->txpower_capa = IW_TXPOW_DBM; if (INFRA_ON(pAdapter)||ADHOC_ON(pAdapter)) { range->min_pmp = 1 * 1024; range->max_pmp = 65535 * 1024; range->min_pmt = 1 * 1024; range->max_pmt = 1000 * 1024; range->pmp_flags = IW_POWER_PERIOD; range->pmt_flags = IW_POWER_TIMEOUT; range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_UNICAST_R | IW_POWER_ALL_R; } range->we_version_compiled = WIRELESS_EXT; range->we_version_source = 14; range->retry_capa = IW_RETRY_LIMIT; range->retry_flags = IW_RETRY_LIMIT; range->min_retry = 0; range->max_retry = 255; val = 0; for (i = 0; i < 14; i++) { chan = pAdapter->ChannelList[val].Channel; if (chan != 0) { range->freq[val].i = chan; MAP_CHANNEL_ID_TO_KHZ(range->freq[val].i, range->freq[val].m); range->freq[val].m*=100; range->freq[val].e = 1; val++; } } range->num_frequency = val; range->num_channels = val; val = 0; for (i = 0; i < pAdapter->PortCfg.SupRateLen; i++) { range->bitrate[i]=1000000*(pAdapter->PortCfg.SupRate[i] & 0x7f)/2; val++; if (val == IW_MAX_BITRATES) break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -