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

📄 spectrum.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
		management queue waiting for transmition.			Parametrs:		1. the destination mac address of the frame.		Return	: None.	========================================================================== */VOID EnqueueMeasurementRep(	IN PRTMP_ADAPTER pAd,	IN PUCHAR pDA,	IN UINT8 DialogToken,	IN UINT8 MeasureToken, 	IN UINT8 MeasureReqMode,	IN UINT8 MeasureReqType,	IN UINT8 ReportInfoLen,	IN PUINT8 pReportInfo){	PUCHAR pOutBuffer = NULL;	NDIS_STATUS NStatus;	ULONG FrameLen;	HEADER_802_11 ActHdr;	MEASURE_REPORT_INFO MeasureRepIE;	// build action frame header.	MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,						pAd->CurrentAddress);	NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  //Get an unused nonpaged memory	if(NStatus != NDIS_STATUS_SUCCESS)	{		DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __FUNCTION__));		return;	}	NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));	FrameLen = sizeof(HEADER_802_11);	InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_MRP);	// fill Dialog Token	InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken);	// prepare Measurement IE.	NdisZeroMemory(&MeasureRepIE, sizeof(MEASURE_REPORT_INFO));	MeasureRepIE.Token = MeasureToken;	MeasureRepIE.ReportMode = MeasureReqMode;	MeasureRepIE.ReportType = MeasureReqType;	InsertMeasureReportIE(pAd, (pOutBuffer + FrameLen), &FrameLen, &MeasureRepIE, ReportInfoLen, pReportInfo);	MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);	MlmeFreeMemory(pAd, pOutBuffer);	return;	}/*	==========================================================================	Description:		Prepare TPC Request action frame and enqueue it into		management queue waiting for transmition.			Parametrs:		1. the destination mac address of the frame.		Return	: None.	========================================================================== */VOID EnqueueTPCReq(	IN PRTMP_ADAPTER pAd,	IN PUCHAR pDA,	IN UCHAR DialogToken){	PUCHAR pOutBuffer = NULL;	NDIS_STATUS NStatus;	ULONG FrameLen;	HEADER_802_11 ActHdr;	// build action frame header.	MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,						pAd->CurrentAddress);	NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  //Get an unused nonpaged memory	if(NStatus != NDIS_STATUS_SUCCESS)	{		DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __FUNCTION__));		return;	}	NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));	FrameLen = sizeof(HEADER_802_11);	InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_TPCRQ);	// fill Dialog Token	InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken);	// Insert TPC Request IE.	InsertTpcReqIE(pAd, (pOutBuffer + FrameLen), &FrameLen);	MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);	MlmeFreeMemory(pAd, pOutBuffer);	return;}/*	==========================================================================	Description:		Prepare TPC Report action frame and enqueue it into		management queue waiting for transmition.			Parametrs:		1. the destination mac address of the frame.		Return	: None.	========================================================================== */VOID EnqueueTPCRep(	IN PRTMP_ADAPTER pAd,	IN PUCHAR pDA,	IN UINT8 DialogToken,	IN UINT8 TxPwr,	IN UINT8 LinkMargin){	PUCHAR pOutBuffer = NULL;	NDIS_STATUS NStatus;	ULONG FrameLen;	HEADER_802_11 ActHdr;	// build action frame header.	MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,						pAd->CurrentAddress);	NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  //Get an unused nonpaged memory	if(NStatus != NDIS_STATUS_SUCCESS)	{		DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __FUNCTION__));		return;	}	NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));	FrameLen = sizeof(HEADER_802_11);	InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_TPCRP);	// fill Dialog Token	InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken);	// Insert TPC Request IE.	InsertTpcReportIE(pAd, (pOutBuffer + FrameLen), &FrameLen, TxPwr, LinkMargin);	MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);	MlmeFreeMemory(pAd, pOutBuffer);	return;}/*	==========================================================================	Description:		Prepare Channel Switch Announcement action frame and enqueue it into		management queue waiting for transmition.			Parametrs:		1. the destination mac address of the frame.		2. Channel switch announcement mode.		2. a New selected channel.		Return	: None.	========================================================================== */VOID EnqueueChSwAnn(	IN PRTMP_ADAPTER pAd,	IN PUCHAR pDA, 	IN UINT8 ChSwMode,	IN UINT8 NewCh){	PUCHAR pOutBuffer = NULL;	NDIS_STATUS NStatus;	ULONG FrameLen;	HEADER_802_11 ActHdr;	// build action frame header.	MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,						pAd->CurrentAddress);	NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  //Get an unused nonpaged memory	if(NStatus != NDIS_STATUS_SUCCESS)	{		DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __FUNCTION__));		return;	}	NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));	FrameLen = sizeof(HEADER_802_11);	InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_CHANNEL_SWITCH);	InsertChSwAnnIE(pAd, (pOutBuffer + FrameLen), &FrameLen, ChSwMode, NewCh, 0);	MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);	MlmeFreeMemory(pAd, pOutBuffer);	return;}static BOOLEAN DfsRequirementCheck(	IN PRTMP_ADAPTER pAd,	IN UINT8 Channel){	BOOLEAN Result = FALSE;	INT i;	do	{		// check DFS procedure is running.		// make sure DFS procedure won't start twice.		if (pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)		{			Result = FALSE;			break;		}		// check the new channel carried from Channel Switch Announcemnet is valid.		for (i=0; i<pAd->ChannelListNum; i++)		{			if ((Channel == pAd->ChannelList[i].Channel)				&&(pAd->ChannelList[i].RemainingTimeForUse == 0))			{				// found radar signal in the channel. the channel can't use at least for 30 minutes.				pAd->ChannelList[i].RemainingTimeForUse = 1800;//30 min = 1800 sec				Result = TRUE;				break;			}		}	} while(FALSE);	return Result;}VOID NotifyChSwAnnToPeerAPs(	IN PRTMP_ADAPTER pAd,	IN PUCHAR pRA,	IN PUCHAR pTA,	IN UINT8 ChSwMode,	IN UINT8 Channel){#ifdef WDS_SUPPORT	if (!((pRA[0] & 0xff) == 0xff)) // is pRA a broadcase address.	{		INT i;		// info neighbor APs that Radar signal found throgh WDS link.		for (i = 0; i < MAX_WDS_ENTRY; i++)		{			if (ValidWdsEntry(pAd, i))			{				PUCHAR pDA = pAd->WdsTab.WdsEntry[i].PeerWdsAddr;				// DA equal to SA. have no necessary orignal AP which found Radar signal.				if (MAC_ADDR_EQUAL(pTA, pDA))					continue;				// send Channel Switch Action frame to info Neighbro APs.				EnqueueChSwAnn(pAd, pDA, ChSwMode, Channel);			}		}	}#endif // WDS_SUPPORT //}static VOID StartDFSProcedure(	IN PRTMP_ADAPTER pAd,	IN UCHAR Channel,	IN UINT8 ChSwMode){	// start DFS procedure	pAd->CommonCfg.Channel = Channel;#ifdef DOT11_N_SUPPORT	N_ChannelCheck(pAd);#endif // DOT11_N_SUPPORT //	pAd->CommonCfg.RadarDetect.RDMode = RD_SWITCHING_MODE;	pAd->CommonCfg.RadarDetect.CSCount = 0;}/*	==========================================================================	Description:		Channel Switch Announcement action frame sanity check.			Parametrs:		1. MLME message containing the received frame		2. message length.		3. Channel switch announcement infomation buffer.				Return	: None.	========================================================================== *//*  Channel Switch Announcement IE.  +----+-----+-----------+------------+-----------+  | ID | Len |Ch Sw Mode | New Ch Num | Ch Sw Cnt |  +----+-----+-----------+------------+-----------+    1    1        1           1            1      */static BOOLEAN PeerChSwAnnSanity(	IN PRTMP_ADAPTER pAd,	IN VOID *pMsg,	IN ULONG MsgLen,	OUT PCH_SW_ANN_INFO pChSwAnnInfo){	PFRAME_802_11 Fr = (PFRAME_802_11)pMsg;	PUCHAR pFramePtr = Fr->Octet;	BOOLEAN result = FALSE;	PEID_STRUCT eid_ptr;	// skip 802.11 header.	MsgLen -= sizeof(HEADER_802_11);	// skip category and action code.	pFramePtr += 2;	MsgLen -= 2;	if (pChSwAnnInfo == NULL)		return result;	eid_ptr = (PEID_STRUCT)pFramePtr;	while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen))	{		switch(eid_ptr->Eid)		{			case IE_CHANNEL_SWITCH_ANNOUNCEMENT:				NdisMoveMemory(&pChSwAnnInfo->ChSwMode, eid_ptr->Octet, 1);				NdisMoveMemory(&pChSwAnnInfo->Channel, eid_ptr->Octet + 1, 1);				NdisMoveMemory(&pChSwAnnInfo->ChSwCnt, eid_ptr->Octet + 2, 1);								result = TRUE;                break;            			default:				break;		}		eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);        	}	return result;}/*	==========================================================================	Description:		Measurement request action frame sanity check.			Parametrs:		1. MLME message containing the received frame		2. message length.		3. Measurement request infomation buffer.		Return	: None.	========================================================================== */static BOOLEAN PeerMeasureReqSanity(	IN PRTMP_ADAPTER pAd,	IN VOID *pMsg,	IN ULONG MsgLen,	OUT PUINT8 pDialogToken,	OUT PMEASURE_REQ_INFO pMeasureReqInfo,	OUT PMEASURE_REQ pMeasureReq){	PFRAME_802_11 Fr = (PFRAME_802_11)pMsg;	PUCHAR pFramePtr = Fr->Octet;	BOOLEAN result = FALSE;	PEID_STRUCT eid_ptr;	PUCHAR ptr;	UINT64 MeasureStartTime;	UINT16 MeasureDuration;	// skip 802.11 header.	MsgLen -= sizeof(HEADER_802_11);	// skip category and action code.	pFramePtr += 2;	MsgLen -= 2;	if (pMeasureReqInfo == NULL)		return result;	NdisMoveMemory(pDialogToken, pFramePtr, 1);	pFramePtr += 1;	MsgLen -= 1;	eid_ptr = (PEID_STRUCT)pFramePtr;	while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen))	{		switch(eid_ptr->Eid)		{			case IE_MEASUREMENT_REQUEST:				NdisMoveMemory(&pMeasureReqInfo->Token, eid_ptr->Octet, 1);				NdisMoveMemory(&pMeasureReqInfo->ReqMode.word, eid_ptr->Octet + 1, 1);				NdisMoveMemory(&pMeasureReqInfo->ReqType, eid_ptr->Octet + 2, 1);				ptr = (PUCHAR)(eid_ptr->Octet + 3);				NdisMoveMemory(&pMeasureReq->ChNum, ptr, 1);				NdisMoveMemory(&MeasureStartTime, ptr + 1, 8);				pMeasureReq->MeasureStartTime = SWAP64(MeasureStartTime);				NdisMoveMemory(&MeasureDuration, ptr + 9, 2);				pMeasureReq->MeasureDuration = SWAP16(MeasureDuration);								result = TRUE;				break;			default:				break;		}		eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);	}	return result;}/*	==========================================================================	Description:		Measurement report action frame sanity check.			Parametrs:		1. MLME message containing the received frame		2. message length.		3. Measurement report infomation buffer.		4. basic report infomation buffer.		Return	: None.	========================================================================== *//*  Measurement Report IE.  +----+-----+-------+-------------+--------------+----------------+  | ID | Len | Token | Report Mode | Measure Type | Measure Report |  +----+-----+-------+-------------+--------------+----------------+    1     1      1          1             1            variable  Basic Report.  +--------+------------+----------+-----+  | Ch Num | Start Time | Duration | Map |  +--------+------------+----------+-----+      1          8           2        1  Map Field Bit Format.  +-----+---------------+---------------------+-------+------------+----------+  | Bss | OFDM Preamble | Unidentified signal | Radar | Unmeasured | Reserved |  +-----+---------------+---------------------+-------+------------+----------+     0          1                  2              3         4          5-7*/static BOOLEAN PeerMeasureReportSanity(	IN PRTMP_ADAPTER pAd,	IN VOID *pMsg,	IN ULONG MsgLen,	OUT PUINT8 pDialogToken,	OUT PMEASURE_REPORT_INFO pMeasureReportInfo,	OUT PUINT8 pReportBuf){	PFRAME_802_11 Fr = (PFRAME_802_11)pMsg;	PUCHAR pFramePtr = Fr->Octet;	BOOLEAN result = FALSE;	PEID_STRUCT eid_ptr;	PUCHAR ptr;	// skip 802.11 header.	MsgLen -= sizeof(HEADER_802_11);	// skip category and action code.	pFramePtr += 2;	MsgLen -= 2;	if (pMeasureReportInfo == NULL)		return result;	NdisMoveMemory(pDialogToken, pFramePtr, 1);	pFramePtr += 1;	MsgLen -= 1;	eid_ptr = (PEID_STRUCT)pFramePtr;	while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen))	{		switch(eid_ptr->Eid)		{			case IE_MEASUREMENT_REPORT:				NdisMoveMemory(&pMeasureReportInfo->Token, eid_ptr->Octet, 1);				NdisMoveMemory(&pMeasureReportInfo->ReportMode, eid_ptr->Octet + 1, 1);				NdisMoveMemory(&pMeasureReportInfo->ReportType, eid_ptr->Octet + 2, 1);				if (pMeasureReportInfo->ReportType == RM_BASIC)				{					PMEASURE_BASIC_REPORT pReport = (PMEASURE_BASIC_REPORT)pReportBuf;					ptr = (PUCHAR)(eid_ptr->Octet + 3);					NdisMoveMemory(&pReport->ChNum, ptr, 1);					NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);					NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);					NdisMoveMemory(&pReport->Map, ptr + 11, 1);									}				else if (pMeasureReportInfo->ReportType == RM_CCA)				{					PMEASURE_CCA_REPORT pReport = (PMEASURE_CCA_REPORT)pReportBuf;					ptr = (PUCHAR)(eid_ptr->Octet + 3);					NdisMoveMemory(&pReport->ChNum, ptr, 1);					NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);					NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);					NdisMoveMemory(&pReport->CCA_Busy_Fraction, ptr + 11, 1);									}				else if (pMeasureReportInfo->ReportType == RM_RPI_HISTOGRAM)				{					PMEASURE_RPI_REPORT pReport = (PMEASURE_RPI_REPORT)pReportBuf;					ptr = (PUCHAR)(eid_ptr->Octet + 3);					NdisMoveMemory(&pReport->ChNum, ptr, 1);					NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);					NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);					NdisMoveMemory(&pReport->RPI_Density, ptr + 11, 8);				}				result = TRUE;                break;			default:				break;		}		eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);	}	return result;}/*	==========================================================================	Description:		TPC Request action frame sanity check.			Parametrs:		1. MLME message containing the received frame		2. message length.		3. Dialog Token.		Return	: None.	========================================================================== */static BOOLEAN PeerTpcReqSanity(	IN PRTMP_ADAPTER pAd,	IN VOID *pMsg,	IN ULONG MsgLen,	OUT PUINT8 pDialogToken){	PFRAME_802_11 Fr = (PFRAME_802_11)pMsg;	PUCHAR pFramePtr = Fr->Octet;	BOOLEAN result = FALSE;	PEID_STRUCT eid_ptr;

⌨️ 快捷键说明

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