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

📄 rtmp_info.c

📁 Ralink RT61 SoftAP Driver source code. RT61:MiniPCI
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
 ***************************************************************************
 * 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 + -