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

📄 rtmp_info.c

📁 r73模块的无线网卡在Linux下的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/*************************************************************************** * 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 + -