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

📄 rtusb_info.c

📁 华硕无线网卡 167G linux 驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
                                  struct iw_point *data, char *extra){	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;	int param;	char value;	        if (extra) { /* Change the state if there's param. */           param = *(int *)extra;           switch(param)           {             case 1:                pAdapter->PortCfg.MallowRFMONTx = TRUE;		if (pAdapter->PortCfg.ForcePrismHeader == 1)                	pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM		else			pAdapter->net->type = 801; // ARPHRD_IEEE80211                break;             case 0:                pAdapter->PortCfg.MallowRFMONTx = FALSE;		if (pAdapter->PortCfg.ForcePrismHeader == 2)			pAdapter->net->type = 801; // ARPHRD_IEEE80211		else                	pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM                break;             default:                return -EOPNOTSUPP;           }	}        value = pAdapter->PortCfg.MallowRFMONTx == TRUE ? '1' : '0';        data->length = sizeof (char);        if (data->pointer != NULL && copy_to_user (data->pointer, &value, data->length))             DBGPRINT (RT_DEBUG_ERROR, "rtusb_ioctl_setrfmontx - copy to user failure.\n");	return 0;}static int rtusb_ioctl_setforceprismheader(struct net_device *dev,                                  struct iw_request_info *info,                                  struct iw_point *data, char *extra){	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;	int param = *(int *)extra;	switch(param)	{	case 0:		pAdapter->PortCfg.ForcePrismHeader = 0;		if (pAdapter->PortCfg.MallowRFMONTx == TRUE)			pAdapter->net->type = 801; // ARPHRD_IEEE80211		else                	pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM		break;	case 1:		pAdapter->PortCfg.ForcePrismHeader = 1;                pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM		break;	case 2:		pAdapter->PortCfg.ForcePrismHeader = 2;		pAdapter->net->type = 801; // ARPHRD_IEEE80211		break;	default:		return -EOPNOTSUPP;	}	return 0;}static int rtusb_ioctl_setadhocmode(struct net_device *dev,                                  struct iw_request_info *info,                                  struct iw_point *data, char *extra){	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;	int param = *(int *)extra;	switch(param)	{	case 0:			pAdapter->PortCfg.AdhocMode = 0;			break;		case 1:			pAdapter->PortCfg.AdhocMode = 1;			break;		case 2:			pAdapter->PortCfg.AdhocMode = 2;		break;		default:			return -EOPNOTSUPP;	}	return 0;}static int rtusb_ioctl_setpsm(struct net_device *dev, struct iw_request_info *info,			 void *w, char *extra){	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv;	int param = *(int *)extra;	switch(param)	{		case 0:			// clear PSM bit immediately			MlmeSetPsmBit(pAdapter, PWR_ACTIVE);			pAdapter->PortCfg.RecvDtim = TRUE;			pAdapter->PortCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;			break;        	        case 1:			// do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()			// to exclude certain situations.			pAdapter->PortCfg.RecvDtim = TRUE;			pAdapter->PortCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;			pAdapter->PortCfg.DefaultListenCount = 3;			break;	        			default:			return -EOPNOTSUPP;    	}    	return 0;}static const iw_handler rtusb_handler[] ={	(iw_handler) NULL,				/* SIOCSIWCOMMIT */	(iw_handler) rtusb_ioctl_giwname,			/* SIOCGIWNAME	1 */	 	(iw_handler) NULL,				/* SIOCSIWNWID */	(iw_handler) NULL,				/* SIOCGIWNWID */	(iw_handler) rtusb_ioctl_siwfreq,		/* SIOCSIWFREQ */	(iw_handler) rtusb_ioctl_giwfreq,		/* SIOCGIWFREQ 5*/	(iw_handler) rtusb_ioctl_siwmode,		/* SIOCSIWMODE */	(iw_handler) rtusb_ioctl_giwmode,		/* SIOCGIWMODE */	(iw_handler) NULL,		/* SIOCSIWSENS */	(iw_handler) NULL,		/* SIOCGIWSENS */	(iw_handler) NULL /* not used */,		/* SIOCSIWRANGE */	(iw_handler) rtusb_ioctl_giwrange,		/* SIOCGIWRANGE 	11 */	(iw_handler) NULL /* not used */,		/* SIOCSIWPRIV */	(iw_handler) NULL /* kernel code */,		/* SIOCGIWPRIV */	(iw_handler) NULL /* not used */,		/* SIOCSIWSTATS */	(iw_handler) NULL /* kernel code */,		/* SIOCGIWSTATS 	f*/	(iw_handler) NULL,		/* SIOCSIWSPY */	(iw_handler) NULL,		/* SIOCGIWSPY */	(iw_handler) NULL,				/* -- hole -- */	(iw_handler) NULL,				/* -- hole -- */	(iw_handler) NULL,		/* SIOCSIWAP */	(iw_handler) rtusb_ioctl_giwap,		/* SIOCGIWAP	0x15*/	(iw_handler) NULL,				/* -- hole --	0x16 */	(iw_handler) rtusb_ioctl_iwaplist,		/* SIOCGIWAPLIST */#ifdef SIOCGIWSCAN	(iw_handler) rtusb_ioctl_siwscan,		/* SIOCSIWSCAN		0x18*/	(iw_handler) rtusb_ioctl_giwscan,		/* SIOCGIWSCAN */#else	(iw_handler) NULL,				/* SIOCSIWSCAN */	(iw_handler) NULL,				/* SIOCGIWSCAN */#endif /* SIOCGIWSCAN */	(iw_handler) rtusb_ioctl_siwessid,		/* SIOCSIWESSID */	(iw_handler) rtusb_ioctl_giwessid,		/* SIOCGIWESSID */	(iw_handler) rtusb_ioctl_siwnickn,		/* SIOCSIWNICKN */	(iw_handler) rtusb_ioctl_giwnickn,		/* SIOCGIWNICKN 1d*/	(iw_handler) NULL,				/* -- hole -- */	(iw_handler) NULL,				/* -- hole -- */	(iw_handler) NULL,		/* SIOCSIWRATE 20*/	(iw_handler) NULL,		/* SIOCGIWRATE */	(iw_handler) rtusb_ioctl_siwrts,		/* SIOCSIWRTS */	(iw_handler) rtusb_ioctl_giwrts,		/* SIOCGIWRTS */	(iw_handler) rtusb_ioctl_siwfrag,		/* SIOCSIWFRAG */	(iw_handler) rtusb_ioctl_giwfrag,		/* SIOCGIWFRAG 25*/	(iw_handler) NULL,		/* SIOCSIWTXPOW */	(iw_handler) NULL,		/* SIOCGIWTXPOW */	(iw_handler) NULL,		/* SIOCSIWRETRY */	(iw_handler) NULL,		/* SIOCGIWRETRY 29*/	(iw_handler) rtusb_ioctl_siwencode,		/* SIOCSIWENCODE 2a*/	(iw_handler) rtusb_ioctl_giwencode,		/* SIOCGIWENCODE 2b*/	(iw_handler) NULL,		/* SIOCSIWPOWER 2c*/	(iw_handler) NULL,		/* SIOCGIWPOWER 2d*/};static const iw_handler rtusb_priv_handlers[] = {	(iw_handler) rtusb_ioctl_setauth,		/* SIOCWFIRSTPRIV+0 */	(iw_handler) rtusb_ioctl_setencryp,		/* SIOCWFIRSTPRIV+1 */	(iw_handler) rtusb_ioctl_setwpapsk,		/* SIOCWFIRSTPRIV+2 */	(iw_handler) rtusb_ioctl_setpsm,		/* SIOCWFIRSTPRIV+3 */	(iw_handler) rtusb_ioctl_setadhocmode,		/* SIOCWFIRSTPRIV+4 */	(iw_handler) rtusb_ioctl_setrfmontx,		/* SIOCWFIRSTPRIV+5 */	(iw_handler) rtusb_ioctl_setforceprismheader,	/* SIOCWFIRSTPRIV+6 */};#define MAX_WPAPSK_STRING 64static const struct iw_priv_args privtab[] = {	{ RTPRIV_IOCTL_AUTH, 	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,  "auth"},	{ RTPRIV_IOCTL_WEPSTATUS, 	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,  "enc"},	{ RTPRIV_IOCTL_WPAPSK, 	  IW_PRIV_TYPE_CHAR | MAX_WPAPSK_STRING,	  0,  "wpapsk"},  // Variable arg count  	{ RTPRIV_IOCTL_PSM, 	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,  "psm"},  // Variable arg count  	{ RTPRIV_IOCTL_ADHOCMODE,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,  "adhocmode"},	{ RTPRIV_IOCTL_RFMONTX,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,	  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | sizeof(char), "rfmontx"}, 	{ RTPRIV_IOCTL_FORCEPRISMHEADER,	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,  "forceprismheader"},#if 0	{ 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};const struct iw_handler_def rt2500usb_iw_handler_def ={	.standard		= (iw_handler *) rtusb_handler,	.num_standard		= sizeof(rtusb_handler) / sizeof(iw_handler),	.private		= (iw_handler *) rtusb_priv_handlers,	.num_private		= ARRAY_SIZE(rtusb_handler),	.private_args		= (struct iw_priv_args *) privtab,	.num_private_args	= ARRAY_SIZE(privtab),#if IW_HANDLER_VERSION >= 6 	.get_wireless_stats 	= RTUSB_get_wireless_stats,#endif};INT RTMPQueryInformation(	IN	PRT2570ADAPTER pAdapter,	IN	OUT struct ifreq	*rq,	IN	INT 				cmd){	struct iwreq						*wrq = (struct iwreq *) rq;	NDIS_802_11_BSSID_LIST_EX			*pBssidList = NULL;	PNDIS_WLAN_BSSID_EX 				pBss;	NDIS_802_11_SSID					Ssid;	NDIS_802_11_CONFIGURATION			Configuration;	RT_802_11_LINK_STATUS				LinkStatus;	NDIS_802_11_STATISTICS				Statistics;	NDIS_802_11_RTS_THRESHOLD			RtsThresh;	NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;	NDIS_802_11_POWER_MODE				PowerMode;	NDIS_802_11_NETWORK_INFRASTRUCTURE	BssType;	RT_802_11_PREAMBLE					PreamType;	NDIS_802_11_AUTHENTICATION_MODE 	AuthMode;	NDIS_802_11_WEP_STATUS				WepStatus;	RT_VERSION_INFO 					DriverVersionInfo;	ULONG								BssBufSize;	ULONG								BssLen;	ULONG								ulInfo = 0;	PUCHAR								pBuf = NULL;	PUCHAR								pPtr;	INT 								Status = NDIS_STATUS_SUCCESS;	UCHAR								Padding;	UINT								i;	BOOLEAN 							RadioState;	UCHAR                         LastR17Value; 		switch(cmd) {		case RT_OID_DEVICE_NAME:			DBGPRINT(RT_DEBUG_INFO, "Query::RT_OID_DEVICE_NAME\n");			wrq->u.data.length = sizeof(NIC_DEVICE_NAME);			if(copy_to_user(wrq->u.data.pointer, NIC_DEVICE_NAME, wrq->u.data.length))				Status = -EFAULT;			break;		case RT_OID_VERSION_INFO:			DBGPRINT(RT_DEBUG_INFO, "Query::RT_OID_VERSION_INFO \n");			DriverVersionInfo.DriverMajorVersion = DRV_MAJORVERSION;			DriverVersionInfo.DriverMinorVersion = DRV_MINORVERSION;			DriverVersionInfo.DriverSubVersion = DRV_SUBVERSION;            		DriverVersionInfo.DriverTestVersion = DRV_TESTVERSION;			DriverVersionInfo.DriverBuildYear = DRV_YEAR;			DriverVersionInfo.DriverBuildMonth = DRV_MONTH;			DriverVersionInfo.DriverBuildDay = DRV_DAY;			wrq->u.data.length = sizeof(RT_VERSION_INFO);			if(copy_to_user(wrq->u.data.pointer, &DriverVersionInfo, wrq->u.data.length))				Status = -EFAULT;			break;		case OID_802_11_BSSID_LIST:					DBGPRINT(RT_DEBUG_ERROR, "Query::OID_802_11_BSSID_LIST (%d BSS returned)\n",pAdapter->PortCfg.BssTab.BssNr);			// Claculate total buffer size required			BssBufSize = sizeof(ULONG);						for (i = 0; i < pAdapter->PortCfg.BssTab.BssNr; i++) 			{				// Align pointer to 4 bytes boundary.				Padding = 4 - (pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen & 0x0003);				if (Padding == 4)					Padding = 0;				BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 4 + sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen + Padding);			}			// For safety issue, we add 256 bytes just in case			BssBufSize += 256;			// Allocate the same size as passed from higher layer			pBuf = kmalloc(BssBufSize, GFP_KERNEL);			if(pBuf == NULL)			{				Status = -ENOMEM;				break;			}			// Init 802_11_BSSID_LIST_EX structure			memset(pBuf, 0, BssBufSize);						pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf;			pBssidList->NumberOfItems = pAdapter->PortCfg.BssTab.BssNr;						// Calculate total buffer length			BssLen = 4; // Consist of NumberOfItems			// Point to start of NDIS_WLAN_BSSID_EX			// pPtr = pBuf + sizeof(ULONG);			pPtr = (PUCHAR) &pBssidList->Bssid[0];			for (i = 0; i < pAdapter->PortCfg.BssTab.BssNr; i++) 			{				pBss = (PNDIS_WLAN_BSSID_EX) pPtr;				memcpy(&pBss->MacAddress, &pAdapter->PortCfg.BssTab.BssEntry[i].Bssid, MAC_ADDR_LEN);				if (pAdapter->PortCfg.BssTab.BssEntry[i].Hidden == 1)				{					pBss->Ssid.SsidLength = 0;				}				else				{			pBss->Ssid.SsidLength = pAdapter->PortCfg.BssTab.BssEntry[i].SsidLen;					memcpy(pBss->Ssid.Ssid, pAdapter->PortCfg.BssTab.BssEntry[i].Ssid, pAdapter->PortCfg.BssTab.BssEntry[i].SsidLen);				}				pBss->Privacy = pAdapter->PortCfg.BssTab.BssEntry[i].Privacy;		  //DBGPRINT(RT_DEBUG_ERROR,"pBss->Privacy=%x\n",(pBss->Privacy));				pBss->Rssi = pAdapter->PortCfg.BssTab.BssEntry[i].Rssi - RSSI_TO_DBM_OFFSET;		  //DBGPRINT(RT_DEBUG_ERROR,"pBss->Rssi=%x\n",pBss->Rssi);				pBss->NetworkTypeInUse = Ndis802_11DS;		  //DBGPRINT(RT_DEBUG_ERROR,"pBss->NetworkTypeInUse=%x\n",(pBss->NetworkTypeInUse));				pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION);		  //DBGPRINT(RT_DEBUG_ERROR,"pBss->pBss->Configuration.Length=%d\n",pBss->Configuration.Length);				pBss->Configuration.BeaconPeriod = pAdapter->PortCfg.BssTab.BssEntry[i].BeaconPeriod;		  //DBGPRINT(RT_DEBUG_ERROR,"pBss->pBss->Configuration.BeaconPeriod=%d\n",pBss->Configuration.BeaconPeriod);				pBss->Configuration.ATIMWindow = pAdapter->PortCfg.BssTab.BssEntry[i].AtimWin;				MAP_CHANNEL_ID_TO_KHZ(pAdapter->PortCfg.BssTab.BssEntry[i].Channel, pBss->Configuration.DSConfig);				if (pAdapter->PortCfg.BssTab.BssEntry[i].BssType == BSS_INFRA) 					pBss->InfrastructureMode = Ndis802_11Infrastructure;				else					pBss->InfrastructureMode = Ndis802_11IBSS;				memcpy(pBss->SupportedRates, pAdapter->PortCfg.BssTab.BssEntry[i].Rates, pAdapter->PortCfg.BssTab.BssEntry[i].RatesLen);				//DBGPRINT(RT_DEBUG_ERROR, "BSS#%d - %s, length of ssid=%d,Ch %d = %d Khz\n",				//			i,pBss->Ssid.Ssid,pBss->Ssid.SsidLength,pAdapter->PortCfg.BssTab.BssEntry[i].Channel,pBss->Configuration.DSConfig);				if (pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen == 0)				{					pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs);					memcpy(pBss->IEs, &pAdapter->PortCfg.BssTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));					pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 4 + sizeof(NDIS_802_11_FIXED_IEs);				}				else				{					pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen;					pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 4 + sizeof(NDIS_802_11_FIXED_IEs);					memcpy(pBss->IEs, &pAdapter->PortCfg.BssTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));					memcpy(pPtr, pAdapter->PortCfg.BssTab.BssEntry[i].VarIEs, pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen);					pPtr += pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen;				}				// Align pointer to 4 bytes boundary.				Padding = 4 - (pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen & 0x0003);				if (Padding == 4)					Padding = 0;				pPtr += Padding;				pBss->Length = sizeof(NDIS_WLAN_BSSID_EX) - 4 + sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->PortCfg.BssTab.BssEntry[i].VarIELen + Padding;				BssLen += pBss->Length;			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -