📄 hwacproc.c
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
*
* Purpose: This module has implmentation of station command
* processing functions
*
* $Author: schiu $
*
* $Date: 2004/12/15 $
*
* $Revision: #16 $
*
*****************************************************************************/
/*
===============================================================================
INCLUDE FILES
===============================================================================
*/
#include "precomp.h"
/*
===============================================================================
CLOBAL CONSTANT
===============================================================================
*/
extern ULONG DSFeqList[];
extern USHORT RegionCodeToIndex[MRVDRV_MAX_REGION_CODE];
extern UCHAR IEEERegionChannel[MRVDRV_MAX_REGION_CODE][MRVDRV_MAX_CHANNEL_NUMBER];
static NDIS_STATUS Deactivate_Host_Sleep_Cfg(PMRVDRV_ADAPTER Adapter);
/*
===============================================================================
CODED PUBLIC PROCEDURES
===============================================================================
*/
UCHAR EAPOLStartPacket[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // dest
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // src
0x88, 0x8e, 0x01, 0x01, 0x0, 0x0, 0x0 };
#ifdef AUTO_REASSOCIATION
/*
return: 1 - Reassociation has been started OK.
0 - Reassociation has not been started.
*/
UINT StartReassociation( IN PMRVDRV_ADAPTER pAdapter, IN UINT uIntCode )
{
UINT nRetCode = 0;
DBGPRINT( DBG_MACEVENT, ("+ StartReassociation\n") );
if ( pAdapter->ReAssociationInProgress )
{
DBGPRINT( DBG_MACEVENT, (" Still in reassociating\n") );
nRetCode = 1;
}
else if ( pAdapter->MediaConnectStatus == NdisMediaStateConnected )
{
if ( pAdapter->WPAEnabled == FALSE )
{
DBGPRINT( DBG_MACEVENT, (" Invoked reassociation\n") );
DBGPRINT( DBG_MACEVENT, (" tick=%d\n", GetTickCount()) );
pAdapter->ReAssociationInProgress = TRUE;
pAdapter->bIsSendCmdImterSet = TRUE;
pAdapter->uCurrentRetryForReassociation = 0;
NdisMSetTimer( &pAdapter->MrvDrvSendCmdTimer, pAdapter->uDelayForReAssociation );
nRetCode = 1;
}
else
{
DBGPRINT( DBG_MACEVENT, (" WPA is enabled, driver doesn't support reassociation currently\n") );
nRetCode = 0;
}
}
else if ( pAdapter->MediaConnectStatus == NdisMediaStateDisconnected )
{
DBGPRINT( DBG_MACEVENT, (" Media state is disconnected\n") );
nRetCode = 0;
}else
nRetCode = 0;
DBGPRINT( DBG_MACEVENT, ("- StartReassociation [%d]\n", nRetCode) );
return nRetCode;
}
/*
return: 1 - Send out (Re)Assoc(Ext) command successfully.
0 - Others.
*/
UINT DoReAssociation( IN PMRVDRV_ADAPTER pAdapter )
{
UINT nRetCode = 0;
UCHAR nIndex;
NDIS_STATUS nStatus;
NDIS_WLAN_BSSID_EX *pCurrentBssid;
UCHAR ucScanCmdEnd, ucScanCmdStart;
DBGPRINT( DBG_MACEVENT, ("+ DoReAssociation\n") );
ucScanCmdEnd = ( (pAdapter->CurCmd->Pad[2] & MRVDRV_SCAN_CMD_END) ? 1 : 0 );
ucScanCmdStart = ( (pAdapter->CurCmd->Pad[2] & MRVDRV_SCAN_CMD_START) ? 1 : 0 );
if ( ucScanCmdStart || ((ucScanCmdEnd==0 && pAdapter->ulNumOfBSSIDs==0)) )
{
DBGPRINT( DBG_MACEVENT, (" SCAN is still in progress, skip this\n") );
DBGPRINT( DBG_MACEVENT, ("- DoReAssociation\n") );
return 0;
}
pCurrentBssid = &(pAdapter->BSSIDList[pAdapter->ulCurrentBSSIDIndex]);
// nIndex = FindBSSIDInList( pAdapter, pAdapter->CurrentBSSID );
nIndex = FindSSIDInList( pAdapter, &(pAdapter->CurrentSSID) );
DBGPRINT( DBG_MACEVENT, (" tick=%d\n", GetTickCount()) );
if ( nIndex == 0xff )
{
DBGPRINT( DBG_MACEVENT, (" Total number of BSSIDs is %d\n", pAdapter->ulNumOfBSSIDs) );
DBGPRINT( DBG_MACEVENT,
(" Could NOT find the current BSSID, reassociation is failed [BSSID: %x:%x:%x:%x:%x:%x]\n",
pAdapter->CurrentBSSID[0],
pAdapter->CurrentBSSID[1],
pAdapter->CurrentBSSID[2],
pAdapter->CurrentBSSID[3],
pAdapter->CurrentBSSID[4],
pAdapter->CurrentBSSID[5] ) );
if ( ucScanCmdEnd )
{
pAdapter->uCurrentRetryForReassociation ++;
if ( pAdapter->uCurrentRetryForReassociation < pAdapter->uRetryForReassociation )
{
DBGPRINT( DBG_MACEVENT, (" Retry reassociation [%d/%d]\n", pAdapter->uCurrentRetryForReassociation, pAdapter->uRetryForReassociation) );
NdisMSetTimer( &pAdapter->MrvDrvSendCmdTimer, pAdapter->uDelayForReAssociation );
}
else
{
DBGPRINT( DBG_MACEVENT, (" Reassociation is failed, stop it and indicate disconnection\n") );
pAdapter->ReAssociationInProgress = FALSE;
MacEventDisconnected( pAdapter, pAdapter->TimerInterval, FALSE);
}
}
}
else
{
DBGPRINT( DBG_MACEVENT, (" Found the current BSSID\n") );
if ( pAdapter->InfrastructureMode == Ndis802_11Infrastructure )
{
DBGPRINT( DBG_MACEVENT, (" Send out AssociateExt for ReAssociation\n") );
nStatus = PrepareAndSendCommand(
pAdapter,
HostCmd_CMD_802_11_ASSOCIATE_EXT,
0,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
&(pAdapter->CurrentSSID));
}
else if ( pAdapter->InfrastructureMode == Ndis802_11IBSS )
{
DBGPRINT( DBG_MACEVENT, (" Send out AdHocJoin\n") );
nStatus = PrepareAndSendCommand(
pAdapter,
HostCmd_CMD_802_11_AD_HOC_JOIN,
0,
HostCmd_OPTION_USE_INT,
(NDIS_OID) 0,
HostCmd_PENDING_ON_CMD,
0, FALSE,
NULL, NULL, NULL,
&(pAdapter->CurrentSSID));
}
else
{
DBGPRINT( DBG_MACEVENT, (" WRONG InfrastructureMode!!!\n") );
nStatus = NDIS_STATUS_SUCCESS + 1; //Set to a NON-success
}
if ( NDIS_SUCCESS( nStatus ) )
{
DBGPRINT( DBG_MACEVENT, (" -> OK\n") );
nRetCode = 1;
}
else
{
DBGPRINT( DBG_MACEVENT, (" -> Failed\n") );
nRetCode = 0;
}
if ( pAdapter->WEPStatus == Ndis802_11WEPEnabled
|| pAdapter->AuthenticationMode == Ndis802_11AuthModeShared )
{
DBGPRINT( DBG_MACEVENT, (" Set wep key\n") );
// TODO: Need to do more tests for this block. Do we need OID_802_11_ADD_WEP (pendding OID)?
nStatus = PrepareAndSendCommand(
pAdapter,
HostCmd_CMD_802_11_SET_WEP,
0,
HostCmd_OPTION_USE_INT,
OID_802_11_ADD_WEP,
HostCmd_PENDING_ON_CMD,
0, FALSE,
NULL, NULL, NULL,
&pAdapter->CurrentWEPKey);
if ( NDIS_SUCCESS( nStatus ) )
{
DBGPRINT( DBG_MACEVENT, (" -> OK\n") );
nRetCode = 1;
}
else
{
DBGPRINT( DBG_MACEVENT, (" -> Failed\n") );
nRetCode = 0;
}
}
} // if ( nIndex == 0xff )
if ( nRetCode )
pAdapter->ReAssociationInProgress = FALSE;
DBGPRINT( DBG_MACEVENT, ("- DoReAssociation\n") );
return nRetCode;
}
#endif // AUTO_REASSOCIATION
#ifdef ADHOCAES
VOID
HandleAdhocAES( IN PMRVDRV_ADAPTER Adapter,
IN PHostCmd_DS_802_11_KEY_MATERIAL pKeyReturn,
IN PVOID info,
IN PULONG BytesWritten
)
{
PMRVL_ADHOC_AES_KEY pKey;
UCHAR key_ascii[32];
UCHAR key_hex[16];
UCHAR *tmp;
int i;
pKey = (PMRVL_ADHOC_AES_KEY)info;
NdisZeroMemory(key_hex, sizeof(key_hex));
NdisMoveMemory(key_hex, Adapter->aeskey.KeyParamSet.Key, sizeof(key_hex));
pKey->Length = sizeof(key_ascii) + 1;
NdisZeroMemory(key_ascii, sizeof(key_ascii));
tmp = key_ascii;
for (i = 0; i < sizeof(key_hex); i++)
tmp += sprintf(tmp, "%02x", key_hex[i]);
//Transfer Ascii[ex: char 0(Char)=0x31(hex)=48(dec)] to hex: 0
for (i = 0; i < sizeof(key_ascii); i++)
{
if ((key_ascii[i] >= 48) && (key_ascii[i] <= 57))
key_ascii[i]-=48;
else if ((key_ascii[i] >= 65) && (key_ascii[i] <= 70))
key_ascii[i]-=55;
else if ((key_ascii[i] >= 97) && (key_ascii[i] <= 102))
key_ascii[i]-=87;
else
break;
}
NdisMoveMemory(pKey->KeyBody, key_ascii, sizeof(key_ascii));
*BytesWritten = 32 + 4;
return ;
}
#endif
#ifdef BG_SCAN
/******************************************************************************
*
* Name: HandleBgScanResponse()
*
* Description: Handle background scan results
*
* Notes:
* The background scan results are added to PSBssidList.
*
*****************************************************************************/
VOID
HandleBgScanResponse(
PHostCmd_DS_802_11_BG_SCAN_QUERY_RSP pBgScanResponse,
PMRVDRV_ADAPTER Adapter
)
{
ULONG i,j;
USHORT Flag = 0;
ULONG TempV = 0,k;
NDIS_STATUS ndStat;
RETAILMSG(1, (TEXT("HandleBgScanResponse() \r\n")));
RETAILMSG(1 ,(TEXT("----------------------- Got background scan results ------------------------\r\n")));
RETAILMSG(1,(TEXT("Command %x\r\n"),(ULONG)pBgScanResponse->Command));
RETAILMSG(1,(TEXT("Size %d SeqNum %d Result %d\r\n"),
(ULONG)pBgScanResponse->Size,
(ULONG)pBgScanResponse->SeqNum,
(ULONG)pBgScanResponse->Result
));
RETAILMSG(1,(TEXT("BSSDescriptSize %d\r\n"),(ULONG)pBgScanResponse->BSSDescriptSize));
RETAILMSG(1,(TEXT("NumberOfSets %d\r\n"),(ULONG)pBgScanResponse->NumberOfSets));
RETAILMSG(1,(TEXT("*** Scan returned %d AP before parsing ***\r\n"), pBgScanResponse->NumberOfSets));
DBGPRINT(DBG_SCAN | DBG_CRLF ,("----------------------- Got background scan results ------------------------\n" ));
DBGPRINT(DBG_SCAN,("Command %x\n",(ULONG)pBgScanResponse -> Command));
DBGPRINT(DBG_SCAN,("Size %d SeqNum %d Result %d \n",
(ULONG)pBgScanResponse -> Size,
(ULONG)pBgScanResponse -> SeqNum,
(ULONG)pBgScanResponse -> Result
));
DBGPRINT(DBG_SCAN,("BSSDescriptSize %d\n",(ULONG)pBgScanResponse ->BSSDescriptSize));
DBGPRINT(DBG_SCAN,("NumberOfSets %d\n",(ULONG)pBgScanResponse ->NumberOfSets));
DBGPRINT(DBG_CMDRESP,("*** Scan returned %d AP before parsing ***\n", pBgScanResponse->NumberOfSets));
// Get number of BSS Descriptors
Adapter->ulNumOfBSSIDs = pBgScanResponse->NumberOfSets;
// Parse the return SCAN result
ndStat = InterpretBSSDescription(
Adapter,
(PVOID)(Adapter->CurCmd->BufVirtualAddr),
pBgScanResponse->BSSDescriptSize,
HostCmd_RET_802_11_BG_SCAN_QUERY );
if ( ndStat != NDIS_STATUS_SUCCESS )
{
DBGPRINT(DBG_SCAN | DBG_ERROR,("ERROR: InterpretBSSDescription returned ERROR\n"));
}
#ifdef DBG
DBGPRINT(DBG_SCAN,("*** Background scan Results: number of BSSID: %d\n", Adapter->ulNumOfBSSIDs));
for ( i=0; i < Adapter->ulNumOfBSSIDs; i++ )
{
DBGPRINT(DBG_SCAN,("\t\t%2d:\t%32s - %2x-%2x-%2x-%2x-%2x-%2x RSSI=%d\n",
i, Adapter->BSSIDList[i].Ssid.Ssid,
Adapter->BSSIDList[i].MacAddress[0],
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -