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 + -
显示快捷键?