sta_ctrl.c

来自「Ralink RT61 SoftAP Driver source code. 」· C语言 代码 · 共 691 行 · 第 1/2 页

C
691
字号
    Description:
        APCLI MLME Auth Req timeout state machine procedure
    ==========================================================================
 */
VOID StaCtrlAuthReqTimeoutAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	MLME_AUTH_REQ_STRUCT AuthReq;

	DBGPRINT(RT_DEBUG_TRACE, "(%s) Auth Req Timeout.\n", __FUNCTION__);

	pAd->ApCliTab.ApCliEntry[ifIndex].AuthReqCnt++;

	if (pAd->ApCliTab.ApCliEntry[ifIndex].AuthReqCnt > 5)
	{
		*pCurrState = STA_CTRL_DISCONNECTED;
		NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
		NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
		pAd->ApCliTab.ApCliEntry[ifIndex].AuthReqCnt = 0;
		return;
	}

	// stay in same state.
	*pCurrState = STA_CTRL_AUTH;

	// retry Authentication.
	DBGPRINT(RT_DEBUG_TRACE, "(%s) Retry Auth Req.\n", __FUNCTION__);
	COPY_MAC_ADDR(AuthReq.Addr, pAd->ApCliTab.ApCliEntry[ifIndex].ApCliBssid);
	AuthReq.Alg = Ndis802_11AuthModeOpen;
	AuthReq.Timeout = AUTH_TIMEOUT;
	StaMlmeEnqueue(pAd, STA_AUTH_STATE_MACHINE, STA_MT2_MLME_AUTH_REQ,
		sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex);

	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME Auth2 Req timeout state machine procedure
    ==========================================================================
 */
VOID StaCtrlAuth2ReqTimeoutAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME ASSOC RSP state machine procedure
    ==========================================================================
 */
VOID StaCtrlAssocRspAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	STA_CTRL_MSG_STRUCT *Info = (STA_CTRL_MSG_STRUCT *)(Elem->Msg);
	USHORT Status = Info->Status;

	if(Status == MLME_SUCCESS)
	{
#ifdef RTL865X_SOC
		printk("(%s) apCliIf = %d, Receive Assoc Rsp Success.\n", __FUNCTION__, ifIndex);
#else
		DBGPRINT(RT_DEBUG_TRACE, "(%s) apCliIf = %d, Receive Assoc Rsp Success.\n", __FUNCTION__, ifIndex);
#endif

		*pCurrState = STA_CTRL_CONNECTED;

		// set the apcli interface be valid.
		pAd->ApCliTab.ApCliEntry[ifIndex].Valid = TRUE;
	} else
	{
		DBGPRINT(RT_DEBUG_TRACE, "(%s) apCliIf = %d, Receive Assoc Rsp Failure.\n", __FUNCTION__,  ifIndex);

		*pCurrState = STA_CTRL_DISCONNECTED;

		// set the apcli interface be valid.
		pAd->ApCliTab.ApCliEntry[ifIndex].Valid = FALSE;
	}

	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME DeASSOC RSP state machine procedure
    ==========================================================================
 */
VOID StaCtrlDeAssocRspAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	STA_CTRL_MSG_STRUCT *Info = (STA_CTRL_MSG_STRUCT *)(Elem->Msg);
	USHORT Status = Info->Status;

	if (Status == MLME_SUCCESS)
	{
		DBGPRINT(RT_DEBUG_TRACE, "(%s) Receive DeAssoc Rsp Success.\n", __FUNCTION__);
	} else
	{
		DBGPRINT(RT_DEBUG_TRACE, "(%s) Receive DeAssoc Rsp Failure.\n", __FUNCTION__);
	}

	if (pAd->ApCliTab.ApCliEntry[ifIndex].Valid)
		ApCliLinkDown(pAd, ifIndex);
	
	*pCurrState = STA_CTRL_DISCONNECTED;

	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME Assoc Req timeout state machine procedure
    ==========================================================================
 */
VOID StaCtrlAssocReqTimeoutAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	MLME_ASSOC_REQ_STRUCT  AssocReq;

	DBGPRINT(RT_DEBUG_TRACE, "(%s) Assoc Req Timeout.\n", __FUNCTION__);

	// give up to retry authentication req after retry it 5 times.
	pAd->ApCliTab.ApCliEntry[ifIndex].AssocReqCnt++;
	if (pAd->ApCliTab.ApCliEntry[ifIndex].AssocReqCnt > 5)
	{
		*pCurrState = STA_CTRL_DISCONNECTED;
		NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
		NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
		pAd->ApCliTab.ApCliEntry[ifIndex].AuthReqCnt = 0;
		return;
		
	}

	// stay in same state.
	*pCurrState = STA_CTRL_ASSOC;

	// retry Association Req.
	DBGPRINT(RT_DEBUG_TRACE, "(%s) Retry Association Req.\n", __FUNCTION__);
	AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo,
		ASSOC_TIMEOUT, /*pAd->PortCfg.DefaultListenCount*/5);
	StaMlmeEnqueue(pAd, STA_ASSOC_STATE_MACHINE, STA_MT2_MLME_ASSOC_REQ, 
		sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex);

	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME Disconnect Rsp state machine procedure
    ==========================================================================
 */
VOID StaCtrlDisconnectReqAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	DBGPRINT(RT_DEBUG_TRACE, "(%s) MLME Request disconnect.\n", __FUNCTION__);

	if (pAd->ApCliTab.ApCliEntry[ifIndex].Valid)
		ApCliLinkDown(pAd, ifIndex);

	// set the apcli interface be invalid.
	pAd->ApCliTab.ApCliEntry[ifIndex].Valid = FALSE;

	// clear MlmeAux.Ssid and Bssid.
	NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
	pAd->MlmeAux.SsidLen = 0;
	NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
	pAd->MlmeAux.Rssi = 0;

	*pCurrState = STA_CTRL_DISCONNECTED;

	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME Peer DeAssoc Req state machine procedure
    ==========================================================================
 */
VOID StaCtrlPeerDeAssocReqAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	DBGPRINT(RT_DEBUG_TRACE, "(%s) Peer DeAssoc Req.\n", __FUNCTION__);

	if (pAd->ApCliTab.ApCliEntry[ifIndex].Valid)
		ApCliLinkDown(pAd, ifIndex);

	// set the apcli interface be invalid.
	pAd->ApCliTab.ApCliEntry[ifIndex].Valid = FALSE;

	// clear MlmeAux.Ssid and Bssid.
	NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
	pAd->MlmeAux.SsidLen = 0;
	NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
	pAd->MlmeAux.Rssi = 0;

	*pCurrState = STA_CTRL_DISCONNECTED;

	return;
}

/* 
    ==========================================================================
    Description:
        APCLI MLME Disconnect Req state machine procedure
    ==========================================================================
 */
VOID StaCtrlDeAssocAction(
	IN PRTMP_ADAPTER pAd, 
	IN MLME_QUEUE_ELEM *Elem,
	OUT PULONG pCurrState,
	IN USHORT ifIndex)
{
	MLME_DISASSOC_REQ_STRUCT DisassocReq;

	DBGPRINT(RT_DEBUG_TRACE, "(%s) MLME Request Disconnect.\n", __FUNCTION__);

	DisassocParmFill(pAd, &DisassocReq, pAd->MlmeAux.Bssid, REASON_DISASSOC_STA_LEAVING);
	StaMlmeEnqueue(pAd, STA_ASSOC_STATE_MACHINE, STA_MT2_MLME_DISASSOC_REQ,
		sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, ifIndex);

	if (pAd->ApCliTab.ApCliEntry[ifIndex].Valid)
		ApCliLinkDown(pAd, ifIndex);

	// set the apcli interface be invalid.
	pAd->ApCliTab.ApCliEntry[ifIndex].Valid = FALSE;

	// clear MlmeAux.Ssid and Bssid.
	NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
	pAd->MlmeAux.SsidLen = 0;
	NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
	pAd->MlmeAux.Rssi = 0;

	*pCurrState = STA_CTRL_DEASSOC;

	return;
}


/* 
    ==========================================================================
    Description:
        APCLI Interface Up.
    ==========================================================================
 */
VOID ApCliIfUp(
	IN PRTMP_ADAPTER pAd)
{
	UCHAR ifIndex;

	for(ifIndex = 0; ifIndex < MAX_APCLI_ENTRY; ifIndex++)
	{
		if ((pAd->ApCliTab.ApCliEntry[ifIndex].InterfaceReady == TRUE) 
			&& (pAd->ApCliTab.ApCliEntry[ifIndex].Enable == TRUE)
			&& (pAd->ApCliTab.ApCliEntry[ifIndex].Valid == FALSE))
		{
			DBGPRINT(RT_DEBUG_TRACE, "(%s) ApCli interface[%d] startup.\n", __FUNCTION__, ifIndex);
			StaMlmeEnqueue(pAd, STA_CTRL_STATE_MACHINE, STA_CTRL_JOIN_REQ, 0, NULL, ifIndex);
		}
	}

	return;
}


/* 
    ==========================================================================
    Description:
        APCLI Interface Down.
    ==========================================================================
 */
VOID ApCliIfDown(
	IN PRTMP_ADAPTER pAd)
{
	UCHAR ifIndex;

	for(ifIndex = 0; ifIndex < MAX_APCLI_ENTRY; ifIndex++)
	{
		if (!(pAd->ApCliTab.ApCliEntry[ifIndex].Enable))
		{
			DBGPRINT(RT_DEBUG_TRACE, "(%s) ApCli interface[%d] startdown.\n", __FUNCTION__, ifIndex);
			StaMlmeEnqueue(pAd, STA_CTRL_STATE_MACHINE, STA_CTRL_DISCONNECT_REQ, 0, NULL, ifIndex);
		}
	}

	return;
}



/* 
    ==========================================================================
    Description:
        APCLI Interface Monitor.
    ==========================================================================
 */
VOID ApCliIfMonitor(
	IN PRTMP_ADAPTER pAd)
{
	UCHAR index;

	for(index = 0; index < MAX_APCLI_ENTRY; index++)
	{
		if ((pAd->ApCliTab.ApCliEntry[index].Valid == TRUE)
			&& (pAd->ApCliTab.ApCliEntry[index].NumOfAvgRssiSample < 5))
		{
			DBGPRINT(RT_DEBUG_TRACE,"MlmePeriodicExec: no traffic and Beancon on ApCli%d, Probe-Response from root-AP.\n", index);
			DBGPRINT(RT_DEBUG_TRACE,"MlmePeriodicExec: Reconnect the Root-Ap again.\n");
			StaMlmeEnqueue(pAd, STA_CTRL_STATE_MACHINE, STA_CTRL_DISCONNECT_REQ, 0, NULL, index);
			MlmeHandler(pAd);
		}
		pAd->ApCliTab.ApCliEntry[index].NumOfAvgRssiSample = 0;
	}

	return;
}

⌨️ 快捷键说明

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