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

📄 dls.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
					pEntry->MmpsMode = (UCHAR)HtCapability.HtCapInfo.MimoPs;					pEntry->AMsduSize = (UCHAR)HtCapability.HtCapInfo.AMsduSize;									pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;					if (HtCapability.HtCapInfo.ShortGIfor20)						CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE);					if (HtCapability.HtCapInfo.ShortGIfor40)						CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE);					if (HtCapability.HtCapInfo.TxSTBC)						CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);					if (HtCapability.HtCapInfo.RxSTBC)						CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);					if (HtCapability.ExtHtCapInfo.PlusHTC)										CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE);					if (pAd->CommonCfg.bRdg && HtCapability.ExtHtCapInfo.RDGSupport)										CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE);						if (HtCapability.ExtHtCapInfo.MCSFeedback == 0x03)						CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);							NdisMoveMemory(&pEntry->HTCapability, &HtCapability, sizeof(HT_CAPABILITY_IE));				}#endif // DOT11_N_SUPPORT //				pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;				pEntry->CurrTxRate = pEntry->MaxSupportedRate;				CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);				if (pAd->StaCfg.bAutoTxRateSwitch == TRUE)				{					PUCHAR pTable;					UCHAR TableSize = 0;					MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &pEntry->CurrTxRateIndex);					pEntry->bAutoTxRateSwitch = TRUE;				}				else				{					pEntry->HTPhyMode.field.MODE	= pAd->StaCfg.HTPhyMode.field.MODE;					pEntry->HTPhyMode.field.MCS	= pAd->StaCfg.HTPhyMode.field.MCS;					pEntry->bAutoTxRateSwitch = FALSE;					RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry);				}				pEntry->RateLen = SupportedRatesLen;				if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)				{					// If support WPA or WPA2, start STAKey hand shake,					// If failed hand shake, just tear down peer DLS					if (RTMPSendSTAKeyRequest(pAd, pAd->StaCfg.DLSEntry[i].MacAddr) != NDIS_STATUS_SUCCESS)					{						MLME_DLS_REQ_STRUCT	MlmeDlsReq;						USHORT				reason = REASON_QOS_CIPHER_NOT_SUPPORT;												DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason);						MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq);						pAd->StaCfg.DLSEntry[i].Status = DLS_NONE;						pAd->StaCfg.DLSEntry[i].Valid	= FALSE;						DBGPRINT(RT_DEBUG_ERROR,("DLS - PeerDlsRspAction failed when call RTMPSendSTAKeyRequest \n"));					}					else					{						pAd->StaCfg.DLSEntry[i].Status = DLS_WAIT_KEY;						DBGPRINT(RT_DEBUG_TRACE,("DLS - waiting for STAKey handshake procedure\n"));					}				}				else				{					RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled);					pAd->StaCfg.DLSEntry[i].Status = DLS_FINISH;					DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsRspAction() from %02x:%02x:%02x:%02x:%02x:%02x Succeed with WEP or no security\n", SA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));				}				//initialize seq no for DLS frames.				pAd->StaCfg.DLSEntry[i].Sequence = 0;				if (HtCapabilityLen != 0)					pAd->StaCfg.DLSEntry[i].bHTCap = TRUE;				else					pAd->StaCfg.DLSEntry[i].bHTCap = FALSE;			}			else			{				// DLS setup procedure failed.				pAd->StaCfg.DLSEntry[i].Status = DLS_NONE;				pAd->StaCfg.DLSEntry[i].Valid	= FALSE;				RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled);				DBGPRINT(RT_DEBUG_ERROR,("DLS - PeerDlsRspAction failed with StatusCode=%d \n", StatusCode));			}		}	}	if (i >= MAX_NUM_OF_INIT_DLS_ENTRY)	{		DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsRspAction() update timeout value \n"));		for (i=(MAX_NUM_OF_DLS_ENTRY-1); i>=MAX_NUM_OF_INIT_DLS_ENTRY; i--)		{			if (pAd->StaCfg.DLSEntry[i].Valid && MAC_ADDR_EQUAL(SA, pAd->StaCfg.DLSEntry[i].MacAddr))			{				if (StatusCode == MLME_SUCCESS)				{					MAC_TABLE_ENTRY *pEntry;					UCHAR MaxSupportedRate = RATE_11;					pEntry = MacTableInsertDlsEntry(pAd, SA, i);					switch (MaxSupportedRateIn500Kbps)					{						case 108: MaxSupportedRate = RATE_54;   break;						case 96:  MaxSupportedRate = RATE_48;   break;						case 72:  MaxSupportedRate = RATE_36;   break;						case 48:  MaxSupportedRate = RATE_24;   break;						case 36:  MaxSupportedRate = RATE_18;   break;						case 24:  MaxSupportedRate = RATE_12;   break;						case 18:  MaxSupportedRate = RATE_9;    break;						case 12:  MaxSupportedRate = RATE_6;    break;						case 22:  MaxSupportedRate = RATE_11;   break;						case 11:  MaxSupportedRate = RATE_5_5;  break;						case 4:   MaxSupportedRate = RATE_2;    break;						case 2:   MaxSupportedRate = RATE_1;    break;						default:  MaxSupportedRate = RATE_11;   break;					}					pEntry->MaxSupportedRate = min(pAd->CommonCfg.MaxTxRate, MaxSupportedRate);					if (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE)					{						pEntry->MaxHTPhyMode.field.MODE = MODE_CCK;						pEntry->MaxHTPhyMode.field.MCS = pEntry->MaxSupportedRate;						pEntry->MinHTPhyMode.field.MODE = MODE_CCK;						pEntry->MinHTPhyMode.field.MCS = pEntry->MaxSupportedRate;						pEntry->HTPhyMode.field.MODE = MODE_CCK;						pEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate;					}					else					{						pEntry->MaxHTPhyMode.field.MODE = MODE_OFDM;						pEntry->MaxHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];						pEntry->MinHTPhyMode.field.MODE = MODE_OFDM;						pEntry->MinHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];						pEntry->HTPhyMode.field.MODE = MODE_OFDM;						pEntry->HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];					}					pEntry->MaxHTPhyMode.field.BW = BW_20;					pEntry->MinHTPhyMode.field.BW = BW_20;					#ifdef DOT11_N_SUPPORT					pEntry->HTCapability.MCSSet[0] = 0;					pEntry->HTCapability.MCSSet[1] = 0;					// If this Entry supports 802.11n, upgrade to HT rate. 					if ((HtCapabilityLen != 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))					{						UCHAR	j, bitmask; //k,bitmask;						CHAR    ii;						DBGPRINT(RT_DEBUG_TRACE, ("DLS - PeerDlsRspAction Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\n",									SA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));						if ((HtCapability.HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF))						{							pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD;						}						else						{								pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;							pAd->MacTab.fAnyStationNonGF = TRUE;							pAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1;						}						if ((HtCapability.HtCapInfo.ChannelWidth) && (pAd->CommonCfg.DesiredHtPhy.ChannelWidth))						{							pEntry->MaxHTPhyMode.field.BW= BW_40;							pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40)&(HtCapability.HtCapInfo.ShortGIfor40));						}						else						{								pEntry->MaxHTPhyMode.field.BW = BW_20;							pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor20)&(HtCapability.HtCapInfo.ShortGIfor20));							pAd->MacTab.fAnyStation20Only = TRUE;						}						// find max fixed rate						for (ii=15; ii>=0; ii--)						{								j = ii/8;								bitmask = (1<<(ii-(j*8)));							if ( (pAd->StaCfg.DesiredHtPhyInfo.MCSSet[j]&bitmask) && (HtCapability.MCSSet[j]&bitmask))							{								pEntry->MaxHTPhyMode.field.MCS = ii;								break;							}							if (ii==0)								break;						}		 						if (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO)						{							DBGPRINT(RT_DEBUG_OFF, ("@@@ pAd->CommonCfg.RegTransmitSetting.field.MCS = %d\n",													pAd->StaCfg.DesiredTransmitSetting.field.MCS));							if (pAd->StaCfg.DesiredTransmitSetting.field.MCS == 32)							{								// Fix MCS as HT Duplicated Mode								pEntry->MaxHTPhyMode.field.BW = 1;								pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;								pEntry->MaxHTPhyMode.field.STBC = 0;								pEntry->MaxHTPhyMode.field.ShortGI = 0;								pEntry->MaxHTPhyMode.field.MCS = 32;							}							else if (pEntry->MaxHTPhyMode.field.MCS > pAd->StaCfg.HTPhyMode.field.MCS)							{								// STA supports fixed MCS 								pEntry->MaxHTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;							}						}						pEntry->MaxHTPhyMode.field.STBC = (HtCapability.HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC));						pEntry->MpduDensity = HtCapability.HtCapParm.MpduDensity;						pEntry->MaxRAmpduFactor = HtCapability.HtCapParm.MaxRAmpduFactor;						pEntry->MmpsMode = (UCHAR)HtCapability.HtCapInfo.MimoPs;						pEntry->AMsduSize = (UCHAR)HtCapability.HtCapInfo.AMsduSize;										pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;						if (HtCapability.HtCapInfo.ShortGIfor20)							CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE);						if (HtCapability.HtCapInfo.ShortGIfor40)							CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE);						if (HtCapability.HtCapInfo.TxSTBC)							CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);						if (HtCapability.HtCapInfo.RxSTBC)							CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);						if (HtCapability.ExtHtCapInfo.PlusHTC)											CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE);						if (pAd->CommonCfg.bRdg && HtCapability.ExtHtCapInfo.RDGSupport)											CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE);							if (HtCapability.ExtHtCapInfo.MCSFeedback == 0x03)							CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);						NdisMoveMemory(&pEntry->HTCapability, &HtCapability, sizeof(HT_CAPABILITY_IE));					}#endif // DOT11_N_SUPPORT //					pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;					pEntry->CurrTxRate = pEntry->MaxSupportedRate;					CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);					if (pAd->StaCfg.bAutoTxRateSwitch == TRUE)					{						PUCHAR pTable;						UCHAR TableSize = 0;						MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &pEntry->CurrTxRateIndex);						pEntry->bAutoTxRateSwitch = TRUE;					}					else					{						pEntry->HTPhyMode.field.MODE	= pAd->StaCfg.HTPhyMode.field.MODE;						pEntry->HTPhyMode.field.MCS	= pAd->StaCfg.HTPhyMode.field.MCS;						pEntry->bAutoTxRateSwitch = FALSE;						RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry);					}					pEntry->RateLen = SupportedRatesLen;					if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)					{						// If support WPA or WPA2, start STAKey hand shake,						// If failed hand shake, just tear down peer DLS						if (RTMPSendSTAKeyRequest(pAd, pAd->StaCfg.DLSEntry[i].MacAddr) != NDIS_STATUS_SUCCESS)						{							MLME_DLS_REQ_STRUCT	MlmeDlsReq;							USHORT				reason = REASON_QOS_CIPHER_NOT_SUPPORT;														DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason);							MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq);							pAd->StaCfg.DLSEntry[i].Status = DLS_NONE;							pAd->StaCfg.DLSEntry[i].Valid	= FALSE;							DBGPRINT(RT_DEBUG_ERROR,("DLS - PeerDlsRspAction failed when call RTMPSendSTAKeyRequest \n"));						}						else						{							pAd->StaCfg.DLSEntry[i].Status = DLS_WAIT_KEY;							DBGPRINT(RT_DEBUG_TRACE,("DLS - waiting for STAKey handshake procedure\n"));						}					}					else					{						RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled);						pAd->StaCfg.DLSEntry[i].Status = DLS_FINISH;						DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsRspAction() from %02x:%02x:%02x:%02x:%02x:%02x Succeed with WEP or no security\n", SA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));					}					pAd->StaCfg.DLSEntry[i].Sequence = 0;					if (HtCapabilityLen != 0)						pAd->StaCfg.DLSEntry[i].bHTCap = TRUE;					else						pAd->StaCfg.DLSEntry[i].bHTCap = FALSE;				}				else				{					// DLS setup procedure failed.					pAd->StaCfg.DLSEntry[i].Status = DLS_NONE;					pAd->StaCfg.DLSEntry[i].Valid	= FALSE;					RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled);					DBGPRINT(RT_DEBUG_ERROR,("DLS - PeerDlsRspAction failed with StatusCode=%d \n", StatusCode));				}			}		}	}}/*    ==========================================================================    Description:        	IRQL = DISPATCH_LEVEL    ========================================================================== */VOID MlmeDlsTearDownAction(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {	PUCHAR			pOutBuffer = NULL;	NDIS_STATUS		NStatus;	ULONG			FrameLen = 0;	UCHAR			Category = CATEGORY_DLS;	UCHAR			Action = ACTION_DLS_TEARDOWN;	USHORT			ReasonCode = REASON_QOS_UNSPECIFY;	HEADER_802_11	DlsTearDownHdr;	PRT_802_11_DLS	pDLS;	BOOLEAN			TimerCancelled;	UCHAR			i;	if(!MlmeDlsReqSanity(pAd, Elem->Msg, Elem->MsgLen, &pDLS, &ReasonCode))		return;	DBGPRINT(RT_DEBUG_TRACE,("DLS - MlmeDlsTearDownAction() with ReasonCode=%d \n", ReasonCode));		NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory	if (NStatus != NDIS_STATUS_SUCCESS) 	{		DBGPRINT(RT_DEBUG_ERROR,("DLS - MlmeDlsTearDownAction() allocate memory failed \n"));		return;	}	ActHeaderInit(pAd, &DlsTearDownHdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->CommonCfg.Bssid);			// Build basic frame first	MakeOutgoingFrame(pOutBuffer,				&FrameLen,					sizeof(HEADER_802_11),		&DlsTearDownHdr,					1,							&Category,					1,							&Action,					6,							&pDLS->MacAddr,					6,							pAd->CurrentAddress,					2,							&ReasonCode,					END_OF_ARGS);	MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);	MlmeFreeMemory(pAd, pOutBuffer);	RTMPCancelTimer(&pDLS->Timer, &TimerCancelled);	// Remove key in local dls table entry	for (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++)	{		if (MAC_ADDR_EQUAL(pDLS->MacAddr, pAd->StaCfg.DLSEntry[i].MacAddr))		{			MacTableDeleteDlsEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, pAd->StaCfg.DLSEntry[i].MacAddr);		}	}	// clear peer dls table entry

⌨️ 快捷键说明

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