📄 hidden.c
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
/** @file hidden.c
*
* Copyright (c) Marvell Semiconductor, Inc.
*/
#include "precomp.h"
VOID
AddHiddenApToList(
PMRVDRV_ADAPTER Adapter,
ULONG index)
{
BOOLEAN bFound;
ULONG i;
DBGPRINT(DBG_SCAN, ("AddHiddenApToList () index = %d\n", index));
if (Adapter->ulHiddenNumOfBSSIDs >=MRVDRV_MAX_HIDDEN_LIST)
return;
bFound = FALSE;
for ( i=0; i < Adapter->ulHiddenNumOfBSSIDs; i++ )
{
if ( NdisEqualMemory(Adapter->BSSIDList[index].MacAddress,
Adapter->HiddenBSSIDList[i].MacAddress,
ETH_ADDR_LENGTH) == 0 )
{
continue;
}
if ( Adapter->BSSIDList[index].InfrastructureMode !=
Adapter->HiddenBSSIDList[i].InfrastructureMode )
{
continue;
}
bFound = TRUE;
// replace the current entry
NdisMoveMemory( &Adapter->HiddenBSSIDList[i],
&Adapter->BSSIDList[index],
sizeof(NDIS_WLAN_BSSID_EX));
NdisMoveMemory( &Adapter->HiddenIEBuffer[i],
&Adapter->IEBuffer[index],
sizeof(MRV_BSSID_IE_LIST));
NdisMoveMemory( &Adapter->HiddenBssDescList[i],
&Adapter->BssDescList[index],
sizeof(BSS_DESCRIPTION_SET_ALL_FIELDS));
//Adapter->bIsHiddenTried[i] = FALSE;
DBGPRINT(DBG_SCAN, ("Add Hidden List : Replace Specific Scan Entry To %d entry of Hidden List\n", i));
}
if (! bFound)
{
// append at the end
NdisMoveMemory( &Adapter->HiddenBSSIDList[Adapter->ulHiddenNumOfBSSIDs],
&Adapter->BSSIDList[index],
sizeof(NDIS_WLAN_BSSID_EX));
NdisMoveMemory( &Adapter->HiddenIEBuffer[Adapter->ulHiddenNumOfBSSIDs],
&Adapter->IEBuffer[index],
sizeof(MRV_BSSID_IE_LIST));
NdisMoveMemory( &Adapter->HiddenBssDescList[Adapter->ulHiddenNumOfBSSIDs],
&Adapter->BssDescList[index],
sizeof(BSS_DESCRIPTION_SET_ALL_FIELDS));
Adapter->bIsHiddenTried[Adapter->ulHiddenNumOfBSSIDs] = FALSE;
Adapter->ulHiddenNumOfBSSIDs++;
DBGPRINT(DBG_SCAN, ("Add Hidden List: Append Specific Scan Entry To %d entry of Hidden List\n", i));
}
}
ULONG
FindHiddenApToTry(
PMRVDRV_ADAPTER Adapter)
{
ULONG i;
DBGPRINT(DBG_SCAN, (" FindHiddenApToTry()\n"));
// >>
//
// now disable tring all hidden ssid association for test
//
return 0xffffffff;
// <<
if (Adapter->ulHiddenNumOfBSSIDs == 0)
return 0xffffffff;
for (i=0; i<Adapter->ulHiddenNumOfBSSIDs; i++)
{
if (Adapter->bIsHiddenTried[i] == FALSE)
break;
}
if ( i == Adapter->ulHiddenNumOfBSSIDs)
return 0xffffffff;
return i;
}
VOID
ResetHiddenTryFlag
(
PMRVDRV_ADAPTER Adapter)
{
ULONG i;
DBGPRINT(DBG_SCAN, (" ResetHiddenTryFlag()\n"));
for ( i=0; i<MRVDRV_MAX_HIDDEN_LIST; i++)
Adapter->bIsHiddenTried[i] = FALSE;
}
VOID
FastHiddenApAssociate(
PMRVDRV_ADAPTER Adapter)
{
ULONG index;
PHostCmd_DS_802_11_ASSOCIATE_EXT pAsso;
CmdCtrlNode *pTempAsocCmd;
//ULONG i;
BOOLEAN bSsidFound = FALSE;
//long lRSSI;
//ULONG ulNumBSSID;
PNDIS_WLAN_BSSID_EX pBSSIDListSrc;
PNDIS_802_11_FIXED_IEs pFixedIE;
PMRV_BSSID_IE_LIST pBSSIDIEListSrc;
PBSS_DESCRIPTION_SET_ALL_FIELDS pBssDescListSrc;
//PPENDING_OID pPending;
BOOLEAN bHasHideSSID = FALSE;
//ULONG iHideSSID;
UCHAR *curpos;
MrvlIEtypes_SsIdParamSet_t *ssid;
MrvlIEtypes_PhyParamSet_t *phy;
MrvlIEtypes_SsParamSet_t *ss;
MrvlIEtypes_RatesParamSet_t *rates;
MrvlIEtypes_RsnParamSet_t *rsn;
//MrvlIEtypes_WmmParamSet_t *wmm;
//HostCmd_DS_802_11_BAND_CONFIG bc;
#ifdef PMKID_CACHE_CAP
int nPmkidIdx;
PUCHAR pOriWpa2Ie;
#endif
DBGPRINT(DBG_SCAN, (" FastHiddenApAssociate()\n"));
index = FindHiddenApToTry(Adapter);
if (index == 0xffffffff)
{
return;
}
if (Adapter->bIsReConnectNow)
{
NdisMoveMemory( &(Adapter->HiddenBSSIDList[index].Ssid),
&(Adapter->ReSSID),
sizeof(NDIS_802_11_SSID));
}
else
{
NdisMoveMemory( &(Adapter->HiddenBSSIDList[index].Ssid),
&(Adapter->SysAttemptedSSID),
sizeof(NDIS_802_11_SSID));
}
pTempAsocCmd = GetFreeCmdCtrlNode(Adapter);
if ( pTempAsocCmd == NULL )
return;
pBSSIDListSrc = Adapter->HiddenBSSIDList;
pBSSIDIEListSrc = Adapter->HiddenIEBuffer;
pBssDescListSrc = Adapter->HiddenBssDescList;
pTempAsocCmd->ExpectedRetCode = GetExpectedRetCode(HostCmd_CMD_802_11_ASSOCIATE_EXT);
pAsso = (PHostCmd_DS_802_11_ASSOCIATE_EXT)pTempAsocCmd->BufVirtualAddr;
//
SetCmdCtrlNode ( Adapter,
pTempAsocCmd,
0,
HostCmd_PENDING_ON_NONE,
HostCmd_OPTION_USE_INT,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
// setup command and parameter
pAsso->SeqNum = (Adapter->SeqNum++);
pAsso->Command = HostCmd_CMD_802_11_ASSOCIATE_EXT;
pAsso->Result = 0;
// size of general header (command size include the header 8 bytes)
pAsso->Size = 8;
NdisMoveMemory(pAsso->PeerStaAddr, pBSSIDListSrc[index].MacAddress,
MRVDRV_ETH_ADDR_LEN);
// set the Capability info
pFixedIE = &(pBSSIDIEListSrc[index].FixedIE);
NdisMoveMemory(&pAsso->CapInfo, &(pFixedIE->Capabilities), sizeof(IEEEtypes_CapInfo_t));
// set the listen interval and Beacon period
pAsso->ListenInterval = MRVDRV_DEFAULT_LISTEN_INTERVAL;
pAsso->BcnPeriod = pBSSIDIEListSrc[index].FixedIE.BeaconInterval;
pAsso->DtimPeriod = 0;
pAsso->Size += 13;
HexDump(DBG_ALLEN, ">>>>> pAsso dump -- 1", (UCHAR *)pAsso, pAsso->Size);
// ssid
ssid = (MrvlIEtypes_SsIdParamSet_t *)((UCHAR *)pAsso + pAsso->Size);
ssid->Header.Type = TLV_TYPE_SSID;
ssid->Header.Len = (USHORT)pBSSIDListSrc[index].Ssid.SsidLength;
NdisMoveMemory(ssid->SsId, pBSSIDListSrc[index].Ssid.Ssid,
pBSSIDListSrc[index].Ssid.SsidLength);
curpos = (UCHAR *)&pAsso->SsIdParamSet + sizeof(MrvlIEtypesHeader_t) + ssid->Header.Len;
pAsso->Size += (sizeof(MrvlIEtypesHeader_t) + ssid->Header.Len);
HexDump(DBG_ALLEN, ">>>>> pAsso dump -- 2", (UCHAR *)ssid,
(sizeof(MrvlIEtypesHeader_t) + ssid->Header.Len));
// ds
phy = (MrvlIEtypes_PhyParamSet_t *)curpos;
phy->Header.Type = TLV_TYPE_PHY_DS;
phy->Header.Len = sizeof(phy->fh_ds.DsParamSet);
NdisMoveMemory(&(phy->fh_ds.DsParamSet), &(pBssDescListSrc[index].PhyParamSet.DsParamSet.CurrentChan),
sizeof(phy->fh_ds.DsParamSet));
curpos += sizeof(phy->Header) + phy->Header.Len;
pAsso->Size += (sizeof(phy->Header) + phy->Header.Len);
HexDump(DBG_ALLEN, ">>>>> pAsso dump -- 3", (UCHAR *)phy,
(sizeof(phy->Header) + phy->Header.Len));
// cf : now we don't need to fill the field
ss = (MrvlIEtypes_SsParamSet_t *)curpos;
ss->Header.Type = TLV_TYPE_CF;
ss->Header.Len = sizeof(ss->cf_ibss.CfParamSet);
curpos += sizeof(ss->Header) + ss->Header.Len;
pAsso->Size += (sizeof(ss->Header) + ss->Header.Len);
HexDump(DBG_ALLEN, ">>>>> pAsso dump -- 4", (UCHAR *)ss,
(sizeof(ss->Header) + ss->Header.Len));
// rate
rates = (MrvlIEtypes_RatesParamSet_t *)curpos;
rates->Header.Type = TLV_TYPE_RATES;
#ifdef MRV_CHIP_8381PN
NdisMoveMemory (rates->Rates, &(pBSSIDListSrc[index].SupportedRates), B_SUPPORTED_RATES);
rates->Header.Len = 4;
#else
NdisMoveMemory (rates->Rates, &(pBSSIDListSrc[index].SupportedRates), G_SUPPORTED_RATES);
rates->Header.Len = 12;
#endif
#ifdef MRV_CHIP_8385H
{
HostCmd_DS_802_11_BAND_CONFIG bc;
bc.BandSelection = (USHORT)pBSSIDListSrc[index].Reserved[1];
DBGPRINT(DBG_CMDRESP, ("ASSO_EXT: Band = %d\n",bc.BandSelection));
if (pBSSIDListSrc[index].Configuration.DSConfig > 5000000)
bc.Channel = (USHORT)((pBSSIDListSrc[index].Configuration.DSConfig - 5000000)/5000);
else if (pBSSIDListSrc[index].Configuration.DSConfig > 2407000)
bc.Channel = (USHORT)((pBSSIDListSrc[index].Configuration.DSConfig - 2407000)/5000);
else
bc.Channel = (USHORT)pBSSIDListSrc[index].Reserved[0];
DBGPRINT(DBG_CMDRESP, ("ASSO_EXT: DSConfig =%d, Channel = %d\n",
pBSSIDListSrc[index].Configuration.DSConfig, bc.Channel));
PrepareAndSendCommand(
Adapter,
HostCmd_CMD_802_11_BAND_CONFIG,
HostCmd_ACT_SET,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
&bc);
Adapter->connected_band = bc.BandSelection;
Adapter->connected_channel = bc.Channel;
}
#endif
#ifdef WPA
// if using one of the WPA authentication mode
if ((FW_IS_WPA_ENABLED(Adapter)) &&
((Adapter->AuthenticationMode == Ndis802_11AuthModeWPAPSK) ||
(Adapter->AuthenticationMode == Ndis802_11AuthModeWPA) ||
(Adapter->AuthenticationMode == Ndis802_11AuthModeWPANone)||
(Adapter->AuthenticationMode == Ndis802_11AuthModeWPA2) ||
(Adapter->AuthenticationMode == Ndis802_11AuthModeWPA2PSK)) )
{
PNDIS_802_11_ASSOCIATION_INFORMATION pAdapterAssoInfo;
WPA_SUPPLICANT *pwpa_supplicant;
// plus++
WPA_SUPPLICANT *pwpa2_supplicant;
UCHAR Mode;
// plus--
//DBGPRINT(DBG_CMDRESP, ("ASSO_EXT: wpa_supplicant.Wpa_ie_len =%d \n",pBssDescListSrc[index].wpa_supplicant.Wpa_ie_len));
if ((Adapter->AuthenticationMode == Ndis802_11AuthModeWPA2) ||
(Adapter->AuthenticationMode == Ndis802_11AuthModeWPA2PSK) )
{
// plus ++
pwpa2_supplicant = &(pBssDescListSrc[index].wpa2_supplicant);
pwpa_supplicant = &Adapter->wpa2_supplicant;
if (Adapter->EncryptionStatus == Ndis802_11Encryption3Enabled)
Mode = RSN_IE_AES;
else
Mode = RSN_IE_TKIP;
pwpa_supplicant->Wpa_ie_len = (UCHAR)Wpa2RsnIeAdjust(&pwpa_supplicant->Wpa_ie[0],
&pwpa2_supplicant->Wpa_ie[0], pwpa2_supplicant->Wpa_ie_len, Mode);
// plus --
}
else
{
pwpa_supplicant = &(pBssDescListSrc[index].wpa_supplicant);
}
if (pwpa_supplicant->Wpa_ie_len)
{
DBGPRINT(DBG_CMDRESP, ("ASSO_EXT: fille the WPA IE \n"));
rsn = (MrvlIEtypes_RsnParamSet_t *)curpos;
rsn->Header.Type = (USHORT)(pwpa_supplicant->Wpa_ie[0]);
rsn->Header.Len = (USHORT)(pwpa_supplicant->Wpa_ie[1]);
NdisMoveMemory(rsn->RsnIE, &(pwpa_supplicant->Wpa_ie[2]), rsn->Header.Len);
curpos += sizeof(rsn->Header) + rsn->Header.Len;
pAsso->Size += (sizeof(rsn->Header) + rsn->Header.Len);
HexDump(DBG_ALLEN, ">>>>> pAsso dump -- 6", (UCHAR *)rsn,
(sizeof(rsn->Header) + rsn->Header.Len));
}
#ifdef PMKID_CACHE_CAP
//{
// int nPmkidIdx;
DBGPRINT( DBG_MACEVENT, (" Check PMKID cache\n") );
HexDump( DBG_MACEVENT, " BSSID: ", pBSSIDListSrc[Adapter->ulAttemptedBSSIDIndex].MacAddress, 6 );
nPmkidIdx = FindPmkidInCache( Adapter, pBSSIDListSrc[Adapter->ulAttemptedBSSIDIndex].MacAddress );
if ( nPmkidIdx >= 0 )
{
DBGPRINT( DBG_MACEVENT, (" ASSOC_EXT: Append PMKID\n") );
DBGPRINT( DBG_MACEVENT, (" Original EID=%d, IELen=%d\n", rsn->Header.Type, rsn->Header.Len) );
curpos[0] = 1;
curpos[1] = 0;
NdisMoveMemory( &curpos[2], Adapter->PmkidCache[nPmkidIdx].pmkid, LEN_OF_PMKID );
rsn->Header.Len += ( 2 + LEN_OF_PMKID );
curpos += ( 2 + LEN_OF_PMKID );
pAsso->Size += ( 2 + LEN_OF_PMKID );
DBGPRINT( DBG_MACEVENT, (" Modified EID=%d, IELen=%d\n", rsn->Header.Type, rsn->Header.Len) );
HexDump(DBG_MACEVENT, "\n >>>>> SetupAssocExt dump -- PMKID had been added", (UCHAR *)rsn,
(sizeof(rsn->Header) + rsn->Header.Len));
}
//}
#endif //PMKID_CACHE_CAP
/*
if (pBssDescListSrc[index].wpa_supplicant.Wpa_ie_len)
{
DBGPRINT(DBG_CMDRESP, ("ASSO_EXT: fille the WPA IE \n"));
rsn = (MrvlIEtypes_RsnParamSet_t *)curpos;
rsn->Header.Type = (USHORT)(pBssDescListSrc[index].wpa_supplicant.Wpa_ie[0]);
rsn->Header.Len = (USHORT)(pBssDescListSrc[index].wpa_supplicant.Wpa_ie[1]);
NdisMoveMemory(rsn->RsnIE, &(pBssDescListSrc[index].wpa_supplicant.Wpa_ie[2]), rsn->Header.Len);
curpos += sizeof(rsn->Header) + rsn->Header.Len;
pAsso->Size += (sizeof(rsn->Header) + rsn->Header.Len);
HexDump(DBG_ALLEN, ">>>>> pAsso dump -- 6", (UCHAR *)rsn,
(sizeof(rsn->Header) + rsn->Header.Len));
}
*/
// reset the cap and interval info according to OID_802_11_ASSOCIATION_INFO
pAdapterAssoInfo = (PNDIS_802_11_ASSOCIATION_INFORMATION)
Adapter->AssocInfoBuffer;
NdisZeroMemory(pAdapterAssoInfo, MRVDRV_ASSOCIATE_INFO_BUFFER_SIZE);
pAdapterAssoInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
pAdapterAssoInfo->OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
// add the default value
pAdapterAssoInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES;
NdisMoveMemory (&pAdapterAssoInfo->RequestFixedIEs.Capabilities,
&(pAsso->CapInfo),
sizeof(IEEEtypes_CapInfo_t));
// add the default value
pAdapterAssoInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_LISTENINTERVAL;
pAdapterAssoInfo->RequestFixedIEs.ListenInterval = pAsso->ListenInterval;
// TODO: not sure what to do with CurrentAPAddress Field!
pAdapterAssoInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CURRENTAPADDRESS;
NdisMoveMemory(pAdapterAssoInfo->RequestFixedIEs.CurrentAPAddress,
pAsso->PeerStaAddr,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -