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

📄 assoc.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
							  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;		}#ifdef LEAP_SUPPORT		if (LEAP_CCKM_ON(pAd) && (pAd->StaCfg.CCKMLinkUpFlag == TRUE))		{			CkipFlag = pAd->StaCfg.CkipFlag;	// We have update that at PeerBeaconAtJoinRequest()			if (CkipFlag != 0)			{				NdisZeroMemory(CkipNegotiationBuffer, CKIP_NEGOTIATION_LENGTH);				CkipNegotiationBuffer[2] = 0x66;				// Make it try KP & MIC, since we have to follow the result from AssocRsp				CkipNegotiationBuffer[8] = 0x18;				CkipNegotiationBuffer[CKIP_NEGOTIATION_LENGTH - 1] = 0x22;				MakeOutgoingFrame(pOutBuffer + FrameLen,            &tmp,									1,                              &AironetCkipIe,									1,                              &AironetCkipLen,									AironetCkipLen,                 CkipNegotiationBuffer,									END_OF_ARGS);				FrameLen += tmp;			}			MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,							1,                              &AironetIPAddressIE,							1,                              &AironetIPAddressLen,							AironetIPAddressLen,            AironetIPAddressBuffer,							END_OF_ARGS);			FrameLen += tmp;			//			// The RN is incremented before each reassociation request.			//			pAd->StaCfg.CCKMRN++;			//			// Calculate MIC = hmac-md5(krk, STA-ID|BSSID|RSNIE|TSF|RN);			//			COPY_MAC_ADDR(CalcMicBuffer, pAd->CurrentAddress);			CalcMicBufferLen = MAC_ADDR_LEN;			COPY_MAC_ADDR(CalcMicBuffer + CalcMicBufferLen, pAd->MlmeAux.Bssid);			CalcMicBufferLen += MAC_ADDR_LEN;			NdisMoveMemory(CalcMicBuffer + CalcMicBufferLen, CipherSuiteCiscoCCKM, CipherSuiteCiscoCCKMLen);			CalcMicBufferLen += CipherSuiteCiscoCCKMLen;			NdisMoveMemory(CalcMicBuffer + CalcMicBufferLen, (PUCHAR) &pAd->StaCfg.CCKMBeaconAtJoinTimeStamp, sizeof(pAd->StaCfg.CCKMBeaconAtJoinTimeStamp));			CalcMicBufferLen += sizeof(pAd->StaCfg.CCKMBeaconAtJoinTimeStamp);			NdisMoveMemory(CalcMicBuffer + CalcMicBufferLen, (PUCHAR)&pAd->StaCfg.CCKMRN, sizeof(pAd->StaCfg.CCKMRN));			CalcMicBufferLen += sizeof(pAd->StaCfg.CCKMRN);			hmac_md5(pAd->StaCfg.KRK, LEN_EAP_MICK, CalcMicBuffer, CalcMicBufferLen, MICMN);			//			// fill up CCKM reassociation request element 			//			NdisMoveMemory(AironetCCKMReassocBuffer, AironetOUI, 4);			NdisMoveMemory(AironetCCKMReassocBuffer + 4, (PUCHAR)&pAd->StaCfg.CCKMBeaconAtJoinTimeStamp, 8);			NdisMoveMemory(AironetCCKMReassocBuffer + 12, (PUCHAR) &pAd->StaCfg.CCKMRN, 4);			NdisMoveMemory(AironetCCKMReassocBuffer +16, MICMN, 8);			MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 							1,                      &AironetCCKMReassocIE,							1,                      &AironetCCKMReassocLen,							AironetCCKMReassocLen,  AironetCCKMReassocBuffer,							END_OF_ARGS);			FrameLen += tmp;			MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,							CipherSuiteCiscoCCKMLen,CipherSuiteCiscoCCKM,							END_OF_ARGS);			FrameLen += tmp;		}#endif // LEAP_SUPPORT //		// Add CCX v2 request if CCX2 admin state is on		if (pAd->StaCfg.CCXControl.field.Enable == 1)		{			//			// Add CCX Version			//			MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,						1,							&Ccx2Ie,						1,							&Ccx2Len,						Ccx2Len,				    Ccx2IeInfo,						END_OF_ARGS);			FrameLen += tmp;		}				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 = 0;	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);		MlmeFreeMemory(pAd, pOutBuffer);	pAd->StaCfg.DisassocReason = REASON_DISASSOC_STA_LEAVING;	COPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pDisassocReq->Addr);	RTMPSetTimer(&pAd->MlmeAux.DisassocTimer, Timeout); /* in mSec */	pAd->Mlme.AssocMachine.CurrState = DISASSOC_WAIT_RSP;#ifdef WPA_SUPPLICANT_SUPPORT#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT    if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) 	{        union iwreq_data    wrqu;        //send disassociate event to wpa_supplicant        memset(&wrqu, 0, sizeof(wrqu));        wrqu.data.flags = RT_DISASSOC_EVENT_FLAG;        wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL);    } #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //#endif // WPA_SUPPLICANT_SUPPORT //#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT    {        union iwreq_data    wrqu;        memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);        wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);    }#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //        }/*	==========================================================================	Description:		peer sends assoc rsp back	Parameters:		Elme - MLME message containing the received frame	IRQL = DISPATCH_LEVEL	========================================================================== */VOID PeerAssocRspAction(	IN PRTMP_ADAPTER pAd, 	IN MLME_QUEUE_ELEM *Elem) {	USHORT        CapabilityInfo, Status, Aid;	UCHAR         SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen;	UCHAR         ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen;	UCHAR         Addr2[MAC_ADDR_LEN];	BOOLEAN       TimerCancelled;	UCHAR         CkipFlag;	EDCA_PARM     EdcaParm;	HT_CAPABILITY_IE		HtCapability;	ADD_HT_INFO_IE		AddHtInfo;	// AP might use this additional ht info IE 	UCHAR			HtCapabilityLen;	UCHAR			AddHtInfoLen;	UCHAR			NewExtChannelOffset = 0xff;	if (PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, 		&HtCapability,&AddHtInfo, &HtCapabilityLen,&AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, &CkipFlag)) 	{		// The frame is for me ?		if(MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) 		{			DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspAction():ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status));#ifdef DOT11_N_SUPPORT			DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspAction():MacTable [%d].AMsduSize = %d. ClientStatusFlags = 0x%lx \n",Elem->Wcid, pAd->MacTab.Content[BSSID_WCID].AMsduSize, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));#endif // DOT11_N_SUPPORT //			RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled);			if(Status == MLME_SUCCESS) 			{				UCHAR			MaxSupportedRateIn500Kbps = 0;				UCHAR			idx;				// supported rates array may not be sorted. sort it and find the maximum rate			    for (idx=0; idx<SupRateLen; idx++)                {			        if (MaxSupportedRateIn500Kbps < (SupRate[idx] & 0x7f)) 			            MaxSupportedRateIn500Kbps = SupRate[idx] & 0x7f;                }				for (idx=0; idx<ExtRateLen; idx++)                {			        if (MaxSupportedRateIn500Kbps < (ExtRate[idx] & 0x7f)) 			            MaxSupportedRateIn500Kbps = ExtRate[idx] & 0x7f;                }				// go to procedure listed on page 376				AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen, 					&EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo);

⌨️ 快捷键说明

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