⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hidden.c

📁 Windows CE 6.0 BSP for VOIP sample phone. Intel PXA270 platform.
💻 C
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -