📄 oidproc.c
字号:
NULL,
NULL);
}
if ((Adapter->bIsReconnectEnable == TRUE) ||
(Adapter->bIsBeaconLoseEvent == TRUE) ||
(Adapter->bIsDeauthenticaticationEvent == TRUE)
#ifdef ACTIVE_ROAMING
||(Adapter->bIsActiveRoaming== TRUE)
#endif
)
{
Adapter->EncryptionStatus = EncryptionStatus;
}
else
{
if ((EncryptionStatus == Ndis802_11Encryption2Enabled) ||
(EncryptionStatus == Ndis802_11Encryption2KeyAbsent))
{
Adapter->EncryptionStatus = Ndis802_11Encryption2KeyAbsent;
}
else
{
Adapter->EncryptionStatus = Ndis802_11Encryption3KeyAbsent;
}
}
Status = NDIS_STATUS_SUCCESS;
break;
case Ndis802_11Encryption1Enabled:
case Ndis802_11Encryption1KeyAbsent:
Adapter->WPAEnabled = FALSE;
// disable RSN if previous status is 2 or 3
if ( (PrevEncryptionStatus == Ndis802_11Encryption2Enabled) ||
(PrevEncryptionStatus == Ndis802_11Encryption3Enabled) ||
(PrevEncryptionStatus == Ndis802_11Encryption2KeyAbsent) ||
(PrevEncryptionStatus == Ndis802_11Encryption3KeyAbsent))
{
Status = PrepareAndSendCommand(
Adapter,
HostCmd_CMD_802_11_ENABLE_RSN,
HostCmd_ACT_SET,
HostCmd_OPTION_USE_INT,
Oid,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
}
// Enable WEP
Adapter->usMacControlRecord |=
(HostCmd_ACT_MAC_RX_ON |
HostCmd_ACT_MAC_TX_ON |
HostCmd_ACT_MAC_WEP_ENABLE |
HostCmd_ACT_MAC_INT_ENABLE);
//BugFix
if(Adapter->LastAddedWEPKey.KeyLength==13)
{
//WEP 128bit
Adapter->usMacControlRecord = Adapter->usMacControlRecord|HostCmd_ACT_MAC_WEP_TYPE;
DBGPRINT(DBG_OID,("MrvDrvSetEncryptionStatus: SetCMD 0x28 WEP 128bit\n"));
}
else
{
//WEP 64bit
Adapter->usMacControlRecord = Adapter->usMacControlRecord&(~HostCmd_ACT_MAC_WEP_TYPE);
DBGPRINT(DBG_OID,("MrvDrvSetEncryptionStatus: SetCMD 0x28 WEP 64bit\n"));
}
Status = PrepareAndSendCommand(
Adapter,
HostCmd_CMD_MAC_CONTROL,
Adapter->usMacControlRecord,
HostCmd_OPTION_USE_INT,
Oid,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
if (Status == NDIS_STATUS_FAILURE || Status == NDIS_STATUS_RESOURCES)
{
Status = NDIS_STATUS_FAILURE;
}
else
{
Status = NDIS_STATUS_SUCCESS;
}
Adapter->EncryptionStatus = Ndis802_11Encryption1Enabled;
Adapter->WEPStatus = Ndis802_11WEPEnabled;
break;
case Ndis802_11EncryptionDisabled:
Adapter->WPAEnabled = FALSE;
switch ( Adapter->EncryptionStatus )
{
case Ndis802_11Encryption3Enabled:
case Ndis802_11Encryption2Enabled:
case Ndis802_11Encryption2KeyAbsent:
case Ndis802_11Encryption3KeyAbsent:
// disable TKIP/WPA
Status = PrepareAndSendCommand(
Adapter,
HostCmd_CMD_802_11_ENABLE_RSN,
HostCmd_ACT_SET,
HostCmd_OPTION_USE_INT,
Oid,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
if (Status == NDIS_STATUS_FAILURE || Status == NDIS_STATUS_RESOURCES)
{
Status = NDIS_STATUS_FAILURE;
}
else
{
Status = NDIS_STATUS_SUCCESS;
}
break;
case Ndis802_11Encryption1Enabled:
case Ndis802_11Encryption1KeyAbsent:
// disable WEP
Adapter->usMacControlRecord |=
(HostCmd_ACT_MAC_RX_ON |
HostCmd_ACT_MAC_TX_ON |
HostCmd_ACT_MAC_INT_ENABLE);
Adapter->usMacControlRecord &=
~HostCmd_STATUS_MAC_WEP_ENABLE;
Status = PrepareAndSendCommand(
Adapter,
HostCmd_CMD_MAC_CONTROL,
Adapter->usMacControlRecord,
HostCmd_OPTION_USE_INT,
Oid,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
if (Status == NDIS_STATUS_FAILURE || Status == NDIS_STATUS_RESOURCES)
{
Status = NDIS_STATUS_FAILURE;
}
else
{
Status = NDIS_STATUS_SUCCESS;
}
break;
default:
// do nothing
Status = NDIS_STATUS_SUCCESS;
break;
}
Adapter->EncryptionStatus = Ndis802_11EncryptionDisabled;
Adapter->WEPStatus = Ndis802_11WEPDisabled;
break;
default:
DBGPRINT(DBG_OID | DBG_WPA, ("Not supported EncryptionStatus: %d\n",
EncryptionStatus));
Status = NDIS_STATUS_INVALID_DATA;
}
DBGPRINT(DBG_OID , (" --- MrvDrvSetEncryptionStatus() \n"));
return Status;
}
#endif // #ifdef WPA
/******************************************************************************
*
* Name: MrvDrvQueryInformation()
*
* Description: NDIS miniport get information handler
*
* Conditions for Use: NDIS wrapper will call this handler to get device information
*
* Arguments:
* IN NDIS_HANDLE MiniportAdapterContext
* IN NDIS_OID Oid
* IN PVOID InformationBuffer
* IN ULONG InformationBufferLength
* OUT PULONG BytesWritten
* OUT PULONG BytesNeeded
*
* Return Value:
* NDIS_STATUS_SUCCESS
* NDIS_STATUS_PENDING
* NDIS_STATUS_BUFFER_TOO_SHORT
* NDIS_STATUS_NOT_SUPPORTED
*
* Notes:
*
*****************************************************************************/
NDIS_STATUS
MrvDrvQueryInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded
)
{
// String describing our adapter
char VendorDescriptor[] = VENDORDESCRIPTOR;
PMRVDRV_ADAPTER Adapter;
// UCHAR VendorId[4];
ULONGLONG GenericULONGLONG;
ULONG GenericULONG;
LONG GenericLONG;
USHORT GenericUSHORT;
UCHAR GenericArray[6];
NDIS_STATUS Status;
NDIS_PNP_CAPABILITIES PMCap;
NDIS_DEVICE_POWER_STATE NewPowerState;
// NDIS_PM_PACKET_PATTERN PMPattern;
PNDIS_802_11_STATISTICS pn11Stat;
// PUCHAR PUchar;
PVOID MoveSource;
ULONG MoveBytes;
//ULONG ulRequiredSize;
// ULONG ulRcvOK;
//RETAILMSG(1, (TEXT("Query OID = %x \r\n"), Oid));
// Common variables for pointing to result of query
MoveSource = (PVOID) (&GenericULONG);
MoveBytes = sizeof(GenericULONG);
// DBGPRINT(DBG_OID,("REQUEST - Enter MrvDrvQueryInformation - 0x%x \n", Oid));
Adapter = (PMRVDRV_ADAPTER)(MiniportAdapterContext);
if (Adapter->bIsFreeNow == TRUE)
return NDIS_STATUS_SUCCESS;
#ifdef DEEP_SLEEP
// In Deep Sleep Mode no packet can be sent out
if (Adapter->IsDeepSleepRequired
|| Adapter->IsDeepSleep)
{
DBGPRINT(DBG_OID | DBG_ALLEN ,("Set OID in Adapter->IsDeepSleepRequired == TRUE\n"));
if (Oid != OID_MRVL_DEEP_SLEEP)
{
DBGPRINT(DBG_OID | DBG_ALLEN ,("Not OID_MRVL_DEEP_SLEEP OID\n"));
return NDIS_STATUS_FAILURE;
}
}
#endif
// Check device removal status
if ( Adapter->SurpriseRemoved == TRUE )
{
return NDIS_STATUS_FAILURE;
}
// Initialize the result variables
*BytesWritten = 0;
*BytesNeeded = 0;
Status = NDIS_STATUS_SUCCESS;
#ifdef UNDER_CE
if ( Adapter->CurPowerState == NdisDeviceStateD3 )
{
// card powered off
return NDIS_STATUS_SUCCESS;
}
#endif
// Switch on request type
switch (Oid)
{
#ifdef BG_SCAN
case OID_MRVL_BG_SCAN_QUERY:
{
POID_MRVL_DS_BG_SCAN_CONFIG pOidBG;
pOidBG = (POID_MRVL_DS_BG_SCAN_CONFIG)Adapter->BgScanCfg;
if (Adapter->bBgScanEnabled)
pOidBG->Enable = 1;
else
pOidBG->Enable = 0;
MoveSource = (PVOID) (Adapter->BgScanCfg);
MoveBytes = Adapter->nBgScanCfg;
}
break;
#endif
//tt ++ v5 firmware
case OID_MRVL_LED_CONTROL:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_LED_CONTROL, OID_MRVL_LED_CONTROL,
sizeof(OID_MRVL_DS_LED_CONTROL), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_LED_CONTROL, NumLed, SIZEOF_OID_DS_LEADING );
break;
#ifdef CAL_DATA
case OID_MRVL_CAL_DATA:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_CAL_DATA, OID_MRVL_CAL_DATA,
sizeof(OID_MRVL_DS_CAL_DATA), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_CAL_DATA, Reserved1[0], SIZEOF_OID_DS_LEADING );
break;
case OID_MRVL_CAL_DATA_EXT:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_CAL_DATA_EXT, OID_MRVL_CAL_DATA_EXT,
sizeof(OID_MRVL_DS_CAL_DATA_EXT), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_CAL_DATA_EXT, Revision, SIZEOF_OID_DS_LEADING );
break;
#endif //CAL_DATA
case OID_MRVL_PWR_CFG:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_PWR_CFG, OID_MRVL_PWR_CFG,
sizeof(OID_MRVL_DS_PWR_CFG), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_PWR_CFG, Enable, SIZEOF_OID_DS_LEADING );
break;
case OID_MRVL_TPC_CFG:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_TPC_CFG, OID_MRVL_TPC_CFG,
sizeof(OID_MRVL_DS_TPC_CFG), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_TPC_CFG, Enable, SIZEOF_OID_DS_LEADING );
break;
case OID_MRVL_RATE_ADAPT_RATESET:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_RATE_ADAPT_RATESET, OID_MRVL_RATE_ADAPT_RATESET,
sizeof(OID_MRVL_DS_RATE_ADAPT_RATESET), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_RATE_ADAPT_RATESET, EnableHwAuto, SIZEOF_OID_DS_LEADING );
break;
//tt --
#ifdef PMKID_CACHE_CAP
case OID_802_11_PMKID:
{
PNDIS_802_11_PMKID pPmkid = (PNDIS_802_11_PMKID) InformationBuffer;
DBGPRINT( DBG_OID|DBG_MACEVENT, ("QUERY - OID_802_11_PMKID\n") );
if ( InformationBufferLength < sizeof(NDIS_802_11_PMKID) )
{
DBGPRINT(DBG_OID|DBG_MACEVENT, (" Buffer too small, return.\n") );
*BytesNeeded = sizeof(NDIS_802_11_PMKID);
return NDIS_STATUS_INVALID_LENGTH;
}
pPmkid->Length = sizeof(NDIS_802_11_PMKID);
pPmkid->BSSIDInfoCount = 0;
return NDIS_STATUS_SUCCESS;
}
break;
case OID_802_11_CAPABILITY:
{
PNDIS_802_11_CAPABILITY pCap = (PNDIS_802_11_CAPABILITY) InformationBuffer;
ULONG nNeedLen;
const ULONG nNumOfModes = 12;
DBGPRINT( DBG_OID|DBG_MACEVENT, ("QUERY - OID_802_11_CAPABILITY\n") );
nNeedLen = sizeof(NDIS_802_11_CAPABILITY) +
((nNumOfModes-1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION) );
if (InformationBufferLength < nNeedLen)
{
DBGPRINT(DBG_OID|DBG_MACEVENT, (" Buffer too small, return.\n") );
*BytesNeeded = nNeedLen;
return NDIS_STATUS_INVALID_LENGTH;
}
pCap->Length = nNeedLen;
pCap->Version = 2;
pCap->NoOfPmkid = MAX_PMKID_CACHE;
pCap->NoOfAuthEncryptPairsSupported = nNumOfModes;
DBGPRINT(DBG_OID|DBG_MACEVENT, (" Copy data... [Len=%d, Pmkid=%d, Modes=%d]\n",
pCap->Length, pCap->NoOfPmkid, pCap->NoOfAuthEncryptPairsSupported ) );
pCap->AuthEncryptSupported[0].AuthMode = Ndis802_11AuthModeOpen;
pCap->AuthEncryptSupported[0].EncryptStatus = Ndis802_11EncryptionDisabled;
pCap->AuthEncryptSupported[1].AuthMode = Ndis802_11AuthModeOpen;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -