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

📄 miscproc.c

📁 marvell wifi driver CF-8385PN-NDIS-ARM4-WINCE50-5.24.17.p5-27.p11.src.zip
💻 C
📖 第 1 页 / 共 5 页
字号:
	*/	
	{
		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 + -