📄 miscproc.c
字号:
*/
{
if (( ! Adapter->bIsScanInProgress ) && ( ! Adapter->bIsAssociateInProgress ))
{
DBGPRINT(DBG_ALLEN, ("Send HostCmd_CMD_802_11_SCAN then Association\n"));
Adapter->bIsAssociationBlockedByScan = TRUE;
Adapter->SetActiveScanSSID = TRUE;
//RETAILMSG(1, (TEXT("Send HostCmd_CMD_802_11_SCAN command \r\n")));
Status = PrepareAndSendCommand(
Adapter,
HostCmd_CMD_802_11_SCAN,
0,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
&(Adapter->ActiveScanSSID));
}
else
{
Adapter->bIsReConnectNow = FALSE;
//RETAILMSG(1, (TEXT("Adapter->bIsReConnectNow = FALSE 9 \r\n")));
}
}
}
/// called by
VOID
ReConnectHandler(
PMRVDRV_ADAPTER Adapter)
{
if (Adapter->bIsReconnectEnable == FALSE )
{
return;
}
if (Adapter->bIsAssociateInProgress ||Adapter->bIsScanInProgress ||Adapter->bIsSystemConnectNow)
{
DBGPRINT(DBG_ALLEN, ("Adapter->bIsSystemConnectNow = TRUE\n"));
return;
}
DBGPRINT(DBG_ALLEN, ("ReConnectHandler() ,ReconnectType = 0x%x\n", Adapter->ReconnectType));
switch (Adapter->ReconnectType)
{
case RECONNECT_COUNTER_TYPE:
DBGPRINT(DBG_ALLEN, ("usReconnectCounter = 0x%x \n", Adapter->usReconnectCounter));
if ((Adapter->usReconnectCounter >= 1) &&
(Adapter->MediaConnectStatus == NdisMediaStateDisconnected))
{
Adapter->usReconnectCounter --;
//RETAILMSG(1, (TEXT("ReConnectHandler %d \r\n"), Adapter->usReconnectCounter));
DoReConnect (Adapter);
}
else
{
InfraBssReconnectStop(Adapter);
}
break;
case RECONNECT_PEROID_TYPE:
{
ULONG ulCurrentSystemUpTime, ulDiff;
NdisGetSystemUpTime(&ulCurrentSystemUpTime);
ulDiff = ulCurrentSystemUpTime - Adapter->ulStartTimeStamp ;
DBGPRINT(DBG_ALLEN, ("ulStartTimeStamp = 0x%x \n", Adapter->ulStartTimeStamp));
DBGPRINT(DBG_ALLEN, ("ulCurrentSystemUpTime = 0x%x \n", ulCurrentSystemUpTime));
DBGPRINT(DBG_ALLEN, ("ulDiff = 0x%x \n", ulDiff));
if ((ulDiff < Adapter->ulReconnectPeriod) &&
(Adapter->MediaConnectStatus == NdisMediaStateDisconnected))
{
DoReConnect (Adapter);
}
else
{
InfraBssReconnectStop(Adapter);
}
}
break;
case RECONNECT_RSSI_TYPE:
break;
}
}
// plus ++
USHORT Wpa2RsnIeAdjust(UCHAR *Dest, UCHAR *Src, USHORT RsnIeLen, UCHAR Mode)
{
USHORT length;
UCHAR Tkip_Oui[] = {0x00, 0xF0, 0xAC, 0x02};
UCHAR Aes_Oui[] = {0x00, 0xF0, 0xAC, 0x4};
length = RsnIeLen;
if (Src[8] == 2) // two pairwise key AES+TKIP
{
NdisMoveMemory(&Dest[0], &Src[0], 10); //copy IE header and group key suite
Dest[1] -= 4;
Dest[8] = 1;
length -= 4;
if (Mode == RSN_IE_AES)
NdisMoveMemory(&Dest[10], &Aes_Oui[0], 4); //copy AES pairwise key suite
else
NdisMoveMemory(&Dest[10], &Tkip_Oui[0], 4); //copy TKIP pairwise keu suite
NdisMoveMemory(&Dest[14], &Src[18], length - 14); //copy IE other information
}
else
NdisMoveMemory(&Dest[0], &Src[0], length); //copy IE header and group key suite
return length;
}
// plus --
VOID
v5MrvPrintFileW (
const unsigned short *fmt, ...)
{
va_list argP;
FILE *MrvDbgfp;
//DWORD dwThreadID;
//DWORD dwTick;
MrvDbgfp = fopen("\\My Documents\\MrvlSDv5.log","a+");
if ( MrvDbgfp == NULL )
{
return;
}
// dwThreadID = GetCurrentThreadId();
// dwTick = GetTickCount();
// fprintf(MrvDbgfp, "%8x:%d:", dwThreadID, dwTick);
va_start(argP, fmt);
vfwprintf(MrvDbgfp, fmt, argP);
fflush(MrvDbgfp);
va_end(argP);
fclose(MrvDbgfp);
}
#ifdef PMKID_CACHE_CAP
void ResetPmkidCache( IN PMRVDRV_ADAPTER Adapter )
{
Adapter->NumOfPmkid = 0;
NdisZeroMemory( Adapter->PmkidCache, sizeof(Adapter->PmkidCache) );
}
/*
RETURN:
0, failed
1, successful
*/
int SavePmkidToCache( IN PMRVDRV_ADAPTER Adapter, IN PNDIS_802_11_PMKID pNewPmkid )
{
int idx;
PPMKID_CACHE pPmkidCache;
PBSSID_INFO pIdInfo;
if ( pNewPmkid->BSSIDInfoCount > MAX_PMKID_CACHE )
return 0;
pPmkidCache = Adapter->PmkidCache;
pIdInfo = pNewPmkid->BSSIDINFO;
for ( idx=0; idx<pNewPmkid->BSSIDInfoCount; idx++ )
{
NdisMoveMemory( pPmkidCache[idx].bssid, pIdInfo[idx].BSSID, sizeof(pIdInfo[idx].BSSID) );
NdisMoveMemory( pPmkidCache[idx].pmkid, pIdInfo[idx].PMKID, sizeof(pIdInfo[idx].PMKID) );
}
Adapter->NumOfPmkid = pNewPmkid->BSSIDInfoCount;
return 1;
}
/*
RETURN:
<0, could not find Pmkid in cache
>=0, found one. the return value is the index of the pmkid.
*/
int FindPmkidInCache( IN PMRVDRV_ADAPTER Adapter, IN UCHAR *pBssid )
{
int idx;
PPMKID_CACHE pPmkidCache;
DBGPRINT( DBG_MACEVENT, (" Try to find PMKID in cache ...\n") );
DBGPRINT( DBG_MACEVENT, (" Total number of PMKID in cache: %d\n", Adapter->NumOfPmkid) );
DBGPRINT( DBG_MACEVENT, (" Desired BSSID=...%x:%x:%x\n", pBssid[3], pBssid[4], pBssid[5]) );
for ( idx=0; idx<Adapter->NumOfPmkid; idx++ )
{
pPmkidCache = &(Adapter->PmkidCache[idx]);
if ( NdisEqualMemory( pPmkidCache->bssid, pBssid, MRVDRV_ETH_ADDR_LEN ) )
break;
}
if ( idx < Adapter->NumOfPmkid )
return idx;
else
return -1;
}
void DbgDumpCurrentPmkidCache( IN PMRVDRV_ADAPTER Adapter )
{
int idx, i;
PPMKID_CACHE pPmkidCache;
pPmkidCache = Adapter->PmkidCache;
DBGPRINT( DBG_MACEVENT, ("*** PMKID cache dump ***\n") );
DBGPRINT( DBG_MACEVENT, (" Total number of PMKIDs is %d\n", Adapter->NumOfPmkid) );
for ( idx=0; idx<Adapter->NumOfPmkid; idx++ )
{
DBGPRINT( DBG_MACEVENT, (" %2x:%2x:%2x:%2x:%2x",
pPmkidCache[idx].bssid[0],
pPmkidCache[idx].bssid[1],
pPmkidCache[idx].bssid[2],
pPmkidCache[idx].bssid[3],
pPmkidCache[idx].bssid[4],
pPmkidCache[idx].bssid[5] ) );
DBGPRINT( DBG_MACEVENT, (" [ ") );
for ( i=0; i<LEN_OF_PMKID; i++ )
DBGPRINT( DBG_MACEVENT, ("%2x ", pPmkidCache[idx].pmkid[i]) );
DBGPRINT( DBG_MACEVENT, ("]\n") );
}
}
void DbgDumpRSN( IN PMRVDRV_ADAPTER Adapter )
{
}
UINT PrepareRSNForOsNotify( IN PMRVDRV_ADAPTER Adapter, IN UCHAR *pDesiredSsid, IN UINT nSsidLen )
{
UINT nIdxBss, nIdxCand;
PPMKID_CANDIDATE pPmkidCand;
PNDIS_WLAN_BSSID_EX pBssidEx;
DBGPRINT( DBG_MACEVENT, ("+ PrepareRSNForOsNotify\n") );
DBGPRINT( DBG_MACEVENT, (" TotalNumOfBssid=%d, DesiredSsid=%c%c%c%c...\n",
Adapter->ulPSNumOfBSSIDs,
pDesiredSsid[0],
pDesiredSsid[1],
pDesiredSsid[2],
pDesiredSsid[3] ) );
for( nIdxBss=0, nIdxCand=0; nIdxBss<Adapter->ulPSNumOfBSSIDs && nIdxCand<MAX_PMKID_CANDIDATE; nIdxBss++ )
{
pBssidEx = &(Adapter->PSBSSIDList[nIdxBss]);
// DBGPRINT( DBG_MACEVENT, (" matching %c%c%c...\n",
// pBssidEx->Ssid.Ssid[0],
// pBssidEx->Ssid.Ssid[1],
// pBssidEx->Ssid.Ssid[2] ) );
if ( nSsidLen == 0 ||
(nSsidLen==pBssidEx->Ssid.SsidLength && NdisEqualMemory(pDesiredSsid, pBssidEx->Ssid.Ssid, nSsidLen)) )
{
pPmkidCand = &(Adapter->RSNPmkidCandidateList.CandidateList[nIdxCand]);
// TODO: value of the Flags should depend on PreAuth field of RSNCapability that comes from an AP.
pPmkidCand->Flags = 0; // means PreAuth disabled.
NdisMoveMemory( pPmkidCand->Bssid, pBssidEx->MacAddress, sizeof(pPmkidCand->Bssid) );
nIdxCand ++;
}
}
DBGPRINT( DBG_MACEVENT, ("- PrepareRSNForOsNotify [NumOfCand=%d]\n", nIdxCand) );
return nIdxCand;
}
/*
This function can be called after we get pairwise and group key.
*/
void OsNotify_RSN( IN PMRVDRV_ADAPTER Adapter )
{
UINT nNumOfRSNItems;
UINT ulSize;
DBGPRINT( DBG_MACEVENT, ("+ OsNotify_RSN\n") );
DBGPRINT( DBG_MACEVENT, (" NumOfBssid: normal=%d, progressive=%d\n", Adapter->ulNumOfBSSIDs, Adapter->ulPSNumOfBSSIDs) );
// TODO: Need to check association state and whether we got group key or not.
if ( Adapter->ulPSNumOfBSSIDs == 0 )
{
DBGPRINT( DBG_MACEVENT, ("- OsNotify_RSN [There is no BSSID record]\n") );
return;
}
Adapter->RSNStatusIndicated.StatusType = Ndis802_11StatusType_PMKID_CandidateList;
Adapter->RSNPmkidCandidateList.Version = 1;
nNumOfRSNItems = PrepareRSNForOsNotify( Adapter, Adapter->CurrentSSID.Ssid, Adapter->CurrentSSID.SsidLength );
if ( nNumOfRSNItems == 0 )
{
DBGPRINT( DBG_MACEVENT, ("- OsNotify_RSN [There is no RSN item to be set]\n") );
return;
}
Adapter->RSNPmkidCandidateList.NumCandidates = nNumOfRSNItems;
ulSize = sizeof(NDIS_802_11_STATUS_INDICATION) +
sizeof(NDIS_802_11_PMKID_CANDIDATELIST) +
(sizeof(PMKID_CANDIDATE)*(Adapter->RSNPmkidCandidateList.NumCandidates-1));
DBGPRINT(DBG_MACEVENT, (" NumCandidate=%d, TotalSize=%d\n", Adapter->RSNPmkidCandidateList.NumCandidates, ulSize) );
DbgDumpRSN( Adapter );
NdisMIndicateStatus( Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_MEDIA_SPECIFIC_INDICATION,
&Adapter->RSNStatusIndicated,
ulSize );
NdisMIndicateStatusComplete( Adapter->MrvDrvAdapterHdl );
DBGPRINT( DBG_MACEVENT, ("- OsNotify_RSN [Indicate completely]\n") );
}
#endif //PMKID_CACHE_CAP
#ifdef ACTIVE_ROAMING
VOID
SetUpLowRssiValue(
PMRVDRV_ADAPTER Adapter
)
{
///OID_MRVL_DS_SUBSCRIBE_EVENT EventCtrl;
//#ifdef MRVL_DBG_ACTIVE_ROAMING
// #ifdef MRVL_PRINT_DBG_MSG
// MrvPrintFile("\n[Marvell]SetUpLowRssiValue =-%d dbm!!\n",usRssiValue);
// #endif
//#endif
Adapter->EventRecord.EventMap |= RSSI_LOW; //ACTIVE_ROAMING
//Adapter->EventRecord.RSSIValue = usRssiValue;
Adapter->EventRecord.RSSIFreq = 0;
PrepareAndSendCommand(
Adapter,
HostCmd_CMD_802_11_SUBSCRIBE_EVENT,
HostCmd_ACT_SET,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
0,
0,
NULL);
return;
}
BOOLEAN
CheckCurrentSsidBssidRssiInList(
PMRVDRV_ADAPTER Adapter
)
{
ULONG i;
ULONG ulNumBSSID;
PNDIS_WLAN_BSSID_EX pBSSIDListSrc;
LONG lRSSILow;
pBSSIDListSrc = Adapter->PSBSSIDList;
ulNumBSSID = Adapter->ulPSNumOfBSSIDs;
lRSSILow=(LONG)Adapter->EventRecord.RSSIValue;
lRSSILow*=(-1);
if (Adapter->bBgScanEnabled)
EnableBgScan(Adapter,FALSE);
for (i=0; i<ulNumBSSID; i++)
{
if ((NdisEqualMemory( pBSSIDListSrc[i].Ssid.Ssid, Adapter->CurrentSSID.Ssid, Adapter->CurrentSSID.SsidLength)) &&
(pBSSIDListSrc[i].Ssid.SsidLength == Adapter->CurrentSSID.SsidLength)&&
(NdisEqualMemory( &(pBSSIDListSrc[i].MacAddress),Adapter->CurrentBSSID, ETH_ADDR_LENGTH)) )
{
//check Mode and RSSI value ex: range (RSSIValue-RSSIThreshold) <10 || >-10
if ( (pBSSIDListSrc[i].InfrastructureMode == Ndis802_11Infrastructure)&&(((pBSSIDListSrc[i].Rssi -lRSSILow)< Adapter->RSSI_Range) &&((pBSSIDListSrc[i].Rssi -lRSSILow)>Adapter->NegativeRSSI_Range)) )
return TRUE;
}
}
return FALSE;
}
VOID
ActiveRoamingHandler(
PMRVDRV_ADAPTER Adapter)
{
#ifdef BG_SCAN
if (CheckCurrentSsidBssidRssiInList(Adapter))
{
PrepareAndSendCommand(
Adapter,
HostCmd_CMD_802_11_ASSOCIATE_EXT,
0,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
&(Adapter->CurrentSSID));
}
else
#endif
{
Adapter->bIsAssociationBlockedByScan =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -