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

📄 rtmp_info.c

📁 r73模块的无线网卡在Linux下的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			erq->flags |= IW_ENCODE_RESTRICTED;		/* XXX */		else			erq->flags |= IW_ENCODE_OPEN;		/* XXX */		erq->flags = pAdapter->PortCfg.DefaultKeyId + 1;			/* NB: base 1 */		erq->flags |= IW_ENCODE_ENABLED;	/* XXX */	}	return 0;}static intrt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info,			 void *w, char *extra){	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;	struct rt_priv_support *PRTMP_PRIVATE_SET_PROC;	char *this_char = extra;	char *value;	int  Status=0;	DBGPRINT(RT_DEBUG_TRACE, "--> %s\n", __FUNCTION__);    //check if the interface is down    if (pAdapter->RTUSBCmdThr_pid < 0)        return -ENETDOWN;	if (!*this_char) {		DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__);		return -EINVAL;	}	if ((value = rtstrchr(this_char, '=')) != NULL)		*value++ = 0;	else {		DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n", __FUNCTION__);		return -EINVAL;	}	// reject setting nothing besides ANY ssid(ssidLen=0)	if (!*value && (strcmp(this_char, "SSID") != 0))		return -ENOSYS;	for (PRTMP_PRIVATE_SET_PROC = RTMP_PRIVATE_SUPPORT_PROC; PRTMP_PRIVATE_SET_PROC->name; PRTMP_PRIVATE_SET_PROC++)	{		if (strcmp(this_char, PRTMP_PRIVATE_SET_PROC->name) == 0)		{			if(!PRTMP_PRIVATE_SET_PROC->set_proc(pAdapter, value))			{	//FALSE:Set private failed then return Invalid argument				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status = -EINVAL;			}			break;	//Exit for loop.		}	}	if(PRTMP_PRIVATE_SET_PROC->name == NULL)	{  //Not found argument		Status = -EINVAL;		DBGPRINT(RT_DEBUG_TRACE, "===>rt_ioctl_setparam:: (iwpriv) Not Support Set Command [%s=%s]\n", this_char, value);	}	return Status;}static const iw_handler rt_handler[] ={	(iw_handler) NULL,						/* SIOCSIWCOMMIT */	(iw_handler) rt_ioctl_giwname,			/* SIOCGIWNAME	1 */	(iw_handler) NULL,						/* SIOCSIWNWID */	(iw_handler) NULL,						/* SIOCGIWNWID */	(iw_handler) rt_ioctl_siwfreq,			/* SIOCSIWFREQ */	(iw_handler) rt_ioctl_giwfreq,			/* SIOCGIWFREQ	5 */	(iw_handler) rt_ioctl_siwmode,			/* SIOCSIWMODE */	(iw_handler) rt_ioctl_giwmode,			/* SIOCGIWMODE */	(iw_handler) NULL,						/* SIOCSIWSENS */	(iw_handler) NULL,						/* SIOCGIWSENS */	(iw_handler) NULL /* not used */,		/* SIOCSIWRANGE */	(iw_handler) rt_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) rt_ioctl_giwap,			/* SIOCGIWAP	0x15*/	(iw_handler) NULL,						/* -- hole --	0x16 */	(iw_handler) rt_ioctl_iwaplist,			/* SIOCGIWAPLIST */#ifdef SIOCGIWSCAN	(iw_handler) rt_ioctl_siwscan,			/* SIOCSIWSCAN	0x18*/	(iw_handler) rt_ioctl_giwscan,			/* SIOCGIWSCAN */#else	(iw_handler) NULL,						/* SIOCSIWSCAN */	(iw_handler) NULL,						/* SIOCGIWSCAN */#endif /* SIOCGIWSCAN */	(iw_handler) rt_ioctl_siwessid,			/* SIOCSIWESSID */	(iw_handler) rt_ioctl_giwessid,			/* SIOCGIWESSID */	(iw_handler) rt_ioctl_siwnickn,			/* SIOCSIWNICKN */	(iw_handler) rt_ioctl_giwnickn,			/* SIOCGIWNICKN 1d*/	(iw_handler) NULL,						/* -- hole -- */	(iw_handler) NULL,						/* -- hole -- */	(iw_handler) NULL,						/* SIOCSIWRATE	20*/	(iw_handler) NULL,						/* SIOCGIWRATE */	(iw_handler) rt_ioctl_siwrts,			/* SIOCSIWRTS */	(iw_handler) rt_ioctl_giwrts,			/* SIOCGIWRTS */	(iw_handler) rt_ioctl_siwfrag,			/* SIOCSIWFRAG */	(iw_handler) rt_ioctl_giwfrag,			/* SIOCGIWFRAG	25*/	(iw_handler) NULL,						/* SIOCSIWTXPOW */	(iw_handler) NULL,						/* SIOCGIWTXPOW */	(iw_handler) NULL,						/* SIOCSIWRETRY */	(iw_handler) NULL,						/* SIOCGIWRETRY  29*/	(iw_handler) rt_ioctl_siwencode,		/* SIOCSIWENCODE 2a*/	(iw_handler) rt_ioctl_giwencode,		/* SIOCGIWENCODE 2b*/	(iw_handler) NULL,						/* SIOCSIWPOWER  2c*/	(iw_handler) NULL,						/* SIOCGIWPOWER  2d*/};static const iw_handler rt_priv_handlers[] = {	(iw_handler) rt_ioctl_setparam,		/* SIOCWFIRSTPRIV+1 */};const struct iw_handler_def rt73_iw_handler_def ={#define	N(a)	(sizeof (a) / sizeof (a[0]))	.standard	= (iw_handler *) rt_handler,	.num_standard	= sizeof(rt_handler) / sizeof(iw_handler),	.private	= (iw_handler *) rt_priv_handlers,	.num_private		= N(rt_priv_handlers),	.private_args	= (struct iw_priv_args *) privtab,	.num_private_args	= N(privtab),#if IW_HANDLER_VERSION >= 6	.get_wireless_stats = rt73_get_wireless_stats,#endif#if WIRELESS_EXT > 15//	.spy_offset	= offsetof(struct hostap_interface, spy_data),#endif /* WIRELESS_EXT > 15 */};INT RTMPSetInformation(	IN	PRTMP_ADAPTER pAdapter,	IN	OUT struct ifreq	*rq,	IN	INT 				cmd){	struct iwreq						*wrq = (struct iwreq *) rq;	NDIS_802_11_SSID					Ssid, *pSsid=NULL;	NDIS_802_11_MAC_ADDRESS 			Bssid;	RT_802_11_PHY_MODE					PhyMode;	RT_802_11_STA_CONFIG				StaConfig, *pStaConfig=NULL;	NDIS_802_11_RATES					aryRates;	RT_802_11_PREAMBLE					Preamble;	NDIS_802_11_WEP_STATUS				WepStatus;	NDIS_802_11_AUTHENTICATION_MODE 	AuthMode;	NDIS_802_11_NETWORK_INFRASTRUCTURE	BssType;	NDIS_802_11_RTS_THRESHOLD			RtsThresh;	NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;	NDIS_802_11_POWER_MODE				PowerMode;	NDIS_802_11_TX_POWER_LEVEL			TxPowerLevel;	PNDIS_802_11_KEY					pKey = NULL;	PNDIS_802_11_REMOVE_KEY 			pRemoveKey = NULL;	NDIS_802_11_CONFIGURATION			Config, *pConfig = NULL;	NDIS_802_11_NETWORK_TYPE			NetType;	ULONG								Now;	ULONG								KeyIdx;	INT 								Status = NDIS_STATUS_SUCCESS;	ULONG								AntDiv;	BOOLEAN 							RadioState;#if WPA_SUPPLICANT_SUPPORT    PNDIS_802_11_WEP			        pWepKey =NULL;    PNDIS_802_11_PMKID                  pPmkId = NULL;    BOOLEAN				                IEEE8021xState;    BOOLEAN				                IEEE8021x_required_keys;    BOOLEAN                             wpa_supplicant_enable;    BOOLEAN                             start_send_beacon_up;#endif	switch(cmd & 0x7FFF) {		case RT_OID_802_11_COUNTRY_REGION:			if (wrq->u.data.length < sizeof(UCHAR)) {				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status = -EINVAL;			}			else if (!(pAdapter->PortCfg.CountryRegion & 0x80) && !(pAdapter->PortCfg.CountryRegionForABand & 0x80))	// Only avaliable when EEPROM not programming			{				ULONG	Country;				UCHAR	TmpPhy;				Status = copy_from_user(&Country, wrq->u.data.pointer, wrq->u.data.length);				pAdapter->PortCfg.CountryRegion = (UCHAR)(Country & 0x000000FF);				pAdapter->PortCfg.CountryRegionForABand = (UCHAR)((Country >> 8) & 0x000000FF);				TmpPhy = pAdapter->PortCfg.PhyMode;				pAdapter->PortCfg.PhyMode = 0xff;				// Build all corresponding channel information				Status = RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_802_11_SET_PHY_MODE, TRUE, &TmpPhy, sizeof(TmpPhy));				DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_SET_COUNTRY_REGION (A:%d  B/G:%d)\n", pAdapter->PortCfg.CountryRegionForABand,					pAdapter->PortCfg.CountryRegion);			}			break;		case OID_802_11_BSSID_LIST_SCAN:			Now = jiffies;			DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_BSSID_LIST_SCAN, TxCnt = %d \n", pAdapter->BulkLastOneSecCount);			if (pAdapter->BulkLastOneSecCount > 100)			{				DBGPRINT(RT_DEBUG_TRACE, "!!! Link UP, ignore this set::OID_802_11_BSSID_LIST_SCAN\n");				//Status = NDIS_STATUS_SUCCESS;				pAdapter->PortCfg.ScanCnt = 99;		// Prevent auto scan triggered by this OID				break;			}			if ((OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED)) &&				((pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPA) ||				(pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||				(pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPA2) ||				(pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)#if WPA_SUPPLICANT_SUPPORT			  	 || (pAdapter->PortCfg.IEEE8021X == TRUE)#endif				) &&				(pAdapter->PortCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED))			{				DBGPRINT(RT_DEBUG_TRACE, "!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\n");				Status = NDIS_STATUS_SUCCESS;				pAdapter->PortCfg.ScanCnt = 99;		// Prevent auto scan triggered by this OID				break;			}			Status = RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_BSSID_LIST_SCAN, TRUE, NULL, 0);			break;		case OID_802_11_SSID:			if (wrq->u.data.length != sizeof(NDIS_802_11_SSID)) {				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status = -EINVAL;			}			else			{				Status = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length);				pSsid = &Ssid;				if (pSsid->SsidLength > MAX_LEN_OF_SSID) {					DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",							__FUNCTION__);					Status = -EINVAL;				}				else				{					// reset SSID to null					if (pSsid->SsidLength == 0)					{						Ssid.Ssid[0] = 0;					}					RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_SSID, TRUE, pSsid, sizeof(NDIS_802_11_SSID));					DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_SSID (Len=%d,Ssid=%s)\n", pSsid->SsidLength, pSsid->Ssid);				}			}			break;		case OID_802_11_BSSID:			if (wrq->u.data.length != sizeof(NDIS_802_11_MAC_ADDRESS)) {				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status	= -EINVAL;			}			else			{				Status = copy_from_user(&Bssid, wrq->u.data.pointer, wrq->u.data.length);				RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_802_11_BSSID, TRUE, &Bssid, wrq->u.data.length);				DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_BSSID %02x:%02x:%02x:%02x:%02x:%02x\n",										Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]);			}			break;		case RT_OID_802_11_RADIO:			if (wrq->u.data.length != sizeof(BOOLEAN)) {				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status	= -EINVAL;			}			else			{				Status = copy_from_user(&RadioState, wrq->u.data.pointer, wrq->u.data.length);				DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_RADIO (=%d)\n", RadioState);				if (pAdapter->PortCfg.bSwRadio != RadioState)				{					pAdapter->PortCfg.bSwRadio = RadioState;					if (pAdapter->PortCfg.bRadio != (pAdapter->PortCfg.bHwRadio && pAdapter->PortCfg.bSwRadio))					{						pAdapter->PortCfg.bRadio = (pAdapter->PortCfg.bHwRadio && pAdapter->PortCfg.bSwRadio);						RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_SET_RADIO, TRUE, NULL, 0);					}				}			}			break;		case RT_OID_802_11_PHY_MODE:			if (wrq->u.data.length != sizeof(RT_802_11_PHY_MODE)) {				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status	= -EINVAL;			}			else			{				Status = copy_from_user(&PhyMode, wrq->u.data.pointer, wrq->u.data.length);				RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_802_11_PHY_MODE, TRUE, &PhyMode, sizeof(RT_802_11_PHY_MODE));				DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_PHY_MODE (=%d)\n", PhyMode);			}			break;		case RT_OID_802_11_STA_CONFIG:			if (wrq->u.data.length != sizeof(RT_802_11_STA_CONFIG)) {				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status	= -EINVAL;			}			else			{				Status = copy_from_user(&StaConfig, wrq->u.data.pointer, wrq->u.data.length);				pStaConfig = &StaConfig;				RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_802_11_STA_CONFIG, TRUE, pStaConfig, sizeof(RT_802_11_STA_CONFIG));				DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_SET_STA_CONFIG (Burst=%d,BGprot=%d,ShortSlot=%d,Adhoc=%d\n",					pStaConfig->EnableTxBurst,					pStaConfig->UseBGProtection,					pStaConfig->UseShortSlotTime,					pStaConfig->AdhocMode);			}			break;		case OID_802_11_DESIRED_RATES:			if (wrq->u.data.length != sizeof(NDIS_802_11_RATES)) {				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status	= -EINVAL;			}			else			{				Status = copy_from_user(&aryRates, wrq->u.data.pointer, wrq->u.data.length);				memset(pAdapter->PortCfg.DesireRate, 0, MAX_LEN_OF_SUPPORTED_RATES);				memcpy(pAdapter->PortCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES));				DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_DESIRED_RATES (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",					pAdapter->PortCfg.DesireRate[0],pAdapter->PortCfg.DesireRate[1],					pAdapter->PortCfg.DesireRate[2],pAdapter->PortCfg.DesireRate[3],					pAdapter->PortCfg.DesireRate[4],pAdapter->PortCfg.DesireRate[5],					pAdapter->PortCfg.DesireRate[6],pAdapter->PortCfg.DesireRate[7] );					// Changing DesiredRate may affect the MAX TX rate we used to TX frames out					RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_UPDATE_TX_RATE, TRUE, NULL, 0);			}			break;		case RT_OID_802_11_PREAMBLE:			if (wrq->u.data.length != sizeof(RT_802_11_PREAMBLE)) {				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status	= -EINVAL;			}			else			{				Status = copy_from_user(&Preamble, wrq->u.data.pointer, wrq->u.data.length);				if ((Preamble == Rt802_11PreambleShort) || (Preamble == Rt802_11PreambleLong) || (Preamble == Rt802_11PreambleAuto))				{					RTUSBEnqueueCmdFromNdis(pAdapter, RT_OID_802_11_PREAMBLE, TRUE, &Preamble, sizeof(RT_802_11_PREAMBLE));				}				else				{					DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",							__FUNCTION__);					Status = -EINVAL;					break;				}				DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_SET_PREAMBLE (=%d)\n", Preamble);			}			break;		case OID_802_11_WEP_STATUS:			if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS)) {				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status	= -EINVAL;			}			else			{				Status = copy_from_user(&WepStatus, wrq->u.data.pointer, wrq->u.data.length);				// Since TKIP, AES, WEP are all supported. It should not have any invalid setting				if (WepStatus <= Ndis802_11Encryption3KeyAbsent)				{					if (pAdapter->PortCfg.WepStatus != WepStatus)					{						// Config has changed						pAdapter->bConfigChanged = TRUE;					}					//Status = RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_WEP_STATUS, TRUE, &WepStatus, sizeof(NDIS_802_11_WEP_STATUS));					pAdapter->PortCfg.WepStatus 	= WepStatus;					pAdapter->PortCfg.OrigWepStatus = WepStatus;					pAdapter->PortCfg.PairCipher	= WepStatus;					pAdapter->PortCfg.GroupCipher	= WepStatus;				}				else				{					DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",							__FUNCTION__);					Status	= -EINVAL;					break;				}				DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_WEP_STATUS (=%d)\n",WepStatus);			}			break;		case OID_802_11_AUTHENTICATION_MODE:			if (wrq->u.data.length != sizeof(NDIS_802_11_AUTHENTICATION_MODE)) {				DBGPRINT(RT_DEBUG_ERROR,"- %s: Invalid argument\n",						__FUNCTION__);				Status	= -EINVAL;			}			else			{				Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length);

⌨️ 快捷键说明

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