📄 hwacproc.c
字号:
break;
case MACREG_INT_CODE_WPA_MIC_ERR_MULTICAST:
message.request.Flags = NDIS_802_11_AUTH_REQUEST_GROUP_ERROR;
DBGPRINT(DBG_WARNING | DBG_ALLEN, ("Groupwise MIC Error!\n"));
break;
default:
DBGPRINT(DBG_ERROR | DBG_ALLEN, ("HandleMicError(): do not know how to handle error code 0x%x!\n",
ErrorType));
// skip the indication
return;
}
NdisMIndicateStatus(Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_MEDIA_SPECIFIC_INDICATION,
&message,
sizeof(WPA_NOTIFY_OS));
NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
DBGPRINT(DBG_WARNING | DBG_ALLEN, ("Indicated MIC error!\n"));
NdisGetSystemUpTime(&ulCurrTime);
if ( ulCurrTime > Adapter->ulLastMICErrorTime )
{
ulTimeDiff = ulCurrTime - Adapter->ulLastMICErrorTime;
}
else
{
ulTimeDiff = 0xFFFFFFFF - Adapter->ulLastMICErrorTime + ulCurrTime;
}
#ifdef MRVL_MIC_ERROR
NdisMSleep(20000);
if ( (Adapter->ulLastMICErrorTime != 0) && (ulTimeDiff < MRVDRV_MIC_ERROR_PERIOD) )
{
//USHORT usCommand;
Adapter->ulMicErrorStartTime = ulCurrTime;
Adapter->bMicErrorIsHappened = TRUE;
DBGPRINT( DBG_MACEVENT, ("*** MIC error is happended!\n") );
NdisMSetTimer( &Adapter->MrvMicDisconnectTimer, 200 ); // tt ++ mic 2
#if 0
// tt mic NdisMSleep( 1000*500 ); // for sending out "MIC failure report"
NdisMSleep( 1000*4500 ); // for sending out "MIC failure report"
DBGPRINT( DBG_MACEVENT, ("*** Going to send out de-auth and indicate disconnect!\n") );
if ( Adapter->InfrastructureMode == Ndis802_11Infrastructure )
{
usCommand = HostCmd_CMD_802_11_DEAUTHENTICATE;
}
else
{
usCommand = HostCmd_CMD_802_11_AD_HOC_STOP;
}
// completely clean up
PrepareAndSendCommand(
Adapter,
usCommand,
0,
HostCmd_OPTION_USE_INT,
0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
Adapter->CurrentBSSID);
NdisMSleep(100000);
DBGPRINT(DBG_MACEVENT, ("Time since last MIC error is %d, disconnect!\n", ulTimeDiff));
ResetDisconnectStatus(Adapter);
#endif // 0
}
#endif // MRVL_MIC_ERROR
Adapter->ulLastMICErrorTime = ulCurrTime;
}
#ifdef MRVL_MIC_ERROR
VOID DisconnectDueToMicError( PMRVDRV_ADAPTER pAdapter )
{
USHORT usCommand;
if ( pAdapter->MediaConnectStatus != NdisMediaStateConnected )
{
DBGPRINT( DBG_MACEVENT, ("*** Connection had already been disconnected.\n") );
return;
}
DBGPRINT( DBG_MACEVENT, ("*** Send out de-authentication due to MIC error\n") );
if ( pAdapter->InfrastructureMode == Ndis802_11Infrastructure )
usCommand = HostCmd_CMD_802_11_DEAUTHENTICATE;
else
usCommand = HostCmd_CMD_802_11_AD_HOC_STOP;
DBGPRINT( DBG_WARNING, ("[Mrvl] Send out de-auth due to MIC error\n") );
PrepareAndSendCommand(
pAdapter,
usCommand,
0,
HostCmd_OPTION_USE_INT,
0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
pAdapter->CurrentBSSID);
NdisMSleep(60000);
DBGPRINT( DBG_WARNING, ("[Mrvl] Reset and disconnect due to MIC error\n") );
ResetDisconnectStatus( pAdapter );
}
// tt ++ mic 2
VOID MrvMicDisconnectTimerFunction(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
DisconnectDueToMicError( Adapter );
}
// tt -- mic 2
BOOL IsInMicErrorPeriod( PMRVDRV_ADAPTER pAdapter )
{
ULONG ulCurrTime, ulTimeDiff;
if ( pAdapter->ulMicErrorStartTime == 0 || pAdapter->bMicErrorIsHappened != TRUE )
return FALSE;
DBGPRINT( DBG_MACEVENT, ("[Mrvl] Check MIC error period\n") );
NdisGetSystemUpTime(&ulCurrTime);
if ( ulCurrTime > pAdapter->ulMicErrorStartTime )
{
ulTimeDiff = ulCurrTime - pAdapter->ulMicErrorStartTime;
}
else
{
ulTimeDiff = 0xFFFFFFFF - pAdapter->ulMicErrorStartTime + ulCurrTime;
}
if ( ulTimeDiff < MRVDRV_MIC_ERROR_PERIOD+2000 )
{
DBGPRINT( DBG_MACEVENT, ("[Mrvl] Driver is still in MIC error period. Remaining %d ms.\n", (MRVDRV_MIC_ERROR_PERIOD+2000)-ulTimeDiff ) );
return TRUE;
}
DBGPRINT( DBG_MACEVENT, ("[Mrvl] MIC error period is finished\n") );
pAdapter->ulMicErrorStartTime = 0;
pAdapter->bMicErrorIsHappened = FALSE;
return FALSE;
}
#endif // MRVL_MIC_ERROR
/******************************************************************************
*
* Name: HandleAdHocModeLink()
*
* Description: Handle link sensed and bcn lost event in adhoc mode
*
* Arguments: PMRVDRV_ADAPTER Adapter
* UINT INTCode
*
* Return Value:
*
* Notes:
*
*****************************************************************************/
VOID
HandleAdHocModeLink(
IN PMRVDRV_ADAPTER Adapter,
IN UINT INTCode)
{
if ( Adapter->InfrastructureMode != Ndis802_11IBSS )
{
DBGPRINT(DBG_WARNING, ("HandleAdHocModeLink(): Currently NOT in adhoc "
"mode, event IGNORED!\n"));
}
// For Adhoc indication fix ++
else
{
if (Adapter->bIsMoreThanOneStaInAdHocBSS)
{
// Send a Media Connected event, according to Microsoft Spec
Adapter->MediaConnectStatus = NdisMediaStateConnected;
NdisMIndicateStatus(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_MEDIA_CONNECT,
(PVOID)NULL,
0);
NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
}
else
{
// Send a Media Connected event, according to Microsoft Spec
Adapter->MediaConnectStatus = NdisMediaStateDisconnected;
NdisMIndicateStatus(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_MEDIA_DISCONNECT,
(PVOID)NULL,
0);
NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
}
}
// For Adhoc indication fix --
return;
}
/******************************************************************************
*
* Name: HandleMACEvent()
*
* Description: MAC event handler
*
* Arguments: PMRVDRV_ADAPTER Adapter
* UINT INTCode
*
* Return Value:
*
* Notes:
*
*****************************************************************************/
VOID
HandleMACEvent(
IN PMRVDRV_ADAPTER Adapter,
IN UINT INTCode)
{
// ULONG i;
// CmdCtrlNode *pTempNode;
PTX_PKT_T pPacket;
switch( INTCode ) {
#ifdef BG_SCAN
case MACREG_INT_CODE_BG_SCAN_REPORT:
/// AllenDBGPRINT(DBG_ALLEN,("MACREG_INT_CODE_BG_SCAN_REPORT\n"));
//RETAILMSG(1, (TEXT("MACREG_INT_CODE_BG_SCAN_REPORT \r\n")));
#ifdef DEEP_SLEEP
if (Adapter->IsDeepSleep == TRUE)
{
Adapter->IsDeepSleep = FALSE;
Adapter->IsDeepSleepRequired= FALSE;
}
#endif
//AllenDBGPRINT( DBG_SCAN, ("MACREG_INT_CODE_BG_SCAN_REPORT: \n") );
if ( Adapter->psState != PS_STATE_FULL_POWER)
{
Adapter->PSMode = Ndis802_11PowerModeCAM;
PSWakeup(Adapter);
Adapter->bPSEnableBGScan=TRUE;
}
HandleBgScanResultEvent( Adapter );
break;
#endif
case MACREG_INT_CODE_TX_PPA_FREE: // 05/28/02 TX PPA is available
//AllenDBGPRINT(DBG_MACEVENT | DBG_ALLEN,("MACREG_INT_CODE_TX_PPA_FREE: \n"));
break;
case MACREG_INT_CODE_TX_DMA_DONE: // TX DMA finished
//AllenDBGPRINT(DBG_MACEVENT | DBG_ALLEN,("MACREG_INT_CODE_TX_DMA_DONE: Unimplemented"));
break;
case MACREG_INT_CODE_LINK_SENSED: //Link found
// For Adhoc indication fix ++
Adapter->bIsMoreThanOneStaInAdHocBSS = TRUE;
// For Adhoc indication fix --
//AllenDBGPRINT(DBG_MACEVENT | DBG_ALLEN,("MACREG_INT_CODE_LINK_SENSED\n"));
HandleAdHocModeLink(Adapter, MACREG_INT_CODE_LINK_SENSED);
break;
case MACREG_INT_CODE_ADHOC_BCN_LOST: // last partner in adhoc mode left
// For Adhoc indication fix ++
Adapter->bIsMoreThanOneStaInAdHocBSS = FALSE;
// For Adhoc indication fix --
//AllenDBGPRINT(DBG_MACEVENT | DBG_ALLEN,("MACREG_INT_CODE_ADHOC_BCN_LOST\n"));
if ( Adapter->CurPowerState == NdisDeviceStateD0)
{
HandleAdHocModeLink(Adapter, MACREG_INT_CODE_ADHOC_BCN_LOST);
}
break;
case MACREG_INT_CODE_DEAUTHENTICATED:
//AllenDBGPRINT(DBG_MACEVENT | DBG_ALLEN,("MACREG_INT_CODE_DEAUTHENTICATED\n"));
/// AllenDBGPRINT(DBG_ALLEN,("MACREG_INT_CODE_DEAUTHENTICATED\n"));
if (Adapter->bIsDeauthenticaticationEvent == FALSE && Adapter->bIsEnterD3 == FALSE)
{
Adapter->bIsDeauthenticaticationEvent = TRUE;
MacEventDisconnected(Adapter, 5000, FALSE);
InfraBssReconnectStart( Adapter, RECONNECT_DEAUTHENTICATE );
}
//MacEventDisconnected(Adapter, 5000, FALSE);
break;
case MACREG_INT_CODE_DISASSOCIATED:
//AllenDBGPRINT(DBG_MACEVENT | DBG_ALLEN,("MACREG_INT_CODE_DISASSOCIATED\n"));
/// AllenDBGPRINT(DBG_ALLEN,("MACREG_INT_CODE_DISASSOCIATED\n"));
// when disassociated, the number of bssid should be 0
//Adapter->ulNumOfBSSIDs = 0;
//Adapter->ulPSNumOfBSSIDs = 0;
//Adapter->ulHiddenNumOfBSSIDs = 0;
MacEventDisconnected(Adapter,(UINT) MRVDRV_TEN_SECS_TIMER_INTERVAL, TRUE);
break;
case MACREG_INT_CODE_LINK_LOSE_W_SCAN: // Link lost
//AllenDBGPRINT(DBG_MACEVENT | DBG_ALLEN,("MACREG_INT_CODE_LINK_LOSE_W_SCAN\n"));
/// AllenDBGPRINT(DBG_ALLEN,("MACREG_INT_CODE_LINK_LOSE_W_SCAN\n"));
//RETAILMSG(1, (TEXT("MACREG_INT_CODE_LINK_LOSE_W_SCAN \r\n")));
///if ( Adapter->CurPowerState == NdisDeviceStateD0)
{
Adapter->bIsBeaconLoseEvent = TRUE;
#ifdef ACTIVE_ROAMING
ActiveRoamingStop(Adapter);
#endif
MacEventDisconnected(Adapter, Adapter->TimerInterval,FALSE);
InfraBssReconnectStart( Adapter, RECONNECT_LINK_LOST );
}
break;
case MACREG_INT_CODE_LINK_LOSE_NO_SCAN:
//AllenDBGPRINT(DBG_MACEVENT | DBG_ALLEN,("MACREG_INT_CODE_LINK_LOSE_NO_SCAN\n"));
///AllenDBGPRINT(DBG_ALLEN,("MACREG_INT_CODE_LINK_LOSE_NO_SCAN\n"));
//RETAILMSG(1, (TEXT("MACREG_INT_CODE_LINK_LOSE_NO_SCAN \r\n")));
Adapter->bIsBeaconLoseEvent = TRUE;
#ifdef ACTIVE_ROAMING
ActiveRoamingStop(Adapter);
#endif
if ( Adapter->CurPowerState == NdisDeviceStateD0)
{
#ifdef HOST_WAKEUP
if ( Adapter->bHostWakeCfgSet == 1 )
{
Deactivate_Host_Wakeup_Cfg(Adapter);
Adapter->bHostWakeCfgSet = 0;
}
#endif
}
MacEventDisconnected(Adapter, 5000,FALSE);
InfraBssReconnectStart( Adapter, RECONNECT_LINK_LOST );
break;
case MACREG_INT_CODE_PS_SLEEP:
// RETAILMSG(1, (TEXT("MACREG_INT_CODE_PS_SLEEP >>> ")));
//AllenDBGPRINT(DBG_MACEVENT ,("MACREG_INT_CODE_PS_SLEEP\n"));
UpdatePowerSaveState( Adapter, NULL, MACREG_INT_CODE_PS_SLEEP);
break;
case MACREG_INT_CODE_PS_AWAKE:
// RETAILMSG(1, (TEXT("MACREG_INT_CODE_PS_AWAKE >>> ")));
//AllenDBGPRINT(DBG_MACEVENT ,("MACREG_INT_CODE_PS_AWAKE\n"));
UpdatePowerSaveState( Adapter, NULL, MACREG_INT_CODE_PS_AWAKE);
GetCmdFromQueueToExecute (Adapter);
if (Adapter->bIsEnterD3 != TRUE)
{
EnterCriticalSection(&Adapter->TxCriticalSection);
if ( Adapter->TxPacketCount && Adapter->SentPacket == NULL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -