📄 miscproc.c
字号:
}
// set ssid
NdisMoveMemory( &(Adapter->ActiveScanSSID),
&(Adapter->ReSSID),
sizeof(NDIS_802_11_SSID));
/*
{ ULONG i;
RETAILMSG(1, (TEXT("ActiveScanSSID \r\n")));
for (i=0; i<Adapter->ActiveScanSSID.SsidLength; i++)
{
RETAILMSG(1, (TEXT("%02x "), *(((UCHAR *)(Adapter->ActiveScanSSID.Ssid))+ i) ));
if (((i %16) == 0) && i)
RETAILMSG(1, (TEXT("\r\n")));
}
RETAILMSG(1, (TEXT("\r\n")));
}
*/
/*
if (Adapter->bIsDeauthenticaticationEvent)
{
Status = 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->ReSSID));
///RETAILMSG(1, (TEXT("Send HostCmd_CMD_802_11_ASSOCIATE_EXT command \r\n")));
}
else
*/
{
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));
if (Adapter->bIsIgnoreTheFirstOne == FALSE)
{
DoReConnect (Adapter);
}
else
{
Adapter->bIsIgnoreTheFirstOne = FALSE;
}
}
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))
{
if (Adapter->bIsIgnoreTheFirstOne == FALSE)
{
DoReConnect (Adapter);
}
else
{
Adapter->bIsIgnoreTheFirstOne = FALSE;
}
}
else
{
InfraBssReconnectStop(Adapter);
}
}
break;
case RECONNECT_RSSI_TYPE:
break;
}
}
// plus ++
USHORT Wpa2RsnIeAdjust(UCHAR *Dest, UCHAR *Src, USHORT RsnIeLen, UCHAR Mode)
{
USHORT length;
#ifdef MRVL_BCOM_MIX
UCHAR Tkip_Oui[] = {0x00, 0xF, 0xAC, 0x2};
UCHAR Aes_Oui[] = {0x00, 0xF, 0xAC, 0x4};
#else
UCHAR Tkip_Oui[] = {0x00, 0xF0, 0xAC, 0x02};
UCHAR Aes_Oui[] = {0x00, 0xF0, 0xAC, 0x4};
#endif
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 --
//Plus++, 080106(for Broadcom mix mode fix)
UCHAR WpaIeAdjust(UCHAR *Dest, UCHAR *Src, UCHAR RsnIeLen, UCHAR Mode)
{
UCHAR length, authOffset, index;
UCHAR Tkip_Oui[] = {0x00, 0x50, 0xF2, 0x02};
UCHAR Aes_Oui[] = {0x00, 0x50, 0xF2, 0x04};
UCHAR Ssn_Oui[] = {0x00, 0x50, 0xF2, 0x01};
UCHAR SsnPsk_Oui[] = {0x00, 0x50, 0xF2, 0x02};
// WPA_ID 1
// Length 1
// OUI 4
// Version 2
// MulticastCipherSuite 4
// UnicastCipherCount 2
// UnicastCipherSuite 4n
// AuthKeyMgmtCount 2
// AuthKeyMgmtSuite 4n
length = RsnIeLen;
authOffset = UNI_CIPHER_OFFSET + 2 + 4; // count + suite
index = authOffset;
if(Src[UNI_CIPHER_OFFSET] == 2) // two pairwise key AES+TKIP
{
NdisMoveMemory(&Dest[0], &Src[0], UNI_CIPHER_OFFSET); //copy IE header and group key suite
Dest[1] -= 4;
Dest[UNI_CIPHER_OFFSET] = 1;
length -= 4;
if(Mode & RSN_IE_AES)
NdisMoveMemory(&Dest[UNI_CIPHER_OFFSET + 2], &Aes_Oui[0], 4); //copy AES pairwise key suite
else
NdisMoveMemory(&Dest[UNI_CIPHER_OFFSET + 2], &Tkip_Oui[0], 4); //copy TKIP pairwise keu suite
index += 4;
}
else
NdisMoveMemory(&Dest[0], &Src[0], authOffset); //copy IE header and group key suite
if(Src[index] == 2) // two auth management count
{
Dest[1] -= 4;
Dest[authOffset] = 1;
length -= 4;
if(Mode & AUTH_SSN)
NdisMoveMemory(&Dest[authOffset + 2], &Ssn_Oui[0], 4); //copy AES pairwise key suite
else
NdisMoveMemory(&Dest[authOffset + 2], &SsnPsk_Oui[0], 4); //copy TKIP pairwise keu suite
index += 4;
}
else
NdisMoveMemory(&Dest[authOffset], &Src[index], 6); //copy IE other information
index += 6;
authOffset += 6;
NdisMoveMemory(&Dest[authOffset], &Src[index], length - authOffset); //copy IE other information
return length;
}
//Plus--, 080106
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 )
{
ULONG 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 )
{
ULONG 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 )
{
ULONG 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;
// tt ++ patch pmk
static NDIS_802_11_MAC_ADDRESS s_PrevAP[3];
static DWORD s_IdxAP=0, s_NumAP=0;
DWORD i;
// tt --
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] ) );
// tt ++ patch pmk
DBGPRINT( DBG_MACEVENT, (" Going to append previous %d APs\n", s_NumAP ) );
nIdxCand = 0;
for ( i=0; i<s_NumAP; i++ )
{
pPmkidCand = &(Adapter->RSNPmkidCandidateList.CandidateList[nIdxCand]);
pPmkidCand->Flags = 0; // means PreAuth disabled.
NdisMoveMemory( pPmkidCand->Bssid, s_PrevAP[i], sizeof(pPmkidCand->Bssid) );
nIdxCand ++;
}
DBGPRINT( DBG_MACEVENT, (" Added %d APs\n", nIdxCand ) );
// tt --
#if 0 // tt ++ patch pmk
for( nIdxBss=0, nIdxCand=0; nIdxBss<Adapter->ulPSNumOfBSSIDs && nIdxCand<MAX_PMKID_CANDIDATE; nIdxBss++ )
#else
for( nIdxBss=0; nIdxBss<Adapter->ulPSNumOfBSSIDs && nIdxCand<MAX_PMKID_CANDIDATE; nIdxBss++ )
#endif
{
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]);
// tt ++ patch pmk
for ( i=0; i<s_NumAP; i++ )
{
if ( NdisEqualMemory( s_PrevAP[i], pBssidEx->MacAddress, 6 ) )
break;
}
if ( i < s_NumAP ) continue;
// tt --
// 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 ++;
// tt ++ patch pmk
NdisMoveMemory( s_PrevAP[s_IdxAP], pBssidEx->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS) );
s_IdxAP ++;
if ( s_NumAP < 3 ) s_NumAP ++;
if ( s_IdxAP >= 3 ) s_IdxAP = 0;
// tt --
}
}
DBGPRINT( DBG_MACEVENT, ("- Pr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -