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