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

📄 ba_action.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
			   pBAEntry->LastIndSeq));		ba_refresh_reordering_mpdus(pAd, pBAEntry);		pBAEntry->LastIndSeqAtTimer = Now32;	}	else	if (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(REORDERING_PACKET_TIMEOUT)))		&& (pBAEntry->list.qlen > 0)	   )		{//		DBGPRINT(RT_DEBUG_OFF, ("timeout[%d] (%lx-%lx = %d > %d): %x, ", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer), //			   (int)((long) Now32 - (long)(pBAEntry->LastIndSeqAtTimer)), REORDERING_PACKET_TIMEOUT,//			   pBAEntry->LastIndSeq));    		//		// force LastIndSeq to shift to LastIndSeq+1    		//     		Sequence = (pBAEntry->LastIndSeq+1) & MAXSEQ;    		ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, Sequence);    		pBAEntry->LastIndSeqAtTimer = Now32;			pBAEntry->LastIndSeq = Sequence;    		//    		// indicate in-order mpdus    		//     		Sequence = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, Sequence);    		if (Sequence != RESET_RCV_SEQ)    		{    			pBAEntry->LastIndSeq = Sequence;    		}		DBGPRINT(RT_DEBUG_OFF, ("%x, flush one!\n", pBAEntry->LastIndSeq));	}}/*  * generate ADDBA request to  * set up BA agreement */VOID BAOriSessionSetUp(					  IN PRTMP_ADAPTER    pAd, 					  IN MAC_TABLE_ENTRY  *pEntry,					  IN UCHAR            TID,					  IN USHORT           TimeOut,					  IN ULONG            DelayTime,					  IN BOOLEAN          isForced){	//MLME_ADDBA_REQ_STRUCT	AddbaReq;	BA_ORI_ENTRY            *pBAEntry = NULL;	USHORT                  Idx;	BOOLEAN                 Cancelled;		if ((pAd->CommonCfg.BACapability.field.AutoBA != TRUE)  &&  (isForced == FALSE))		return;	// if this entry is limited to use legacy tx mode, it doesn't generate BA.  	if (RTMPStaFixedTxMode(pAd, pEntry) != FIXED_TXMODE_HT)		return;	if ((pEntry->BADeclineBitmap & (1<<TID)) && (isForced == FALSE))	{		// try again after 3 secs		DelayTime = 3000; //		DBGPRINT(RT_DEBUG_TRACE, ("DeCline BA from Peer\n"));//		return;	}		Idx = pEntry->BAOriWcidArray[TID];  	if (Idx == 0)	{		// allocate a BA session		pBAEntry = BATableAllocOriEntry(pAd, &Idx);     		if (pBAEntry == NULL)		{			DBGPRINT(RT_DEBUG_TRACE,("ADDBA - MlmeADDBAAction() allocate BA session failed \n"));			return;		}	}	else	{		pBAEntry =&pAd->BATable.BAOriEntry[Idx];	}	if (pBAEntry->ORI_BA_Status >= Originator_WaitRes)	{		return;	}	pEntry->BAOriWcidArray[TID] = Idx;	// Initialize BA session 	pBAEntry->ORI_BA_Status = Originator_WaitRes;       	pBAEntry->Wcid = pEntry->Aid;	pBAEntry->BAWinSize = pAd->CommonCfg.BACapability.field.RxBAWinLimit;   	pBAEntry->Sequence = BA_ORI_INIT_SEQ;	pBAEntry->Token = 1;	// (2008-01-21) Jan Lee recommends it - this token can't be 0	pBAEntry->TID = TID;	pBAEntry->TimeOutValue = TimeOut;   	pBAEntry->pAdapter = pAd;		if (!(pEntry->TXBAbitmap & (1<<TID)))	{		RTMPInitTimer(pAd, &pBAEntry->ORIBATimer, GET_TIMER_FUNCTION(BAOriSessionSetupTimeout), pBAEntry, FALSE);	}	else		RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);	// set timer to send ADDBA request 	RTMPSetTimer(&pBAEntry->ORIBATimer, DelayTime);}VOID BAOriSessionAdd(			IN PRTMP_ADAPTER    pAd, 					IN MAC_TABLE_ENTRY  *pEntry,			IN PFRAME_ADDBA_RSP pFrame){	BA_ORI_ENTRY  *pBAEntry = NULL;	BOOLEAN       Cancelled;	UCHAR         TID;	USHORT        Idx;	PUCHAR          pOutBuffer2 = NULL;	NDIS_STATUS     NStatus;	ULONG           FrameLen;	FRAME_BAR       FrameBar;	TID = pFrame->BaParm.TID;	Idx = pEntry->BAOriWcidArray[TID];  	pBAEntry =&pAd->BATable.BAOriEntry[Idx];	// Start fill in parameters.	if ((Idx !=0) && (pBAEntry->TID == TID) && (pBAEntry->ORI_BA_Status == Originator_WaitRes))	{		pBAEntry->BAWinSize = min(pBAEntry->BAWinSize, ((UCHAR)pFrame->BaParm.BufSize));		BA_MaxWinSizeReasign(pAd, pEntry, &pBAEntry->BAWinSize);		pBAEntry->TimeOutValue = pFrame->TimeOutValue;		pBAEntry->ORI_BA_Status = Originator_Done;		pAd->BATable.numDoneOriginator ++;				// reset sequence number 		pBAEntry->Sequence = BA_ORI_INIT_SEQ;		// Set Bitmap flag.		pEntry->TXBAbitmap |= (1<<TID);				RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);		pBAEntry->ORIBATimer.TimerValue = 0;	//pFrame->TimeOutValue;		DBGPRINT(RT_DEBUG_TRACE,("%s : TXBAbitmap = %x, BAWinSize = %d, TimeOut = %ld\n", __FUNCTION__, pEntry->TXBAbitmap, 								 pBAEntry->BAWinSize, pBAEntry->ORIBATimer.TimerValue));		// SEND BAR ;		NStatus = MlmeAllocateMemory(pAd, &pOutBuffer2);  //Get an unused nonpaged memory		if (NStatus != NDIS_STATUS_SUCCESS)		{			DBGPRINT(RT_DEBUG_TRACE,("BA - BAOriSessionAdd() allocate memory failed \n"));			return;		}#ifdef CONFIG_STA_SUPPORT		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)			BarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pBAEntry->Wcid].Addr, pAd->CurrentAddress);#endif // CONFIG_STA_SUPPORT //		FrameBar.StartingSeq.field.FragNum = 0;	// make sure sequence not clear in DEL function.		FrameBar.StartingSeq.field.StartSeq = pBAEntry->Sequence; // make sure sequence not clear in DEL funciton.		FrameBar.BarControl.TID = pBAEntry->TID; // 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);		if (pBAEntry->ORIBATimer.TimerValue)			RTMPSetTimer(&pBAEntry->ORIBATimer, pBAEntry->ORIBATimer.TimerValue); // in mSec 	}}BOOLEAN BARecSessionAdd(					   IN PRTMP_ADAPTER    pAd, 					   IN MAC_TABLE_ENTRY  *pEntry,					   IN PFRAME_ADDBA_REQ pFrame){	BA_REC_ENTRY            *pBAEntry = NULL;	BOOLEAN                 Status = TRUE;	BOOLEAN                 Cancelled;	USHORT                  Idx;	UCHAR                   TID;	UCHAR                   BAWinSize;	//UINT32                  Value;	//UINT                    offset;	ASSERT(pEntry);	// find TID	TID = pFrame->BaParm.TID;	BAWinSize = min(((UCHAR)pFrame->BaParm.BufSize), (UCHAR)pAd->CommonCfg.BACapability.field.RxBAWinLimit);	// Intel patch	if (BAWinSize == 0)	{		BAWinSize = 64;	}	Idx = pEntry->BARecWcidArray[TID];	if (Idx == 0)	{		pBAEntry = BATableAllocRecEntry(pAd, &Idx);     	}	else	{		pBAEntry = &pAd->BATable.BARecEntry[Idx];		// flush all pending reordering mpdus		ba_refresh_reordering_mpdus(pAd, pBAEntry);	}	DBGPRINT(RT_DEBUG_TRACE,("%s(%ld): Idx = %d, BAWinSize(req %d) = %d\n", __FUNCTION__, pAd->BATable.numAsRecipient, Idx, 							 pFrame->BaParm.BufSize, BAWinSize));	// Start fill in parameters.	if (pBAEntry != NULL)	{		ASSERT(pBAEntry->list.qlen == 0);		pBAEntry->REC_BA_Status = Recipient_HandleRes;		pBAEntry->BAWinSize = BAWinSize;		pBAEntry->Wcid = pEntry->Aid;		pBAEntry->TID = TID;		pBAEntry->TimeOutValue = pFrame->TimeOutValue;		pBAEntry->REC_BA_Status = Recipient_Accept;		// initial sequence number 		pBAEntry->LastIndSeq = RESET_RCV_SEQ; //pFrame->BaStartSeq.field.StartSeq;		DBGPRINT(RT_DEBUG_OFF, ("Start Seq = %08x\n",  pFrame->BaStartSeq.field.StartSeq));		if (pEntry->RXBAbitmap & (1<<TID))		{			RTMPCancelTimer(&pBAEntry->RECBATimer, &Cancelled);		}		else		{			RTMPInitTimer(pAd, &pBAEntry->RECBATimer, GET_TIMER_FUNCTION(BARecSessionIdleTimeout), pBAEntry, TRUE);		}		// Set Bitmap flag.		pEntry->RXBAbitmap |= (1<<TID);		pEntry->BARecWcidArray[TID] = Idx;		pEntry->BADeclineBitmap &= ~(1<<TID);		// Set BA session mask in WCID table.		RTMP_ADD_BA_SESSION_TO_ASIC(pAd, pEntry->Aid, TID);		DBGPRINT(RT_DEBUG_TRACE,("MACEntry[%d]RXBAbitmap = 0x%x. BARecWcidArray=%d\n", 				pEntry->Aid, pEntry->RXBAbitmap, pEntry->BARecWcidArray[TID]));	}	else	{		Status = FALSE;		DBGPRINT(RT_DEBUG_TRACE,("Can't Accept ADDBA for %02x:%02x:%02x:%02x:%02x:%02x TID = %d\n", 				PRINT_MAC(pEntry->Addr), TID));	}	return(Status);}BA_REC_ENTRY *BATableAllocRecEntry(								  IN  PRTMP_ADAPTER   pAd,								  OUT USHORT          *Idx){	int             i;	BA_REC_ENTRY    *pBAEntry = NULL;	NdisAcquireSpinLock(&pAd->BATabLock);	if (pAd->BATable.numAsRecipient >= MAX_BARECI_SESSION)	{		DBGPRINT(RT_DEBUG_OFF, ("BA Recipeint Session (%ld) > %d\n", 							pAd->BATable.numAsRecipient, MAX_BARECI_SESSION));		goto done;	}	// reserve idx 0 to identify BAWcidArray[TID] as empty	for (i=1; i < MAX_LEN_OF_BA_REC_TABLE; i++)	{		pBAEntry =&pAd->BATable.BARecEntry[i];		if ((pBAEntry->REC_BA_Status == Recipient_NONE))		{			// get one 			pAd->BATable.numAsRecipient++;			pBAEntry->REC_BA_Status = Recipient_USED;			*Idx = i;			break;		}	}done:	NdisReleaseSpinLock(&pAd->BATabLock);	return pBAEntry;}BA_ORI_ENTRY *BATableAllocOriEntry(								  IN  PRTMP_ADAPTER   pAd,								  OUT USHORT          *Idx){	int             i;	BA_ORI_ENTRY    *pBAEntry = NULL;	NdisAcquireSpinLock(&pAd->BATabLock);	if (pAd->BATable.numAsOriginator >= (MAX_LEN_OF_BA_ORI_TABLE))	{		goto done;	}			// reserve idx 0 to identify BAWcidArray[TID] as empty	for (i=1; i<MAX_LEN_OF_BA_ORI_TABLE; i++)	{		pBAEntry =&pAd->BATable.BAOriEntry[i];		if ((pBAEntry->ORI_BA_Status == Originator_NONE))		{			// get one 			pAd->BATable.numAsOriginator++;			pBAEntry->ORI_BA_Status = Originator_USED;			pBAEntry->pAdapter = pAd;			*Idx = i;			break;		}	}done:	NdisReleaseSpinLock(&pAd->BATabLock);	return pBAEntry;}VOID BATableFreeOriEntry(						IN  PRTMP_ADAPTER   pAd,						IN  ULONG           Idx){	BA_ORI_ENTRY    *pBAEntry = NULL;	MAC_TABLE_ENTRY *pEntry;	if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_ORI_TABLE))		return;	pBAEntry =&pAd->BATable.BAOriEntry[Idx];	if (pBAEntry->ORI_BA_Status != Originator_NONE)	{		pEntry = &pAd->MacTab.Content[pBAEntry->Wcid];		pEntry->BAOriWcidArray[pBAEntry->TID] = 0;		NdisAcquireSpinLock(&pAd->BATabLock);		if (pBAEntry->ORI_BA_Status == Originator_Done)		{			pAd->BATable.numDoneOriginator -= 1;		 	pEntry->TXBAbitmap &= (~(1<<(pBAEntry->TID) ));			DBGPRINT(RT_DEBUG_TRACE, ("BATableFreeOriEntry numAsOriginator= %ld\n", pAd->BATable.numAsRecipient));			// Erase Bitmap flag.		}			ASSERT(pAd->BATable.numAsOriginator != 0);		pAd->BATable.numAsOriginator -= 1;				pBAEntry->ORI_BA_Status = Originator_NONE;		pBAEntry->Token = 0;		NdisReleaseSpinLock(&pAd->BATabLock);	}}VOID BATableFreeRecEntry(						IN  PRTMP_ADAPTER   pAd,						IN  ULONG           Idx){	BA_REC_ENTRY    *pBAEntry = NULL;	MAC_TABLE_ENTRY *pEntry;	if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_REC_TABLE))		return;	pBAEntry =&pAd->BATable.BARecEntry[Idx];	if (pBAEntry->REC_BA_Status != Recipient_NONE)	{		pEntry = &pAd->MacTab.Content[pBAEntry->Wcid];		pEntry->BARecWcidArray[pBAEntry->TID] = 0;		NdisAcquireSpinLock(&pAd->BATabLock);				ASSERT(pAd->BATable.numAsRecipient != 0);		pAd->BATable.numAsRecipient -= 1;		pBAEntry->REC_BA_Status = Recipient_NONE;		NdisReleaseSpinLock(&pAd->BATabLock);	}}VOID BAOriSessionTearDown(						 IN OUT  PRTMP_ADAPTER   pAd, 						 IN      UCHAR           Wcid,						 IN      UCHAR           TID,						 IN      BOOLEAN         bPassive,						 IN      BOOLEAN         bForceSend){	ULONG           Idx = 0;	BA_ORI_ENTRY    *pBAEntry;	BOOLEAN         Cancelled;	if (Wcid >= MAX_LEN_OF_MAC_TABLE)	{		return;	}	//	// Locate corresponding BA Originator Entry in BA Table with the (pAddr,TID).	//	Idx = pAd->MacTab.Content[Wcid].BAOriWcidArray[TID];	if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_ORI_TABLE))	{		if (bForceSend == TRUE)		{			// force send specified TID DelBA			MLME_DELBA_REQ_STRUCT   DelbaReq;   			MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);			if (Elem != NULL)			{				NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));

⌨️ 快捷键说明

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