📄 rtmp_info.c
字号:
/*
***************************************************************************
* Ralink Tech Inc.
* 4F, No. 2 Technology 5th Rd.
* Science-based Industrial Park
* Hsin-chu, Taiwan, R.O.C.
*
* (c) Copyright 2002-2006, Ralink Technology, Inc.
*
* 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. *
* *
************************************************************************
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
*/
#include "rt_config.h"
#include <net/iw_handler.h>
#ifdef DBG
extern ULONG RTDebugLevel;
#endif
#ifndef IW_ESSID_MAX_SIZE
/* Maximum size of the ESSID and NICKN strings */
#define IW_ESSID_MAX_SIZE 32
#endif
extern 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_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"},
#if 1
{ 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"},
#endif
};
static struct {
CHAR *name;
INT (*set_proc)(PRTMP_ADAPTER pAdapter, PUCHAR arg);
} *PRTMP_PRIVATE_SET_PROC, 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
*/
int
rt_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)
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);
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 = pAdapter->PortCfg.Channel;
freq->e = 0;
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 (INFRA_ON(pAdapter))
{
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;
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;
DBGPRINT(RT_DEBUG_TRACE, "===>rt_ioctl_siwmode::SIOCSIWMODE (INFRA)\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;
if (ADHOC_ON(pAdapter))
*mode = IW_MODE_ADHOC;
else if (INFRA_ON(pAdapter))
*mode = IW_MODE_INFRA;
else
*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)
{
#ifdef MAJI_DBG
printk("I am in %s \n",__FUNCTION__);
#endif
PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
struct iw_range *range = (struct iw_range *) extra;
u16 val;
int i;
//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;
range->num_channels = pAdapter->ChannelListNum;
val = 0;
for (i = 0; i < pAdapter->PortCfg.SupRateLen; i++) {
range->freq[val].i =(pAdapter->PortCfg.SupRate[i] & 0x7f)/2;
range->freq[val].m = (pAdapter->PortCfg.SupRate[i] & 0x7f)/2 * 100000;
range->freq[val].e = 1;
val++;
if (val == IW_MAX_FREQUENCIES)
break;
}
range->num_frequency = val;
range->max_qual.qual = 100; /* what is correct max? This was not
* documented exactly. At least
* 69 has been observed. */
range->max_qual.level = 0; /* dB */
range->max_qual.noise = 0; /* dB */
/* What would be suitable values for "average/typical" qual? */
range->avg_qual.qual = 20;
range->avg_qual.level = -60;
range->avg_qual.noise = -95;
range->sensitivity = 3;
range->max_encoding_tokens = NR_WEP_KEYS;
range->num_encoding_sizes = 2;
range->encoding_size[0] = 5;
range->encoding_size[1] = 13;
#if 0
over2 = 0;
len = prism2_get_datarates(dev, rates);
range->num_bitrates = 0;
for (i = 0; i < len; i++) {
if (range->num_bitrates < IW_MAX_BITRATES) {
range->bitrate[range->num_bitrates] =
rates[i] * 500000;
range->num_bitrates++;
}
if (rates[i] == 0x0b || rates[i] == 0x16)
over2 = 1;
}
/* estimated maximum TCP throughput values (bps) */
range->throughput = over2 ? 5500000 : 1500000;
#endif
range->min_rts = 0;
range->max_rts = 2347;
range->min_frag = 256;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -