📄 rtmp_info.c
字号:
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 + -