📄 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-2005, Ralink Technology, Inc. * * All rights reserved. Ralink's source code is an unpublished work and the * use of a copyright notice does not imply otherwise. This source code * contains confidential trade secret material of Ralink Tech. Any attemp * or participation in deciphering, decoding, reverse engineering or in any * way altering the source code is stricitly prohibited, unless the prior * written consent of Ralink Technology, Inc. is obtained. *************************************************************************** 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 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"},{ RTPRIV_IOCTL_SHOW, IW_PRIV_TYPE_CHAR | 1024, 0, "show"},#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"},#ifdef RALINK_ATE{ RTPRIV_IOCTL_E2P, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, "e2p"},#endif /* RALINK_ATE */ #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[] = { {"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}, {"TxQueSize", Set_TxQueSize_Proc}, #ifdef DBG {"Debug", Set_Debug_Proc}, #endif#ifdef RALINK_ATE {"ATE", Set_ATE_Proc}, // set ATE Mode to: STOP, TXCONT, TXCARR, TXFRAME, RXFRAME {"ATEDA", Set_ATE_DA_Proc}, // set ATE TxFrames ADDR1, DA {"ATESA", Set_ATE_SA_Proc}, // set ATE TxFrames ADDR2, SA {"ATEBSSID", Set_ATE_BSSID_Proc}, // set ATE TxFrames ADDR3, BSSID {"ATECHANNEL", Set_ATE_CHANNEL_Proc}, // set ATE Channel {"ATETXPOW", Set_ATE_TX_POWER_Proc}, // set ATE TxPower {"ATETXFREQOFFSET", Set_ATE_TX_FREQOFFSET_Proc}, //set ATE RF frequency offset {"ATETXLEN", Set_ATE_TX_LENGTH_Proc}, // set ATE TxLength {"ATETXCNT", Set_ATE_TX_COUNT_Proc}, // set ATE TxCount {"ATETXRATE", Set_ATE_TX_RATE_Proc}, // set ATE TxRate#endif // RALINK_ATE {NULL,}};static struct { CHAR *name; INT (*set_proc)(PRTMP_ADAPTER pAdapter, PUCHAR arg);} *PRTMP_PRIVATE_SHOW_PROC, RTMP_PRIVATE_SHOW_SUPPORT_PROC[] = { {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 ((dev->flags & IFF_UP) == 0) return -ENETDOWN; 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_TRACE, "==>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; UCHAR channel; if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; channel = pAdapter->PortCfg.Channel; 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; return 0;}// Set wireless operation mode(Infra or AdHoc).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 ((dev->flags & IFF_UP) == 0) return -ENETDOWN; if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; // 0 = infra/BSS (associate with an AP), 1 = adhoc/IBSS 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;}// Get wireless operation modeint rt_ioctl_giwmode(struct net_device *dev, struct iw_request_info *info, __u32 *mode, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; 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 ((dev->flags & IFF_UP) == 0) return -ENETDOWN; 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; 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; 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)); /* Informative stuff, estimated maximum TCP throughput values (bps) */ //range->throughput = ; /* NWID (or domain id) */ //range->min_nwid = ; // Minimal NWID we are able to set //range->max_nwid = ; // Maximal NWID we are able to set /* Old Frequency (backward compat - moved lower ) */ //range->old_num_channels = ; //range->old_num_frequency = ;#if WIRELESS_EXT > 17 /* Wireless event capability bitmasks */ range->event_capa[0] = (IW_EVENT_CAPA_K_0 | IW_EVENT_CAPA_MASK(SIOCGIWAP) | IW_EVENT_CAPA_MASK(SIOCGIWSCAN)); range->event_capa[1] = IW_EVENT_CAPA_K_1;#endif /* signal level threshold range */ range->sensitivity = 3; /* Quality of link & SNR stuff, Quality range (link, level, noise) */ range->max_qual.qual = 100; // link quality (%retries, SNR, %missed beacons or better...) // what is correct max? This was not documented exactly. // At least 69 has been observed. range->max_qual.level = 0; // signal level (dBm) range->max_qual.noise = 0; // noise level (dBm) //range->max_qual.updated = ; // Flags to know if updated range->avg_qual.qual = 20; // What would be suitable values for "average/typical" qual? range->avg_qual.level = -60; range->avg_qual.noise = -95; //range->avg_qual.updated = ; /* Rates */ if (INFRA_ON(pAdapter)||ADHOC_ON(pAdapter)) { UCHAR allRateLen, SupRateLen; SupRateLen = pAdapter->ActiveCfg.SupRateLen; allRateLen = SupRateLen + pAdapter->ActiveCfg.ExtRateLen; range->num_bitrates = (allRateLen > IW_MAX_BITRATES ? IW_MAX_BITRATES : allRateLen); // Number of entries in the list for (i = 0; i < range->num_bitrates; i++) { if (i < SupRateLen) range->bitrate[i] = (pAdapter->ActiveCfg.SupRate[i] & 0x7F) * 500000; // in bps else range->bitrate[i] = (pAdapter->ActiveCfg.ExtRate[i-SupRateLen] & 0x7F) * 500000; // in bps } } else { // If the link is not up, the pAdapter->PortCfg.SupRate will be filled after set PhyMode. // But we have no idea if the PhyMode didn't set when handle this ioctl. So, ignore this fields. } /* RTS threshold */ range->min_rts = 0; // Minimal RTS threshold range->max_rts = 2347; // Maximal RTS threshold /* Frag threshold */ range->min_frag = 256; // Minimal frag threshold range->max_frag = 2346; // Maximal frag threshold /* Power Management duration & timeout */ if (INFRA_ON(pAdapter)||ADHOC_ON(pAdapter)) { range->min_pmp = 1 * 1024; // Minimal PM period range->max_pmp = 65535 * 1024; // Maximal PM period range->min_pmt = 1 * 1024; // Minimal PM timeout range->max_pmt = 1000 * 1024; // Maximal PM timeout range->pmp_flags = IW_POWER_PERIOD; // How to decode max/min PM period range->pmt_flags = IW_POWER_TIMEOUT; // How to decode max/min PM timeout range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_UNICAST_R | IW_POWER_ALL_R; // What PM options are supported } /* Encoder stuff */ range->max_encoding_tokens = NR_WEP_KEYS; // Max number of tokens range->num_encoding_sizes = 2; // Number of entry in the list range->encoding_size[0] = 5; // size of token 0. range->encoding_size[1] = 13; // size of token 1. //range->encoding_login_index = ; // For drivers that need a "login/passwd" form /* Transmit power */ range->txpower_capa = IW_TXPOW_DBM; // What options are supported //range->num_txpower = ; // Number of entries in the list //range->txpower[IW_MAX_TXPOWER] = ; // list, in bps /* Wireless Extension version info */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -