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

📄 connect.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 5 页
字号:
        NdisAcquireSpinLock(&pAd->MacTabLock);		RTMPMoveMemory(pAd->MacTab.Content[BSSID_WCID].Addr, pAd->CommonCfg.Bssid, MAC_ADDR_LEN);		pAd->MacTab.Content[BSSID_WCID].Aid = BSSID_WCID;		pAd->MacTab.Content[BSSID_WCID].pAd = pAd;		pAd->MacTab.Content[BSSID_WCID].ValidAsCLI = TRUE;	//Although this is bssid..still set ValidAsCl		pAd->MacTab.Size = 1;	// infra mode always set MACtab size =1.		pAd->MacTab.Content[BSSID_WCID].Sst = SST_ASSOC;		pAd->MacTab.Content[BSSID_WCID].AuthState = SST_ASSOC;        NdisReleaseSpinLock(&pAd->MacTabLock);		DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!!  ClientStatusFlags=%lx, Mmps=%d, AmsduSize=%d, )\n", 			pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags, 			pAd->MacTab.Content[BSSID_WCID].MmpsMode, pAd->MacTab.Content[BSSID_WCID].AMsduSize));		DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !! (StaActive.bHtEnable =%d, )\n", pAd->StaActive.SupportedHtPhy.bHtEnable));                // When STA assocates with WEP or TKIP enabled AP, STA cannot send BA request.        // ex. If STA send BA request to WEP enabled Atheros AP, data connection will fail.        if ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE) &&             (pAd->StaActive.SupportedHtPhy.bHtEnable == TRUE))        {            if (pAd->StaCfg.WepStatus == Ndis802_11WEPDisabled)	  	        BAOriSessionSetUp(pAd, &pAd->MacTab.Content[BSSID_WCID], 0, 0,3000, FALSE);            else if ((pAd->MlmeAux.APRalinkIe != 0x0) && (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled))            {#ifdef WPA_SUPPLICANT_SUPPORT                if (pAd->StaCfg.IEEE8021X == FALSE)#endif // WPA_SUPPLICANT_SUPPORT //                    // Static WEP                BAOriSessionSetUp(pAd, &pAd->MacTab.Content[BSSID_WCID], 0, 0,3000, FALSE);#ifdef WPA_SUPPLICANT_SUPPORT                else                    // Dynamic 1x WEP                    BAOriSessionSetUp(pAd, &pAd->MacTab.Content[BSSID_WCID], 0, 0, 9000, FALSE);#endif // WPA_SUPPLICANT_SUPPORT //            }            else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||                     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))            {                if ((pAd->StaCfg.WepStatus != Ndis802_11Encryption2Enabled) || (pAd->MlmeAux.APRalinkIe != 0x0))                    BAOriSessionSetUp(pAd, &pAd->MacTab.Content[BSSID_WCID], 0, 0,3000, FALSE);            }#ifdef WPA_SUPPLICANT_SUPPORT            else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||                     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2))            {                if ((pAd->StaCfg.WepStatus != Ndis802_11Encryption2Enabled) || (pAd->MlmeAux.APRalinkIe != 0x0))                    BAOriSessionSetUp(pAd, &pAd->MacTab.Content[BSSID_WCID], 0, 0,10000, FALSE);            }#endif // WPA_SUPPLICANT_SUPPORT //        }		MlmeUpdateTxRates(pAd, TRUE);		MlmeUpdateHtTxRates(pAd, BSSID_WCID);		//		// Report Adjacent AP report.		//#ifdef LEAP_SUPPORT		CCXAdjacentAPReport(pAd);#endif // LEAP_SUPPORT //		if (pAd->CommonCfg.bAggregationCapable)		{			if ((pAd->CommonCfg.bPiggyBackCapable) && (pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)			{				OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED);				OPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);                RTMPSetPiggyBack(pAd, TRUE);				DBGPRINT(RT_DEBUG_TRACE, ("Turn on Piggy-Back\n"));			}			else if (pAd->MlmeAux.APRalinkIe & 0x00000001)			{				OPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);			}		}				if (pAd->MlmeAux.APRalinkIe != 0x0)		{			if (CLIENT_STATUS_TEST_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RDG_CAPABLE))			{				AsicEnableRDG(pAd);			}			OPSTATUS_SET_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);			CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RALINK_CHIPSET);		}		else		{			OPSTATUS_CLEAR_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);			CLIENT_STATUS_CLEAR_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RALINK_CHIPSET);		}	}	DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_CONNECT Event B!.BACapability = %x. ClientStatusFlags = %lx\n", pAd->CommonCfg.BACapability.word, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));	DBGPRINT(RT_DEBUG_INFO, ("CCX: CWMax CWMin %d %d\n", pAd->StaCfg.CCXQosECWMax, pAd->StaCfg.CCXQosECWMin));	// Set LED	RTMPSetLED(pAd, LED_LINK_UP);		pAd->Mlme.PeriodicRound = 0;        // re-schedule MlmePeriodicExec()	pAd->Mlme.OneSecPeriodicRound = 0;	pAd->bConfigChanged = FALSE;        // Reset config flag	pAd->ExtraInfo = GENERAL_LINK_UP;   // Update extra information to link is up	// Set asic auto fall back	{		PUCHAR					pTable;		UCHAR					TableSize = 0;				MlmeSelectTxRateTable(pAd, &pTable, &TableSize, &pAd->CommonCfg.TxRateIndex);		AsicUpdateAutoFallBackTable(pAd, pTable);	}		if (pAd->CommonCfg.bAutoTxRateSwitch == FALSE)	{		pEntry = &pAd->MacTab.Content[BSSID_WCID];				pEntry->HTPhyMode.field.MODE	= pAd->CommonCfg.HTPhyMode.field.MODE;		pEntry->HTPhyMode.field.MCS		= pAd->CommonCfg.HTPhyMode.field.MCS;		pEntry->HTPhyMode.field.BW		= pAd->CommonCfg.HTPhyMode.field.BW;		pEntry->HTPhyMode.field.STBC	= pAd->CommonCfg.HTPhyMode.field.STBC;		pEntry->HTPhyMode.field.ShortGI	= pAd->CommonCfg.HTPhyMode.field.ShortGI;		if (pEntry->HTPhyMode.field.MCS == 32)			pEntry->HTPhyMode.field.ShortGI = GI_800;// For Wifi Short GI test item, we need to use short GI at every rate, although our rate adaptation prefer only short GI at MCS=15.#ifdef WIFI_TEST#else		if (pEntry->HTPhyMode.field.MCS < MCS_15)			pEntry->HTPhyMode.field.ShortGI = GI_800;#endif		if ((pEntry->HTPhyMode.field.MCS > MCS_7) || (pEntry->HTPhyMode.field.MCS == 32))			pEntry->HTPhyMode.field.STBC = STBC_NONE;	}	//  Let Link Status Page display first initial rate.	pAd->LastTxRate = (USHORT)(pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word);	// Select DAC according to HT or Legacy	if (pAd->StaActive.SupportedHtPhy.MCSSet[0] != 0x00)	{		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value);		Value &= (~0x18);		if (pAd->Antenna.field.TxPath == 2)		{			Value |= 0x10;		}		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value);	}	else	{		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value);		Value &= (~0x18);		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value);	}	if (pAd->StaActive.SupportedHtPhy.bHtEnable == FALSE) 	{	}	else if (pAd->MacTab.Content[BSSID_WCID].MaxRAmpduFactor == 0)	{		RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x0fff);	// Default set to 0x1fff. But if one peer can't support 0x1fff, we need to change to 0xfff	}	// Patch for Marvel AP to gain high throughput	// Need to set as following,	// 1. Set txop in register-EDCA_AC0_CFG as 0x60	// 2. Set EnTXWriteBackDDONE in register-WPDMA_GLO_CFG as zero	// 3. PBF_MAX_PCNT as 0x1F3FBF9F	// 4. kick per two packets when dequeue	// 	// Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable	if (pAd->CommonCfg.bEnableTxBurst)	{		RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);		Data  &= 0xFFFFFF00;		Data  |= 0x60;		RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);		pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = TRUE;		RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3FBF9F);	}	else	{		RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);		Data  &= 0xFFFFFF00;		RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);		RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F);	}	// Re-check to turn on TX burst or not.	if ((pAd->CommonCfg.IOTestParm.bLastAtheros == TRUE) && ((STA_WEP_ON(pAd))||(STA_TKIP_ON(pAd))))	{		pAd->CommonCfg.IOTestParm.bNextDisableRxBA = TRUE;		if (pAd->CommonCfg.bEnableTxBurst)		{		    UINT MACValue = 0;			// Force disable  TXOP value in this case. The same action in MLMEUpdateProtect too.			// I didn't change PBF_MAX_PCNT setting. 			RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &MACValue);			MACValue  &= 0xFFFFFF00;			RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, MACValue);			pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE;		}	}	else	{		pAd->CommonCfg.IOTestParm.bNextDisableRxBA = FALSE;	}	pAd->CommonCfg.IOTestParm.bLastAtheros = FALSE;	COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);	DBGPRINT(RT_DEBUG_TRACE, ("!!!pAd->bNextDisableRxBA= %d \n", pAd->CommonCfg.IOTestParm.bNextDisableRxBA));	// BSSID add in one MAC entry too.  Because in Tx, ASIC need to check Cipher and IV/EIV, BAbitmap	// Pther information in MACTab.Content[BSSID_WCID] is not necessary for driver.	// Note: As STA, The MACTab.Content[BSSID_WCID]. PairwiseKey and Shared Key for BSS0 are the same.}/*	==========================================================================	Routine	Description:		Disconnect current BSSID	Arguments:		pAd				- Pointer to our adapter		IsReqFromAP		- Request from AP			Return Value:				None			IRQL = DISPATCH_LEVEL	Note:		We need more information to know it's this requst from AP.		If yes! we need to do extra handling, for example, remove the WPA key.		Otherwise on 4-way handshaking will faied, since the WPA key didn't be		remove while auto reconnect.		Disconnect request from AP, it means we will start afresh 4-way handshaking 		on WPA mode.	==========================================================================*/VOID LinkDown(	IN PRTMP_ADAPTER pAd,	IN  BOOLEAN      IsReqFromAP){	UCHAR			    i, ByteValue = 0;    TX_RTY_CFG_STRUC	CurTxRryCfg;	// Do nothing if monitor mode is on	if (MONITOR_ON(pAd))		return;#ifdef RALINK_ATE	// Nothing to do in ATE mode. 	if (pAd->ate.Mode != ATE_STOP)		return;#endif // RALINK_ATE //    	DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN !!!\n"));	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);	if (ADHOC_ON(pAd))		// Adhoc mode link down	{		DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 1!!!\n"));		// Delete every  BA session with BSSID BEFORE tear INFRA.		//BATableTearRECEntry(pAd, pAd->CommonCfg.Bssid, 0, BSSID_WCID, TRUE);		//BATableTearORIEntry(pAd, pAd->CommonCfg.Bssid, 0, TRUE);		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);#ifdef	SINGLE_ADHOC_LINKUP		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);		pAd->IndicateMediaState = NdisMediaStateDisconnected;		NdisMIndicateStatus(pAd->AdapterHandle, NDIS_STATUS_MEDIA_DISCONNECT, (PVOID)NULL, 0);		NdisMIndicateStatusComplete(pAd->AdapterHandle);		// clean up previous SCAN result, add current BSS back to table if any		BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel);#else		// Why need this ???		//if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))		{			OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);            pAd->IndicateMediaState = NdisMediaStateDisconnected;			RTMP_IndicateMediaState();			BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel);		}#endif		DBGPRINT(RT_DEBUG_TRACE, ("!!! MacTab.Size=%d !!!\n", pAd->MacTab.Size));		// ad-hoc linkdown Reset MAC Table. Start from 1 or 0 ?		NdisAcquireSpinLock(&pAd->MacTabLock);		for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)		{			if (pAd->MacTab.Size == 0)				break;			if (pAd->MacTab.Content[i].ValidAsCLI == TRUE)			{					// free resources of BA				BASessionTearDownALL(pAd, i);				pAd->MacTab.Content[i].ValidAsCLI = FALSE;				RTMPZeroMemory(pAd->MacTab.Content[i].Addr, MAC_ADDR_LEN);				AsicRemovePairwiseKeyEntry(pAd, BSS0, i);				pAd->MacTab.Size --;				AsicDelWcidTab(pAd, i);			}			pAd->MacTab.Content[i].ValidAsWDS = FALSE;		}		NdisReleaseSpinLock(&pAd->MacTabLock);	}	else					// Infra structure mode	{		DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 2!!!\n"));		// Delete every  BA session with BSSID before tear down INFRA.		// free resources of BA		BASessionTearDownALL(pAd, BSSID_WCID);		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON); 		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 		// Saved last SSID for linkup comparison		pAd->CommonCfg.LastSsidLen = pAd->CommonCfg.SsidLen;		NdisMoveMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.LastSsidLen);		COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);		if (pAd->MlmeAux.CurrReqIsFromNdis == TRUE)		{			pAd->IndicateMediaState = NdisMediaStateDisconnected;			RTMP_IndicateMediaState();			DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event A!\n"));			pAd->MlmeAux.CurrReqIsFromNdis = FALSE;		}		else		{			// Set linkdown timer			RTMPSetTimer(&pAd->Mlme.LinkDownTimer, 10000);		            //			// If disassociation request is from NDIS, then we don't need to delete BSSID from entry.			// Otherwise lost beacon or receive De-Authentication from AP, 			// then we should delete BSSID from BssTable.			// If we don't delete from entry, roaming will fail.			//			BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel);		}		// restore back to - 		//      1. long slot (20 us) or short slot (9 us) time		//      2. turn on/off RTS/CTS and/or CTS-to-self protection		//      3. short preamble		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);		if (pAd->StaCfg.CCXAdjacentAPReportFlag == TRUE)		{			//			// Record current AP's information.			// for later used reporting Adjacent AP report.			//			pAd->StaCfg.CCXAdjacentAPChannel = pAd->CommonCfg.Channel;			pAd->StaCfg.CCXAdjacentAPSsidLen = pAd->CommonCfg.SsidLen;			NdisMov

⌨️ 快捷键说明

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