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

📄 sta_ioctl.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
	range->max_frag = 2346;#if WIRELESS_EXT > 17	/* IW_ENC_CAPA_* bit field */	range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | 					IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;#endif	return 0;}int rt_ioctl_siwap(struct net_device *dev,		      struct iw_request_info *info,		      struct sockaddr *ap_addr, char *extra){	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;    NDIS_802_11_MAC_ADDRESS Bssid;	//check if the interface is down	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))	{       	DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));       	return -ENETDOWN;       }	if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE)    {        RTMP_MLME_RESET_STATE_MACHINE(pAdapter);        DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n"));    }    // tell CNTL state machine to call NdisMSetInformationComplete() after completing    // this request, because this request is initiated by NDIS.    pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE; 	// Prevent to connect AP again in STAMlmePeriodicExec	pAdapter->MlmeAux.AutoReconnectSsidLen= 32;    memset(Bssid, 0, MAC_ADDR_LEN);    memcpy(Bssid, ap_addr->sa_data, MAC_ADDR_LEN);    MlmeEnqueue(pAdapter,                 MLME_CNTL_STATE_MACHINE,                 OID_802_11_BSSID,                 sizeof(NDIS_802_11_MAC_ADDRESS),                (VOID *)&Bssid);        DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCSIWAP %02x:%02x:%02x:%02x:%02x:%02x\n",        Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]));	return 0;}int rt_ioctl_giwap(struct net_device *dev,		      struct iw_request_info *info,		      struct sockaddr *ap_addr, char *extra){	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;	if (pAdapter == NULL)	{		/* if 1st open fail, pAd will be free;		   So the net_dev->priv will be NULL in 2rd open */		return -ENETDOWN;	}	if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter))	{		ap_addr->sa_family = ARPHRD_ETHER;		memcpy(ap_addr->sa_data, &pAdapter->CommonCfg.Bssid, ETH_ALEN);	}#ifdef WPA_SUPPLICANT_SUPPORT        // Add for RT2870    else if (pAdapter->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)    {        ap_addr->sa_family = ARPHRD_ETHER;        memcpy(ap_addr->sa_data, &pAdapter->MlmeAux.Bssid, ETH_ALEN);    }#endif // WPA_SUPPLICANT_SUPPORT //    	else	{		DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIWAP(=EMPTY)\n"));		return -ENOTCONN;	}	return 0;}/* * Units are in db above the noise floor. That means the * rssi values reported in the tx/rx descriptors in the * driver are the SNR expressed in db. * * If you assume that the noise floor is -95, which is an * excellent assumption 99.5 % of the time, then you can * derive the absolute signal level (i.e. -95 + rssi).  * There are some other slight factors to take into account * depending on whether the rssi measurement is from 11b, * 11g, or 11a.   These differences are at most 2db and * can be documented. * * NB: various calculations are based on the orinoco/wavelan *     drivers for compatibility */static void set_quality(PRTMP_ADAPTER pAdapter,                        struct iw_quality *iq,                         signed char rssi){	__u8 ChannelQuality;	// Normalize Rssi	if (rssi >= -50)        ChannelQuality = 100;	else if (rssi >= -80) // between -50 ~ -80dbm		ChannelQuality = (__u8)(24 + ((rssi + 80) * 26)/10);	else if (rssi >= -90)   // between -80 ~ -90dbm        ChannelQuality = (__u8)((rssi + 90) * 26)/10;   	else		ChannelQuality = 0;            iq->qual = (__u8)ChannelQuality;        iq->level = (__u8)(rssi);    iq->noise = (pAdapter->BbpWriteLatch[66] > pAdapter->BbpTuning.FalseCcaUpperThreshold) ? ((__u8)pAdapter->BbpTuning.FalseCcaUpperThreshold) : ((__u8) pAdapter->BbpWriteLatch[66]); 	// noise level (dBm)    iq->noise += 256 - 143;		    iq->updated = pAdapter->iw_stats.qual.updated;}int rt_ioctl_iwaplist(struct net_device *dev,			struct iw_request_info *info,			struct iw_point *data, char *extra){ 	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;	struct sockaddr addr[IW_MAX_AP];	struct iw_quality qual[IW_MAX_AP];	int i;   	//check if the interface is down    if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))    {       	DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));		data->length = 0;		return 0;        //return -ENETDOWN;   	}	for (i = 0; i <IW_MAX_AP ; i++)	{		if (i >=  pAdapter->ScanTab.BssNr)			break;		addr[i].sa_family = ARPHRD_ETHER;			memcpy(addr[i].sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN);		set_quality(pAdapter, &qual[i], pAdapter->ScanTab.BssEntry[i].Rssi);		}	data->length = i;	memcpy(extra, &addr, i*sizeof(addr[0]));	data->flags = 1;		/* signal quality present (sort of) */	memcpy(extra + i*sizeof(addr[0]), &qual, i*sizeof(qual[i]));	return 0;}#ifdef SIOCGIWSCANint rt_ioctl_siwscan(struct net_device *dev,			struct iw_request_info *info,			struct iw_point *data, char *extra){	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;	ULONG								Now;	int Status = NDIS_STATUS_SUCCESS;	//check if the interface is down	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))	{		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));		return -ENETDOWN;   	}	if (MONITOR_ON(pAdapter))    {        DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is in Monitor Mode now !!!\n"));        return -EINVAL;    }#ifdef WPA_SUPPLICANT_SUPPORT	if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE)	{		pAdapter->StaCfg.WpaSupplicantScanCount++;	}#endif // WPA_SUPPLICANT_SUPPORT //    pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE;	if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))		return NDIS_STATUS_SUCCESS;	do{		Now = jiffies;#ifdef WPA_SUPPLICANT_SUPPORT		if ((pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) &&			(pAdapter->StaCfg.WpaSupplicantScanCount > 3))		{			DBGPRINT(RT_DEBUG_TRACE, ("!!! WpaSupplicantScanCount > 3\n"));			Status = NDIS_STATUS_SUCCESS;			break;		}#endif // WPA_SUPPLICANT_SUPPORT //		if ((OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED)) &&			((pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || 			(pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) &&				(pAdapter->StaCfg.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;			break;		}		if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE)		{			RTMP_MLME_RESET_STATE_MACHINE(pAdapter);			DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n"));		}		// tell CNTL state machine to call NdisMSetInformationComplete() after completing		// this request, because this request is initiated by NDIS.		pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE;		// Reset allowed scan retries		pAdapter->StaCfg.ScanCnt = 0;		pAdapter->StaCfg.LastScanTime = Now;		MlmeEnqueue(pAdapter, 			MLME_CNTL_STATE_MACHINE, 			OID_802_11_BSSID_LIST_SCAN, 			0,			NULL);		Status = NDIS_STATUS_SUCCESS;		RTMP_MLME_HANDLER(pAdapter);	}while(0);	return NDIS_STATUS_SUCCESS;}int rt_ioctl_giwscan(struct net_device *dev,			struct iw_request_info *info,			struct iw_point *data, char *extra){	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;	int i=0;	PSTRING current_ev = extra, previous_ev = extra;	PSTRING end_buf;	PSTRING current_val;	STRING custom[MAX_CUSTOM_LEN] = {0};#ifndef IWEVGENIE	unsigned char idx;#endif // IWEVGENIE //	struct iw_event iwe;	if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))    {		/*		 * Still scanning, indicate the caller should try again.		 */		return -EAGAIN;	}#ifdef WPA_SUPPLICANT_SUPPORT	if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE)	{		pAdapter->StaCfg.WpaSupplicantScanCount = 0;	}#endif // WPA_SUPPLICANT_SUPPORT //	if (pAdapter->ScanTab.BssNr == 0)	{		data->length = 0;		return 0;	}	#if WIRELESS_EXT >= 17    if (data->length > 0)        end_buf = extra + data->length;    else        end_buf = extra + IW_SCAN_MAX_DATA;#else    end_buf = extra + IW_SCAN_MAX_DATA;#endif	for (i = 0; i < pAdapter->ScanTab.BssNr; i++) 	{		if (current_ev >= end_buf)        {#if WIRELESS_EXT >= 17            return -E2BIG;#else			break;#endif        }				//MAC address		//================================		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = SIOCGIWAP;		iwe.u.ap_addr.sa_family = ARPHRD_ETHER;				memcpy(iwe.u.ap_addr.sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid, ETH_ALEN);        previous_ev = current_ev;		current_ev = IWE_STREAM_ADD_EVENT(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN);        if (current_ev == previous_ev)#if WIRELESS_EXT >= 17            return -E2BIG;#else			break;#endif		/* 		Protocol:			it will show scanned AP's WirelessMode .			it might be					802.11a					802.11a/n					802.11g/n					802.11b/g/n					802.11g					802.11b/g		*/		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = SIOCGIWNAME;	{		PBSS_ENTRY pBssEntry=&pAdapter->ScanTab.BssEntry[i];		BOOLEAN isGonly=FALSE;		int rateCnt=0;		if (pBssEntry->Channel>14)		{			if (pBssEntry->HtCapabilityLen!=0)				strcpy(iwe.u.name,"802.11a/n");			else					strcpy(iwe.u.name,"802.11a");		}		else		{			/*				if one of non B mode rate is set supported rate . it mean G only. 			*/			for (rateCnt=0;rateCnt<pBssEntry->SupRateLen;rateCnt++)			{													/*					6Mbps(140) 9Mbps(146) and >=12Mbps(152) are supported rate , it mean G only. 				*/				if (pBssEntry->SupRate[rateCnt]==140 || pBssEntry->SupRate[rateCnt]==146 || pBssEntry->SupRate[rateCnt]>=152)					isGonly=TRUE;			}			for (rateCnt=0;rateCnt<pBssEntry->ExtRateLen;rateCnt++)			{				if (pBssEntry->ExtRate[rateCnt]==140 || pBssEntry->ExtRate[rateCnt]==146 || pBssEntry->ExtRate[rateCnt]>=152)					isGonly=TRUE;			}											if (pBssEntry->HtCapabilityLen!=0)			{				if (isGonly==TRUE)					strcpy(iwe.u.name,"802.11g/n");				else					strcpy(iwe.u.name,"802.11b/g/n");			}			else			{				if (isGonly==TRUE)					strcpy(iwe.u.name,"802.11g");				else				{					if (pBssEntry->SupRateLen==4 && pBssEntry->ExtRateLen==0)						strcpy(iwe.u.name,"802.11b");					else						strcpy(iwe.u.name,"802.11b/g");						}			}		}	}		previous_ev = current_ev;		current_ev = IWE_STREAM_ADD_EVENT(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN);		if (current_ev == previous_ev)#if WIRELESS_EXT >= 17	   		return -E2BIG;#else			break;#endif		//ESSID			//================================		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = SIOCGIWESSID;		iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].SsidLen;		iwe.u.data.flags = 1;         previous_ev = current_ev;		current_ev = IWE_STREAM_ADD_POINT(info, current_ev,end_buf, &iwe, (PSTRING) pAdapter->ScanTab.BssEntry[i].Ssid);        if (current_ev == previous_ev)#if WIRELESS_EXT >= 17            return -E2BIG;#else			break;#endif				//Network Type 		//================================		memset(&iwe, 0, sizeof(iwe));		iwe.cmd = SIOCGIWMODE;		if (pAdapter->ScanTab.BssEntry[i].BssType == Ndis802_11IBSS)		{			iwe.u.mode = IW_MODE_ADHOC;		}		else if (pAdapter->ScanTab.BssEntry[i].BssType == Ndis802_11Infrastructure)

⌨️ 快捷键说明

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