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

📄 assoc.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
							  END_OF_ARGS);			FrameLen += TmpLen;		}		if (pAd->MlmeAux.APEdcaParm.bValid)		{			if (pAd->CommonCfg.bAPSDCapable && pAd->MlmeAux.APEdcaParm.bAPSDCapable)			{				QBSS_STA_INFO_PARM QosInfo;				NdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM));				QosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE;				QosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK;				QosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI;				QosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO;				QosInfo.MaxSPLength = pAd->CommonCfg.MaxSPLength;				WmeIe[8] |= *(PUCHAR)&QosInfo;			}			else			{                // The Parameter Set Count is set to ¨0〃 in the association request frames                // WmeIe[8] |= (pAd->MlmeAux.APEdcaParm.EdcaUpdateCount & 0x0f);			}			MakeOutgoingFrame(pOutBuffer + FrameLen,    &tmp,							  9,                        &WmeIe[0],							  END_OF_ARGS);			FrameLen += tmp;		}				//		// Let WPA(#221) Element ID on the end of this association frame.		// Otherwise some AP will fail on parsing Element ID and set status fail on Assoc Rsp.		// For example: Put Vendor Specific IE on the front of WPA IE.		// This happens on AP (Model No:Linksys WRK54G)		//				if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||             (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||            (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||             (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)			)                        )          		{			UCHAR RSNIe = IE_WPA;						if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||                (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2))			{				RSNIe = IE_WPA2;			}				#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT#ifdef SIOCSIWGENIE			if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE) &&				(pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE))#endif // SIOCSIWGENIE //#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //            RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0);                        // Check for WPA PMK cache list			if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)			{			    INT     idx;                BOOLEAN FoundPMK = FALSE;				// Search chched PMKID, append it if existed				for (idx = 0; idx < PMKID_NO; idx++)				{					if (NdisEqualMemory(ApAddr, &pAd->StaCfg.SavedPMK[idx].BSSID, 6))					{						FoundPMK = TRUE;						break;					}				}				if (FoundPMK)				{					// Set PMK number					*(PUSHORT) &pAd->StaCfg.RSN_IE[pAd->StaCfg.RSNIE_Len] = 1;					NdisMoveMemory(&pAd->StaCfg.RSN_IE[pAd->StaCfg.RSNIE_Len + 2], &pAd->StaCfg.SavedPMK[idx].PMKID, 16);                    pAd->StaCfg.RSNIE_Len += 18;				}			}			#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT#ifdef SIOCSIWGENIE			if ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) &&				(pAd->StaCfg.bRSN_IE_FromWpaSupplicant == TRUE))						{				MakeOutgoingFrame(pOutBuffer + FrameLen,    		&tmp,		                        	pAd->StaCfg.RSNIE_Len,			pAd->StaCfg.RSN_IE,		                        	END_OF_ARGS);			}			else#endif#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //			{			MakeOutgoingFrame(pOutBuffer + FrameLen,    		&tmp,			              		1,                              &RSNIe,	                        	1,                              &pAd->StaCfg.RSNIE_Len,	                        	pAd->StaCfg.RSNIE_Len,			pAd->StaCfg.RSN_IE,	                        	END_OF_ARGS);			}			FrameLen += tmp;#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT#ifdef SIOCSIWGENIE			if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE) ||				(pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE))#endif#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //			{            // Append Variable IE            NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &RSNIe, 1);            VarIesOffset += 1;            NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &pAd->StaCfg.RSNIE_Len, 1);            VarIesOffset += 1;			}			NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->StaCfg.RSN_IE, pAd->StaCfg.RSNIE_Len);			VarIesOffset += pAd->StaCfg.RSNIE_Len;			// Set Variable IEs Length			pAd->StaCfg.ReqVarIELen = VarIesOffset;		}			MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);		MlmeFreeMemory(pAd, pOutBuffer);		RTMPSetTimer(&pAd->MlmeAux.AssocTimer, Timeout);		pAd->Mlme.AssocMachine.CurrState = ASSOC_WAIT_RSP;	} 	else 	{		DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeAssocReqAction() sanity check failed. BUG!!!!!! \n"));		pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;		Status = MLME_INVALID_FORMAT;		MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status);	}}/*	==========================================================================	Description:		mlme reassoc req handling procedure	Parameters:		Elem - 	Pre:		-# SSID  (Adapter->StaCfg.ssid[])		-# BSSID (AP address, Adapter->StaCfg.bssid)		-# Supported rates (Adapter->StaCfg.supported_rates[])		-# Supported rates length (Adapter->StaCfg.supported_rates_len)		-# Tx power (Adapter->StaCfg.tx_power)	IRQL = DISPATCH_LEVEL	========================================================================== */VOID MlmeReassocReqAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {	UCHAR			ApAddr[6];	HEADER_802_11	ReassocHdr;	UCHAR			WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};	USHORT			CapabilityInfo, ListenIntv;	ULONG			Timeout;	ULONG			FrameLen = 0;	BOOLEAN			TimerCancelled;	NDIS_STATUS		NStatus;	ULONG			tmp;	PUCHAR			pOutBuffer = NULL;	USHORT			Status;	// Block all authentication request durning WPA block period	if (pAd->StaCfg.bBlockAssoc == TRUE)	{		DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Block ReAssoc request durning WPA block period!\n"));		pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;		Status = MLME_STATE_MACHINE_REJECT;		MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status);	}		// the parameters are the same as the association	else if(MlmeAssocReqSanity(pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo, &Timeout, &ListenIntv)) 	{		RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &TimerCancelled);		NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory		if(NStatus != NDIS_STATUS_SUCCESS) 		{			DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeReassocReqAction() allocate memory failed \n"));			pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;			Status = MLME_FAIL_NO_RESOURCE;			MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status);			return;		}		COPY_MAC_ADDR(pAd->MlmeAux.Bssid, ApAddr);		// make frame, use bssid as the AP address??		DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send RE-ASSOC request...\n"));		MgtMacHeaderInit(pAd, &ReassocHdr, SUBTYPE_REASSOC_REQ, 0, ApAddr, ApAddr);		MakeOutgoingFrame(pOutBuffer,               &FrameLen,						  sizeof(HEADER_802_11),    &ReassocHdr,						  2,                        &CapabilityInfo,						  2,                        &ListenIntv,						  MAC_ADDR_LEN,             ApAddr,						  1,                        &SsidIe,						  1,                        &pAd->MlmeAux.SsidLen, 						  pAd->MlmeAux.SsidLen,     pAd->MlmeAux.Ssid, 						  1,                        &SupRateIe,						  1,						&pAd->MlmeAux.SupRateLen,						  pAd->MlmeAux.SupRateLen,  pAd->MlmeAux.SupRate,						  END_OF_ARGS);		if (pAd->MlmeAux.ExtRateLen != 0)		{			MakeOutgoingFrame(pOutBuffer + FrameLen,        &tmp,							  1,                            &ExtRateIe,							  1,                            &pAd->MlmeAux.ExtRateLen,							  pAd->MlmeAux.ExtRateLen,	    pAd->MlmeAux.ExtRate,														  END_OF_ARGS);			FrameLen += tmp;		}		if (pAd->MlmeAux.APEdcaParm.bValid)		{			if (pAd->CommonCfg.bAPSDCapable && pAd->MlmeAux.APEdcaParm.bAPSDCapable)			{				QBSS_STA_INFO_PARM QosInfo;				NdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM));				QosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE;				QosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK;				QosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI;				QosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO;				QosInfo.MaxSPLength = pAd->CommonCfg.MaxSPLength;				WmeIe[8] |= *(PUCHAR)&QosInfo;			}			MakeOutgoingFrame(pOutBuffer + FrameLen,    &tmp,							  9,                        &WmeIe[0],							  END_OF_ARGS);			FrameLen += tmp;		}#ifdef DOT11_N_SUPPORT		// HT		if ((pAd->MlmeAux.HtCapabilityLen > 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))		{			ULONG TmpLen;			UCHAR HtLen;			UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33};			if (pAd->StaActive.SupportedPhyInfo.bPreNHt == TRUE)			{				HtLen = SIZE_HT_CAP_IE + 4;				MakeOutgoingFrame(pOutBuffer + FrameLen,            &TmpLen,							  1,                                &WpaIe,							  1,                                &HtLen,							  4,                                &BROADCOM[0],							 pAd->MlmeAux.HtCapabilityLen,          &pAd->MlmeAux.HtCapability, 							  END_OF_ARGS);			}			else							{				MakeOutgoingFrame(pOutBuffer + FrameLen,            &TmpLen,							  1,                                &HtCapIe,							  1,                                &pAd->MlmeAux.HtCapabilityLen,							 pAd->MlmeAux.HtCapabilityLen,          &pAd->MlmeAux.HtCapability, 							  END_OF_ARGS);			}			FrameLen += TmpLen;		}#endif // DOT11_N_SUPPORT //		// add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION		// Case I: (Aggregation + Piggy-Back)		// 1. user enable aggregation, AND		// 2. Mac support piggy-back		// 3. AP annouces it's PIGGY-BACK+AGGREGATION-capable in BEACON		// Case II: (Aggregation)		// 1. user enable aggregation, AND		// 2. AP annouces it's AGGREGATION-capable in BEACON		if (pAd->CommonCfg.bAggregationCapable)		{			if ((pAd->CommonCfg.bPiggyBackCapable) && ((pAd->MlmeAux.APRalinkIe & 0x00000003) == 3))			{				ULONG TmpLen;				UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x03, 0x00, 0x00, 0x00}; 				MakeOutgoingFrame(pOutBuffer+FrameLen,           &TmpLen,								  9,                             RalinkIe,								  END_OF_ARGS);				FrameLen += TmpLen;			}			else if (pAd->MlmeAux.APRalinkIe & 0x00000001)			{				ULONG TmpLen;				UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x01, 0x00, 0x00, 0x00}; 				MakeOutgoingFrame(pOutBuffer+FrameLen,           &TmpLen,								  9,                             RalinkIe,								  END_OF_ARGS);				FrameLen += TmpLen;			}		}		else		{			ULONG TmpLen;			UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x04, 0x00, 0x00, 0x00}; 			MakeOutgoingFrame(pOutBuffer+FrameLen,		 &TmpLen,							  9,						 RalinkIe,							  END_OF_ARGS);			FrameLen += TmpLen;		}		MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);		MlmeFreeMemory(pAd, pOutBuffer);		RTMPSetTimer(&pAd->MlmeAux.ReassocTimer, Timeout); /* in mSec */		pAd->Mlme.AssocMachine.CurrState = REASSOC_WAIT_RSP;	} 	else 	{		DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeReassocReqAction() sanity check failed. BUG!!!! \n"));		pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;		Status = MLME_INVALID_FORMAT;		MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status);	}}/*	==========================================================================	Description:		Upper layer issues disassoc request	Parameters:		Elem -	IRQL = PASSIVE_LEVEL	========================================================================== */VOID MlmeDisassocReqAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {	PMLME_DISASSOC_REQ_STRUCT pDisassocReq;	HEADER_802_11         DisassocHdr;	PHEADER_802_11        pDisassocHdr;	PUCHAR                pOutBuffer = NULL;	ULONG                 FrameLen = 0;	NDIS_STATUS           NStatus;	BOOLEAN               TimerCancelled;	ULONG                 Timeout = 500;	USHORT                Status;#ifdef QOS_DLS_SUPPORT	// send DLS-TEAR_DOWN message, 	if (pAd->CommonCfg.bDLSCapable)	{		UCHAR i;		// tear down local dls table entry		for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++)		{			if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))			{				RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);				pAd->StaCfg.DLSEntry[i].Status	= DLS_NONE;				pAd->StaCfg.DLSEntry[i].Valid	= FALSE;			}		}		// tear down peer dls table entry		for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++)		{			if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))			{				RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);				pAd->StaCfg.DLSEntry[i].Status = DLS_NONE;				pAd->StaCfg.DLSEntry[i].Valid	= FALSE;			}		}	}#endif // QOS_DLS_SUPPORT //	// skip sanity check	pDisassocReq = (PMLME_DISASSOC_REQ_STRUCT)(Elem->Msg);	NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory	if (NStatus != NDIS_STATUS_SUCCESS) 	{		DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - MlmeDisassocReqAction() allocate memory failed\n"));		pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;		Status = MLME_FAIL_NO_RESOURCE;		MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status);		return;	}	RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &TimerCancelled);	DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send DISASSOC request[BSSID::%02x:%02x:%02x:%02x:%02x:%02x (Reason=%d)\n", 				pDisassocReq->Addr[0], pDisassocReq->Addr[1], pDisassocReq->Addr[2],				pDisassocReq->Addr[3], pDisassocReq->Addr[4], pDisassocReq->Addr[5], pDisassocReq->Reason));	MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pDisassocReq->Addr, pDisassocReq->Addr);	// patch peap ttls switching issue	MakeOutgoingFrame(pOutBuffer,           &FrameLen, 					  sizeof(HEADER_802_11),&DisassocHdr, 					  2,                    &pDisassocReq->Reason, 					  END_OF_ARGS);	MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);	// To patch Instance and Buffalo(N) AP	// Driver has to send deauth to Instance AP, but Buffalo(N) needs to send disassoc to reset Authenticator's state machine	// Therefore, we send both of them.	pDisassocHdr = (PHEADER_802_11)pOutBuffer;	pDisassocHdr->FC.SubType = SUBTYPE_DEAUTH;	MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);

⌨️ 快捷键说明

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