pararoamingproc.c
来自「marvell8385 GSPI开发驱动」· C语言 代码 · 共 1,981 行 · 第 1/5 页
C
1,981 行
/*
* File : ParaRoamingProc.c
* Timer : 2006-03-07
* Creater : Stephen Zhang
*/
#include "ParaRoamingProc.h"
#include "exdat.h"
#include "logmain.h"
extern DWORD g_AssociationDuration;
#ifdef PARA_WPA_1X
#define HANDOFF_HAD_POSTED_LINK_UP 525
#endif
extern PRIVATE_PARAROAMING_ADAPTER priv;
const WCHAR sParaScanMutex_Name[]=TEXT("PARA_SCAN_Mutex_9wd9je2gfi");
void wlan_RMMLinkLost(IN PMRVDRV_ADAPTER adapter)
{
#ifdef CONFIG_WLAN_PMU
if (adapter->PSMode == Ndis802_11PowerModeMAX_PSP)
{
wlan_PMURoamingExitSleep();
}
#endif
adapter->MediaConnectStatus = NdisMediaStateDisconnected;
/*Fix the bug 2779/3151 by Stephen Zhang on 2007-06-25<<<<<<<<<*/
//if((!priv.bAutoRoamingInProcess) && (!priv.bManualRoamingInProcess))
/*Fix the bug 2779/3151 by Stephen Zhang on 2007-06-25>>>>>>>>>*/
{
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("Enter wlan_RMMLinkLost!!!!\n")));
ParaPrintFile("\nEnter wlan_RMMLinkLost and Wake up auto-roaming!!!!\n");
RETAILMSG(1,(TEXT("Wake up auto-roaming!Caused by HWAC - Deauthenticated...\n")));
#endif
DBGPRINT(DBG_ALL,("Wake up auto-roaming!Caused by HWAC - Deauthenticated...\n"));
// when deauthenticated, the number of bssid should be 0
adapter->ulNumOfBSSIDs = 0;
adapter->ulPSNumOfBSSIDs = 0;
priv.bFastAutoRoaming = FALSE;
SetEvent(priv.hAutoRoamingEvent);
}
}
//Roaming Module Message handler
DWORD RMM_MsgProc(DWORD msg, DWORD p1, DWORD p2)
{
LPVOID pSharedMemStar = NULL;
UI_PROFILE_CONF* pProCfg = NULL;
ShareMemLayout* pBase = NULL;
unsigned int i = 0;
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("~~~~~~~Enter RMM_MsgProc~~~~~~~\n")));
#endif
DBGPRINT(DBG_ALL,("~~~~~~~Enter RMM_MsgProc~~~~~~~\n"));
switch(msg)
{
case RMM_SET_PROFILE:
pSharedMemStar = ED_CreateMemObject();
ASSERT(pSharedMemStar != NULL);
ED_HoldMemObject(INFINITE);
pBase = (ShareMemLayout*)pSharedMemStar;
pProCfg = (UI_PROFILE_CONF*)&pBase->g_ProfileMemBlockAddr[0];
if( pProCfg->profile_sum > WLAN_MAX_PROFILES || pProCfg->profile_sum < 0 )
{
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("~~~~~~~Proflies number is error!~~~~~~~\n")));
#endif
DBGPRINT(DBG_ALL,("~~~~~~~Proflies number is error!~~~~~~~\n"));
ED_ReleaseMemObject();
ED_CloseMemObject();
return 1;
}
priv.ProfileAllList.ProfilesNumber = pProCfg->profile_sum;
for(i = 0;i < priv.ProfileAllList.ProfilesNumber; i++)
{
memcpy(&priv.ProfileAllList.Profiles[i], (void*)(&pProCfg->profile_list[i].pApInfo), sizeof(WLAN_PROFILE));
#ifdef CONFIG_WLAN_DHCP_PROXY
memcpy(&priv.ProfileAllList.MacInfo[i], (void*)(&pProCfg->profile_list[i].pMacInfo), sizeof(UI_NDIS_MACIPInfo));
#endif
}
ED_ReleaseMemObject();
ED_CloseMemObject();
/*Don't send roaming cmd if WLAN card is off*/
if((p1==0)&&(wlan_PMUCardOnOffStatus() == 1))
{
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("Wakeup Manual Roaming Thread to set WiFi profile!\n")));
#endif
DBGPRINT(DBG_ALL,("Wakeup Manual Roaming Thread to set WiFi profile!\n"));
SetEvent(priv.hManualRoamingEvent);
}
break;
case RMM_WZC_PREFERLIST_READY:
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("Wakeup All Scan Thread to continue!\n")));
#endif
DBGPRINT(DBG_ALL,("Wakeup All Scan Thread to continue!\n"));
SetEvent(priv.hWZCPreferListReadyEvent);
break;
case RMM_BOOT_ROAMING_BY_PRM:
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("PRM boot up to set profile!\n")));
#endif
DBGPRINT(DBG_ALL,("PRM boot up to set profile!\n"));
priv.bBootRoamingByPRM = TRUE;
break;
case RMM_ADD_PRELIST_SUCCESS:
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("PRM Add prelist successful!\n")));
#endif
DBGPRINT(DBG_ALL,("PRM Add prelist successful!\n"));
priv.bAddedPrelistByPRM = RMM_ADD_PREFERLIST_SUCCESS;
break;
case RMM_ENABLE_GET_VIRTUAL_AP_LIST:
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("PRM BEFORE Add prelist,ENABLE GET VIRTUAL SCAN LIST!\n")));
#endif
DBGPRINT(DBG_ALL,("PRM BEFORE Add prelist,ENABLE GET VIRTUAL SCAN LIST!\n"));
priv.bAddedPrelistByPRM = RMM_ENABLE_GET_VIRTUAL_SCAN_LIST;
break;
#ifdef PARA_WPA_1X
case RMM_REG_NOTIFY_WIFI_STATE_CHANGED:
if(p1==0&&p2==0)
SendNotifyToRoaming_wx(LINK_SUCCESS_FROM_REGISTRY_WX,0,0,6);
break;
#endif
case RMM_ADD_PRELIST_FAILED:
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("PRM Add prelist failed!\n")));
#endif
priv.bAddedPrelistByPRM = RMM_ADD_PREFERLIST_FAILED;
break;
case RMM_GET_MAC:
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("RMM_GET_MAC......\n")));
#endif
/*
p1 = priv.MacAddr[0];
p1 |= priv.MacAddr[1]<<8;
p1 |= priv.MacAddr[2]<<16;
p1 |= priv.MacAddr[3]<<24;
p2 = priv.MacAddr[4];
p2 |= priv.MacAddr[5]<<8;
*/
p1 = 0;
p2 = 0;
memcpy(&p1,&priv.MacAddr[0],sizeof(DWORD));
memcpy(&p2,&priv.MacAddr[4],sizeof(WORD));
ED_PostMessage(EXDATNAME_LIC, LIC_INF_MAC,p1, p2);
break;
#ifdef PARA_SIP_UNREGISTER_AND_IP_REALEASE_BEFORE_SYS_SHUTDOWN
/*Erase the case,but set priv.bSysShutDown by REG "Software\\paragon\\SysPower" instead.
*/
#if 0
case RMM_SYS_SHUTDOWN:
priv.bSysShutDown = TRUE;
break;
#endif
case RMM_MSG_POWEROFF_DHCPRELEASE:
SetEvent(priv.hStartTurnOffCardEvent);
break;
#endif
#ifdef CONFIG_VERTICAL_HANDOFF
#if 0 //Erase RMM_MSG_ROVEOUT_ROVEIN and RMM_MSG_ROAMINGTIMER by Stephen Zhang on 2007-03-30
case RMM_MSG_ROVEOUT_ROVEIN:
//#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("RMM: UI Set ROVEOUT = %d,ROVEIN = %d\n"),p1,p2));
//#endif
priv.VerticalHandoffCfg.RoveOut_RSSIThreshold = (int)p1;
priv.VerticalHandoffCfg.RoveIn_RSSIThreshold = (int)p2;
break;
case RMM_MSG_ROAMINGTIMER:
//#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("RMM: UI Set AutoRoamingTimeout = %d\n"),p1));
//#endif
priv.iAutoRoamingTimeout = (int)p1;
break;
#endif
//Add RMM_MSG_VERTICAL_HANDOFF_MODIFY by Stephen Zhang on 2007-03-30
case RMM_MSG_VERTICAL_HANDOFF_MODIFY:
{
TCHAR szBuf[MAX_PATH] = {0};
int temp = 0;
/*Read PARA_REG_AUTO_HANDOFF enable or not?*/
if(GetRegStr(TEXT("Software\\paragon\\phoneset\\NetSwitch"), _T("flag"), szBuf) && (_tcscmp(szBuf, _T("1")) == 0))
{//Need modify the setted value
memset(szBuf,0,MAX_PATH*sizeof(TCHAR));
GetRegStr(TEXT("Software\\paragon\\phoneset\\NetSwitch\\roveout"), _T("Roveout"), szBuf);
temp = _wtoi(szBuf);
if (temp == 0)
{//Need restore the default value
priv.VerticalHandoffCfg.RoveOut_RSSIThreshold = PARA_RSSI_ROVE_OUT_INIT_THRESHOLD;
}
else
{
priv.VerticalHandoffCfg.RoveOut_RSSIThreshold = temp;
}
memset(szBuf,0,MAX_PATH*sizeof(TCHAR));
GetRegStr(TEXT("Software\\paragon\\phoneset\\NetSwitch\\roveout"), _T("Rovein"), szBuf);
temp = _wtoi(szBuf);
if (temp == 0)
{//Need restore the default value
priv.VerticalHandoffCfg.RoveIn_RSSIThreshold = PARA_RSSI_ROVE_IN_INIT_THRESHOLD;
}
else
{
priv.VerticalHandoffCfg.RoveIn_RSSIThreshold = temp;
}
memset(szBuf,0,MAX_PATH*sizeof(TCHAR));
GetRegStr(TEXT("Software\\paragon\\phoneset\\NetSwitch\\roamingtimer"), _T("RoamingTimer"), szBuf);
temp = _wtoi(szBuf);
if (temp == 0)
{//Need restore the default value
priv.iAutoRoamingTimeout = ROAMING_LINKLOST_TIMEOUT;
}
else
{
priv.iAutoRoamingTimeout = temp;
}
}
else
{//Need restore the default value
priv.VerticalHandoffCfg.RoveOut_RSSIThreshold = PARA_RSSI_ROVE_OUT_INIT_THRESHOLD;
priv.VerticalHandoffCfg.RoveIn_RSSIThreshold = PARA_RSSI_ROVE_IN_INIT_THRESHOLD;
priv.iAutoRoamingTimeout = ROAMING_LINKLOST_TIMEOUT;
}
}
break;
case RMM_MSG_ENABLE_VERTICAL_HANDOFF:
if(p1==1)
{
priv.bVerticalHandoffEnabled = TRUE;
}
else
{
priv.bVerticalHandoffEnabled = FALSE;
}
break;
#endif
default:
break;
}
return 1;
}
#if 0
NDIS_MINIPORT_TIMER g_stRMMNdisMIndicateStatusTimer;
NDIS_MINIPORT_TIMER g_stRMMRetryPRMLinkupStatusTimer;
VOID wlan_RMMNdisMIndicateStatusTimerFunc(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
PMRVDRV_ADAPTER Adapter = FunctionContext;
RETAILMSG(1,(L"\n\nRMM TRACE:" L"Timeout, Ndis indicate connect status\n"));
DBGPRINT(DBG_ALL,("\n\nRMM TRACE: Timeout, Ndis indicate connect status\n"));
// indicate the NDIS the media is connected
NdisMIndicateStatus(Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_MEDIA_CONNECT,
(PVOID)NULL,
0);
NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
return;
}
void wlan_RMMSetNdisMIndicateStatusTimer()
{
NdisMSetTimer(&g_stRMMNdisMIndicateStatusTimer, 50);
}
VOID wlan_RMMRetryPRMLinkupStatusTimerFunc(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
PMRVDRV_ADAPTER Adapter = FunctionContext;
RETAILMSG(1,(L"\n\nRMM TRACE:" L"Timeout, retry PRM linkup status!\n"));
if(Adapter->MediaConnectStatus == NdisMediaStateConnected)
{
ED_PostMessage(TEXT("PRM"), PRM_REBIND_ADAPTER, 1, priv.ProfileAllList.CurrentProfileIndex);
}
return;
}
void wlan_RMMSetRetryPRMLinkupStatusTimer()
{
NdisMSetTimer(&g_stRMMRetryPRMLinkupStatusTimer, 10000);
}
void wlan_RMMCancelRetryPRMLinkupStatusTimer()
{
BOOLEAN timerStatus;
NdisMCancelTimer(&g_stRMMRetryPRMLinkupStatusTimer,&timerStatus);
}
#endif
DWORD RMM_Init(DWORD dwData)
{
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("Enter RMM_Init!...\n")));
#endif
DBGPRINT(DBG_ALL,("Enter RMM_Init!...\n"));
#if 0
NdisMInitializeTimer(
&g_stRMMNdisMIndicateStatusTimer,
priv.pAdapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_RMMNdisMIndicateStatusTimerFunc,
(PVOID) priv.pAdapter
);
NdisMInitializeTimer(
&g_stRMMRetryPRMLinkupStatusTimer,
priv.pAdapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_RMMRetryPRMLinkupStatusTimerFunc,
(PVOID) priv.pAdapter
);
#endif
/* PShareMemLayout pSML;
if(NULL==(g_pMemBuf=ED_CreateMemObject()))
{
return 0;
}
pSML=(PShareMemLayout)g_pMemBuf;
ED_HoldMemObject(INFINITE);
LoadSIPXMLToMemory(TEXT("\\profile\\sipconfig.xml"),pSML->g_SipMemBlockAddr);
LoadProfileXMLToMemory(TEXT("\\profile\\profileconfig.xml"),pSML->g_ProfileMemBlockAddr, pSML->g_SipMemBlockAddr);
ED_ReleaseMemObject();
*/
//ED_CreateMessageObject();
if(!ED_RegisterMessageProc(EXDATNAME_RMM,RMM_MsgProc))
return 0;
return 1;
}
BOOLEAN RMM_Deinit(DWORD dwData)
{
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("Enter RMM_Deinit!...\n")));
#endif
DBGPRINT(DBG_ALL,("Enter RMM_Deinit!...\n"));
ED_DERegisterMessageProc(TEXT("RMM"));
//ED_CloseMessageObject();
return 1;
}
NDIS_STATUS InitParaPrivAdapterObject(PMRVDRV_ADAPTER Adapter)
{
DWORD threadID;
// Zero out the parar-roaming related private adapter object space
NdisZeroMemory(&priv, sizeof(PRIVATE_PARAROAMING_ADAPTER));
priv.pAdapter= Adapter;
InitializeCriticalSection(&priv.AutoRoamingCriticalSection);
InitializeCriticalSection(&priv.ManualRoamingCriticalSection);
InitializeCriticalSection(&priv.WlanSmartDetectionCriticalSection);
InitializeCriticalSection(&priv.WlanAllDetectionCriticalSection);
//InitializeCriticalSection(&priv.WPA1XCriticalSection);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?