pararoamingproc.c

来自「marvell8385 GSPI开发驱动」· C语言 代码 · 共 1,981 行 · 第 1/5 页

C
1,981
字号

	priv.hAutoRoamingEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
	if (NULL == priv.hAutoRoamingEvent)
	{
	  //RETAILMSG(1,(TEXT("Null AutoRoaming EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

	priv.hManualRoamingEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
	if (NULL == priv.hManualRoamingEvent)
	{
	  //RETAILMSG(1,(TEXT("Null ManualRoaming EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

	priv.hWlanSmartDetectionEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
	if (NULL == priv.hWlanSmartDetectionEvent)
	{
	  //RETAILMSG(1,(TEXT("Null WlanSmartDetectionEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

	priv.hWlanAllDetectionEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
	if (NULL == priv.hWlanAllDetectionEvent)
	{
	  //RETAILMSG(1,(TEXT("Null WlanAllDetectionEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

#ifdef CONFIG_VERTICAL_HANDOFF
	priv.hBeaconRSSIListenEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
	if (NULL == priv.hBeaconRSSIListenEvent)
	{
	  //RETAILMSG(1,(TEXT("Null BeaconRSSIListenEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}
#endif

	priv.hScanFinishedEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
	if (NULL == priv.hScanFinishedEvent)
	{
	  //RETAILMSG(1,(TEXT("Null ScanFinishedEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

	priv.hAuthFinishedEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
	if (NULL == priv.hAuthFinishedEvent)
	{
	  //RETAILMSG(1,(TEXT("Null AuthFinishedEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

	priv.hAssoFinishedEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
	if (NULL == priv.hAssoFinishedEvent)
	{
	  //RETAILMSG(1,(TEXT("Null AssoFinishedEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

	priv.hDeauthFinishedEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
	if (NULL == priv.hDeauthFinishedEvent)
	{
	  //RETAILMSG(1,(TEXT("Null DeauthFinishedEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

	priv.hOIDSetSSIDFinishedEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
	if (NULL == priv.hOIDSetSSIDFinishedEvent)
	{
	  //RETAILMSG(1,(TEXT("Null OIDSetSSIDFinishedEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

	priv.hWZCPreferListReadyEvent= CreateEvent(NULL, FALSE, FALSE,NULL);
	if (NULL == priv.hWZCPreferListReadyEvent)
	{
	  //RETAILMSG(1,(TEXT("Null WZCPreferListReadyEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

	priv.hGetMacAddrFinishedEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
	if(NULL == priv.hGetMacAddrFinishedEvent)
	{
	  //RETAILMSG(1,(TEXT("Null GetMacAddrFinishedEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}

#ifdef PARA_SIP_UNREGISTER_AND_IP_REALEASE_BEFORE_SYS_SHUTDOWN
	priv.hStartTurnOffCardEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
	if(NULL == priv.hStartTurnOffCardEvent)
	{
	  //RETAILMSG(1,(TEXT("Null StartTurnOffCardEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}
#endif

#ifdef PARA_WPA_1X
	priv.hRegNotifyWifiOK= CreateEvent(NULL, FALSE, FALSE,NULL);//zzh added for regnotifywifiok
	if (NULL == priv.hRegNotifyWifiOK)
	{
	  //RETAILMSG(1,(TEXT("Null hRegNotifyWifiOK EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}
#endif

	priv.hParaScanMutex=CreateMutex(NULL,FALSE,sParaScanMutex_Name);

#ifdef CONFIG_VERTICAL_HANDOFF
	priv.hBeaconRSSIUpdatedEvent= CreateEvent(NULL,FALSE,FALSE,NULL);
	if (NULL == priv.hBeaconRSSIUpdatedEvent)
	{
	  //RETAILMSG(1,(TEXT("Null BeaconRSSIUpdatedEvent EVENT \n")));
	  return NDIS_STATUS_FAILURE;
	}
#endif


	priv.hAutoRoamingThread = CreateThread(NULL,
	                                              0,
	                                              (LPTHREAD_START_ROUTINE)AutoRoamingThread,
	                                              Adapter,
	                                              0,
	                                              &threadID);
	if (NULL == priv.hAutoRoamingThread)
	{
	  //RETAILMSG(1,(TEXT("Null AutoRoaming Thread \n")));
	  return NDIS_STATUS_FAILURE;
	} 

	priv.hManualRoamingThread = CreateThread(NULL,
	                                              0,
	                                              (LPTHREAD_START_ROUTINE)ManualRoamingThread,
	                                              Adapter,
	                                              0,
	                                              &threadID);
	if (NULL == priv.hManualRoamingThread)
	{
	  //RETAILMSG(1,(TEXT("Null ManualRoaming Thread \n")));
	  return NDIS_STATUS_FAILURE;
	} 

	priv.hWlanSmartDetectionThread = CreateThread(NULL,
	                                              0,
	                                              (LPTHREAD_START_ROUTINE)WlanSmartDetectionThread,
	                                              Adapter,
	                                              0,
	                                              &threadID);
	if (NULL == priv.hWlanSmartDetectionThread)
	{
	  //RETAILMSG(1,(TEXT("Null WlanSmartDetection Thread \n")));
	  return NDIS_STATUS_FAILURE;
	} 

	priv.hWlanAllDetectionThread = CreateThread(NULL,
	                                              0,
	                                              (LPTHREAD_START_ROUTINE)WlanALLDetectionThread,
	                                              Adapter,
	                                              0,
	                                              &threadID);
	if (NULL == priv.hWlanAllDetectionThread)
	{
	  //RETAILMSG(1,(TEXT("Null WlanAllDetection Thread \n")));
	  return NDIS_STATUS_FAILURE;
	} 

#ifdef CONFIG_VERTICAL_HANDOFF
	priv.hBeaconRSSIListenThread = CreateThread(NULL,
	                                              0,
	                                              (LPTHREAD_START_ROUTINE)BeaconRSSIListenThread,
	                                              Adapter,
	                                              0,
	                                              &threadID);
	if (NULL == priv.hBeaconRSSIListenThread)
	{
	  //RETAILMSG(1,(TEXT("Null BeaconRSSIListenThread Thread \n")));
	  return NDIS_STATUS_FAILURE;
	}
#endif

	// Initialize the timer for auto-roaming
	NdisMInitializeTimer(
		&priv.AutoRoamingTimer,
		Adapter->MrvDrvAdapterHdl,
		(PNDIS_TIMER_FUNCTION) AutoRoamingTimerFunction,
		(PVOID)Adapter
	);
	
	priv.bAutoRoamingTimerIsSet= FALSE;

	// Initialize the timer for data busy retry-roaming 
	NdisMInitializeTimer(
		&priv.DataBusyRetryRoamingTimer,
		Adapter->MrvDrvAdapterHdl,
		(PNDIS_TIMER_FUNCTION) DataBusyRetryRoamingTimerFunction,
		(PVOID)Adapter
	);
	priv.bDataBusyRetryRoamingTimerIsSet= FALSE;

	// Initialize the timer for link lost check 
	NdisMInitializeTimer(
		&priv.LinkLostCheckTimer,
		Adapter->MrvDrvAdapterHdl,
		(PNDIS_TIMER_FUNCTION) LinkLostCheckTimerFunction,
		(PVOID)Adapter
	);
	priv.bLinkLostCheckTimerIsSet= FALSE;	

#ifdef CONFIG_VERTICAL_HANDOFF
	// Initialize the timer for update beacon's rssi 
	NdisMInitializeTimer(
		&priv.GetBeaconRSSITimer,
		Adapter->MrvDrvAdapterHdl,
		(PNDIS_TIMER_FUNCTION) GetBeaconRSSITimerFunction,
		(PVOID)Adapter
	);
	priv.bGetBeaconRSSITimerIsSet= FALSE;
#endif

	RMM_Init(0);
	//Initiate roaming policy to PARAGON's default policy
	priv.RoamingPolicy = BEST_RSSI_GIVEN_PROFILES;

	//Initiate smart scan default channel list
	InitAllProfileChanList(&priv);
	
#ifdef DEBUG_PARA_ROAMING_ONLY//construct test profile only for roaming module
	priv.ProfileAllList.CurrentProfileIndex = 0;
	priv.ProfileAllList.PreviousProfileIndex = 0;
	
	priv.ProfileAllList.ProfilesNumber = 2;
	
	priv.ProfileAllList.Profiles[0].CurrentUsed = 0;
	priv.ProfileAllList.Profiles[0].PrivacyMode = PRIVACY_NONE;
	strcpy(priv.ProfileAllList.Profiles[0].Ssid.Ssid,"QA_Zhaox");
	priv.ProfileAllList.Profiles[0].Ssid.SsidLength = strlen(priv.ProfileAllList.Profiles[0].Ssid.Ssid);

	priv.ProfileAllList.Profiles[1].CurrentUsed = 0;
	priv.ProfileAllList.Profiles[1].PrivacyMode = PRIVACY_NONE;
	strcpy(priv.ProfileAllList.Profiles[1].Ssid.Ssid,"Jin Guang");
	priv.ProfileAllList.Profiles[1].Ssid.SsidLength = strlen(priv.ProfileAllList.Profiles[1].Ssid.Ssid);	
#endif

#ifdef CONFIG_VERTICAL_HANDOFF
	priv.VerticalHandoffCfg.RoveIn_RSSIThreshold = PARA_RSSI_ROVE_IN_INIT_THRESHOLD;
	priv.VerticalHandoffCfg.RoveOut_RSSIThreshold = PARA_RSSI_ROVE_OUT_INIT_THRESHOLD;
	priv.iAutoRoamingTimeout = ROAMING_LINKLOST_TIMEOUT;
#endif
	priv.iLinkLostCheckTimeout = MULTIPLE_LINK_LOST_EVENTS*MAX_MISSED_BEACONS *100;//default beacon period = 100 ms
	priv.iRxDataCount = 0;

	return NDIS_STATUS_SUCCESS;
	
}
void InitParaPrivAdapterFlags(PRIVATE_PARAROAMING_ADAPTER *priv)
{

	priv->bManualRoamingInProcess = FALSE;
	priv->bAutoRoamingInProcess = FALSE;
	priv->bWlanSmartDetectionInProcess = FALSE;
	priv->bWlanAllDetectionInProcess = FALSE;
	priv->bFastAutoRoaming = FALSE;
	priv->bHandoffViaBSSID = FALSE;
	priv->bAuthenticated = FALSE;
	priv->bStopRoaming = FALSE;
	priv->bProfileSetWiFiConnected = FALSE;
	priv->bUpdateCurrentProfileChanList = FALSE;
	priv->bSmartScan = FALSE;
	priv->bOID_BSSID_LIST_SCAN = FALSE;
	priv->bOID_SET_SSID = FALSE;
	priv->bBootRoamingByPRM = FALSE;
	priv->bFindSameAPInFastRoaming = FALSE;
	priv->bGetMacAddr = FALSE;
	priv->bProcessedHandOff = FALSE;
	//priv->bRebootCardInProcess = FALSE;//Should NOT clear it when reboot WLAN card! 
#ifdef CONFIG_VERTICAL_HANDOFF
	//priv->bVerticalHandoffEnabled = FALSE;//Should NOT clear it when reboot WLAN card!
	priv->bBeaconRSSIListenInProcess = FALSE;
	priv->bWiFiGood = FALSE;
#endif
}


void FreeParaPrivAdapterObject()
{
	BOOLEAN		timerStatus;
	
	//Stop the auto-roaming timer
	if (priv.bAutoRoamingTimerIsSet)
	{   
		NdisMCancelTimer(&priv.AutoRoamingTimer, &timerStatus);
		priv.bAutoRoamingTimerIsSet = FALSE;
	}

	//Stop the data busy retry-roaming timer
	if (priv.bDataBusyRetryRoamingTimerIsSet)
	{   
		NdisMCancelTimer(&priv.DataBusyRetryRoamingTimer, &timerStatus);
		priv.bDataBusyRetryRoamingTimerIsSet = FALSE;
	}

	//Stop the link lost check timer
	if (priv.bLinkLostCheckTimerIsSet)
	{   
		NdisMCancelTimer(&priv.LinkLostCheckTimer, &timerStatus);
		priv.bLinkLostCheckTimerIsSet= FALSE;
	}	
	
#ifdef CONFIG_VERTICAL_HANDOFF
	//Stop the get beacon's rssi periodic timer
	if(priv.bGetBeaconRSSITimerIsSet)
	{
		NdisMCancelTimer(&priv.GetBeaconRSSITimer, &timerStatus);
		priv.bGetBeaconRSSITimerIsSet = FALSE;
	}
#endif
	//RMM_Deinit(0);
	
	InitParaPrivAdapterFlags(&priv);
	priv.bBootRoamingByPRM = TRUE;
       priv.pAdapter->bIsScanInProgress = FALSE;
       priv.pAdapter->bIsAssociateInProgress = FALSE; 

	//restore PARAGON's default roaming policy
	priv.RoamingPolicy = BEST_RSSI_GIVEN_PROFILES;
	
	priv.RSSITriggerCounter = 0;
	priv.RSSIAverage = 0;	
	priv.iRxDataCount = 0;
}
void rmm_CleanBlackBssidList(PMRVDRV_ADAPTER adapter)
{
    memset(adapter->BlackBSSIDList, 0, sizeof(adapter->BlackBSSIDList));
    adapter->BlackBSSIDListCursor = 0;    
    adapter->ProfileListCursor = 0;
}

int rmm_CheckBlackBSSIDList(PMRVDRV_ADAPTER adapter,NDIS_WLAN_BSSID_EX PSBSSIDList, NDIS_802_11_SSID HandOffSSID)
{
    int i = 0;
    /*
     * If it exist, add the count
     */
    for (i = 0; i < MRVDRV_MAX_BSSID_LIST; i++)
    {
        if(memcmp(adapter->BlackBSSIDList[i].MacAddress, PSBSSIDList.MacAddress, 6) == 0 &&
            memcmp(&adapter->BlackBSSIDList[i].HandOffSSID,&HandOffSSID, sizeof(NDIS_802_11_SSID)) == 0)
        {
            if(adapter->BlackBSSIDList[i].fail_time >= 3)
            {
                return TRUE;
            }
            else
                return FALSE;
        }
    }
    return FALSE;
}
void rmm_AddBlackBSSIDList(PMRVDRV_ADAPTER adapter,NDIS_WLAN_BSSID_EX PSBSSIDList, NDIS_802_11_SSID HandOffSSID)
{
    int i = 0;
    /*
     * If it exist, add the count
     */
    for (i = 0; i < MRVDRV_MAX_BSSID_LIST; i++)
    {
        if(memcmp(adapter->BlackBSSIDList[i].MacAddress, PSBSSIDList.MacAddress, 6) == 0 &&
            memcmp(&adapter->BlackBSSIDList[i].HandOffSSID,&HandOffSSID, sizeof(NDIS_802_11_SSID)) == 0)
        {
            adapter->BlackBSSIDList[i].fail_time++;
            return;
        }
    }
    /*
     * If it isn't exist, add the item
     */
    adapter->BlackBSSIDListCursor++;
    if(adapter->BlackBSSIDListCursor > (MRVDRV_MAX_BSSID_LIST -1))
    {
        adapter->BlackBSSIDListCursor = MRVDRV_MAX_BSSID_LIST -1;
    }
    i = adapter->BlackBSSIDListCursor - 1;
    memcpy(adapter->BlackBSSIDList[i].MacAddress, PSBSSIDList.MacAddress, 6);
    memset(&adapter->BlackBSSIDList[i].HandOffSSID,0, sizeof(NDIS_802_11_SSID));
    memcpy(&adapter->BlackBSSIDList[i].HandOffSSID,&HandOffSSID, sizeof(NDIS_802_11_SSID));
    adapter->BlackBSSIDList[i].fail_time = 1;
    return;
     
}
void AutoRoamingThread(PVOID pContext)
{
	DWORD         waitStatus,dwWifi;
	BOOLEAN		timerStatus;
	int 			iSearchRst;
	ULONG  		i;
	UCHAR		j,ucAttemptedProfileIdx;
	int 			iAutoRoamingCount = 0;
	

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?