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

📄 rtmp_info.c

📁 Ralink RT61 SoftAP Driver source code. RT61:MiniPCI
💻 C
📖 第 1 页 / 共 5 页
字号:
		case OID_802_11_STATISTICS:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_STATISTICS \n");
			
			// add the most up-to-date h/w raw counters into software counters
			NICUpdateRawCounters(pAd);

			// Sanity check for calculation of sucessful count
			if (pAd->WlanCounters.TransmittedFragmentCount < pAd->WlanCounters.RetryCount)
				pAd->WlanCounters.TransmittedFragmentCount = pAd->WlanCounters.RetryCount;
		
			//DBGPRINT(RT_DEBUG_TRACE,"-------------Statistics.TransmittedFragmentCount=%d\n",Statistics.TransmittedFragmentCount);
			Statistics.TransmittedFragmentCount = pAd->WlanCounters.TransmittedFragmentCount;
			Statistics.MulticastTransmittedFrameCount = pAd->WlanCounters.MulticastTransmittedFrameCount;
			Statistics.FailedCount = pAd->WlanCounters.FailedCount;
			Statistics.RetryCount = pAd->WlanCounters.RetryCount;
			Statistics.MultipleRetryCount = pAd->WlanCounters.MultipleRetryCount;
			Statistics.RTSSuccessCount = pAd->WlanCounters.RTSSuccessCount;
			Statistics.RTSFailureCount = pAd->WlanCounters.RTSFailureCount;
			Statistics.ACKFailureCount = pAd->WlanCounters.ACKFailureCount;
			Statistics.FrameDuplicateCount = pAd->WlanCounters.FrameDuplicateCount;
			Statistics.ReceivedFragmentCount = pAd->WlanCounters.ReceivedFragmentCount;
			Statistics.MulticastReceivedFrameCount = pAd->WlanCounters.MulticastReceivedFrameCount;
		#ifdef DBG	
			Statistics.FCSErrorCount = pAd->RalinkCounters.RealFcsErrCount;
		#else
			Statistics.FCSErrorCount = pAd->WlanCounters.FCSErrorCount;
			//Statistics.FrameDuplicateCount.vv.LowPart = pAd->WlanCounters.FrameDuplicateCount.vv.LowPart / 100;
		#endif
			wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS);
			Status = copy_to_user(wrq->u.data.pointer, &Statistics, wrq->u.data.length);
			break;

		case OID_802_11_RTS_THRESHOLD:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_RTS_THRESHOLD \n");
			wrq->u.data.length = sizeof(ulInfo);
			ulInfo = pAd->PortCfg.RtsThreshold; //MAX_RTS_THRESHOLD;
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
			break;

		case OID_802_11_FRAGMENTATION_THRESHOLD:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_FRAGMENTATION_THRESHOLD \n");
			wrq->u.data.length = sizeof(ulInfo);
			ulInfo = pAd->PortCfg.FragmentThreshold;//MAX_FRAG_THRESHOLD;
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
			break;

		// SNMP ieee802dot11
		case RT_OID_802_11_MANUFACTUREROUI:
			DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_MANUFACTUREROUI \n");
			wrq->u.data.length = ManufacturerOUI_LEN;
			Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);
			break;

		case RT_OID_802_11_MANUFACTURERNAME:
			DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_MANUFACTURERNAME \n");
			wrq->u.data.length = strlen(ManufacturerNAME);
			Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);
			break;

		case RT_OID_802_11_RESOURCETYPEIDNAME:
			DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_RESOURCETYPEIDNAME \n");
			wrq->u.data.length = strlen(ResourceTypeIdName);
			Status = copy_to_user(wrq->u.data.pointer, ResourceTypeIdName, wrq->u.data.length);
			break;

		case RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED:
			DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED \n");
			ulInfo = 1; // 1 is support wep else 2 is not support.
			wrq->u.data.length = sizeof(ulInfo);
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
			break;

		case RT_OID_802_11_POWERMANAGEMENTMODE:
			DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_POWERMANAGEMENTMODE \n");
			ulInfo = 1; // 1 is power active else 2 is power save.
			wrq->u.data.length = sizeof(ulInfo);
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
			break;

		case OID_802_11_WEPDEFAULTKEYVALUE:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_WEPDEFAULTKEYVALUE \n");
			//KeyIdxValue.KeyIdx = pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId;
			pKeyIdxValue = wrq->u.data.pointer;
			DBGPRINT(RT_DEBUG_TRACE,"KeyIdxValue.KeyIdx = %d, \n",pKeyIdxValue->KeyIdx);
			valueLen = strlen(pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[pKeyIdxValue->KeyIdx].Key);
			NdisMoveMemory(pKeyIdxValue->Value,
						   pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[pKeyIdxValue->KeyIdx].Key,
						   valueLen);
			pKeyIdxValue->Value[valueLen]='\0';

			wrq->u.data.length = sizeof(DefaultKeyIdxValue);

			Status = copy_to_user(wrq->u.data.pointer, pKeyIdxValue, wrq->u.data.length);
			DBGPRINT(RT_DEBUG_TRACE,"DefaultKeyId = %d, total len = %d, str len=%d, KeyValue= %02x %02x %02x %02x %02x \n", pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId, wrq->u.data.length, strlen(pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[pKeyIdxValue->KeyIdx].Key),
			pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[pKeyIdxValue->KeyIdx].Key[0],
			pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[pKeyIdxValue->KeyIdx].Key[1],
			pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[pKeyIdxValue->KeyIdx].Key[2],
			pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[pKeyIdxValue->KeyIdx].Key[3],
			pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[pKeyIdxValue->KeyIdx].Key[4]);

			/*DBGPRINT(RT_DEBUG_TRACE,"DefaultKeyId = %d, len = %d, KeyValue= %02x %02x %02x %02x %02x \n", pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId, strlen(pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[KeyIdxValue.KeyIdx].Key),
			KeyIdxValue.Value[0],
			KeyIdxValue.Value[1],
			KeyIdxValue.Value[2],
			KeyIdxValue.Value[3],
			KeyIdxValue.Value[4]);*/
			
			break;
		
		case OID_802_11_WEPDEFAULTKEYID:
			DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_WEPDEFAULTKEYID \n");
			wrq->u.data.length = sizeof(UCHAR);
			Status = copy_to_user(wrq->u.data.pointer, &pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId, wrq->u.data.length);
			DBGPRINT(RT_DEBUG_TRACE, "DefaultKeyId =%d \n",pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId);
			break;

		case RT_OID_802_11_WEPKEYMAPPINGLENGTH:
			DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_WEPKEYMAPPINGLENGTH \n");
			wrq->u.data.length = sizeof(UCHAR);
			Status = copy_to_user(wrq->u.data.pointer,
									&pAd->PortCfg.MBSSID[pAd->IoctlIF].SharedKey[pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId].KeyLen,
									wrq->u.data.length);
			break;

		case OID_802_11_SHORTRETRYLIMIT:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_SHORTRETRYLIMIT \n");
			wrq->u.data.length = sizeof(ULONG);
			RTMP_IO_READ32(pAd, TXRX_CSR4, &csr4.word);
			ShortRetryLimit = csr4.field.ShortRetryLimit;
			DBGPRINT(RT_DEBUG_TRACE, "ShortRetryLimit =%ld,  csr4.field.ShortRetryLimit=%ld\n", ShortRetryLimit, csr4.field.ShortRetryLimit);
			Status = copy_to_user(wrq->u.data.pointer, &ShortRetryLimit, wrq->u.data.length);
			break;

		case OID_802_11_LONGRETRYLIMIT:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_LONGRETRYLIMIT \n");
			wrq->u.data.length = sizeof(ULONG);
			RTMP_IO_READ32(pAd, TXRX_CSR4, &csr4.word);
			LongRetryLimit = csr4.field.LongRetryLimit;
			DBGPRINT(RT_DEBUG_TRACE, "LongRetryLimit =%ld,  csr4.field.LongRetryLimit=%ld\n", LongRetryLimit, csr4.field.LongRetryLimit);
			Status = copy_to_user(wrq->u.data.pointer, &LongRetryLimit, wrq->u.data.length);
			break;
	
		case RT_OID_802_11_PRODUCTID:
			DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_PRODUCTID \n");
			sprintf(tmp, "%04x, %04x, %04x \n", NIC2661_PCI_DEVICE_ID, NIC2561S_PCI_DEVICE_ID, NIC2561_PCI_DEVICE_ID);
			wrq->u.data.length = strlen(tmp);
			Status = copy_to_user(wrq->u.data.pointer, tmp, wrq->u.data.length);
			break;

		case RT_OID_802_11_MANUFACTUREID:
			DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_MANUFACTUREID \n");
			wrq->u.data.length = strlen(ManufacturerNAME);
			Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);
			break;

		case OID_802_11_TX_ANTENNA_SELECTED:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_TX_ANTENNA_SELECTED \n");
			wrq->u.data.length = sizeof(USHORT);
			ulInfo = pAd->Antenna.field.TxDefaultAntenna;
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
			DBGPRINT(RT_DEBUG_TRACE, "Antenna tx=%d \n", pAd->Antenna.field.TxDefaultAntenna);
			break;

		case OID_802_11_RX_ANTENNA_SELECTED:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_TX_ANTENNA_SELECTED \n");
			wrq->u.data.length = sizeof(USHORT);
			ulInfo = pAd->Antenna.field.RxDefaultAntenna;
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
			DBGPRINT(RT_DEBUG_TRACE, "Antenna rx=%d \n", pAd->Antenna.field.RxDefaultAntenna);
			break;

		case OID_802_11_NUMBER_OF_ANTENNAS:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_NUMBER_OF_ANTENNAS \n");
			wrq->u.data.length = sizeof(USHORT);
			ulInfo = pAd->Antenna.field.NumOfAntenna;
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
			DBGPRINT(RT_DEBUG_TRACE, "Antenna num=%d \n", pAd->Antenna.field.NumOfAntenna);
			break;

		case OID_802_11_DESIRED_RATES:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_DESIRED_RATES \n");
			wrq->u.data.length = sizeof(NDIS_802_11_RATES);
			Status = copy_to_user(wrq->u.data.pointer, pAd->PortCfg.MBSSID[pAd->IoctlIF].DesiredRates, wrq->u.data.length);
			
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_DESIRED_RATES (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n", 
				pAd->PortCfg.MBSSID[pAd->IoctlIF].DesiredRates[0],pAd->PortCfg.MBSSID[pAd->IoctlIF].DesiredRates[1],
				pAd->PortCfg.MBSSID[pAd->IoctlIF].DesiredRates[2],pAd->PortCfg.MBSSID[pAd->IoctlIF].DesiredRates[3],
				pAd->PortCfg.MBSSID[pAd->IoctlIF].DesiredRates[4],pAd->PortCfg.MBSSID[pAd->IoctlIF].DesiredRates[5],
				pAd->PortCfg.MBSSID[pAd->IoctlIF].DesiredRates[6],pAd->PortCfg.MBSSID[pAd->IoctlIF].DesiredRates[7]);
				
			break;
			
		case OID_802_11_CURRENTCHANNEL:
			DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_CURRENTCHANNEL \n");
			wrq->u.data.length = sizeof(UCHAR);
			DBGPRINT(RT_DEBUG_TRACE, "sizeof UCHAR=%d, channel=%d \n", sizeof(UCHAR), pAd->PortCfg.Channel);
			Status = copy_to_user(wrq->u.data.pointer, &pAd->PortCfg.Channel, wrq->u.data.length);
			DBGPRINT(RT_DEBUG_TRACE, "Status=%d\n", Status);
			break;
#endif //snmp
   		default:
			DBGPRINT(RT_DEBUG_TRACE, "Query::unknown IOCTL's subcmd = 0x%08x\n", cmd);
			Status = -EOPNOTSUPP;
			break;
    }

	return Status;
}

INT RT61_ioctl(
	IN	struct net_device	*net_dev, 
	IN	OUT	struct ifreq	*rq, 
	IN	INT					cmd)
{
    VIRTUAL_ADAPTER                     *pVirtualAd;
	RTMP_ADAPTER                        *pAd = net_dev->priv;
    struct iwreq                        *wrq = (struct iwreq *) rq;
    INT                                 Status = NDIS_STATUS_SUCCESS;
    USHORT                              subcmd, index;

    //+ patch for SnapGear Request even the interface is down
    if(cmd== SIOCGIWNAME){
	    DBGPRINT(RT_DEBUG_TRACE, "IOCTL::SIOCGIWNAME\n");
	    strcpy(wrq->u.name, "RT61 SoftAP");
	    return Status;
    }//- patch for SnapGear
	
    if((net_dev->priv_flags == INT_MAIN) && !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
    {
		DBGPRINT(RT_DEBUG_TRACE, "INFO::Network is down!\n");
		return -ENETDOWN;
    }

    // determine this ioctl command is comming from which interface.
    if (net_dev->priv_flags == INT_MAIN)
    {
    	pAd= net_dev->priv;
        pAd->IoctlIF = MAIN_MBSSID;
        DBGPRINT(RT_DEBUG_INFO, "RT61_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\n", pAd->IoctlIF, net_dev->priv_flags, cmd);
    }
    else if (net_dev->priv_flags == INT_MBSSID)
    {
    	pVirtualAd = net_dev->priv;
        pAd = pVirtualAd->RtmpDev->priv;

    	if (!RTMPEqualMemory(net_dev->name, pAd->net_dev->name, 3))  // for multi-physical card, no MBSSID
    	{
	        for (index = 1; index < pAd->PortCfg.BssidNum; index++)
	    	{
	    	    if (pAd->PortCfg.MBSSID[index].MSSIDDev == net_dev)
	    	    {
	    	        pAd->IoctlIF = index;
	    	        
	    	        DBGPRINT(RT_DEBUG_INFO, "RT61_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\n", index, net_dev->priv_flags, cmd);
	    	        break;
	    	    }
	    	}
	        // Interface not found!
	        if(index == pAd->PortCfg.BssidNum)
	        {
	        	DBGPRINT(RT_DEBUG_ERROR, "RT61_ioctl can not find I/F\n");
	            return -ENETDOWN;
	        }
	    }
	    else    // ioctl command from I/F(ra0)
	    {
	    	pAd= net_dev->priv;
    	    pAd->IoctlIF = MAIN_MBSSID;
	        DBGPRINT(RT_DEBUG_ERROR, "RT61_ioctl can not find I/F and use default: cmd = 0x%08x\n", cmd);
	    }
    }
#ifdef APCLI_SUPPORT
    else if (net_dev->priv_flags == INT_APCLI)
    {
        pVirtualAd = net_dev->priv;
        pAd = pVirtualAd->RtmpDev->priv;

        for (index = 0; index < MAX_APCLI_ENTRY; index++)
        {
            if (pAd->ApCliTab.ApCliEntry[index].dev == net_dev)
            {
                pAd->ApcliIF = index;

                DBGPRINT(RT_DEBUG_INFO, "RT61_ioctl I/F(apcli%d)(flags=%d): cmd = 0x%08x\n", index, net_dev->priv_flags, cmd);
                break;
            }
        }
    }
#endif
    else
    {
    	DBGPRINT(RT_DEBUG_WARN, "IOCTL is not supported in WDS interface\n");
    	return -EOPNOTSUPP;
    }

	switch(cmd)
	{
        case SIOCGIFHWADDR:
			DBGPRINT(RT_DEBUG_TRACE, "IOCTLIOCTLIOCTL::SIOCGIFHWADDR\n");
			strcpy(wrq->u.name, pAd->PortCfg.MBSSID[pAd->IoctlIF].Bssid);
			break;
		case SIOCGIWNAME:
			DBGPRINT(RT_DEBUG_TRACE, "IOCTL::SIOCGIWNAME\n");
			strcpy(wrq->u.name, "RT61 SoftAP");
			break;
		case SIOCSIWESSID:  //Set ESSID
			Status = -EOPNOTSUPP;
			break;
		case SIOCGIWESSID:  //Get ESSID
			{
				struct iw_point *erq = &wrq->u.essid;

				erq->flags=1;
				erq->length = pAd->PortCfg.MBSSID[pAd->IoctlIF].SsidLen;

				if(erq->pointer)
				{
					if(copy_to_user(erq->pointer, pAd->PortCfg.MBSSID[pAd->IoctlIF].Ssid, erq->length))
					{
						Status = -EFAULT;
						break;
					}
				}
				DBGPRINT(RT_DEBUG_TRACE, "IOCTL::SIOCGIWESSID (Len=%d, ssid=%s...)\n", erq->length, (char *)erq->pointer);
			}
			break;
		case SIOCGIWNWID: // get network id 
		case SIOCSIWNWID: // set network id (the cell)
			Status = -EOPNOTSUPP;
			break;
		case SIOCGIWFREQ: // get channel/frequency (Hz)
			wrq->u.freq.m = pAd->PortCfg.Channel;
			wrq->u.freq.e = 0;
			wrq->u.freq.i = 0;
			break; 
		case SIOCSIWFREQ: //set channel/frequency (Hz)
		case SIOCGIWNICKN:
		case SIOCSIWNICKN: //set node name/nickname
		case SIOCGIWRATE:  //get default bit rate (bps)
			wrq->u.bitrate.value = RateIdTo500Kbps[pAd->PortCfg.MBSSID[pAd->IoctlIF].TxRate] * 500000;
			wrq->u.bitrate.disabled = 0;
			break;
		case SIOCSIWRATE:  //set default bit rate (bps)
		case SIOCGIWRTS:  // get RTS/CTS threshold (bytes)
		case SIOCSIWRTS:  //set RTS/CTS threshold (bytes)
		case SIOCGIWFRAG:  //get fragmentation thr (bytes)
		case SIOCSIWFRAG:  //set fragmentation thr (bytes)
		case SIOCGIWENCODE:  //get encoding token & mode
		case SIOCSIWENCODE:  //set encoding token & mode
			Status = -EOPNOTSUPP;
			break;
		case SIOCGIWAP:  //get access point MAC addresses
			wrq->u.ap_addr.sa_family = ARPHRD_ETHER;
			memcpy(wrq->u.ap_addr.sa_data, &pAd->PortCfg.MBSSID[pAd->IoctlIF].Bssid, ETH_ALEN);
			DBGPRINT(RT_DEBUG_TRACE, "IOCTL::SIOCGIWAP(=%02x:%02x:%02x:%02x:%02x:%02x)\n",
				pAd->PortCfg.MBSSID[pAd->IoctlIF].Bssid[0],pAd->PortCfg.MBSSID[pAd->IoctlIF].Bssid[1],pAd->PortCfg.MBSSID[pAd->IoctlIF].Bssid[2],
				pAd->PortCfg.MBSSID[pAd->IoctlIF].Bssid[3],pAd->PortCfg.MBSSID[pAd->IoctlIF].Bssid[4],pAd->PortCfg.MBSSID[pAd->IoctlIF].Bssid[5]);
			break;
		case SIOCGIWMODE:  //get operation mode
			wrq->u.mode = IW_MODE_INFRA;   //SoftAP always on INFRA mode.
			break;
		case SIOCSIWAP:  //set access point MAC addresses
		case SIOCSIWMODE:  //set operation mode
		case SIOCGIWSENS:   //get sensitivity (dBm)
		case SIOCSIWSENS:	//set sensitivity (dBm)
		case SIOCGIWPOWER:  //get Power Management settings
		case SIOCSIWPOWER:  //set Power Management settings
		case SIOCGIWTXPOW:  //get transmit power (dBm)
		case SIOCSIWTXPOW:  //set transmit power (dBm)
		//case SIOCGIWRANGE:	//Get range of parameters
		case SIOCGIWRETRY:	//get retry limits and lifetime
		case SIOCSIWRETRY:	//set retry limits and lifetime
			Status = -EOPNOTSUPP;
			break;
		case SIOCGIWRANGE:	//Get range of parameters
		    {
		        struct iw_range range;

                        memset(&range, 0, sizeof(range));
	                range.we_version_compiled = WIRELESS_EXT;
	                range.we_version_source = 14;
                        copy_to_user(wrq->u.data.pointer, &range, sizeof(range));
		    }
		    break;
		    

⌨️ 快捷键说明

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