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

📄 action.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ************************************************************************* * Ralink Tech Inc. * 4F, No. 2 Technology 5th Rd. * Science-based Industrial Park * Hsin-chu, 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:    assoc.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)PeerDLSAction);	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_BA_CATE, (STATE_MACHINE_FUNC)PeerBAAction);	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE, (STATE_MACHINE_FUNC)ReservedAction);	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_BSSTRANS_CATE, (STATE_MACHINE_FUNC)ReservedAction);	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);	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);}VOID 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		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];#ifdef BIG_ENDIAN		*(USHORT *)(&Frame.BaParm) = SWAP16(*(USHORT *)(&Frame.BaParm));		Frame.TimeOutValue = SWAP16(Frame.TimeOutValue);		Frame.BaStartSeq.word = SWAP16(Frame.BaStartSeq.word);#endif		MakeOutgoingFrame(pOutBuffer,		   &FrameLen,		              sizeof(FRAME_ADDBA_REQ), &Frame,		              END_OF_ARGS);		MiniportMMRequest(pAd, QID_AC_BE, 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));		if(MlmeDelBAReqSanity(pAd, Elem->Msg, Elem->MsgLen)) 	{		NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory		if(NStatus != NDIS_STATUS_SUCCESS) 		{			DBGPRINT(RT_DEBUG_TRACE,("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_TRACE,("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		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		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#ifdef BIG_ENDIAN		*(USHORT *)(&Frame.DelbaParm) = SWAP16(*(USHORT *)(&Frame.DelbaParm));		Frame.ReasonCode = SWAP16(Frame.ReasonCode);#endif		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. \n"));    	}}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 PeerSpectrumAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {	UCHAR	Action = Elem->Msg[LENGTH_802_11+1];		switch(Action)	{		case SPEC_CHANNEL_SWITCH:		{//			FRAME_SPETRUM_CS	FrameCS;			break;		}	}// unknown category field value received.// return to source with most significant bit set to 1 if received packet's MSB = 0}VOID PeerQOSAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {}VOID PeerDLSAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {}VOID PeerBAAction(

⌨️ 快捷键说明

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