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

📄 action.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
			break;		case ADDBA_RESP:			PeerAddBARspAction(pAd,Elem);			break;		case DELBA:			PeerDelBAAction(pAd,Elem);			break;	}}#ifdef DOT11N_DRAFT3#ifdef CONFIG_STA_SUPPORTVOID StaPublicAction(	IN PRTMP_ADAPTER pAd, 	IN UCHAR Bss2040Coexist) {	BSS_2040_COEXIST_IE		BssCoexist;	MLME_SCAN_REQ_STRUCT			ScanReq;	BssCoexist.word = Bss2040Coexist;	// AP asks Station to return a 20/40 BSS Coexistence mgmt frame.  So we first starts a scan, then send back 20/40 BSS Coexistence mgmt frame 	if ((BssCoexist.field.InfoReq == 1) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040)))	{		// Clear record first.  After scan , will update those bit and send back to transmiter.		pAd->CommonCfg.BSSCoexist2040.field.InfoReq = 1;		pAd->CommonCfg.BSSCoexist2040.field.Intolerant40 = 0;		pAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq = 0;		// Fill out stuff for scan request		ScanParmFill(pAd, &ScanReq, ZeroSsid, 0, BSS_ANY, SCAN_2040_BSS_COEXIST);		MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq);		pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;	}}/*Description : Build Intolerant Channel Rerpot from Trigger event table.return : how many bytes copied. */ULONG BuildIntolerantChannelRep(	IN	PRTMP_ADAPTER	pAd,	IN    PUCHAR  pDest) {	ULONG			FrameLen = 0;	ULONG			ReadOffset = 0;	UCHAR			i;	UCHAR			LastRegClass = 0xff;	PUCHAR			pLen;		for ( i = 0;i < MAX_TRIGGER_EVENT;i++)	{		if (pAd->CommonCfg.TriggerEventTab.EventA[i].bValid == TRUE)		{			if (pAd->CommonCfg.TriggerEventTab.EventA[i].RegClass == LastRegClass)			{				*(pDest + ReadOffset) = (UCHAR)pAd->CommonCfg.TriggerEventTab.EventA[i].Channel;				*pLen++;				ReadOffset++;				FrameLen++;			}			else			{				*(pDest + ReadOffset) = IE_2040_BSS_INTOLERANT_REPORT;  // IE				*(pDest + ReadOffset + 1) = 2;	// Len = RegClass byte + channel byte.				pLen = pDest + ReadOffset + 1;				LastRegClass = pAd->CommonCfg.TriggerEventTab.EventA[i].RegClass;				*(pDest + ReadOffset + 2) = LastRegClass;	// Len = RegClass byte + channel byte.				*(pDest + ReadOffset + 3) = (UCHAR)pAd->CommonCfg.TriggerEventTab.EventA[i].Channel;				FrameLen += 4;				ReadOffset += 4;			}					}	}	return FrameLen;}/*Description : Send 20/40 BSS Coexistence Action frame If one trigger event is triggered.*/VOID Send2040CoexistAction(	IN	PRTMP_ADAPTER	pAd,	IN    UCHAR  Wcid,	IN	BOOLEAN	bAddIntolerantCha) {	PUCHAR			pOutBuffer = NULL;	NDIS_STATUS 	NStatus;	FRAME_ACTION_HDR	Frame;	ULONG			FrameLen;	ULONG			IntolerantChaRepLen;	IntolerantChaRepLen = 0;	NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory	if(NStatus != NDIS_STATUS_SUCCESS) 	{		DBGPRINT(RT_DEBUG_ERROR,("ACT - Send2040CoexistAction() allocate memory failed \n"));		return;	}	ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[Wcid].Addr, pAd->CommonCfg.Bssid);	Frame.Category = CATEGORY_PUBLIC;	Frame.Action = ACTION_BSS_2040_COEXIST;		MakeOutgoingFrame(pOutBuffer,				&FrameLen,				  sizeof(FRAME_ACTION_HDR),	  &Frame,				  END_OF_ARGS);	*(pOutBuffer + FrameLen) = pAd->CommonCfg.BSSCoexist2040.word;	FrameLen++;		if (bAddIntolerantCha == TRUE)		IntolerantChaRepLen = BuildIntolerantChannelRep(pAd, pOutBuffer + FrameLen);	MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen + IntolerantChaRepLen);	DBGPRINT(RT_DEBUG_ERROR,("ACT - Send2040CoexistAction( BSSCoexist2040 = 0x%x )  \n", pAd->CommonCfg.BSSCoexist2040.word));		}/*		==========================================================================	Description: 	After scan, Update 20/40 BSS Coexistence IE and send out.	According to 802.11n D3.03 11.14.10			Parameters: 	========================================================================== */VOID Update2040CoexistFrameAndNotify(	IN	PRTMP_ADAPTER	pAd,	IN    UCHAR  Wcid,	IN	BOOLEAN	bAddIntolerantCha) {	BSS_2040_COEXIST_IE	OldValue;	OldValue.word = pAd->CommonCfg.BSSCoexist2040.word;	if ((pAd->CommonCfg.TriggerEventTab.EventANo > 0) || (pAd->CommonCfg.TriggerEventTab.EventBCountDown > 0))		pAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq = 1;	// Need to check !!!!	// How STA will set Intolerant40 if implementation dependent. Now we don't set this bit first.!!!!!	// So Only check BSS20WidthReq change.	if (OldValue.field.BSS20WidthReq != pAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq)	{		Send2040CoexistAction(pAd, Wcid, bAddIntolerantCha);	}}#endif // CONFIG_STA_SUPPORT //BOOLEAN ChannelSwitchSanityCheck(	IN	PRTMP_ADAPTER	pAd,	IN    UCHAR  Wcid,	IN    UCHAR  NewChannel,	IN    UCHAR  Secondary) {	UCHAR		i;		if (Wcid >= MAX_LEN_OF_MAC_TABLE)		return FALSE;	if ((NewChannel > 7) && (Secondary == 1))		return FALSE;	if ((NewChannel < 5) && (Secondary == 3))		return FALSE;	// 0. Check if new channel is in the channellist.	for (i = 0;i < pAd->ChannelListNum;i++)	{		if (pAd->ChannelList[i].Channel == NewChannel)		{			break;		}	}	if (i == pAd->ChannelListNum)		return FALSE;		return TRUE;}VOID ChannelSwitchAction(	IN	PRTMP_ADAPTER	pAd,	IN    UCHAR  Wcid,	IN    UCHAR  NewChannel,	IN    UCHAR  Secondary) {	UCHAR		BBPValue = 0;	ULONG		MACValue;		DBGPRINT(RT_DEBUG_TRACE,("SPECTRUM - ChannelSwitchAction(NewChannel = %d , Secondary = %d)  \n", NewChannel, Secondary));	if (ChannelSwitchSanityCheck(pAd, Wcid, NewChannel, Secondary) == FALSE)		return;		// 1.  Switches to BW = 20.	if (Secondary == 0)	{		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);		BBPValue&= (~0x18);		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);		if (pAd->MACVersion == 0x28600100)		{			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);			DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));		}		pAd->CommonCfg.BBPCurrentBW = BW_20;		pAd->CommonCfg.Channel = NewChannel;		pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;		AsicSwitchChannel(pAd, pAd->CommonCfg.Channel,FALSE);		AsicLockChannel(pAd, pAd->CommonCfg.Channel);		pAd->MacTab.Content[Wcid].HTPhyMode.field.BW = 0;		DBGPRINT(RT_DEBUG_TRACE, ("!!!20MHz   !!! \n" ));	}	// 1.  Switches to BW = 40 And Station supports BW = 40.	else if (((Secondary == 1) || (Secondary == 3)) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == 1))	{		pAd->CommonCfg.Channel = NewChannel;		if (Secondary == 1)		{			// Secondary above.			pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2;			RTMP_IO_READ32(pAd, TX_BAND_CFG, &MACValue);			MACValue &= 0xfe;			RTMP_IO_WRITE32(pAd, TX_BAND_CFG, MACValue);			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);			BBPValue&= (~0x18);			BBPValue|= (0x10);			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPValue);			BBPValue&= (~0x20);			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPValue);			DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel ));		}		else		{			// Secondary below.			pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2;			RTMP_IO_READ32(pAd, TX_BAND_CFG, &MACValue);			MACValue &= 0xfe;			MACValue |= 0x1;			RTMP_IO_WRITE32(pAd, TX_BAND_CFG, MACValue);			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);			BBPValue&= (~0x18);			BBPValue|= (0x10);			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPValue);			BBPValue&= (~0x20);			BBPValue|= (0x20);			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPValue);			DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel ));		}		pAd->CommonCfg.BBPCurrentBW = BW_40;		AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);		AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);		pAd->MacTab.Content[Wcid].HTPhyMode.field.BW = 1;	}}#endif // DOT11N_DRAFT3 //#endif // DOT11_N_SUPPORT //VOID PeerPublicAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {#ifdef DOT11_N_SUPPORT#ifdef DOT11N_DRAFT3	UCHAR	Action = Elem->Msg[LENGTH_802_11+1];#endif // DOT11N_DRAFT3 //#endif // DOT11_N_SUPPORT //		if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)		return;#ifdef DOT11_N_SUPPORT#ifdef DOT11N_DRAFT3	switch(Action)	{		case ACTION_BSS_2040_COEXIST:	// Format defined in IEEE 7.4.7a.1 in 11n Draf3.03			{				//UCHAR	BssCoexist;				BSS_2040_COEXIST_ELEMENT		*pCoexistInfo;				BSS_2040_COEXIST_IE 			*pBssCoexistIe;				BSS_2040_INTOLERANT_CH_REPORT	*pIntolerantReport = NULL;								if (Elem->MsgLen <= (LENGTH_802_11 + sizeof(BSS_2040_COEXIST_ELEMENT)) )				{					DBGPRINT(RT_DEBUG_ERROR, ("ACTION - 20/40 BSS Coexistence Management Frame length too short! len = %ld!\n", Elem->MsgLen));					break;				}							DBGPRINT(RT_DEBUG_TRACE, ("ACTION - 20/40 BSS Coexistence Management action----> \n"));				hex_dump("CoexistenceMgmtFrame", Elem->Msg, Elem->MsgLen);								pCoexistInfo = (BSS_2040_COEXIST_ELEMENT *) &Elem->Msg[LENGTH_802_11+2];				//hex_dump("CoexistInfo", (PUCHAR)pCoexistInfo, sizeof(BSS_2040_COEXIST_ELEMENT));				if (Elem->MsgLen >= (LENGTH_802_11 + sizeof(BSS_2040_COEXIST_ELEMENT) + sizeof(BSS_2040_INTOLERANT_CH_REPORT)))				{					pIntolerantReport = (BSS_2040_INTOLERANT_CH_REPORT *)((PUCHAR)pCoexistInfo + sizeof(BSS_2040_COEXIST_ELEMENT));				}				//hex_dump("IntolerantReport ", (PUCHAR)pIntolerantReport, sizeof(BSS_2040_INTOLERANT_CH_REPORT));								pBssCoexistIe = (BSS_2040_COEXIST_IE *)(&pCoexistInfo->BssCoexistIe);#ifdef CONFIG_STA_SUPPORT				IF_DEV_CONFIG_OPMODE_ON_STA(pAd)				{					if (INFRA_ON(pAd))					{						StaPublicAction(pAd, pCoexistInfo);					}				}#endif // CONFIG_STA_SUPPORT //			}			break;	}#endif // DOT11N_DRAFT3 //#endif // DOT11_N_SUPPORT //}	static VOID ReservedAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem){	UCHAR Category;	if (Elem->MsgLen <= LENGTH_802_11)	{		return;	}	Category = Elem->Msg[LENGTH_802_11];	DBGPRINT(RT_DEBUG_TRACE,("Rcv reserved category(%d) Action Frame\n", Category));	hex_dump("Reserved Action Frame", &Elem->Msg[0], Elem->MsgLen);}VOID PeerRMAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {	return;}

⌨️ 快捷键说明

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