📄 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 attempt
* 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"
/*
** Functions prototype
*/
INT Set_ApCli_Enable_Proc(IN PRTMP_ADAPTER pAd, IN PUCHAR arg);
INT Set_ApCli_Ssid_Proc(IN PRTMP_ADAPTER pAd, IN PUCHAR arg);
INT Set_ApCli_Bssid_Proc(IN PRTMP_ADAPTER pAd, IN PUCHAR arg);
INT Set_ApCli_WPAPSK_Proc(IN PRTMP_ADAPTER pAd, IN PUCHAR arg);
struct iw_priv_args privtab[] = {
{ RTPRIV_IOCTL_SET,
IW_PRIV_TYPE_CHAR | 1024, 0,
"set"},
{ RTPRIV_IOCTL_GSITESURVEY,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,
"get_site_survey"},
{ RTPRIV_IOCTL_GET_MAC_TABLE,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,
"get_mac_table"},
#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"},
{ RTPRIV_IOCTL_E2P,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,
"e2p"},
#endif
{ RTPRIV_IOCTL_STATISTICS,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,
"stat"}
};
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},
{"CountryCode", Set_CountryCode_Proc},
{"SSID", Set_SSID_Proc},
{"WirelessMode", Set_WirelessMode_Proc},
{"TxRate", Set_TxRate_Proc},
{"BasicRate", Set_BasicRate_Proc},
{"Channel", Set_Channel_Proc},
{"BeaconPeriod", Set_BeaconPeriod_Proc},
{"DtimPeriod", Set_DtimPeriod_Proc},
{"TxPower", Set_TxPower_Proc},
{"BGProtection", Set_BGProtection_Proc},
{"DisableOLBC", Set_OLBCDetection_Proc},
{"TxAntenna", Set_TxAntenna_Proc},
{"RxAntenna", Set_RxAntenna_Proc},
{"TxPreamble", Set_TxPreamble_Proc},
{"RTSThreshold", Set_RTSThreshold_Proc},
{"FragThreshold", Set_FragThreshold_Proc},
{"TxBurst", Set_TxBurst_Proc},
#ifdef AGGREGATION_SUPPORT
{"PktAggregate", Set_PktAggregate_Proc},
#endif
{"TurboRate", Set_TurboRate_Proc},
{"NoForwardingBTNBSSID", Set_NoForwardingBTNSSID_Proc},
#ifdef WMM_SUPPORT
{"WmmCapable", Set_WmmCapable_Proc},
#endif
{"NoForwarding", Set_NoForwarding_Proc},
{"HideSSID", Set_HideSSID_Proc},
{"ShortSlot", Set_ShortSlot_Proc},
{"IEEE8021X", Set_IEEE8021X_Proc},
{"IEEE80211H", Set_IEEE80211H_Proc},
{"CSPeriod", Set_CSPeriod_Proc},
{"PreAuth", Set_PreAuth_Proc},
{"VLANID", Set_VLANID_Proc},
{"VLANPriority", Set_VLANPriority_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},
{"HSCounter", Set_HSCounter_Proc},
{"AccessPolicy", Set_AccessPolicy_Proc},
{"AccessControlList", Set_AccessControlList_Proc},
{"WPAPSK", Set_WPAPSK_Proc},
{"ResetCounter", Set_ResetStatCounter_Proc},
{"RadioOn", Set_RadioOn_Proc},
{"dfstest", Set_dfstest_Proc},
{"RekeyMethod", Set_RekeyMethod_Proc},
{"RekeyInterval", Set_RekeyInterval_Proc},
{"PMKCachePeriod", Set_PMKCachePeriod_Proc},
{"SiteSurvey", Set_SiteSurvey_Proc},
{"RetryLimit", Set_RetryLimit_Proc},
{"TxQueueSize", Set_TxQueueSize_Proc},
#ifdef DBG
{"Debug", Set_Debug_Proc},
#endif
#ifdef RALINK_ATE
{"ATE", Set_ATE_Proc},
{"ATEDA", Set_ATE_DA_Proc},
{"ATESA", Set_ATE_SA_Proc},
{"ATEBSSID", Set_ATE_BSSID_Proc},
{"ATECHANNEL", Set_ATE_CHANNEL_Proc},
{"ATETXPOW", Set_ATE_TX_POWER_Proc},
{"ATETXFREQOFFSET", Set_ATE_TX_FREQOFFSET_Proc},
{"ATETXLEN", Set_ATE_TX_LENGTH_Proc},
{"ATETXCNT", Set_ATE_TX_COUNT_Proc},
{"ATETXRATE", Set_ATE_TX_RATE_Proc},
{"ATERXFER", Set_ATE_RX_FER_Proc},
#endif // RALINK_ATE
#ifdef APCLI_SUPPORT
{"ApCliEnable", Set_ApCli_Enable_Proc},
{"ApCliSsid", Set_ApCli_Ssid_Proc},
{"ApCliBssid", Set_ApCli_Bssid_Proc},
{"ApCliWPAPSK", Set_ApCli_WPAPSK_Proc},
#endif
{NULL,}
};
INT RTMPSetInformation(
IN PRTMP_ADAPTER pAd,
IN OUT struct ifreq *rq,
IN INT cmd)
{
struct iwreq *wrq = (struct iwreq *) rq;
UCHAR Addr[MAC_ADDR_LEN];
INT Status = NDIS_STATUS_SUCCESS;
#ifdef SNMP
//snmp
TXRX_CSR4_STRUC csr4;
ULONG ShortRetryLimit, LongRetryLimit;
USHORT stmp;
UCHAR ctmp;
NDIS_802_11_KEY *pKey=NULL;
ULONG KeyIdx;
#endif //snmp
switch(cmd & 0x7FFF)
{
case RT_SET_APD_PID:
if (copy_from_user(&pAd->ApdPid, wrq->u.data.pointer, wrq->u.data.length))
{
Status = -EFAULT;
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "RT_SET_APD_PID::(ApdPid=%d)\n", pAd->ApdPid);
}
break;
case RT_SET_DEL_MAC_ENTRY:
if (copy_from_user(Addr, wrq->u.data.pointer, wrq->u.data.length))
{
Status = -EFAULT;
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "RT_SET_DEL_MAC_ENTRY::(%02x:%02x:%02x:%02x:%02x:%02x)\n", Addr[0],Addr[1],Addr[2],Addr[3],Addr[4],Addr[5]);
MacTableDeleteEntry(pAd, Addr);
}
break;
#ifdef SNMP
case OID_802_11_SHORTRETRYLIMIT:
if (wrq->u.data.length != sizeof(ULONG))
Status = -EINVAL;
else
{
copy_from_user(&ShortRetryLimit, wrq->u.data.pointer, wrq->u.data.length);
RTMP_IO_READ32(pAd, TXRX_CSR4, &csr4.word);
csr4.field.ShortRetryLimit = ShortRetryLimit;
RTMP_IO_WRITE32(pAd, TXRX_CSR4, csr4.word);
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_SHORTRETRYLIMIT (csr4.field.ShortRetryLimit=%ld, ShortRetryLimit=%ld)\n", csr4.field.ShortRetryLimit, ShortRetryLimit);
}
break;
case OID_802_11_LONGRETRYLIMIT:
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_LONGRETRYLIMIT \n");
if (wrq->u.data.length != sizeof(ULONG))
Status = -EINVAL;
else
{
copy_from_user(&LongRetryLimit, wrq->u.data.pointer, wrq->u.data.length);
RTMP_IO_READ32(pAd, TXRX_CSR4, &csr4.word);
csr4.field.LongRetryLimit = LongRetryLimit;
RTMP_IO_WRITE32(pAd, TXRX_CSR4, csr4.word);
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_LONGRETRYLIMIT (csr4.field.LongRetryLimit= %ld,LongRetryLimit=%ld)\n", csr4.field.LongRetryLimit, LongRetryLimit);
}
break;
case OID_802_11_WEPDEFAULTKEYVALUE:
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_WEPDEFAULTKEYVALUE\n");
pKey = kmalloc(wrq->u.data.length, GFP_KERNEL);
copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);
//pKey = &WepKey;
if ( pKey->Length != wrq->u.data.length)
{
Status = -EINVAL;
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_WEPDEFAULTKEYVALUE, Failed!!\n");
}
KeyIdx = pKey->KeyIndex & 0x0fffffff;
DBGPRINT(RT_DEBUG_TRACE,"pKey->KeyIndex =%d, pKey->KeyLength=%d\n", pKey->KeyIndex, pKey->KeyLength);
// it is a shared key
if (KeyIdx > 4)
Status = -EINVAL;
else
{
pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[KeyIdx].KeyLen = (UCHAR) pKey->KeyLength;
NdisMoveMemory(pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength);
if (pKey->KeyIndex & 0x80000000)
{
// Default key for tx (shared key)
pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId = (UCHAR) KeyIdx;
}
//RestartAPIsRequired = TRUE;
}
break;
case OID_802_11_WEPDEFAULTKEYID:
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_WEPDEFAULTKEYID \n");
if (wrq->u.data.length != sizeof(UCHAR))
Status = -EINVAL;
else
copy_from_user(&pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId, wrq->u.data.pointer, wrq->u.data.length);
break;
case OID_802_11_RTS_THRESHOLD:
DBGPRINT(RT_DEBUG_TRACE, "Set:OID_802_11_RTS_THRESHOLD \n");
if (wrq->u.data.length != sizeof(USHORT))
Status = -EINVAL;
else
copy_from_user(&pAd->PortCfg.RtsThreshold, wrq->u.data.pointer, wrq->u.data.length);
break;
case OID_802_11_FRAGMENTATION_THRESHOLD:
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_FRAGMENTATION_THRESHOLD \n");
if (wrq->u.data.length != sizeof(USHORT))
Status = -EINVAL;
else
copy_from_user(&pAd->PortCfg.FragmentThreshold, wrq->u.data.pointer, wrq->u.data.length);
break;
case OID_802_11_TX_ANTENNA_SELECTED:
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_TX_ANTENNA_SELECTED \n");
if (wrq->u.data.length != sizeof(USHORT))
Status = -EINVAL;
else
{
copy_from_user(&stmp, wrq->u.data.pointer, wrq->u.data.length);
sprintf(&ctmp,"%d", stmp);
Set_RxAntenna_Proc(pAd, &ctmp);
//pAd->Antenna.field.TxDefaultAntenna = stmp;
}
break;
case OID_802_11_RX_ANTENNA_SELECTED:
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_RX_ANTENNA_SELECTED \n");
if (wrq->u.data.length != sizeof(USHORT))
Status = -EINVAL;
else
{
copy_from_user(&stmp, wrq->u.data.pointer, wrq->u.data.length);
sprintf(&ctmp,"%d", stmp);
Set_RxAntenna_Proc(pAd, &ctmp);
//pAd->Antenna.field.RxDefaultAntenna = stmp;
}
break;
case OID_802_11_CURRENTCHANNEL:
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_CURRENTCHANNEL \n");
if (wrq->u.data.length != sizeof(UCHAR))
Status = -EINVAL;
else
{
copy_from_user(&ctmp, wrq->u.data.pointer, wrq->u.data.length);
sprintf(&ctmp,"%d", ctmp);
Set_Channel_Proc(pAd, &ctmp);
}
break;
#endif
default:
DBGPRINT(RT_DEBUG_TRACE, "Set::unknown IOCTL's subcmd = 0x%08x\n", cmd);
Status = -EOPNOTSUPP;
break;
}
return Status;
}
INT RTMPQueryInformation(
IN PRTMP_ADAPTER pAd,
IN OUT struct ifreq *rq,
IN INT cmd)
{
struct iwreq *wrq = (struct iwreq *) rq;
INT Status = NDIS_STATUS_SUCCESS;
#ifdef SNMP
//for snmp, kathy
UCHAR DefaultKeyId;
UCHAR KeyValue[16];
DefaultKeyIdxValue KeyIdxValue, *pKeyIdxValue;
INT valueLen;
TXRX_CSR4_STRUC csr4;
ULONG ShortRetryLimit, LongRetryLimit, ulInfo = 0;
UCHAR tmp[64];
NDIS_802_11_STATISTICS Statistics;
#endif //SNMP
switch(cmd)
{
#ifdef RALINK_ATE
case RT_QUERY_ATE_TXDONE_COUNT:
DBGPRINT(RT_DEBUG_TRACE, "Query::RT_QUERY_ATE_TXDONE_COUNT \n");
wrq->u.data.length = sizeof(ULONG);
if (copy_to_user(wrq->u.data.pointer, &pAd->ate.TxDoneCount, wrq->u.data.length))
{
Status = -EFAULT;
}
break;
#endif
case RT_QUERY_SIGNAL_CONTEXT:
DBGPRINT(RT_DEBUG_TRACE, "Query::RT_QUERY_SIGNAL_CONTEXT \n");
wrq->u.data.length = sizeof(RT_SIGNAL_STRUC);
if (copy_to_user(wrq->u.data.pointer, &pAd->RTSignal, wrq->u.data.length))
{
Status = -EFAULT;
}
break;
#ifdef SNMP
case OID_802_3_CURRENT_ADDRESS:
DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_3_CURRENT_ADDRESS\n");
wrq->u.data.length = MAC_ADDR_LEN;
Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, "Status = %d, Mac len= %d, data=%s \n", Status, wrq->u.data.length, &pAd->CurrentAddress);
break;
case RT_OID_802_11_MAC_ADDRESS:
DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_MACADDRESS \n");
wrq->u.data.length = MAC_ADDR_LEN;
Status = copy_to_user(wrq->u.data.pointer, pAd->PortCfg.MBSSID[pAd->IoctlIF].Bssid, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, "Status = %d, Mac len= %d, data=%s \n", Status, wrq->u.data.length, &pAd->PortCfg.MBSSID[pAd->IoctlIF].Bssid);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -