⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 action.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
/* ************************************************************************* * Ralink Tech Inc. * 5F., No.36, Taiyuan St., Jhubei City, * Hsinchu County 302, * Taiwan, R.O.C. * * (c) Copyright 2002-2007, Ralink Technology, Inc. * * This program is free software; you can redistribute it and/or modify  *  * it under the terms of the GNU General Public License as published by  *  * the Free Software Foundation; either version 2 of the License, or     *  * (at your option) any later version.                                   *  *                                                                       *  * This program is distributed in the hope that it will be useful,       *  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *  * GNU General Public License for more details.                          *  *                                                                       *  * You should have received a copy of the GNU General Public License     *  * along with this program; if not, write to the                         *  * Free Software Foundation, Inc.,                                       *  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *  *                                                                       *  *************************************************************************    Module Name:	action.c     Abstract:    Handle association related requests either from WSTA or from local MLME     Revision History:    Who         When          What    --------    ----------    ----------------------------------------------	Jan Lee		2006	  	created for rt2860 */#include "rt_config.h"#include "action.h"static VOID ReservedAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem);/*      ==========================================================================    Description:         association state machine init, including state transition and timer init    Parameters:         S - pointer to the association state machine    Note:        The state machine looks like the following                                             ASSOC_IDLE                     MT2_MLME_DISASSOC_REQ    mlme_disassoc_req_action         MT2_PEER_DISASSOC_REQ    peer_disassoc_action             MT2_PEER_ASSOC_REQ       drop                             MT2_PEER_REASSOC_REQ     drop                             MT2_CLS3ERR              cls3err_action               ========================================================================== */VOID ActionStateMachineInit(    IN	PRTMP_ADAPTER	pAd,     IN  STATE_MACHINE *S,     OUT STATE_MACHINE_FUNC Trans[]) {	StateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, MAX_ACT_STATE, MAX_ACT_MSG, (STATE_MACHINE_FUNC)Drop, ACT_IDLE, ACT_MACHINE_BASE);	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_SPECTRUM_CATE, (STATE_MACHINE_FUNC)PeerSpectrumAction);	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_QOS_CATE, (STATE_MACHINE_FUNC)PeerQOSAction);	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE, (STATE_MACHINE_FUNC)ReservedAction);#ifdef QOS_DLS_SUPPORT		StateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE, (STATE_MACHINE_FUNC)PeerDLSAction);#endif // QOS_DLS_SUPPORT //#ifdef DOT11_N_SUPPORT	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_BA_CATE, (STATE_MACHINE_FUNC)PeerBAAction);	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_HT_CATE, (STATE_MACHINE_FUNC)PeerHTAction);	StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ADD_BA_CATE, (STATE_MACHINE_FUNC)MlmeADDBAAction);	StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ORI_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);	StateMachineSetAction(S, ACT_IDLE, MT2_MLME_REC_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);#endif // DOT11_N_SUPPORT //	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_PUBLIC_CATE, (STATE_MACHINE_FUNC)PeerPublicAction);	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE, (STATE_MACHINE_FUNC)PeerRMAction);		StateMachineSetAction(S, ACT_IDLE, MT2_MLME_QOS_CATE, (STATE_MACHINE_FUNC)MlmeQOSAction);	StateMachineSetAction(S, ACT_IDLE, MT2_MLME_DLS_CATE, (STATE_MACHINE_FUNC)MlmeDLSAction);	StateMachineSetAction(S, ACT_IDLE, MT2_ACT_INVALID, (STATE_MACHINE_FUNC)MlmeInvalidAction);}#ifdef DOT11_N_SUPPORTVOID MlmeADDBAAction(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {	MLME_ADDBA_REQ_STRUCT *pInfo;	UCHAR           Addr[6];	PUCHAR         pOutBuffer = NULL;	NDIS_STATUS     NStatus;	ULONG		Idx;	FRAME_ADDBA_REQ  Frame;	ULONG		FrameLen;	BA_ORI_ENTRY			*pBAEntry = NULL;	pInfo = (MLME_ADDBA_REQ_STRUCT *)Elem->Msg;	NdisZeroMemory(&Frame, sizeof(FRAME_ADDBA_REQ));		if(MlmeAddBAReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr)) 	{		NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory		if(NStatus != NDIS_STATUS_SUCCESS) 		{			DBGPRINT(RT_DEBUG_TRACE,("BA - MlmeADDBAAction() allocate memory failed \n"));			return;		}		// 1. find entry		Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];		if (Idx == 0)		{			MlmeFreeMemory(pAd, pOutBuffer);			DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() can't find BAOriEntry \n"));			return;		} 		else		{			pBAEntry =&pAd->BATable.BAOriEntry[Idx];		}		#ifdef CONFIG_STA_SUPPORT		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		{			if (ADHOC_ON(pAd))				ActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);			else#ifdef QOS_DLS_SUPPORT			if (pAd->MacTab.Content[pInfo->Wcid].ValidAsDls)				ActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);			else#endif // QOS_DLS_SUPPORT //			ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pInfo->pAddr);		}#endif // CONFIG_STA_SUPPORT // 		Frame.Category = CATEGORY_BA;		Frame.Action = ADDBA_REQ;		Frame.BaParm.AMSDUSupported = 0;		Frame.BaParm.BAPolicy = IMMED_BA;		Frame.BaParm.TID = pInfo->TID;		Frame.BaParm.BufSize = pInfo->BaBufSize;		Frame.Token = pInfo->Token;		Frame.TimeOutValue = pInfo->TimeOutValue;		Frame.BaStartSeq.field.FragNum = 0;		Frame.BaStartSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID];		*(USHORT *)(&Frame.BaParm) = cpu2le16(*(USHORT *)(&Frame.BaParm));		Frame.TimeOutValue = cpu2le16(Frame.TimeOutValue);		Frame.BaStartSeq.word = cpu2le16(Frame.BaStartSeq.word);		MakeOutgoingFrame(pOutBuffer,		   &FrameLen,		              sizeof(FRAME_ADDBA_REQ), &Frame,		              END_OF_ARGS);		MiniportMMRequest(pAd, (MGMT_USE_QUEUE_FLAG | MapUserPriorityToAccessCategory[pInfo->TID]), pOutBuffer, FrameLen);		MlmeFreeMemory(pAd, pOutBuffer);				DBGPRINT(RT_DEBUG_TRACE, ("BA - Send ADDBA request. StartSeq = %x,  FrameLen = %ld. BufSize = %d\n", Frame.BaStartSeq.field.StartSeq, FrameLen, Frame.BaParm.BufSize));    }}/*    ==========================================================================    Description:        send DELBA and delete BaEntry if any    Parametrs:        Elem - MLME message MLME_DELBA_REQ_STRUCT        	IRQL = DISPATCH_LEVEL    ========================================================================== */VOID MlmeDELBAAction(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {	MLME_DELBA_REQ_STRUCT *pInfo;	PUCHAR         pOutBuffer = NULL;	PUCHAR		   pOutBuffer2 = NULL;	NDIS_STATUS     NStatus;	ULONG		Idx;	FRAME_DELBA_REQ  Frame;	ULONG		FrameLen;	FRAME_BAR	FrameBar;		pInfo = (MLME_DELBA_REQ_STRUCT *)Elem->Msg;		// must send back DELBA 	NdisZeroMemory(&Frame, sizeof(FRAME_DELBA_REQ));	DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeDELBAAction(), Initiator(%d) \n", pInfo->Initiator));		if(MlmeDelBAReqSanity(pAd, Elem->Msg, Elem->MsgLen)) 	{		NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory		if(NStatus != NDIS_STATUS_SUCCESS) 		{			DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeDELBAAction() allocate memory failed 1. \n"));			return;		}		NStatus = MlmeAllocateMemory(pAd, &pOutBuffer2);  //Get an unused nonpaged memory		if(NStatus != NDIS_STATUS_SUCCESS) 		{			MlmeFreeMemory(pAd, pOutBuffer);			DBGPRINT(RT_DEBUG_ERROR, ("BA - MlmeDELBAAction() allocate memory failed 2. \n"));			return;		}		// SEND BAR (Send BAR to refresh peer reordering buffer.)		Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];#ifdef CONFIG_STA_SUPPORT		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)			BarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress);#endif // CONFIG_STA_SUPPORT //		FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL funciton.		FrameBar.StartingSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID]; // make sure sequence not clear in DEL funciton.		FrameBar.BarControl.TID = pInfo->TID; // make sure sequence not clear in DEL funciton.		FrameBar.BarControl.ACKPolicy = IMMED_BA; // make sure sequence not clear in DEL funciton.		FrameBar.BarControl.Compressed = 1; // make sure sequence not clear in DEL funciton.		FrameBar.BarControl.MTID = 0; // make sure sequence not clear in DEL funciton.		MakeOutgoingFrame(pOutBuffer2,				&FrameLen,					  sizeof(FRAME_BAR),	  &FrameBar,					  END_OF_ARGS);		MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen);		MlmeFreeMemory(pAd, pOutBuffer2);		DBGPRINT(RT_DEBUG_TRACE,("BA - MlmeDELBAAction() . Send BAR to refresh peer reordering buffer \n"));		// SEND DELBA FRAME		FrameLen = 0;#ifdef CONFIG_STA_SUPPORT		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		{			if (ADHOC_ON(pAd))				ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);			else#ifdef QOS_DLS_SUPPORT			if (pAd->MacTab.Content[pInfo->Wcid].ValidAsDls)				ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);			else#endif // QOS_DLS_SUPPORT //			ActHeaderInit(pAd, &Frame.Hdr,  pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[pInfo->Wcid].Addr);		}#endif // CONFIG_STA_SUPPORT //		Frame.Category = CATEGORY_BA;		Frame.Action = DELBA;		Frame.DelbaParm.Initiator = pInfo->Initiator;		Frame.DelbaParm.TID = pInfo->TID;		Frame.ReasonCode = 39; // Time Out		*(USHORT *)(&Frame.DelbaParm) = cpu2le16(*(USHORT *)(&Frame.DelbaParm));		Frame.ReasonCode = cpu2le16(Frame.ReasonCode);				MakeOutgoingFrame(pOutBuffer,               &FrameLen,		              sizeof(FRAME_DELBA_REQ),    &Frame,		              END_OF_ARGS);		MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);		MlmeFreeMemory(pAd, pOutBuffer);		DBGPRINT(RT_DEBUG_TRACE, ("BA - MlmeDELBAAction() . 3 DELBA sent. Initiator(%d)\n", pInfo->Initiator));    	}}#endif // DOT11_N_SUPPORT //VOID MlmeQOSAction(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {}VOID MlmeDLSAction(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {}VOID MlmeInvalidAction(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {	//PUCHAR		   pOutBuffer = NULL;	//Return the receiving frame except the MSB of category filed set to 1.  7.3.1.11}VOID PeerQOSAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {}#ifdef QOS_DLS_SUPPORTVOID PeerDLSAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {	UCHAR	Action = Elem->Msg[LENGTH_802_11+1];	switch(Action)	{		case ACTION_DLS_REQUEST:#ifdef CONFIG_STA_SUPPORT			IF_DEV_CONFIG_OPMODE_ON_STA(pAd)			PeerDlsReqAction(pAd, Elem);#endif // CONFIG_STA_SUPPORT //			break;		case ACTION_DLS_RESPONSE:#ifdef CONFIG_STA_SUPPORT			IF_DEV_CONFIG_OPMODE_ON_STA(pAd)			PeerDlsRspAction(pAd, Elem);#endif // CONFIG_STA_SUPPORT //			break;		case ACTION_DLS_TEARDOWN:#ifdef CONFIG_STA_SUPPORT			IF_DEV_CONFIG_OPMODE_ON_STA(pAd)			PeerDlsTearDownAction(pAd, Elem);#endif // CONFIG_STA_SUPPORT //			break;	}}#endif // QOS_DLS_SUPPORT //#ifdef DOT11_N_SUPPORTVOID PeerBAAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {	UCHAR	Action = Elem->Msg[LENGTH_802_11+1];		switch(Action)	{		case ADDBA_REQ:			PeerAddBAReqAction(pAd,Elem);

⌨️ 快捷键说明

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