📄 rtmp_main.c
字号:
if (ADHOC_ON(pAd))
MakeIbssBeacon(pAd);
break;
case RT_OID_802_11_PREAMBLE:
{
ULONG Preamble = *((PULONG)(cmdqelmt->buffer));
if (Preamble == Rt802_11PreambleShort)
{
pAd->PortCfg.TxPreamble = Preamble;
MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);
}
else if ((Preamble == Rt802_11PreambleLong) || (Preamble == Rt802_11PreambleAuto))
{
// if user wants AUTO, initialize to LONG here, then change according to AP's
// capability upon association.
pAd->PortCfg.TxPreamble = Preamble;
MlmeSetTxPreamble(pAd, Rt802_11PreambleLong);
}
else
NdisStatus = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::RT_OID_802_11_SET_PREAMBLE (=%d)\n", Preamble);
}
break;
case OID_802_11_NETWORK_TYPE_IN_USE:
{
NDIS_802_11_NETWORK_TYPE NetType = *(PNDIS_802_11_NETWORK_TYPE)(cmdqelmt->buffer);
if (NetType == Ndis802_11DS)
RTMPSetPhyMode(pAd, PHY_11B);
else if (NetType == Ndis802_11OFDM24)
RTMPSetPhyMode(pAd, PHY_11BG_MIXED);
else if (NetType == Ndis802_11OFDM5)
RTMPSetPhyMode(pAd, PHY_11A);
else
NdisStatus = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_NETWORK_TYPE_IN_USE (=%d)\n",NetType);
}
break;
case RT_OID_802_11_PHY_MODE:
{
ULONG phymode = *(ULONG *)(cmdqelmt->buffer);
RTMPSetPhyMode(pAd, phymode);
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::RT_OID_802_11_SET_PHY_MODE (=%d)\n", phymode);
}
break;
#if 0
case OID_802_11_WEP_STATUS:
{
USHORT Value;
NDIS_802_11_WEP_STATUS WepStatus = *(PNDIS_802_11_WEP_STATUS)pData;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::66- OID_802_11_WEP_STATUS \n");
break;
if (pAd->PortCfg.WepStatus != WepStatus)
{
DBGPRINT(RT_DEBUG_ERROR, "Config Changed !!status= %x \n", WepStatus);
// Config has changed
pAd->bConfigChanged = TRUE;
}
pAd->PortCfg.WepStatus = WepStatus;
pAd->PortCfg.PairCipher = WepStatus;
pAd->PortCfg.GroupCipher = WepStatus;
#if 1
if ((WepStatus == Ndis802_11Encryption1Enabled) &&
(pAd->SharedKey[pAd->PortCfg.DefaultKeyId].KeyLen != 0))
{
if (pAd->SharedKey[pAd->PortCfg.DefaultKeyId].KeyLen <= 5)
{
DBGPRINT(RT_DEBUG_ERROR, "WEP64! \n");
pAd->SharedKey[pAd->PortCfg.DefaultKeyId].CipherAlg = CIPHER_WEP64;
}
else
{
DBGPRINT(RT_DEBUG_ERROR, "WEP128! \n");
pAd->SharedKey[pAd->PortCfg.DefaultKeyId].CipherAlg = CIPHER_WEP128;
}
#if 0
RTUSBReadMACRegister_old(pAd, TXRX_CSR0, &Value);
Value &= 0xfe00;
Value |= ((LENGTH_802_11 << 3) | (pAd->PortCfg.CipherAlg));
RTUSBWriteMACRegister_old(pAd, TXRX_CSR0, Value);
#endif
}
else if (WepStatus == Ndis802_11Encryption2Enabled)
{
DBGPRINT(RT_DEBUG_ERROR, " TKIP !!! \n");
pAd->SharedKey[pAd->PortCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP;
#if 0
RTUSBReadMACRegister_old(pAd, TXRX_CSR0, &Value);
Value &= 0xfe00;
Value |= ((LENGTH_802_11 << 3) | (pAd->PortCfg.CipherAlg));
RTUSBWriteMACRegister_old(pAd, TXRX_CSR0, Value);
#endif
}
else if (WepStatus == Ndis802_11Encryption3Enabled)
{
DBGPRINT(RT_DEBUG_ERROR, " AES !!! \n");
pAd->SharedKey[pAd->PortCfg.DefaultKeyId].CipherAlg = CIPHER_AES;
#if 0
RTUSBReadMACRegister_old(pAd, TXRX_CSR0, &Value);
Value &= 0xfe00;
Value |= ((LENGTH_802_11 << 3) | (pAd->PortCfg.CipherAlg));
RTUSBWriteMACRegister_old(pAd, TXRX_CSR0, Value);
#endif
}
else if (WepStatus == Ndis802_11EncryptionDisabled)
{
DBGPRINT(RT_DEBUG_ERROR, " CIPHER_NONE !!! \n");
pAd->SharedKey[pAd->PortCfg.DefaultKeyId].CipherAlg = CIPHER_NONE;
#if 0
RTUSBReadMACRegister_old(pAd, TXRX_CSR0, &Value);
Value &= 0xfe00;
RTUSBWriteMACRegister_old(pAd, TXRX_CSR0, Value);
#endif
}else
{
DBGPRINT(RT_DEBUG_ERROR, " ERROR Cipher !!! \n");
}
#endif
}
break;
#endif
case OID_802_11_ADD_WEP:
{
ULONG KeyIdx;
PNDIS_802_11_WEP pWepKey;
DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_ADD_WEP \n");
pWepKey = (PNDIS_802_11_WEP)pData;
KeyIdx = pWepKey->KeyIndex & 0x0fffffff;
// it is a shared key
if ((KeyIdx >= 4) || ((pWepKey->KeyLength != 5) && (pWepKey->KeyLength != 13)))
{
NdisStatus = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_ADD_WEP, INVALID_DATA!!\n");
}
else
{
UCHAR CipherAlg;
pAd->SharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;
NdisMoveMemory(pAd->SharedKey[KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);
CipherAlg = (pAd->SharedKey[KeyIdx].KeyLen == 5)? CIPHER_WEP64 : CIPHER_WEP128;
pAd->SharedKey[KeyIdx].CipherAlg = CipherAlg;
if (pWepKey->KeyIndex & 0x80000000)
{
// Default key for tx (shared key)
pAd->PortCfg.DefaultKeyId = (UCHAR) KeyIdx;
}
AsicAddSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx, CipherAlg, pWepKey->KeyMaterial, NULL, NULL);
DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_ADD_WEP (KeyIdx=%d, Len=%d-byte)\n", KeyIdx, pWepKey->KeyLength);
}
}
break;
case OID_802_11_REMOVE_WEP:
{
ULONG KeyIdx;
KeyIdx = *(NDIS_802_11_KEY_INDEX *) pData;
if (KeyIdx & 0x80000000)
{
NdisStatus = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_REMOVE_WEP, INVALID_DATA!!\n");
}
else
{
KeyIdx = KeyIdx & 0x0fffffff;
if (KeyIdx >= 4)
{
NdisStatus = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_REMOVE_WEP, Invalid KeyIdx[=%d]!!\n", KeyIdx);
}
else
{
pAd->SharedKey[KeyIdx].KeyLen = 0;
pAd->SharedKey[KeyIdx].CipherAlg = CIPHER_NONE;
AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx);
DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_REMOVE_WEP (KeyIdx=%d)\n", KeyIdx);
}
}
}
break;
case OID_802_11_ADD_KEY_WEP:
{
PNDIS_802_11_KEY pKey;
ULONG i, KeyIdx;
pKey = (PNDIS_802_11_KEY) pData;
KeyIdx = pKey->KeyIndex & 0x0fffffff;
// it is a shared key
if (KeyIdx >= 4)
{
NdisStatus = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_ADD_KEY_WEP, Invalid KeyIdx[=%d]!!\n", KeyIdx);
}
else
{
UCHAR CipherAlg;
pAd->SharedKey[KeyIdx].KeyLen = (UCHAR) pKey->KeyLength;
NdisMoveMemory(pAd->SharedKey[KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength);
if (pKey->KeyLength == 5)
CipherAlg = CIPHER_WEP64;
else
CipherAlg = CIPHER_WEP128;
// always expand the KEY to 16-byte here for efficiency sake. so that in case CKIP is used
// sometime later we don't have to do key expansion for each TX in RTUSBHardTransmit().
// However, we shouldn't change pAd->SharedKey[BSS0][KeyIdx].KeyLen
if (pKey->KeyLength < 16)
{
for(i = 1; i < (16 / pKey->KeyLength); i++)
{
NdisMoveMemory(&pAd->SharedKey[KeyIdx].Key[i * pKey->KeyLength],
&pKey->KeyMaterial[0],
pKey->KeyLength);
}
NdisMoveMemory(&pAd->SharedKey[KeyIdx].Key[i * pKey->KeyLength],
&pKey->KeyMaterial[0],
16 - (i * pKey->KeyLength));
}
pAd->SharedKey[KeyIdx].CipherAlg = CipherAlg;
if (pKey->KeyIndex & 0x80000000)
{
// Default key for tx (shared key)
pAd->PortCfg.DefaultKeyId = (UCHAR) KeyIdx;
}
AsicAddSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx, CipherAlg, pAd->SharedKey[KeyIdx].Key, NULL, NULL);
DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_ADD_KEY_WEP (KeyIdx=%d, KeyLen=%d, CipherAlg=%d)\n",
pAd->PortCfg.DefaultKeyId, pAd->SharedKey[KeyIdx].KeyLen, pAd->SharedKey[KeyIdx].CipherAlg);
}
}
break;
case OID_802_11_ADD_KEY:
{
PNDIS_802_11_KEY pkey = (PNDIS_802_11_KEY)pData;
NdisStatus = RTMPWPAAddKeyProc(pAd, pkey);
RTUSBBulkReceive(pAd);
DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_ADD_KEY\n");
}
break;
#if 0
case RT_OID_802_11_REMOVE_WEP:
case OID_802_11_REMOVE_WEP:
{
ULONG KeyIdx;
KeyIdx = *(NDIS_802_11_KEY_INDEX *) pData;
if (KeyIdx & 0x80000000)
{
NdisStatus = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_REMOVE_WEP, INVALID_DATA!!\n");
}
else
{
KeyIdx = KeyIdx & 0x0fffffff;
if (KeyIdx >= 4)
{
NdisStatus = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_REMOVE_WEP, INVALID_DATA!!\n");
}
else
{
}
}
}
break;
#if 0
{
//PNDIS_802_11_REMOVE_KEY pRemoveKey;
ULONG KeyIdx;
//pRemoveKey = (PNDIS_802_11_REMOVE_KEY) pData;
//KeyIdx = pRemoveKey->KeyIndex;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_REMOVE_WEP\n");
//if (InformationBufferLength != sizeof(NDIS_802_11_KEY_INDEX))
// Status = NDIS_STATUS_INVALID_LENGTH;
//else
{
KeyIdx = *(NDIS_802_11_KEY_INDEX *) pData;
if (KeyIdx & 0x80000000)
{
// Should never set default bit when remove key
//Status = NDIS_STATUS_INVALID_DATA;
}
else
{
KeyIdx = KeyIdx & 0x0fffffff;
if (KeyIdx >= 4)
{
//Status = NDIS_STATUS_INVALID_DATA;
}
else
{
pAd->SharedKey[KeyIdx].KeyLen = 0;
//Status = RT2573USBEnqueueCmdFromNdis(pAd, OID_802_11_REMOVE_WEP, TRUE, pInformationBuffer, InformationBufferLength);
AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx);
}
}
}
}
break;
#endif
#endif
case OID_802_11_REMOVE_KEY:
{
PNDIS_802_11_REMOVE_KEY pRemoveKey;
ULONG KeyIdx;
pRemoveKey = (PNDIS_802_11_REMOVE_KEY) pData;
if (pAd->PortCfg.AuthMode >= Ndis802_11AuthModeWPA)
{
NdisStatus = RTMPWPARemoveKeyProc(pAd, pData);
DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::RTMPWPARemoveKeyProc\n");
}
else
{
KeyIdx = pRemoveKey->KeyIndex;
if (KeyIdx & 0x80000000)
{
// Should never set default bit when remove key
NdisStatus = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_REMOVE_KEY, Invalid KeyIdx[=%d]!!\n", KeyIdx);
}
else
{
KeyIdx = KeyIdx & 0x0fffffff;
if (KeyIdx >= 4)
{
NdisStatus = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_REMOVE_KEY, Invalid KeyIdx[=%d]!!\n", KeyIdx);
}
else
{
pAd->SharedKey[KeyIdx].KeyLen = 0;
pAd->SharedKey[KeyIdx].CipherAlg = CIPHER_NONE;
AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx);
DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::AsicRemoveSharedKeyEntry(KeyIdx=%d)\n", KeyIdx);
}
}
}
}
break;
case OID_802_11_POWER_MODE:
{
NDIS_802_11_POWER_MODE PowerMode = *(PNDIS_802_11_POWER_MODE) pData;
DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_POWER_MODE (=%d)\n",PowerMode);
// save user's policy here, but not change PortCfg.Psm immediately
if (PowerMode == Ndis802_11PowerModeCAM)
{
// clear PSM bit immediately
MlmeSetPsmBit(pAd, PWR_ACTIVE);
OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
if (pAd->PortCfg.bWindowsACCAMEnable == FALSE)
pAd->PortCfg.WindowsPowerMode = PowerMode;
pAd->PortCfg.WindowsBatteryPowerMode = PowerMode;
}
else if (PowerMode == Ndis802_11PowerModeMAX_PSP)
{
// do NOT turn on PSM bit here, wait until MlmeCheckPsmChange()
// to exclude certain situations.
// MlmeSetPsmBit(pAd, PWR_SAVE);
if (pAd->PortCfg.bWindowsACCAMEnable == FALSE)
pAd->PortCfg.WindowsPowerMode = PowerMode;
pAd->PortCfg.WindowsBatteryPowerMode = PowerMode;
OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
pAd->PortCfg.DefaultListenCount = 5;
}
else if (PowerMode == Ndis802_11PowerModeFast_PSP)
{
// do NOT turn on PSM bit here, wait until MlmeCheckPsmChange()
// to exclude certain situations.
// MlmeSetPsmBit(pAd, PWR_SAVE);
OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
if (pAd->PortCfg.bWindowsACCAMEnable == FALSE)
pAd->PortCfg.WindowsPowerMode = PowerMode;
pAd->PortCfg.WindowsBatteryPowerMode = PowerMode;
pAd->PortCfg.DefaultListenCount = 3;
}
}
break;
case RT_PERFORM_SOFT_DIVERSITY:
AsicRxAntEvalAction(pAd);
break;
case RT_OID_FORCE_WAKE_UP:
AsicForceWakeup(pAd);
break;
case RT_OID_SET_PSM_BIT_ACTIVE:
MlmeSetPsmBit(pAd, PWR_ACTIVE);
break;
default:
break;
}
if (cmdqelmt->CmdFromNdis == TRUE)
{
if ((cmdqelmt->command != OID_802_11_BSSID_LIST_SCAN) &&
(cmdqelmt->command != RT_OID_802_11_BSSID) &&
(cmdqelmt->command != OID_802_11_SSID) &&
(cmdqelmt->command != OID_802_11_DISASSOCIATE))
{
}
if ((cmdqelmt->command != RT_OID_MULTI_READ_MAC) &&
(cmdqelmt->command != RT_OID_VENDOR_READ_BBP) &&
#ifdef DBG
(cmdqelmt->command != RT_OID_802_11_QUERY_HARDWARE_REGISTER) &&
#endif
(cmdqelmt->command != RT_OID_USB_VENDOR_EEPROM_READ))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -