📄 rtmp_info.c
字号:
if(pKey == NULL)
{
Status = -ENOMEM;
break;
}
Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);
if (pKey->Length != wrq->u.data.length)
{
Status = -EINVAL;
DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_ADD_WPA, Failed!!\n");
}
else
{
if ((pAdapter->PortCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&\
(pAdapter->PortCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&\
(pAdapter->PortCfg.AuthMode != Ndis802_11AuthModeWPANone) )
{
Status = -EOPNOTSUPP;
DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_ADD_WPA, Failed!! [AuthMode != WPAPSK/WPA2PSK/WPANONE]\n");
}
else if ((pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\
(pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ) // Only for WPA PSK mode
{
INT i;
pAdapter->PortCfg.PskKey.KeyLen = (UCHAR) pKey->KeyLength;
NdisMoveMemory(pAdapter->PortCfg.PskKey.Key, &pKey->KeyMaterial, pKey->KeyLength);
// Use RaConfig as PSK agent.
// Start STA supplicant state machine
pAdapter->PortCfg.WpaState = SS_START;
DBGPRINT(RT_DEBUG_TRACE,"PskKey = Len = %d \n ",pKey->KeyLength);
for (i = 0; i < 32; i++)
{
DBGPRINT_RAW(RT_DEBUG_TRACE,"%02x:", pAdapter->PortCfg.PskKey.Key[i]);
}
DBGPRINT(RT_DEBUG_TRACE,"\n");
// Use RaConfig as PSK agent.
// Start STA supplicant state machine
pAdapter->PortCfg.WpaState = SS_START;
DBGPRINT(RT_DEBUG_TRACE, "Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength);
}
else
{
Status = RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_ADD_KEY, TRUE, pKey, sizeof(pKey));
}
}
kfree(pKey);
break;
case OID_802_11_REMOVE_KEY:
pRemoveKey = kmalloc(wrq->u.data.length, GFP_KERNEL);
if(pRemoveKey == NULL)
{
Status = -ENOMEM;
break;
}
Status = copy_from_user(pRemoveKey, wrq->u.data.pointer, wrq->u.data.length);
if (pRemoveKey->Length != wrq->u.data.length)
{
Status = -EINVAL;
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_REMOVE_KEY, Failed!!\n");
}
else
{
Status = RTMPRemoveKeySanity(pAdapter, pRemoveKey);
if (Status == NDIS_STATUS_SUCCESS)
{
RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_REMOVE_KEY, TRUE, pRemoveKey, wrq->u.data.length);
}
}
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_REMOVE_KEY (id=0x%x, Len=%d-byte)\n", pRemoveKey->KeyIndex, pRemoveKey->Length);
kfree(pRemoveKey);
break;
// New for WPA
case OID_802_11_ADD_KEY:
DBGPRINT(RT_DEBUG_ERROR, "!!!!!!!!!!!!!!!!!!!!!Set::OID_802_11_ADD_KEY !!\n");
pKey = kmalloc(wrq->u.data.length, GFP_KERNEL);
if(pKey == NULL)
{
Status = -ENOMEM;
break;
}
Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);
if (pKey->Length != wrq->u.data.length)
{
Status = -EINVAL;
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_ADD_KEY, Failed!!\n");
}
else
{
if (pAdapter->PortCfg.AuthMode >= Ndis802_11AuthModeWPA)
{
RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_ADD_KEY, TRUE, pKey, sizeof(pKey));
}
else // Old WEP stuff
{
Status = RTMPWPAWepKeySanity(pAdapter, pKey);
if (Status == NDIS_STATUS_SUCCESS)
RTUSBEnqueueCmdFromNdis(pAdapter, OID_802_11_ADD_KEY_WEP, TRUE, pKey, wrq->u.data.length);
}
KeyIdx = pKey->KeyIndex & 0x0fffffff;
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_ADD_KEY (id=0x%x, Len=%d-byte)\n", KeyIdx, pKey->KeyLength);
}
kfree(pKey);
break;
case OID_802_11_CONFIGURATION:
if (wrq->u.data.length != sizeof(NDIS_802_11_CONFIGURATION))
Status = -EINVAL;
else
{
Status = copy_from_user(&Config, wrq->u.data.pointer, wrq->u.data.length);
pConfig = &Config;
if ((pConfig->BeaconPeriod >= 20) && (pConfig->BeaconPeriod <=400))
pAdapter->PortCfg.BeaconPeriod = (USHORT) pConfig->BeaconPeriod;
pAdapter->PortCfg.AtimWin = (USHORT) pConfig->ATIMWindow;
MAP_KHZ_TO_CHANNEL_ID(pConfig->DSConfig, pAdapter->PortCfg.Channel);
//
// Save the channel on MlmeAux for CntlOidRTBssidProc used.
//
pAdapter->MlmeAux.Channel = pAdapter->PortCfg.Channel;
DBGPRINT(RT_DEBUG_TRACE, "Set::OID_802_11_CONFIGURATION (BeacnPeriod=%d,AtimW=%d,Ch=%d)\n",
pConfig->BeaconPeriod, pConfig->ATIMWindow, pAdapter->PortCfg.Channel);
// Config has changed
pAdapter->bConfigChanged = TRUE;
}
break;
default:
DBGPRINT(RT_DEBUG_TRACE, "Set::unknown IOCTL's subcmd = 0x%08x\n", cmd);
Status = -EOPNOTSUPP;
break;
}
return Status;
}
INT RTMPQueryInformation(
IN PRTMP_ADAPTER 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;
RT_802_11_STA_CONFIG StaConfig;
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;
NDIS_MEDIA_STATE MediaState;
ULONG BssBufSize;
ULONG BssLen;
ULONG ulInfo = 0;
PUCHAR pBuf = NULL;
PUCHAR pPtr;
INT Status = NDIS_STATUS_SUCCESS;
UCHAR Padding;
UINT i;
BOOLEAN RadioState;
ULONG NetworkTypeList[4];
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);
Status = copy_to_user(wrq->u.data.pointer, NIC_DEVICE_NAME, wrq->u.data.length);
break;
case RT_OID_VERSION_INFO:
DBGPRINT(RT_DEBUG_INFO, "Query::RT_OID_VERSION_INFO \n");
DriverVersionInfo.DriverVersionW = DRV_MAJORVERSION;
DriverVersionInfo.DriverVersionX = DRV_MINORVERSION;
DriverVersionInfo.DriverVersionY = DRV_SUBVERSION;
DriverVersionInfo.DriverVersionZ = DRV_TESTVERSION;
DriverVersionInfo.DriverBuildYear = DRV_YEAR;
DriverVersionInfo.DriverBuildMonth = DRV_MONTH;
DriverVersionInfo.DriverBuildDay = DRV_DAY;
wrq->u.data.length = sizeof(RT_VERSION_INFO);
Status = copy_to_user(wrq->u.data.pointer, &DriverVersionInfo, wrq->u.data.length);
break;
case OID_802_11_BSSID_LIST:
DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_BSSID_LIST (%d BSS returned)\n",pAdapter->ScanTab.BssNr);
// Claculate total buffer size required
BssBufSize = sizeof(ULONG);
for (i = 0; i < pAdapter->ScanTab.BssNr; i++)
{
// Align pointer to 4 bytes boundary.
Padding = 4 - (pAdapter->ScanTab.BssEntry[i].VarIELen & 0x0003);
if (Padding == 4)
Padding = 0;
BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 4 + sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->ScanTab.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
NdisZeroMemory(pBuf, BssBufSize);
pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf;
pBssidList->NumberOfItems = pAdapter->ScanTab.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->ScanTab.BssNr; i++)
{
pBss = (PNDIS_WLAN_BSSID_EX) pPtr;
NdisMoveMemory(&pBss->MacAddress, &pAdapter->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN);
if ((pAdapter->ScanTab.BssEntry[i].Hidden == 1) && (pAdapter->PortCfg.bShowHiddenSSID == FALSE))
{
pBss->Ssid.SsidLength = 0;
}
else
{
pBss->Ssid.SsidLength = pAdapter->ScanTab.BssEntry[i].SsidLen;
NdisMoveMemory(pBss->Ssid.Ssid, pAdapter->ScanTab.BssEntry[i].Ssid, pAdapter->ScanTab.BssEntry[i].SsidLen);
}
pBss->Privacy = pAdapter->ScanTab.BssEntry[i].Privacy;
pBss->Rssi = pAdapter->ScanTab.BssEntry[i].Rssi - pAdapter->BbpRssiToDbmDelta;
pBss->NetworkTypeInUse = NetworkTypeInUseSanity(pAdapter->ScanTab.BssEntry[i].Channel,
pAdapter->ScanTab.BssEntry[i].SupRate,
pAdapter->ScanTab.BssEntry[i].SupRateLen,
pAdapter->ScanTab.BssEntry[i].ExtRate,
pAdapter->ScanTab.BssEntry[i].ExtRateLen);
pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION);
pBss->Configuration.BeaconPeriod = pAdapter->ScanTab.BssEntry[i].BeaconPeriod;
pBss->Configuration.ATIMWindow = pAdapter->ScanTab.BssEntry[i].AtimWin;
MAP_CHANNEL_ID_TO_KHZ(pAdapter->ScanTab.BssEntry[i].Channel, pBss->Configuration.DSConfig);
if (pAdapter->ScanTab.BssEntry[i].BssType == BSS_INFRA)
pBss->InfrastructureMode = Ndis802_11Infrastructure;
else
pBss->InfrastructureMode = Ndis802_11IBSS;
NdisMoveMemory(pBss->SupportedRates, pAdapter->ScanTab.BssEntry[i].SupRate, pAdapter->ScanTab.BssEntry[i].SupRateLen);
// TODO: 2004-09-13 john - should we copy ExtRate into this array? if not, some APs annouced all 8 11g rates
// in ExtRateIE which may be mis-treated as 802.11b AP by ZeroConfig
NdisMoveMemory(pBss->SupportedRates + pAdapter->ScanTab.BssEntry[i].SupRateLen,
pAdapter->ScanTab.BssEntry[i].ExtRate,
pAdapter->ScanTab.BssEntry[i].ExtRateLen);
DBGPRINT(RT_DEBUG_TRACE,"BSS#%d - %s, Ch %d = %d Khz, Sup+Ext rate# = %d\n",
i,pBss->Ssid.Ssid,
pAdapter->ScanTab.BssEntry[i].Channel,
pBss->Configuration.DSConfig,
pAdapter->ScanTab.BssEntry[i].SupRateLen + pAdapter->ScanTab.BssEntry[i].ExtRateLen);
if (pAdapter->ScanTab.BssEntry[i].VarIELen == 0)
{
pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs);
NdisMoveMemory(pBss->IEs, &pAdapter->ScanTab.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->ScanTab.BssEntry[i].VarIELen;
pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 4 + sizeof(NDIS_802_11_FIXED_IEs);
NdisMoveMemory(pBss->IEs, &pAdapter->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));
NdisMoveMemory(pPtr, pAdapter->ScanTab.BssEntry[i].VarIEs, pAdapter->ScanTab.BssEntry[i].VarIELen);
pPtr += pAdapter->ScanTab.BssEntry[i].VarIELen;
}
// Align pointer to 4 bytes boundary.
Padding = 4 - (pAdapter->ScanTab.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->ScanTab.BssEntry[i].VarIELen + Padding;
BssLen += pBss->Length;
}
wrq->u.data.length = BssLen;
Status = copy_to_user(wrq->u.data.pointer, pBssidList, wrq->u.data.length);
kfree(pBssidList);
break;
case OID_802_3_CURRENT_ADDRESS:
wrq->u.data.length = MAC_ADDR_LEN;
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CurrentAddress, wrq->u.data.length);
DBGPRINT(RT_DEBUG_INFO, "Query::OID_802_3_CURRENT_ADDRESS \n");
break;
case OID_GEN_MEDIA_CONNECT_STATUS:
DBGPRINT(RT_DEBUG_INFO, "Query::OID_GEN_MEDIA_CONNECT_STATUS \n");
if (OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED))
MediaState = NdisMediaStateConnected;
else
MediaState = NdisMediaStateDisconnected;
wrq->u.data.length = sizeof(NDIS_MEDIA_STATE);
Status = copy_to_user(wrq->u.data.pointer, &MediaState, wrq->u.data.length);
break;
case OID_802_11_BSSID:
if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter))
{
wrq->u.data.length = sizeof(NDIS_802_11_MAC_ADDRESS);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->PortCfg.Bssid, wrq->u.data.length);
DBGPRINT(RT_DEBUG_INFO, "IOCTL::SIOCGIWAP(=%02x:%02x:%02x:%02x:%02x:%02x)\n",
pAdapter->PortCfg.Bssid[0],pAdapter->PortCfg.Bssid[1],pAdapter->PortCfg.Bssid[2],
pAdapter->PortCfg.Bssid[3],pAdapter->PortCfg.Bssid[4],pAdapter->PortCfg.Bssid[5]);
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_BSSID(=EMPTY)\n");
Status = -ENOTCONN;
}
break;
case OID_802_11_SSID:
Ssid.SsidLength = pAdapter->PortCfg.SsidLen;
NdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID);
NdisMoveMemory(Ssid.Ssid, pAdapter->PortCfg.Ssid, Ssid.SsidLength);
wrq->u.data.length = sizeof(NDIS_802_11_SSID);
Status = copy_to_user(wrq->u.data.pointer, &Ssid, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_SSID (Len=%d, ssid=%s)\n", Ssid.SsidLength,Ssid.Ssid);
break;
case RT_OID_802_11_QUERY_LINK_STATUS:
LinkStatus.CurrTxRate = RateIdTo500Kbps[pAdapter->PortCfg.TxRate]; // unit : 500 kbps
LinkStatus.ChannelQuality = pAdapter->Mlme.ChannelQuality;
LinkStatus.RxByteCount = pAdapter->RalinkCounters.ReceivedByteCount;
LinkStatus.TxByteCount = pAdapter->RalinkCounters.TransmittedByteCount;
wrq->u.data.length = sizeof(RT_802_11_LINK_STATUS);
Status = copy_to_user(wrq->u.data.pointer, &LinkStatus, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, "Query::RT_OID_802_11_QUERY_LINK_STATUS\n");
break;
case OID_802_11_CONFIGURATION:
Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION);
Configuration.BeaconPeriod = pAdapter->PortCfg.BeaconPeriod;
Configuration.ATIMWindow = pAdapter->PortCfg.AtimWin;
MAP_CHANNEL_ID_TO_KHZ(pAdapter->PortCfg.Channel, Configuration.DSConfig);
wrq->u.data.length = sizeof(NDIS_802_11_CONFIGURATION);
Status = copy_to_user(wrq->u.data.pointer, &Configuration, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_CONFIGURATION(BeaconPeriod=%d,AtimW=%d,Channel=%d) \n",
Configuration.BeaconPeriod, Configuration.ATIMWindow, pAdapter->PortCfg.Channel);
break;
case OID_802_11_RSSI_TRIGGER:
ulInfo = pAdapter->PortCfg.LastRssi - pAdapter->BbpRssiToDbmDelta;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, "Query::OID_802_11_RSSI_TRIGGER(=%d)\n", ulInfo);
break;
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(pAdapter);
// Sanity check for calculation of sucessful count
if (pAdapter->WlanCounters.TransmittedFragmentCount.QuadPart < pAdapter->WlanCounters.RetryCount.QuadPart)
pAdapter->W
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -